标签:sprite 继承 cocos2dx3.0
本文章特指使用C++作为编程语言,基于cocos2dx游戏引擎开发游戏。
在cocos2dx中,sprite作为精灵类是使用最为频繁的类,与其它类相比,如:Node, Layer或Scene,Sprite最大的不同是它包含一个纹理,通过OpenGL的渲染,在游戏中呈现出来。游戏中的主角,怪物,背景,或是精灵的血条等都是通过Sprite来实现的。
在cocos2dx中,关于创建Sprite的类,根据输入参数的不同有以下几个工厂函数,
static Sprite* create() static Sprite* create(const std::string& filename) static Sprite* create(const std::string& filename, const Rect& rect) static Sprite* createWithTexture(Texture2D *texture) static Sprite* createWithTexture(Texture2D *texture, const Rect& rect, bool rotated=false) static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame) static Sprite* createWithSpriteFrameName(const 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 = new Sprite(); if (sprite && sprite->initWithFile(filename)) { sprite->autorelease(); return sprite; } CC_SAFE_DELETE(sprite); return nullptr;
Sprite *sprite = new Sprite();
它决定了工厂函数创建的实例是Sprite类型,所以当在编码中调用Sprite的虚函数时,调用的就是Sprite类中的相应函数。
可能你会有这样一个问题:如果我想重载一个虚函数,在这个函数中实现自己需要的一些特殊行为,该怎么做?
答案是:必须继承Sprite创建一个你自己精灵类,在类中重载这个虚函数,这样还不够,必须定义这个新的继承类的工厂函数,在这个工厂函数中创建这个类的对象,
class MySprite : public Sprite { static MySprite * create(const char *pszFileName); } MySprite * MySprite ::create(const char *filename) { MySprite *sprite = new MySprite(); if (sprite && sprite->initWithFile(filename)) { sprite->autorelease(); return sprite; } CC_SAFE_DELETE(sprite); return nullptr; }
在程序中使用MySprite的代码与Sprite类似,
MySprite *sprite = MySprite::create("hero.png"); this->addChild(sprite); sprite->setPosition(Point(100, 200));
MySprite * MySprite ::create(Sprite* sprite, const char *filename) { if (sprite && sprite->initWithFile(filename)) { sprite->autorelease(); return sprite; } CC_SAFE_DELETE(sprite); return nullptr; }
MySprite *sprite = new MySprite(); MySprite::create(sprite, "hero.png"); this->addChild(sprite); sprite->setPosition(Point(100, 200));
class MySprite2 : public MySprite { ... }
MySprite2 *sprite = new MySprite2(); MySprite::create(sprite, "hero.png"); this->addChild(sprite); sprite->setPosition(Point(100, 200));
class MySprite : public Sprite { Sprite* newInstance(); } Sprite* MySprite::newInstance() { return new MySprite(); }
MySprite::create("hero.png"); this->addChild(sprite); sprite->setPosition(Point(100, 200));
关于在cocos2dx中继承Sprite的分析与技巧,布布扣,bubuko.com
标签:sprite 继承 cocos2dx3.0
原文地址:http://blog.csdn.net/while0/article/details/25615685