您好,登錄后才能下訂單哦!
用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所需要知道的一些內容
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。