LevelHelper Cocos2d-x with Box2d(一)自定义精灵
更新:HHH   时间:2023-1-7


用LevelHelper所提供的LHSprite是非常方便的,也非常好用。但有时候我们的精灵需要有更多的信息。

例如我们需要建一个玩家类,可能它存在生命值,魔法值等其他信息。这些信息都是LevelHelper所不能提供的。

在本文我将为大家演示一下创建一个自定义的LHSprite是多么的容易,so easy!

从这种方法,你可以很方便的创建任意你想要的LHSprite类型。

在进入下一步之前,先简单介绍一下LHSpite这个类:

该类继承CCSpite,提供了播放动画;访问精灵的body属性;还有spite和body能够同时移动或者旋转,而不需要疯狂的计算;让精灵按指定的路径移动等等。关于LHSpite更多的信息,可以查看源码。(支持开源)

下面将详细为你介绍如何创建一个自定义的精灵类,我将它命名为LHSpiteHelper。

1、当你继承LHSpite,你需要提供2个自动释放的静态初始化函数。

// LHSpiteHelper.h 文件

  1. #ifndef __CUSTOM_LHSPRITE_NODE_PLAYER  
  2. #define __CUSTOM_LHSPRITE_NODE_PLAYER  
  3.  
  4. #include "cocos2d.h"  
  5. #include "LHSprite.h"  
  6.  
  7. using namespace cocos2d;  
  8.  
  9. class LHSpritePlayer : public LHSprite  
  10. {      
  11. public:  
  12.     int life;  
  13.     int magic;  
  14.     //添加你想要的属性,或者把这些属性设为private  
  15.       
  16.     //构造函数,初始化  
  17.     virtual bool init(void);  
  18.     virtual ~LHSpritePlayer(void);  
  19.     LHSpritePlayer();      
  20.       
  21.     //为了让你创建的自定义精灵能正常运行,以下2个函数是必须的  
  22.     static LHSprite* spriteWithFile(const char *pszFileName, const CCRect& rect);  
  23.     static LHSprite* spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect);  
  24.  
  25.     //------------------------------------------------------------------------------  
  26.     //检测是否真正属于LHSpritePlayer类型
  27.     static bool isSpritePlayer(LHSprite* object);   
  28.       
  29.     //------------------------------------------------------------------------------  
  30.     //在这里加入你其他的接口函数... 
  31.  
  32. private:  
  33.       
  34. };  
  35. ////////////////////////////////////////////////////////////////////////////////  
  36.  
  37. #endif  

// LHSpiteHelper.cpp

  1. #include "LHSpritePlayer.h"  
  2.  
  3. ////////////////////////////////////////////////////////////////////////////////  
  4. ////////////////////////////////////////////////////////////////////////////////  
  5. LHSpritePlayer::~LHSpritePlayer(void)
  6. {  
  7.     //释放你动态分配的属性  
  8. }  
  9. //------------------------------------------------------------------------------  
  10. bool LHSpritePlayer::init(void)
  11. {  
  12.     return LHSprite::init();  
  13. }  
  14. //------------------------------------------------------------------------------  
  15. LHSpritePlayer::LHSpritePlayer()
  16. {  
  17.     life = 100;  
  18.     magic = 50;  
  19. }  
  20. //------------------------------------------------------------------------------  
  21. LHSprite* LHSpritePlayer::spriteWithFile(const char *pszFileName, const CCRect& rect)  
  22. {  
  23.     LHSpritePlayer *pobSprite = new LHSpritePlayer();  
  24.     if (pobSprite && pobSprite->initWithFile(pszFileName, rect))  
  25.     {  
  26.         pobSprite->autorelease();  
  27.         return pobSprite;  
  28.     }  
  29.     CC_SAFE_DELETE(pobSprite);  
  30.     return NULL;  
  31. }  
  32. //------------------------------------------------------------------------------  
  33. LHSprite* LHSpritePlayer::spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect)  
  34. {  
  35.     LHSpritePlayer *pobSprite = new LHSpritePlayer();  
  36.     if (pobSprite && pobSprite->initWithBatchNode(batchNode, rect))  
  37.     {  
  38.         pobSprite->autorelease();  
  39.         return pobSprite;  
  40.     }  
  41.     CC_SAFE_DELETE(pobSprite);  
  42.     return NULL;  
  43. }  
  44. //------------------------------------------------------------------------------  
  45. bool LHSpritePlayer::isSpritePlayer(LHSprite* object)
  46. {  
  47.     if( 0 != dynamic_cast<LHSpitePlayer*>(object))
  48. {  
  49.         return true;  
  50.   }
  51.     return false;  
  52. }  
  53.  

2、把LHSpitePlayer载入到关卡

需要注意的是所有自定义的LHSpite都需要关联一个LevelHelper的tag,换句话说就是给自定义的类型做一个唯一的标记。详细参考下面的代码实现。

  1. LHCustomSpriteMgr::sharedInstance()->registerCustomSpriteClassForTag(&LHSpritePlayer::spriteWithFile,  
  2.                                                                      &LHSpritePlayer::spriteWithBatchNode,  
  3.                                                                      PLAYER_TAG);  
  4.  
  5. LHCustomSpriteMgr::sharedInstance()->registerCustomSpriteClassForTag(&LHSpriteOtherCustomClass::spriteWithFile,  
  6.                                                                      &LHSpriteOtherCustomClass::spriteWithBatchNode,  
  7.                                                                      OTHER_TAG);  
  8. //这里你可以添加任意你想要的类型   
  9. // ...
  10.  
  11. loader = new LevelHelperLoader("levelTestDict.plhs");  
  12. loader->addObjectsToWorld(world, this); 

看,多么的简单,不会觉得很蛋疼吧?

3、从关卡中获得LHSpitePlayer的引用

在上一步中,我们把关卡载入进来了。你肯定会想要一个指向player对象的指针。

因为我们要确认它是否真正属于LHSpritePlayer类,所以在赋值之前必须先作检测。

  1. LHSprite* testSpr = loader->spriteWithUniqueName("PlayerSpriteNameInLevelHelper");  
  2.       
  3. if(LHSpritePlayer::isSpritePlayer(testSpr))  
  4. {  
  5.    LHSpritePlayer* playerSprite = (LHSpritePlayer*)testSpr;  
  6.    CCLog("Player sprite has life %d and magic %d", playerSprite->life, playerSprite->magic);  

如果你很确信它真正属于LHSpitePlayer类。你可以不用检测,直接用下面的方法:

  1. LHSpritePlayer* playerSprite = (LHSpritePlayer*)loader->spriteWithUniqueName("PlayerSpriteNameInLevelHelper");  

很显然,第一种方法更加安全。(但它不应该定义成一个临时变量。我这样写,只是为了跟容易理解)

以上就是你想要建立一个自定义的LHSpite所需要知道的一些内容

返回游戏开发教程...