学过了面向对象的编程,就不可避免的以对象的角度来思考程序结构。
牛皮少吹,说点实际的。
首先,先来说一下cocos2d-x的程序类结构。
基本所有的元素都是CCNode的子类。比如CCSprite、CCMenu、CCLayer等。只是相应关注的功能点不一样。
我们通常需要的是一个复合的对象。
比如:塔防游戏。怪物头上都要有血条。这个东西是跟着怪物走的。显然应该在一个对象中。血条显示的是血量,这个数值自然是一个成员变量会比较好。但是如果我写成
Class MySprite : public CCSprite { ...... }
Class MySprite : public CCNode { ...... }
这两个东西都用addChild加到MySprite中,此时可以把MySprite理解为一个CCLayer。所以这个类看起来应该是这样的:
Class MySprite:public CCNode { public: CREATE_FUNC(MySprite); virtual bool init(); }然后在init中添加相应的功能就行了。
bool MySprite::init() { //add Sprite ....... //add BloodBar ...... }
MySprite* sp = MySprite::create(100);
Class MySprite:public CCNode { public: CREATE_FUNC(MySprite); virtual bool init(); static MySprite* create(int hp); protect: int m_hp; }
无参数的构造函数留不留看你需要了。如果你希望安全一些就彻底按照cocos2d-x的create方式来做,这也是推荐的写法。如果你觉得没必要的话只需在这个create中添加处理代码就行了。
更好的做法是在create中调用init,在init中添加处理:
Class MySprite:public CCNode { public: CREATE_FUNC(MySprite); virtual bool init(); static MySprite* create(int hp); virtual bool initMySprite(int hp); protect: int m_hp; }
其实现与CREATE_FUNC宏类似:
MySprite* MySprite::create( int hp ) { MySprite*pRet = new MySprite(); if (pRet && pRet->initMySprite(hp)) { pRet->autorelease(); return pRet; } else { delete pRet; pRet = NULL; return NULL; } } bool MySprite::initMySprite(int hp) { //save hp ...... //add sprite ...... //add BloodBar ...... }
经过这些步骤,我们就可以通过参数来控制这个类的行为了。
本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/9455307