温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-05-06 10:26:13 阅读:2384 作者:丶雨季 栏目:游戏开发
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

用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;      //添加你想要的属性,或者把这些属性设为private            //构造函数,初始化      virtual bool init(void);      virtual ~LHSpritePlayer(void);      LHSpritePlayer();                //为了让你创建的自定义精灵能正常运行,以下2个函数是必须的      static LHSprite* spriteWithFile(const char *pszFileName, const CCRect& rect);      static LHSprite* spriteWithBatchNode(CCSpriteBatchNode *batchNode, const CCRect& rect);       //------------------------------------------------------------------------------      //检测是否真正属于LHSpritePlayer类型    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所需要知道的一些内容

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×