cocos2dx实现经典飞机大战
游戏开始层
#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实现经典飞机大战的更多相关文章
- cocos2dx 3.0 飞机大战
因为课程须要.然后又水平有限.所以写了个飞机大战.加上不会画画.所以图片资源也是从微信apk解压出来的,设计思路參考的偶尔e网事. 闲话不说.先讲一下设计.大体上一共分为3个场景.场景以下是Layer ...
- 【cocos2d-x 3.7 飞机大战】 决战南海I (三) 敌机实现
如今来实现敌机类 敌机和我方飞机相似,具有生命值.能够发射子弹.而且有自己的运动轨迹.事实上能够为它们设计一个共同的基类,这样能够更方便扩展. 不同的敌机,应设置不同的标识.属性 // 敌机生命值 c ...
- 【cocos2d-x 3.7 飞机大战】 决战南海I (十) 游戏主场景
主场景要包括其它类的头文件 #include "cocos2d.h" #include "MyPlane.h" #include "Bullet.h& ...
- 【cocos2d-x 3.7 飞机大战】 决战南海I (二) 我方飞机的实现
在上一篇中.我们实现了游戏的開始界面,接下来要实现游戏的主界面.主界面包括地图.我方飞机.敌机等 先来实现我方飞机 我方飞机具有哪些属性呢? 飞机要具有生命值.要有动画效果(尾部喷气),飞机不可以飞出 ...
- 【cocos2d-x 3.7 飞机大战】 决战南海I (四) 敌机管理
敌方飞机应该不定时的出现,有自己的生命周期.运动轨迹.这个类用来管理敌机的产生.移动.爆炸.销毁等. 敌机管理类主要函数例如以下 //绑定控制器(更新分数) void bindController(C ...
- 【cocos2d-x 3.7 飞机大战】 决战南海I (七) 控制器的实现
控制器中的功能并不多,主要是以下这些 //对玩家分数的操作 CC_SYNTHESIZE_READONLY(SaveData *, m_saveData, SaveData); void update( ...
- 【cocos2d-x 3.7 飞机大战】 决战南海I (八) 背景移动
採用双层背景.这样效果更好 .h class BackgroundMove : public Layer { public: BackgroundMove(); ~BackgroundMove(); ...
- 【cocos2d-x 3.7 飞机大战】 决战南海I (十二) 游戏结束场景
游戏结束的时候,要显示分数.还要可以选择是返回主场景还是退出游戏 // 退出游戏 void menuCloseCallback(cocos2d::Ref* pSender); // 返回主界面 voi ...
- 【Web前端Talk】无聊吗?写个【飞机大战】来玩吧(上篇)
01前言介绍 微信小游戏是基于微信客户端的游戏,它即点即玩,无需下载安装,体验轻便,可以和微信内的好友一起玩,比如PK.围观等,享受小游戏带来的乐趣.那如何开发一款属于自己的小游戏呢? 源码地址: h ...
随机推荐
- php编程常用经验
1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数&quo ...
- python学习易错点1
1.>>> d = {'x': 'A', 'y': 'B', 'z': 'C' } >>> for k, v in d.iteritems(): ... print ...
- hdu 2049 不容易系列之(4)——考新郎
在本博AC代码中,求CNM用的是Anm/amm没用阶乘的形式,两者皆可 #include <stdio.h> int main(void) { long long a,b,larr[21] ...
- Python 科学计算涉及模块
模块1.数据基础 numpy 模块2.数值运算 scipy 模块3.符号运算 sympy 模块4.图形绘制 matplotlib
- pthread 学习系列 case2-- pthread_mutex_t
许多互斥对象 如果放置了过多的互斥对象,代码就没有什么并发性可言,运行起来也比单线程解决方案慢.如果放置了过少的互斥对象,代码将出现奇怪和令人尴尬的错误.幸运的是,有一个中间立场.首先,互斥对象是用于 ...
- HttpRuntime应用程序的运行时
System.Web.HttpRuntime类是整个Asp.net服务器处理的入口. 这个类提供了一系列的静态属性,反映web应用程序域的设置信息,而且每个web应用程序域中存在一个System.We ...
- js控制固定div和随屏滚动div兼容多浏览器和纯css控制(来自网络)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- angular-ngSanitize模块-linky过滤器详解
本篇主要讲解angular中的linky这个过滤器.此过滤器依赖于ngSanitize模块. linky能找出文本中的链接,然后把它转换成html链接.什么意思,就是说,一段文本里有一个链接,但是这个 ...
- Linux中用st_mode判断文件类型
Linux中用st_mode判断文件类型 2012-12-11 12:41 14214人阅读 评论(4) 收藏 举报 分类: Linux(8) C/C++(20) 版权声明:本文为博主原创文章, ...
- jQuery基础细节
使用CDN版的jQuery 用托管在公共CDN(Content Delivery Network,内容分发网络)上的jQuery库,CDN是一种内容分发网络,当用户请求其数据时,CDN ...