游戏开始层

#ifndef __LayerGameStart_H__
#define __LayerGameStart_H__
#include "cocos2d.h"
USING_NS_CC; class LayerGameStart :public CCLayer
{
public:
static CCScene * scene();
CREATE_FUNC(LayerGameStart);
bool init(); void addStartGamePicture();
void addPreLoadMusic();
void toMainGameCallback(); }; #endif

游戏主场景

#include "cocos2d.h"
#include "Plane.h"
#include "LayerGameStart.h"
#include "LayerBullet.h"
#include "LayerEnemy.h"
#include "LayerControl.h"
#include "LayerFood.h"
#include "LayerGameOver.h"
USING_NS_CC; const int SMALL_SCORE = 1000;
const int MID_SCORE = 6000;
const int BIG_SCORE = 30000; const int MAX_BIGBOOM_COUNT = 100000;
const int TAG_BIGBOOM = 1000;
const int TAG_BIGBOOMCOUNT = 2000;
class LayerGameMain :public CCLayer
{
public:
static CCScene * scene();
CREATE_FUNC(LayerGameMain);
bool init();
//加载主场景背景
void addBackGround();
//背景动起来
void movingBackGround(float dt);
void addHero();
void addBulletLayer();
void addEnemyLayer();
void addCtrlLayer();
void addFoodLayer(); void updateBigBoomCount(int bigBoomCount); void boomMenuCallBack(CCObject * obj);
enum BACKGROUND
{
BACK1, BACK2
};
void update(float dt);
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
LayerBullet * _bulletLayer;
LayerEnemy * _enemyLayer;
LayerControl * _ctrlLayer;
LayerFood * _foodLayer;
static int score;
static void setScore(int num);
int bigBoomCount; };

碰撞检测

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

CCARRAY_FOREACH(_bulletLayer->_bulletArray, bt)
{
CCSprite * bullet = (CCSprite*)bt;
CCArray * smallEnemyToDel = CCArray::create();
    CCARRAY_FOREACH(_enemyLayer->smallArray, et)
{
Enemy * smallEnemy = (Enemy *)et;
if (bullet->boundingBox().intersectsRect(smallEnemy->getBoundingBox()))
{
CCLog("%d", smallEnemy->getLife());
if (smallEnemy->getLife() == 1)
{
smallEnemy->loseLife();
bulletsToDel->addObject(bullet);
smallEnemyToDel->addObject(smallEnemy);
score += SMALL_SCORE;
_ctrlLayer->updataScore(score);
}
}
}
CCARRAY_FOREACH(smallEnemyToDel, et)
{
Enemy * smallEnemy = (Enemy*)et;
_enemyLayer->smallEnemyBlowUp(smallEnemy);
}
smallEnemyToDel->release();
}

“`

飞机与飞机的碰撞检测

//hero vs enemySmall
CCRect planeRect = Plane::getInstance()->boundingBox();
planeRect.origin.x += 30;
planeRect.origin.y += 20;
planeRect.size.width -= 60;
planeRect.size.height -= 40; CCARRAY_FOREACH(_enemyLayer->smallArray,et)
{
Enemy * smallEnemy = (Enemy *)et;
if (planeRect.intersectsRect(smallEnemy->getBoundingBox()))
{
_bulletLayer->stopShoot();
unscheduleAllSelectors();
Plane::getInstance()->blowUp();
Plane::getInstance()->removePlane();
_enemyLayer->smallEnemyBlowUp(smallEnemy); }
}

飞机大战的分层

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

控制层代码

    #ifndef __LayerControl_H__
#define __LayerControl_H__ #include "cocos2d.h"
USING_NS_CC; class LayerControl : public CCLayer
{
public:
CREATE_FUNC(LayerControl);
bool init(); void menuCallBack(CCObject *obj);
void updataScore(int score); private:
CCMenuItemSprite * pauseMenuItem;
CCLabelBMFont * scoreItem;
}; #endif

食物层代码

#ifndef __LayerFood_H__
#define __LayerFood_H__ #include "cocos2d.h"
USING_NS_CC;
class LayerFood :public CCLayer
{
public:
CREATE_FUNC(LayerFood);
bool init(); //void addMultiBullets(float dt);
//void multiBulletsMoveFinished(CCNode * pSender);
//void removeMultiBullets(CCSprite *mb); void addBigBoom(float dt);
void bigBoomMoveFinished(CCNode *pSender);
void removeBigBoom(CCSprite *bb); public:
CCArray * multiBulletArray;
CCArray * bigBoomArray; }; #endif

敌机层代码

#ifndef __LayerEnemy_H__
#define __LayerEnemy_H__ #include "cocos2d.h"
#include "Enemy.h" USING_NS_CC; const int SMALL_MAXLIFE = 1;
const int MID_MAXLIFE = 3;
const int BIG_MAXLIFE = 5; class LayerEnemy: public CCLayer
{
public:
CREATE_FUNC(LayerEnemy);
bool init(); void addSmallEnemy(float dt);
void smallEnemyMovefinished(CCNode *node);
void smallEnemyBlowUp(Enemy * smallEnemy);
void removeSmallEnemy(CCNode * target, void * data);
void removeAllSmallEnemy(); void addMidEnemy(float dt);
void midHitAnimate(Enemy *midEnemy);
void midEnemyMovefinished(CCNode *node);
void midEnemyBlowUp(Enemy * midEnemy);
void removeMidEnemy(CCNode * target, void * data);
void removeAllMidEnemy(); void addBigEnemy(float dt);
void bigHitAnimate(Enemy *midEnemy);
void bigEnemyMovefinished(CCNode *node);
void bigEnemyBlowUp(Enemy * bigEnemy);
void removeBigEnemy(CCNode * target, void * data);
void removeAllBigEnemy(); void removeAllEnemy(); CCArray * smallArray;
CCArray *midArray;
CCArray *bigArray;
}; #endif

子弹层代码

#ifndef __LayerBullet_H__
#define __LayerBullet_H__ #include "cocos2d.h"
USING_NS_CC; class LayerBullet: public CCLayer
{
public:
CREATE_FUNC(LayerBullet);
bool init(); void startShoot();
void stopShoot();
void addBulletCallback(float dt);
void bulletMoveFinished(CCNode* node);
void removeBullet(CCSprite* bullet); CCArray *_bulletArray;
CCSpriteBatchNode * _bulletBatchNode;
}; #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. iOS开发编码建议与编程经验

    作者:乞力马扎罗的雪(GitHub) 原文 在开发过程中,我们不仅要去看别人的代码,也要让别人看我们的代码.那么,有一个良好的编码习惯将会非常重要.下面将会罗列使用Objective-C来开发iOS的 ...

  2. POJ2392Space Elevator(贪心+背包)

    Space Elevator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9970   Accepted: 4738 De ...

  3. POJ3020Antenna Placement(最小路径覆盖+重在构图)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7788   Accepted: 3880 ...

  4. android 读取sd卡中的图片

    一.获取读取SD卡的权限 <!--在SDCard中创建与删除文件权限  -->    <uses-permission android:name="android.perm ...

  5. MyEclipse修改项目名称后,部署到 tomcat问题

    问题描述: 修改项目名称后,部署到tomcat问题 解决方案: 项目->属性->myelcipse->web下,修 改web context root就可! 要在eclipse里面改 ...

  6. Linux之convert命令

    Linux之convert命令 强大的convert命令 convert命令可以用来转换图像的格式,支持JPG, BMP, PCX, GIF, PNG, TIFF, XPM和XWD等类型,下面举几个例 ...

  7. iphone6 wifi自动断开 tplink

    这样设置就好了,不会自动断开 了

  8. pthread_exit

    当主线程调用pthread_exit时,其余线程不退出,继续执行 当主线程调用exit/或return时,其余线程退出,整个进程都退出了. #include <pthread.h> #in ...

  9. xss跨站攻击测试代码

    '><script>alert(document.cookie)</script> ='><script>alert(document.cookie)& ...

  10. 解决mysqldump: Got error: 1044: Access denied for user

    转自:http://blog.slogra.com/post-512.html 今天给新加的几个数据库备份,在执行mysqldump的时候,居然报mysqldump: Got error: 1044: ...