热门IT资讯网

LevelHelper Cocos2d-x with Box2d(一)自定义精灵

发表于:2024-11-28 作者:热门IT资讯网编辑
编辑最后更新 2024年11月28日,用LevelHelper所提供的LHSprite是非常方便的,也非常好用。但有时候我们的精灵需要有更多的信息。例如我们需要建一个玩家类,可能它存在生命值,魔法值等其他信息。这些信息都是LevelHel

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

// LHSpiteHelper.cpp

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

2、把LHSpitePlayer载入到关卡

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

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

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

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

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

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

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

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

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

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

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

0