91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LevelHelper Cocos2d-x with Box2d(一)自定義精靈

發布時間:2020-05-06 10:26:13 來源:網絡 閱讀:2374 作者:丶雨季 欄目:游戲開發

用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所需要知道的一些內容

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

遂平县| 新昌县| 温宿县| 渭源县| 广水市| 荔浦县| 弋阳县| 赤峰市| 姜堰市| 望江县| 邹平县| 孝义市| 乡宁县| 天峻县| 平江县| 德州市| 化隆| 霸州市| 德令哈市| 龙川县| 扎兰屯市| 湘潭县| 衡水市| 章丘市| 同德县| 黄浦区| 信丰县| 潼关县| 黑山县| 微山县| 南乐县| 马龙县| 聂拉木县| 修水县| 泊头市| 望江县| 开化县| 阳西县| 镇安县| 垫江县| 乐昌市|