关于在cocos2dx中继承Sprite的分析与技巧
本文章特指使用C++作为编程语言,基于cocos2dx游戏引擎开发游戏。
在cocos2dx中,sprite作为精灵类是使用最为频繁的类,与其它类相比,如:Node,Layer或Scene,Sprite最大的不同是它包含一个纹理,通过OpenGL的渲染,在游戏中呈现出来。游戏中的主角,怪物,背景,或是精灵的血条等都是通过Sprite来实现的。 在cocos2dx中,关于创建Sprite的类,根据输入参数的不同有以下几个工厂函数, static Sprite* create()
Sprite* create(
const std::string& filename)
std::string& filename,
Rect& rect)
Sprite* createWithTexture(Texture2D *texture)
Sprite* createWithTexture(Texture2D *texture,monospace!important; min-height:inherit!important; color:black!important; background:none!important">Rect& rect,bool rotated=
false )
Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame)
Sprite* createWithSpriteFrameName(
std::string& spriteFrameName)
顺便提醒,工厂函数中Sprite的实例都调用了autorelease(),所以由工厂函数返回的实例一般立即通过addChild到加入到父节点中,这样它的引用计数加一,表示有人在使用这个实例,这个实例不能被释放。当然,如果你不想立即加入到父节点中,也可以调用retain()函数直接对其引用计数加1,不然在主循环的下一次,就会将其回收,这是cocos2dx内存自动回收的机制决定的。
在游戏的开发过程中,使用Sprite最频繁的编码就是三部曲 (1)创建Sprite (2)加入layer中 (3)设置精灵位置: Sprite *sprite = Sprite::create(hero.png);
this ->addChild(sprite);
sprite->setPosition(Point( 100 , 200 ));
第一行创建Sprite的实例,也就是创建了一个类Sprite的对象,这个是在工厂函数中实现的,
Sprite *sprite = new Sprite();
if (sprite && sprite->initWithFile(filename))
{
sprite->autorelease();
return sprite;
}
CC_SAFE_DELETE(sprite);
nullptr;
我们重点关注第一句:
Sprite *sprite = new Sprite(); 它决定了工厂函数创建的实例是Sprite类型,所以当在编码中调用Sprite的虚函数时,调用的就是Sprite类中的相应函数。 可能你会有这样一个问题:如果我想重载一个虚函数,在这个函数中实现自己需要的一些特殊行为,该怎么做? 答案是:必须继承Sprite创建一个你自己精灵类,在类中重载这个虚函数,这样还不够,必须定义这个新的继承类的工厂函数,在这个工厂函数中创建这个类的对象,
class
MySprite : public Sprite
{
MySprite * create(
const char *pszFileName);
}
MySprite * MySprite ::create(
*filename)
{
MySprite *sprite =
MySprite();
(sprite && sprite->initWithFile(filename))
{
sprite->autorelease();
sprite;
}
CC_SAFE_DELETE(sprite);
nullptr;
}
在程序中使用MySprite的代码与Sprite类似, MySprite *sprite = MySprite::create(hero.png);
->addChild(sprite);
));
如果输入参数不同,可以参考Sprite类的实现,创建不同输入参数的工厂函数。
在工厂函数中,实例作为输入参数传入 MySprite * MySprite ::create(Sprite* sprite,monospace!important; min-height:inherit!important; color:black!important; background:none!important"> *filename)
(sprite && sprite->initWithFile(filename))
{
sprite->autorelease();
sprite;
}
CC_SAFE_DELETE(sprite);
nullptr;
调用MySprite的代码: MySprite();
MySprite::create(sprite,hero.png);
->addChild(sprite);
在MySprite的基础上再做继承时,就不需要实现工厂函数了。
例如:从MySprite继承新类MySprite2: MySprite2 :
MySprite
...
调用MySprite2的代码:
MySprite2 *sprite = 2. 创建newInstance的虚函数 第二种方法,我们可以通过虚函数newInstance()来避免重复创建工厂函数。在newInstance中创建新类的对象。 *filename);
virtual Sprite* newInstance();
}
Sprite* MySprite::newInstance()
return
new MySprite();
}
*filename)
{
MySprite *sprite = newInstance();
(sprite && sprite->initWithFile(filename))
{
sprite;
}
CC_SAFE_DELETE(sprite);
nullptr;
调用MySprite的代码: MySprite::create(hero.png);
第二种方法的好处是在使用MySprite时与Sprite的完全相同,但需要在继承类中实现虚函数newInstance()。
本文抛砖引玉,在您的实现过程中也许会有更好的方法,欢迎讨论,共同进步。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |