亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

cocos2d-x 2x 菜鳥編塔防 01 準備工作

發布時間:2020-06-29 07:05:21 來源:網絡 閱讀:2657 作者:83628410 欄目:游戲開發
一.前言
最近在學習2dx,看了幾個源碼,手很是癢癢,下面跟我一下編寫一個類似保衛大蘿卜的塔防游戲吧。


二.不廢話開始編代碼。
我用的cocos2d-x 的版本是2.04 ,編輯器是vs2010.首先創建一個工程,我們取名字叫“TDgame”。
之后我們添加幾個常用到的模塊。
 
1.動畫管理器,AnimationManager類

 AnimationManager類這是個單例的類,大家要問這樣弄個單例類出來有什么好處呢,有什么作用呢,一開始我也是不明白,最后看了看魔塔的源代碼,總結了一下:
  1. 實現了一體化,也就是說把所有的動畫加載都放到一個函數中,我們可以讓這個函數出現在想要的位置上,比如,我們有一大堆的精靈動畫,如果在游戲中加載起來會讓游戲有點卡,這時候我們就可以創建一個進入游戲時的加載頁面,同時執行加載動畫。一般游戲也都是這么做的。
  2. 規范代碼,有利于編寫代碼。

好了它的優點和作用就說到這吧,肯定還有很多,我也就不知道了。

關于單例的問題大家可以看看這篇文章

http://www.zilongshanren.com/cocos2d-x-design-pattern-singleton1/

回到主題,首先我們粘貼一段代碼。

 


第一步:復制黏貼

在魔塔的源代碼中有一個單例類的模板,無腦的復制黏貼,這個模板是動畫管理器AnimationManager的基類,這個有什么用呢,其實用處很簡單就是一個單例的模板讓繼承他的子類都變成單例模式,下次再做別的游戲時用到直接繼承,多方便。當然你也可以不用這個模板,直接讓AnimationManager變成單例類。

 

  1. #ifndef _SINGLETON_H 
  2. #define _SINGLETON_H 
  3.  
  4. template <class T> 
  5. class Singleton 
  6. public
  7.     //獲取類的唯一實例 
  8.     static inline T* instance(); 
  9.     //釋放類的唯一實例 
  10.     void release(); 
  11. protected
  12.     Singleton(void){} 
  13.     ~Singleton(void){} 
  14.     static T* _instance; 
  15. }; 
  16.  
  17. template <class T> 
  18. inline T* Singleton<T>::instance() 
  19.     if(!_instance) 
  20.         _instance = new T; 
  21.     return _instance; 
  22.  
  23. template <class T> 
  24. void Singleton<T>::release() 
  25.     if (!_instance) 
  26.         return
  27.     delete _instance; 
  28.     _instance = 0; 
  29.  
  30. //cpp文件中需要先聲明靜態變量 
  31. #define DECLARE_SINGLETON_MEMBER(_Ty)   \ 
  32.     template <> _Ty* Singleton<_Ty>::_instance = NULL; 
  33.  
  34. #endif//_SINGLETON_H 
好了這樣我們的標準的單例基類就寫好了,記住這是一個.h文件

 注意:

1.子類要在子類的cpp文件開始寫上DECLARE_SINGLETON_MEMBER(子類的名字)

2.子類最好寫上構造和析構函數

 


第二步:編寫動畫管理器AnimationManager類

先看代碼:

AnimationManager.h

  1. #ifndef _ANIMATION_MANAGER_H_ 
  2. #define _ANIMATION_MANAGER_H_ 
  3.  
  4. #include "cocos2d.h" 
  5. #include "Singleton.h" 
  6. #include "type.h" 
  7. using namespace cocos2d; 
  8.  
  9. class AnimationManager : public Singleton<AnimationManager> 
  10. public
  11.     AnimationManager(); 
  12.     ~AnimationManager(); 
  13.     //初始化動畫模版緩存表 
  14.     bool initAnimationMap(); 
  15.     //根據名字得到一個動畫模板 
  16.     CCAnimation* getAnimation(int key); 
  17.     //創建一個動畫實例 
  18.     CCAnimate* createAnimate(int key); 
  19.     //創建一個動畫實例 
  20.     CCAnimate* createAnimate(const char* key); 
  21.     //清空所有緩存 
  22.     void releaseAllCacha(); 
  23. protected
  24.     //加載勇士行走動畫模版 
  25.     CCAnimation* createAnimationByDirection(HeroDirection direction); 
  26. }; 
  27. //定義動畫管理器實例的別名 
  28. #define sAnimationMgr AnimationManager::instance() 
  29.  
  30. #endif 

AnimationManager.cpp

 

  1. #include "AnimationManager.h" 
  2. DECLARE_SINGLETON_MEMBER(AnimationManager); 
  3.  
  4.  
  5.  
  6. AnimationManager::AnimationManager() 
  7.  
  8.  
  9. AnimationManager::~AnimationManager() 
  10.  
  11.  
  12. bool AnimationManager::initAnimationMap() 
  13.     bool sRet = false
  14.     do  
  15.     { 
  16.         //1.添加圖片進內存 
  17.         CCTexture2D * creepTexture = CCTextureCache::sharedTextureCache()->addImage("boy.png"); 
  18.         CC_BREAK_IF(!creepTexture); 
  19.         //2.加載各個方向的敵人動畫 
  20.         char temp[20]; 
  21.         sprintf(temp, "%d", aDown); 
  22.         //加載勇士向下走的動畫 
  23.         CCAnimationCache::sharedAnimationCache()->addAnimation(createAnimationByDirection(kDown), temp); 
  24.         sprintf(temp, "%d", aRight); 
  25.         //加載勇士向右走的動畫 
  26.         CCAnimationCache::sharedAnimationCache()->addAnimation(createAnimationByDirection(kRight), temp); 
  27.         sprintf(temp, "%d", aLeft); 
  28.         //加載勇士向左走的動畫 
  29.         CCAnimationCache::sharedAnimationCache()->addAnimation(createAnimationByDirection(kLeft), temp); 
  30.         sprintf(temp, "%d", aUp); 
  31.         //加載勇士向上走的動畫 
  32.         CCAnimationCache::sharedAnimationCache()->addAnimation(createAnimationByDirection(kUp), temp); 
  33.  
  34.         sRet = true
  35.     } while (0); 
  36.     return sRet; 
  37.  
  38. CCAnimation* AnimationManager::getAnimation( int key ) 
  39.     char temp[20]; 
  40.     sprintf(temp, "%d", key); 
  41.     return CCAnimationCache::sharedAnimationCache()->animationByName(temp); 
  42.  
  43. CCAnimate* AnimationManager::createAnimate( int key ) 
  44.     //獲取指定動畫模版 
  45.     CCAnimation* anim = getAnimation(key); 
  46.     if(anim) 
  47.     { 
  48.         //根據動畫模版生成一個動畫實例 
  49.     //  return cocos2d::CCAnimate::actionWithAnimation(anim); 
  50.         return cocos2d::CCAnimate::create(anim); 
  51.     } 
  52.     return NULL; 
  53.  
  54. CCAnimate* AnimationManager::createAnimate( const char* key ) 
  55.     //獲取指定動畫模版 
  56.     CCAnimation* anim = CCAnimationCache::sharedAnimationCache()->animationByName(key); 
  57.     if(anim) 
  58.     { 
  59.         //根據動畫模版生成一個動畫實例 
  60.         return cocos2d::CCAnimate::create(anim); 
  61.     } 
  62.     return NULL; 
  63.  
  64. CCAnimation* AnimationManager::createAnimationByDirection( HeroDirection direction ) 
  65.     //3.生產剪切動畫 
  66.     CCTexture2D * creepTexture=CCTextureCache::sharedTextureCache()->textureForKey("boy.png"); 
  67.     CCSpriteFrame *frame0, *frame1, *frame2, *frame3; 
  68.     frame0 = CCSpriteFrame::createWithTexture(creepTexture, cocos2d::CCRectMake(47*0, 95*direction, 47, 95)); 
  69.     frame1 = CCSpriteFrame::createWithTexture(creepTexture, cocos2d::CCRectMake(47*1, 95*direction, 47, 95)); 
  70.     frame2 = CCSpriteFrame::createWithTexture(creepTexture, cocos2d::CCRectMake(47*2, 95*direction, 47, 95)); 
  71.     frame3 = CCSpriteFrame::createWithTexture(creepTexture, cocos2d::CCRectMake(47*3, 95*direction, 47, 95)); 
  72.     CCArray * animFrames = new CCArray(4); 
  73.     animFrames->addObject(frame0); 
  74.     animFrames->addObject(frame1); 
  75.     animFrames->addObject(frame2); 
  76.     animFrames->addObject(frame3); 
  77.     CC_SAFE_RETAIN(animFrames); 
  78.     CCAnimation * animation= CCAnimation::createWithSpriteFrames(animFrames,0.5f); 
  79.  
  80.     animFrames->release(); 
  81.     return animation; 
  82.  
  83. void AnimationManager::releaseAllCacha() 
  84.      

 

建立完這個動畫管理單例后,用法也是很簡單,只需要調用那幾個getXXXX 就行,當然這個動畫管理器功能還比較簡單,因為我是個新手所以不能一下吧所有的功能都寫上,還是先用到哪些寫那些。

 


第三步:全局數據

之后我們在建立一個單例類,來保存一些全局數據

HWorld.h

  1. #ifndef __HWORLD_H__ 
  2. #define __HWORLD_H__ 
  3.  
  4. #include "cocos2d.h" 
  5. #include "type.h" 
  6. #include "Singleton.h" 
  7. using namespace cocos2d; 
  8. class HWorld: 
  9.     public Singleton<HWorld> 
  10. public
  11.     HWorld(); 
  12.     ~HWorld(); 
  13.     //初始化 
  14.     bool initHWorld(); 
  15.     //清空所有緩存 
  16.     void releaseAll(); 
  17. public
  18.     //路點數組 
  19.     CCPointArray * _wayPoint;    
  20. }; 
  21. //定義動畫管理器實例的別名 
  22. #define sHWorld HWorld::instance() 
  23. #endif

HWorld.cpp

 

  1. #include "HWorld.h"  
  2. DECLARE_SINGLETON_MEMBER(HWorld);  
  3.  
  4. bool HWorld::initHWorld()  
  5. {  
  6.     return true;  
  7. }  
  8.  
  9. void HWorld::releaseAll()  
  10. {  
  11. }  
  12.  
  13. HWorld::HWorld()  
  14. {  
  15. }  
  16.  
  17. HWorld::~HWorld()  
  18. {  
  19. }  

目前這個類里面之后一個路點的數組,這個數組中保存了地圖上需要轉彎地方的坐標,其他的東西以后再添加。

當然還有我們的枚舉,把它放在一個.h文件中,方便查看

type.h

 

  1. #ifndef __TYPE_H__  
  2. #define __TYPE_H__  
  3.  
  4. typedef enum {  
  5.     kDown =  0,//向下方向  
  6.     kLeft = 1,//向左方向  
  7.     kRight= 2,//向右方向  
  8.     kUp = 3,//向上方向  
  9.     kNormal,  
  10. } HeroDirection;//勇士方向  
  11.  
  12.  
  13. typedef enum 
  14. {  
  15.     aDown = 0,//向下行走動畫  
  16.     aLeft,//向左行走動畫  
  17.     aRight,//向右行走動畫  
  18.     aUp,//向上行走動畫  
  19.     aFight,//刀光動畫  
  20. } AnimationKey;//動畫模版鍵值  
  21. //定義怪物的類型  
  22. typedef enum 
  23. {  
  24.     kHighBlood=0,//高血量怪物  
  25.     kQuick = 1,  
  26.  
  27. }CreepType;  
  28. //----------------定義一個creep中所用到的tag--------  
  29. typedef enum 
  30. {  
  31.     kSprite =0,//精靈的標簽  
  32.     kSpeedAction = 1,//控制速度的action所用的標簽  
  33.     kFoveverAction = 2,//控制精靈幀的action標簽  
  34. }CreepTag;  
  35.  enum   
  36. {  
  37.     kZMap = 0,//地圖的zOrder  
  38.     kZNPC,  
  39.     kZTeleport,  
  40.     kZHero,//勇士精靈的zOrder  
  41.     kZTip,//提示信息的zOrder  
  42. };//GameLayer中各部分的顯示zOrder及tag  
  43. #endif 

 


好了,生成一下。

下一篇會讓我們的敵人動起來

向AI問一下細節

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

AI

同心县| 三亚市| 孝感市| 鄂托克前旗| 杂多县| 武安市| 鄂伦春自治旗| 冷水江市| 大英县| 湖南省| 三门县| 西峡县| 九江市| 和静县| 阳春市| 当涂县| 姚安县| 蚌埠市| 湾仔区| 凭祥市| 根河市| 谢通门县| 新余市| 定日县| 满洲里市| 徐闻县| 临沧市| 彰化市| 游戏| 敦化市| 宁阳县| 茂名市| 郴州市| 佛教| 卓尼县| 聂拉木县| 中卫市| 都匀市| 寿宁县| 容城县| 龙门县|