游戏开始层

#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. Mysql 学习-索引的设计原则

    索引的设计不合理或者缺少索引都会对数据库和应用程序的性能造成障碍.高效的索引对获的良好性能非常重要.设计索引是,应该考虑一下准则: (1)索引并非语讹夺越好,若一个表中有大量索引,不仅占用磁盘空间,而 ...

  2. 浅谈Dynamic 关键字系列之三(上):ExpandoObject, DynamicObject, DynamicMetaObject

    http://www.cnblogs.com/LoveJenny/archive/2011/07/05/2098578.html ExpandoObject:表示一个对象,该对象包含可在运行时动态添加 ...

  3. MyEclipse------从MySQL取出图片

    showImage.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  4. eclipse错误:Unable to read workbench state. Workbench UI layout will be reset.XML document structures

    Unable to read workbench state. Workbench UI layout will be reset.XML document structures must start ...

  5. bootstrap-select搜索框输入中文

    bootstrap-select 的搜索框无法输入中文,解决办法: 删除源码中这两行代码 that.$lis.not('.hidden, .divider, .dropdown-header').eq ...

  6. PQ格式化虚拟机硬盘如何生效

    用pq格式化虚拟机硬盘后,安装时,总是从dhcp的网卡启动,没有从硬盘启动 但是用ghost是可以拷贝镜像文件的 这就是说,硬盘有了,但是没有将硬盘"激活",没有将硬盘设为acti ...

  7. 百科编辑器ueditor应用笔记

    最近项目上要用到文本编辑器,选了百科开源的ueditor,使用过程中虽然有些问题,但是一个个都解决了,记录如下: 开发的项目环境是vs2012:.net4.0: 1:百度js编辑器,编辑器加载到项目中 ...

  8. Jquery Validate 正则表达式实用验证代码

    jQuery.validate 的正则验证功能,包括手机号码.电话号码.邮政编码.QQ号码.IP地址.字母和数字.中文的验证等. 手机号码验证 以下为引用内容:  jQuery.validator.a ...

  9. iOS开发之#iPhone6与iPhone6Plus适配#Xcode6.0/Xcode6.1上传应用过程中一些变动以及#解决方案#

    更新时间2014年11月13日  本博文创建时,只有Xcode6.0, Xcode6.0尝试多次,确实如此 之后在6.1版本经博主少量尝试,确实也有如下问题,现更新下博客! iOS8发布之后,苹果强制 ...

  10. Highways(prim & MST)

    Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23421   Accepted: 10826 Descri ...