• 基于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 };


     

    
    
  • 相关阅读:
    田忌赛马(动态规划)
    关于程序中使用相对路径的小技巧
    ReadyGo新闻管理系统 使用号召帖
    解决:Visual Studio2005打开UTF8网页文件时出现乱码
    10个不为人知 但绝对值得收藏的网站
    幻数
    模板偏特化的威力
    c++ 拷贝
    win7下Visualbox 装Ubuntu10.10, 装eclipsecdt+svn插件全过程
    找完工作的心情
  • 原文地址:https://www.cnblogs.com/Ray1024/p/5128737.html
Copyright © 2020-2023  润新知