最近接觸過幾個版本的cocos2dx,決定每個大變動的版本都嘗試一下。本實例模仿微信5.0版本中的飛機大戰游戲,如圖:
一、工具
1.素材:飛機大戰的素材(圖片、聲音等)來自於網絡
2.引擎:cocos2d-1.0.1-x-0.9.2
3.環境:vs2010
二、使用的類
1.游戲菜單界面類:PlaneWarMenu——派生自CCLayer類。
1 // 游戲菜單界面類 2 class PlaneWarMenu: public CCLayer 3 { 4 public: 5 virtual bool init(); 6 static cocos2d::CCScene* scene(); 7 8 virtual void menuStartCallback(CCObject* pSender); 9 virtual void menuManualCallback(CCObject* pSender); 10 virtual void menuAboutCallback(CCObject* pSender); 11 virtual void menuBackCallback(CCObject* pSender); 12 13 LAYER_NODE_FUNC(PlaneWarMenu); 14 };
2.游戲界面類:PlaneWarGame——派生自CCLayer類。
1 // 游戲界面類 2 class PlaneWarGame :public CCLayer 3 { 4 public: 5 PlaneWarGame(); 6 ~PlaneWarGame(); 7 static CCScene* scene(); 8 virtual bool init(); 9 10 // 游戲界面的初始化 11 bool initBackground(); 12 void bg1roll(); 13 void bg2roll(); 14 bool initMenu1(); 15 bool initMenu2(); 16 bool initMenu3(); 17 18 // 游戲界面內的菜單項回調 19 void menuPauseCallback(CCObject* pSender); 20 void menuSoundCallback(CCObject* pSender); 21 void menuBombCallback(CCObject* pSender); 22 void menuResumeCallback(CCObject* pSender); 23 void menuRestartCallback(CCObject* pSender); 24 void menuBackCallback(CCObject* pSender); 25 26 LAYER_NODE_FUNC(PlaneWarGame); 27 28 // 敵機產生 29 void addEnemy(float dt); 30 // 玩家發射子彈 31 void shoot(float dt); 32 // 游戲邏輯的循環 33 void gameLoop(float dt); 34 void addBullet(CCSprite* bullet, CCPoint pt); 35 // 道具的產生 36 void addProp(float dt); 37 // 游戲的碰撞檢測 38 void updateGame(float dt); 39 // 數據顯示 40 void show(); 41 // 游戲結束 42 void gameover(bool isWin); 43 44 void spriteMoveFinished(CCNode* sender); 45 void killAllEnemys(); 46 void releaseEnemys(); 47 48 // 鍵盤消息處理 49 void processWin32KeyPress(UINT message, WPARAM wParam, LPARAM lParam); 50 // 觸摸操作 51 void registerWithTouchDispatcher(); 52 virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); 53 virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); 54 virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); 55 protected: 56 57 // 游戲成員 58 PlaySprite* _player; // 玩家飛機 59 CCArray* _enemys; // 敵方飛機數組 60 CCArray* _bullets; // 子彈數組 61 int _bulletsDestroyed; // 子彈擊中目標個數 62 63 // 游戲控件 64 CCLabelBMFont* _label; // 分數標簽 65 CCMenuItemSprite* _pause; // 暫停按鈕 66 CCMenu* _menu; // 游戲界面內的菜單(暫停/聲音/炸彈) 67 68 // 主要游戲屬性 69 bool _issound; // 背景音樂開關 70 CCSize _size; // 游戲界面大小(屏幕大小) 71 int _score; // 分數 72 bool _isOver; // 游戲結束標志 73 };
3.游戲介紹類:PlaneWarInfoboard——派生自CCLayer類。
1 // 游戲介紹類 2 class PlaneWarInfoboard: public CCLayer 3 { 4 public: 5 virtual bool init(); 6 static cocos2d::CCScene* scene(); 7 8 virtual void menuBackCallback(CCObject* pSender); 9 10 LAYER_NODE_FUNC(PlaneWarInfoboard); 11 };
4.玩家角色類:PlaySprite——由於直接繼承CCSprite類使用不方便,所以從CCNode類派生,使用組合的方式使用CCSprite類。
1 // 玩家飛機的運動模式 2 enum moveMode{ 3 MM_NONE = 0, 4 MM_UP, 5 MM_DOWN, 6 MM_LEFT, 7 MM_RIGHT 8 }; 9 // 子彈類型 10 enum bulletKind{ 11 BK_SINGLE=0, 12 BK_DOUBLE 13 }; 14 15 // 玩家角色類 16 class PlaySprite: public CCNode 17 { 18 public: 19 virtual void onEnter(); 20 21 PlaySprite(); 22 ~PlaySprite(); 23 24 CCRect getRect(); 25 CCPoint getPlayerPt(); 26 void setPlayerPt(CCPoint pt); 27 28 void setMoveMode( UINT message, WPARAM wParam) ; 29 void move(float dt); 30 void die(); 31 void destroy(); 32 33 public: 34 // 屬性 35 moveMode _mode; // 運動方式(方向按鍵) 36 bool _isDragEnabled; // 可否被鼠標拖拽(鼠標移動) 37 38 bulletKind _bulletKind; // 子彈類型(吃道具可變雙發) 39 int _bombCount; // 炸彈數量(吃道具獲得) 40 41 protected: 42 CCSprite* _sprite; // 代表精靈 43 };
5.敵機類:EnemySprite——由於直接繼承CCSprite類使用不方便,所以從CCNode類派生,使用組合的方式使用CCSprite類。
1 enum EnemyKind{ 2 EK_SMALL=0, 3 EK_MIDDLE, 4 EK_BIG 5 }; 6 7 // 敵機類 8 class EnemySprite: public CCNode 9 {//敵機可有三種類型 10 public: 11 EnemySprite(); 12 ~EnemySprite(); 13 14 virtual void onEnter(); 15 16 CCRect getRect(); 17 18 void spriteMoveFinished(CCNode* sender); 19 20 void die(); 21 void destroy(); 22 23 bool isNull(); 24 public: 25 // 屬性 26 int _hp; // 血量 27 EnemyKind _enemyKind; // 敵機種類 28 bool _die; // 已死亡 29 bool _destroy; // 已釋放 30 31 protected: 32 CCSprite* _sprite; // 代表精靈 33 };