学过了面向对象的编程,就不可避免的以对象的角度来思考程序结构。
牛皮少吹,说点实际的。
首先,先来说一下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