基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)相关的知识,希望对你有一定的参考价值。

最近接触过几个版本的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 };

以上是关于基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)的主要内容,如果未能解决你的问题,请参考以下文章

基于Cocos2d-x-1.0.1的飞机大战游戏迁移到Cocos2d-x-3.0版本,并移植到Android平台成功运行

基于Java的飞机大战游戏的设计与实现

雷电飞机大战游戏|基于Java开发实现雷电飞机大战游戏

雷电飞机大战游戏|基于Java开发实现雷电飞机大战游戏

基于Python+MySQL的飞机大战游戏包含用户登录

基于Java的飞机大战的课程设计与实现