用LevelHelper所提供的LHSprite是非常方便的,也非常好用。但有时候我们的精灵需要有更多的信息。
例如我们需要建一个玩家类,可能它存在生命值,魔法值等其他信息。这些信息都是LevelHelper所不能提供的。
在本文我将为大家演示一下创建一个自定义的LHSprite是多么的容易,so easy!
从这种方法,你可以很方便的创建任意你想要的LHSprite类型。
在进入下一步之前,先简单介绍一下LHSpite这个类:
该类继承CCSpite,提供了播放动画;访问精灵的body属性;还有spite和body能够同时移动或者旋转,而不需要疯狂的计算;让精灵按指定的路径移动等等。关于LHSpite更多的信息,可以查看源码。(支持开源)
下面将详细为你介绍如何创建一个自定义的精灵类,我将它命名为LHSpiteHelper。
1、当你继承LHSpite,你需要提供2个自动释放的静态初始化函数。
// LHSpiteHelper.h 文件
- #ifndef __CUSTOM_LHSPRITE_NODE_PLAYER  
 - #define __CUSTOM_LHSPRITE_NODE_PLAYER  
 -  
 - #include "cocos2d.h"  
 - #include "LHSprite.h"  
 -  
 - using namespace cocos2d;  
 -  
 - class LHSpritePlayer : public LHSprite  
 - {      
 - public:  
 -     int life;  
 -     int magic;  
 -      
 -       
 -      
 -     virtual bool init(void);  
 -     virtual ~LHSpritePlayer(void);  
 -     LHSpritePlayer();      
 -       
 -      
 -     static LHSprite* spriteWithFile(const char *pszFileName, const CCRect& rect);  
 -     static LHSprite* spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect);  
 -  
 -      
 -     
 -     static bool isSpritePlayer(LHSprite* object);   
 -       
 -      
 -      
 -  
 - private:  
 -       
 - };  
 -  
 -  
 - #endif  
 
// LHSpiteHelper.cpp
- #include "LHSpritePlayer.h"  
 -  
 -  
 -  
 - LHSpritePlayer::~LHSpritePlayer(void)
 - {  
 -      
 - }  
 -  
 - bool LHSpritePlayer::init(void)
 - {  
 -     return LHSprite::init();  
 - }  
 -  
 - LHSpritePlayer::LHSpritePlayer()
 - {  
 -     life = 100;  
 -     magic = 50;  
 - }  
 -  
 - LHSprite* LHSpritePlayer::spriteWithFile(const char *pszFileName, const CCRect& rect)  
 - {  
 -     LHSpritePlayer *pobSprite = new LHSpritePlayer();  
 -     if (pobSprite && pobSprite->initWithFile(pszFileName, rect))  
 -     {  
 -         pobSprite->autorelease();  
 -         return pobSprite;  
 -     }  
 -     CC_SAFE_DELETE(pobSprite);  
 -     return NULL;  
 - }  
 -  
 - LHSprite* LHSpritePlayer::spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect)  
 - {  
 -     LHSpritePlayer *pobSprite = new LHSpritePlayer();  
 -     if (pobSprite && pobSprite->initWithBatchNode(batchNode, rect))  
 -     {  
 -         pobSprite->autorelease();  
 -         return pobSprite;  
 -     }  
 -     CC_SAFE_DELETE(pobSprite);  
 -     return NULL;  
 - }  
 -  
 - bool LHSpritePlayer::isSpritePlayer(LHSprite* object)
 - {  
 -     if( 0 != dynamic_cast<LHSpitePlayer*>(object))
 -     {  
 -         return true;  
 -     }
 -     return false;  
 - }  
 -  
 
2、把LHSpitePlayer载入到关卡
需要注意的是所有自定义的LHSpite都需要关联一个LevelHelper的tag,换句话说就是给自定义的类型做一个唯一的标记。详细参考下面的代码实现。
- LHCustomSpriteMgr::sharedInstance()->registerCustomSpriteClassForTag(&LHSpritePlayer::spriteWithFile,  
 -                                                                      &LHSpritePlayer::spriteWithBatchNode,  
 -                                                                      PLAYER_TAG);  
 -  
 - LHCustomSpriteMgr::sharedInstance()->registerCustomSpriteClassForTag(&LHSpriteOtherCustomClass::spriteWithFile,  
 -                                                                      &LHSpriteOtherCustomClass::spriteWithBatchNode,  
 -                                                                      OTHER_TAG);  
 -  
 - loader = new LevelHelperLoader("levelTestDict.plhs");  
 - loader->addObjectsToWorld(world, this); 
 
看,多么的简单,不会觉得很蛋疼吧?
3、从关卡中获得LHSpitePlayer的引用
在上一步中,我们把关卡载入进来了。你肯定会想要一个指向player对象的指针。
因为我们要确认它是否真正属于LHSpritePlayer类,所以在赋值之前必须先作检测。
- LHSprite* testSpr = loader->spriteWithUniqueName("PlayerSpriteNameInLevelHelper");  
 -       
 - if(LHSpritePlayer::isSpritePlayer(testSpr))  
 - {  
 -    LHSpritePlayer* playerSprite = (LHSpritePlayer*)testSpr;  
 -    CCLog("Player sprite has life %d and magic %d", playerSprite->life, playerSprite->magic);  
 - } 
 
如果你很确信它真正属于LHSpitePlayer类。你可以不用检测,直接用下面的方法:
- LHSpritePlayer* playerSprite = (LHSpritePlayer*)loader->spriteWithUniqueName("PlayerSpriteNameInLevelHelper");  
 
很显然,第一种方法更加安全。(但它不应该定义成一个临时变量。我这样写,只是为了跟容易理解)
以上就是你想要建立一个自定义的LHSpite所需要知道的一些内容