LevelHelper Cocos2d-x with Box2d(一)自定义精灵
用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" usingnamespacecocos2d; classLHSpritePlayer:publicLHSprite { public: intlife; intmagic; //添加你想要的属性,或者把这些属性设为private //构造函数,初始化 virtualboolinit(void); virtual~LHSpritePlayer(void); LHSpritePlayer(); //为了让你创建的自定义精灵能正常运行,以下2个函数是必须的 staticLHSprite*spriteWithFile(constchar*pszFileName,constCCRect&rect); staticLHSprite*spriteWithBatchNode(CCSpriteBatchNode*batchNode,constCCRect&rect); //------------------------------------------------------------------------------ //检测是否真正属于LHSpritePlayer类型staticboolisSpritePlayer(LHSprite*object); //------------------------------------------------------------------------------ //在这里加入你其他的接口函数...private: }; //////////////////////////////////////////////////////////////////////////////// #endif
// LHSpiteHelper.cpp
#include"LHSpritePlayer.h" //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// LHSpritePlayer::~LHSpritePlayer(void){ //释放你动态分配的属性 } //------------------------------------------------------------------------------ boolLHSpritePlayer::init(void){ returnLHSprite::init(); } //------------------------------------------------------------------------------ LHSpritePlayer::LHSpritePlayer(){ life=100; magic=50; } //------------------------------------------------------------------------------ LHSprite*LHSpritePlayer::spriteWithFile(constchar*pszFileName,constCCRect&rect) { LHSpritePlayer*pobSprite=newLHSpritePlayer(); if(pobSprite&&pobSprite->initWithFile(pszFileName,rect)) { pobSprite->autorelease(); returnpobSprite; } CC_SAFE_DELETE(pobSprite); returnNULL; } //------------------------------------------------------------------------------ LHSprite*LHSpritePlayer::spriteWithBatchNode(CCSpriteBatchNode*batchNode,constCCRect&rect) { LHSpritePlayer*pobSprite=newLHSpritePlayer(); if(pobSprite&&pobSprite->initWithBatchNode(batchNode,rect)) { pobSprite->autorelease(); returnpobSprite; } CC_SAFE_DELETE(pobSprite); returnNULL; } //------------------------------------------------------------------------------ boolLHSpritePlayer::isSpritePlayer(LHSprite*object){ if(0!=dynamic_cast<LHSpitePlayer*>(object)) { returntrue; }returnfalse; }
2、把LHSpitePlayer载入到关卡
需要注意的是所有自定义的LHSpite都需要关联一个LevelHelper的tag,换句话说就是给自定义的类型做一个唯一的标记。详细参考下面的代码实现。
LHCustomSpriteMgr::sharedInstance()->registerCustomSpriteClassForTag(&LHSpritePlayer::spriteWithFile, &LHSpritePlayer::spriteWithBatchNode, PLAYER_TAG); LHCustomSpriteMgr::sharedInstance()->registerCustomSpriteClassForTag(&LHSpriteOtherCustomClass::spriteWithFile, &LHSpriteOtherCustomClass::spriteWithBatchNode, OTHER_TAG); //这里你可以添加任意你想要的类型// ...loader=newLevelHelperLoader("levelTestDict.plhs"); loader->addObjectsToWorld(world,this);
看,多么的简单,不会觉得很蛋疼吧?
3、从关卡中获得LHSpitePlayer的引用
在上一步中,我们把关卡载入进来了。你肯定会想要一个指向player对象的指针。
因为我们要确认它是否真正属于LHSpritePlayer类,所以在赋值之前必须先作检测。
LHSprite*testSpr=loader->spriteWithUniqueName("PlayerSpriteNameInLevelHelper"); if(LHSpritePlayer::isSpritePlayer(testSpr)) { LHSpritePlayer*playerSprite=(LHSpritePlayer*)testSpr; CCLog("Playerspritehaslife%dandmagic%d",playerSprite->life,playerSprite->magic); }
如果你很确信它真正属于LHSpitePlayer类。你可以不用检测,直接用下面的方法:
LHSpritePlayer*playerSprite=(LHSpritePlayer*)loader->spriteWithUniqueName("PlayerSpriteNameInLevelHelper");
很显然,第一种方法更加安全。(但它不应该定义成一个临时变量。我这样写,只是为了跟容易理解)
以上就是你想要建立一个自定义的LHSpite所需要知道的一些内容
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。