游戏开始层

  1. #ifndef __LayerGameStart_H__
  2. #define __LayerGameStart_H__
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. class LayerGameStart :public CCLayer
  6. {
  7. public:
  8. static CCScene * scene();
  9. CREATE_FUNC(LayerGameStart);
  10. bool init();
  11. void addStartGamePicture();
  12. void addPreLoadMusic();
  13. void toMainGameCallback();
  14. };
  15. #endif

游戏主场景

  1. #include "cocos2d.h"
  2. #include "Plane.h"
  3. #include "LayerGameStart.h"
  4. #include "LayerBullet.h"
  5. #include "LayerEnemy.h"
  6. #include "LayerControl.h"
  7. #include "LayerFood.h"
  8. #include "LayerGameOver.h"
  9. USING_NS_CC;
  10. const int SMALL_SCORE = 1000;
  11. const int MID_SCORE = 6000;
  12. const int BIG_SCORE = 30000;
  13. const int MAX_BIGBOOM_COUNT = 100000;
  14. const int TAG_BIGBOOM = 1000;
  15. const int TAG_BIGBOOMCOUNT = 2000;
  16. class LayerGameMain :public CCLayer
  17. {
  18. public:
  19. static CCScene * scene();
  20. CREATE_FUNC(LayerGameMain);
  21. bool init();
  22. //加载主场景背景
  23. void addBackGround();
  24. //背景动起来
  25. void movingBackGround(float dt);
  26. void addHero();
  27. void addBulletLayer();
  28. void addEnemyLayer();
  29. void addCtrlLayer();
  30. void addFoodLayer();
  31. void updateBigBoomCount(int bigBoomCount);
  32. void boomMenuCallBack(CCObject * obj);
  33. enum BACKGROUND
  34. {
  35. BACK1, BACK2
  36. };
  37. void update(float dt);
  38. virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
  39. virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
  40. LayerBullet * _bulletLayer;
  41. LayerEnemy * _enemyLayer;
  42. LayerControl * _ctrlLayer;
  43. LayerFood * _foodLayer;
  44. static int score;
  45. static void setScore(int num);
  46. int bigBoomCount;
  47. };

碰撞检测

其中分为子弹与飞机的碰撞检测,飞机与飞机的碰撞检测,其中敌机分为大飞机,中飞机与小飞机,原理大致相同,这里只展示小飞机的原理与方法。

  1. CCARRAY_FOREACH(_bulletLayer->_bulletArray, bt)
  2. {
  3. CCSprite * bullet = (CCSprite*)bt;
  4. CCArray * smallEnemyToDel = CCArray::create();
  5.     CCARRAY_FOREACH(_enemyLayer->smallArray, et)
  6.     {
  7.         Enemy * smallEnemy = (Enemy *)et;
  8.         if (bullet->boundingBox().intersectsRect(smallEnemy->getBoundingBox()))
  9.         {
  10.             CCLog("%d", smallEnemy->getLife());
  11.             if (smallEnemy->getLife() == 1)
  12.             {
  13.                 smallEnemy->loseLife();
  14.                 bulletsToDel->addObject(bullet);
  15.                 smallEnemyToDel->addObject(smallEnemy);
  16.                 score += SMALL_SCORE;
  17.                 _ctrlLayer->updataScore(score);
  18.             }
  19.         }
  20.     }
  21.     CCARRAY_FOREACH(smallEnemyToDel, et)
  22.     {
  23.         Enemy * smallEnemy = (Enemy*)et;
  24.         _enemyLayer->smallEnemyBlowUp(smallEnemy);
  25.     }
  26.     smallEnemyToDel->release();
  27. }
  28.  
  29. `

飞机与飞机的碰撞检测

  1. //hero vs enemySmall
  2. CCRect planeRect = Plane::getInstance()->boundingBox();
  3. planeRect.origin.x += 30;
  4. planeRect.origin.y += 20;
  5. planeRect.size.width -= 60;
  6. planeRect.size.height -= 40;
  7. CCARRAY_FOREACH(_enemyLayer->smallArray,et)
  8. {
  9. Enemy * smallEnemy = (Enemy *)et;
  10. if (planeRect.intersectsRect(smallEnemy->getBoundingBox()))
  11. {
  12. _bulletLayer->stopShoot();
  13. unscheduleAllSelectors();
  14. Plane::getInstance()->blowUp();
  15. Plane::getInstance()->removePlane();
  16. _enemyLayer->smallEnemyBlowUp(smallEnemy);
  17. }
  18. }

飞机大战的分层

由于游戏的复杂性,需要将精灵分为好几个层次加入到游戏中,可以分为控制层,敌机层,食物层,子弹层等

控制层代码

  1. #ifndef __LayerControl_H__
  2. #define __LayerControl_H__
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. class LayerControl : public CCLayer
  6. {
  7. public:
  8. CREATE_FUNC(LayerControl);
  9. bool init();
  10. void menuCallBack(CCObject *obj);
  11. void updataScore(int score);
  12. private:
  13. CCMenuItemSprite * pauseMenuItem;
  14. CCLabelBMFont * scoreItem;
  15. };
  16. #endif

食物层代码

  1. #ifndef __LayerFood_H__
  2. #define __LayerFood_H__
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. class LayerFood :public CCLayer
  6. {
  7. public:
  8. CREATE_FUNC(LayerFood);
  9. bool init();
  10. //void addMultiBullets(float dt);
  11. //void multiBulletsMoveFinished(CCNode * pSender);
  12. //void removeMultiBullets(CCSprite *mb);
  13. void addBigBoom(float dt);
  14. void bigBoomMoveFinished(CCNode *pSender);
  15. void removeBigBoom(CCSprite *bb);
  16. public:
  17. CCArray * multiBulletArray;
  18. CCArray * bigBoomArray;
  19. };
  20. #endif

敌机层代码

  1. #ifndef __LayerEnemy_H__
  2. #define __LayerEnemy_H__
  3. #include "cocos2d.h"
  4. #include "Enemy.h"
  5. USING_NS_CC;
  6. const int SMALL_MAXLIFE = 1;
  7. const int MID_MAXLIFE = 3;
  8. const int BIG_MAXLIFE = 5;
  9. class LayerEnemy: public CCLayer
  10. {
  11. public:
  12. CREATE_FUNC(LayerEnemy);
  13. bool init();
  14. void addSmallEnemy(float dt);
  15. void smallEnemyMovefinished(CCNode *node);
  16. void smallEnemyBlowUp(Enemy * smallEnemy);
  17. void removeSmallEnemy(CCNode * target, void * data);
  18. void removeAllSmallEnemy();
  19. void addMidEnemy(float dt);
  20. void midHitAnimate(Enemy *midEnemy);
  21. void midEnemyMovefinished(CCNode *node);
  22. void midEnemyBlowUp(Enemy * midEnemy);
  23. void removeMidEnemy(CCNode * target, void * data);
  24. void removeAllMidEnemy();
  25. void addBigEnemy(float dt);
  26. void bigHitAnimate(Enemy *midEnemy);
  27. void bigEnemyMovefinished(CCNode *node);
  28. void bigEnemyBlowUp(Enemy * bigEnemy);
  29. void removeBigEnemy(CCNode * target, void * data);
  30. void removeAllBigEnemy();
  31. void removeAllEnemy();
  32. CCArray * smallArray;
  33. CCArray *midArray;
  34. CCArray *bigArray;
  35. };
  36. #endif

子弹层代码

  1. #ifndef __LayerBullet_H__
  2. #define __LayerBullet_H__
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. class LayerBullet: public CCLayer
  6. {
  7. public:
  8. CREATE_FUNC(LayerBullet);
  9. bool init();
  10. void startShoot();
  11. void stopShoot();
  12. void addBulletCallback(float dt);
  13. void bulletMoveFinished(CCNode* node);
  14. void removeBullet(CCSprite* bullet);
  15. CCArray *_bulletArray;
  16. CCSpriteBatchNode * _bulletBatchNode;
  17. };
  18. #endif

运行结果



cocos2dx实现经典飞机大战的更多相关文章

  1. cocos2dx 3.0 飞机大战

    因为课程须要.然后又水平有限.所以写了个飞机大战.加上不会画画.所以图片资源也是从微信apk解压出来的,设计思路參考的偶尔e网事. 闲话不说.先讲一下设计.大体上一共分为3个场景.场景以下是Layer ...

  2. 【cocos2d-x 3.7 飞机大战】 决战南海I (三) 敌机实现

    如今来实现敌机类 敌机和我方飞机相似,具有生命值.能够发射子弹.而且有自己的运动轨迹.事实上能够为它们设计一个共同的基类,这样能够更方便扩展. 不同的敌机,应设置不同的标识.属性 // 敌机生命值 c ...

  3. 【cocos2d-x 3.7 飞机大战】 决战南海I (十) 游戏主场景

    主场景要包括其它类的头文件 #include "cocos2d.h" #include "MyPlane.h" #include "Bullet.h& ...

  4. 【cocos2d-x 3.7 飞机大战】 决战南海I (二) 我方飞机的实现

    在上一篇中.我们实现了游戏的開始界面,接下来要实现游戏的主界面.主界面包括地图.我方飞机.敌机等 先来实现我方飞机 我方飞机具有哪些属性呢? 飞机要具有生命值.要有动画效果(尾部喷气),飞机不可以飞出 ...

  5. 【cocos2d-x 3.7 飞机大战】 决战南海I (四) 敌机管理

    敌方飞机应该不定时的出现,有自己的生命周期.运动轨迹.这个类用来管理敌机的产生.移动.爆炸.销毁等. 敌机管理类主要函数例如以下 //绑定控制器(更新分数) void bindController(C ...

  6. 【cocos2d-x 3.7 飞机大战】 决战南海I (七) 控制器的实现

    控制器中的功能并不多,主要是以下这些 //对玩家分数的操作 CC_SYNTHESIZE_READONLY(SaveData *, m_saveData, SaveData); void update( ...

  7. 【cocos2d-x 3.7 飞机大战】 决战南海I (八) 背景移动

    採用双层背景.这样效果更好 .h class BackgroundMove : public Layer { public: BackgroundMove(); ~BackgroundMove(); ...

  8. 【cocos2d-x 3.7 飞机大战】 决战南海I (十二) 游戏结束场景

    游戏结束的时候,要显示分数.还要可以选择是返回主场景还是退出游戏 // 退出游戏 void menuCloseCallback(cocos2d::Ref* pSender); // 返回主界面 voi ...

  9. 【Web前端Talk】无聊吗?写个【飞机大战】来玩吧(上篇)

    01前言介绍 微信小游戏是基于微信客户端的游戏,它即点即玩,无需下载安装,体验轻便,可以和微信内的好友一起玩,比如PK.围观等,享受小游戏带来的乐趣.那如何开发一款属于自己的小游戏呢? 源码地址: h ...

随机推荐

  1. 数组实现栈的结构(java)

    自定义数组实现栈的结构. package test; public class MyArrayStackClient { public static void main(String[] args) ...

  2. Message

    * Defines a message containing a description and arbitrary data object that can be* sent to a {@link ...

  3. tmux下的滚屏

    先Ctrl+b进入tmux的操作模式,然后用PageUp和PageDown,

  4. hdu 1008 Elevator

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description The hig ...

  5. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

  6. vs2012 智能提示消失解决办法

    一般你可以重启vs就可以解决问题,最蛋疼的是你重启也没用.只能重置,再不行就重装vs,再不行你就重装系统......扯淡了... 重置Visual Studio可以解决此问题, 方法:开始->M ...

  7. JS设置cookie,删除cookie

    js设置cookie有很多种方法. 第一种:(这个是w3c官网的代码) <script> //设置cookie function setCookie(cname, cvalue, exda ...

  8. 浅谈setTimeout函数和setInterval函数

    前几天学了js,看到了两个非常有趣的函数,他们分别是setTimeout函数和setInterval函数,这两个函数能使网页呈现非常一些网页中比较常见的效果,比如说图片轮播,等一些非常好玩的效果.下面 ...

  9. java笔记--查看和修改线程的优先级

    查看和修改线程的优先级 java中每一个线程都有优先级属性,在默认情况下,新建的线程的优先级与创建该线程的线程优先级相同.每当线程调度器选择要运行的线程时,通常选择优先级较高的线程. 注:线程的优先级 ...

  10. 关于showModalDialog()对话框点击按钮弹出新页面的问题

    页面a.aspx上,单击按钮a,走脚本,弹出showModalDialog("b.aspx",....) 在b.aspx上有个服务器控件按钮b,单击按钮,更新数据后,会弹出一个新的 ...