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