最近终于把TD塔防的游戏补完了,写的好写的不好也不管了,在开始写游戏是总是把框架想的很大,但在开始写的时候才发现每一步原来都是那么的艰难,看来我总是高估了自己。
但不管游戏写的怎么烂,但在写的途中也总结了很多cocos2d-x的技巧和方法,和大家分享一下。
首先是CCLayer 和父层和子层 ,子层访问父层 是并不需要在子层保存 父层的指针,只需getParent()后强制转换成 父层的类型,这仅仅适合 Layer 和Scene ,如果用在sprite别的类型节点上很容易出错,因为sprite的父节点可能经常会变动,但层与层之间的关系一般都是单一且很少变动的。
第二点 如果你用了CCSpriteBatchNode去保存 texture时,然后在加载sprite时最好不要 用CCSpriteBathcNode 的对象去addChild ,因为假若你这样做,被addChild的节点 只能是尾节点,该节点不能使用addChild。
第三点 ,可以自己写一个模板类去代替 预处理函数 LAYER_NODE_FUNC ,多重继承模板类,方法是可行的。
第四点 关卡选择按钮的设计方法:关卡按钮通常一一面就有10几个按钮,如果每一个按钮都去写一个触发函数很不实际 ,这里有2种办法可以解决
第一个是在关卡选择页面写一个保存按钮指针的容器,然后在写一个按钮触发函数,在函数里 把传递过来的CCObject 指针强制转换成 CCMenuItem类型,
然后 拿它和按钮指针容器 里的 每一个按钮 比较,若 uId相同则触发相应的事件。
第二个就是我用的办法,用Sprite去代替CCMenuItem,然后为每一个Sprite 添加一个b2Body 然后再 写一个继承 b2QueryCallback类的回调类,
在CCTouchBegan CCTouchMoved CCTouchEnden 中 用b2World::QueryAABB函数调用先前定义个回调类判定有没有点击 那个sprite按钮上
这个的做法好处很多,比如你可以在继承的b2QueryAABB 中以修改点击判定的方法,而且因为用到box2d所以按钮可以是圆型或各种不规则图形。
但是这种方法 运行负担可能比较大,但是只是在关卡选择界面做没有问题。