最近接觸過幾個版本的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 };