cocos2dx之飞机大战简单版1

先说下版本 vs2010+cocos2dx2.2


本章主要是告诉大家如何实现创建背景、飞机、***精灵,并且然后他们动起来,然后做一个碰撞测试,当***和敌方飞机碰撞时就销毁精灵并且加一个爆炸的精灵。



  1. 创建背景、飞机、***精灵

先在GameScene.h中添加以下成员

GameScene();
~GameScene();
voidaddMonster();
voidaddBullet1();
voidGameLogic(floatdt);
voidGameLogicaddBullet1(floatdt);
voidGameLogicaddBullet2(floatdt);
voidspriteMoveFinished(CCNode*sender);
voidkeyArrowClicked(intarrow);
voidccTouchesBegan(cocos2d::CCSet*pTouches,cocos2d::CCEvent*pEvent);
voidccTouchesMoved(cocos2d::CCSet*pTouches,cocos2d::CCEvent*pEvent);
cocos2d::CCArray*_monsters;
cocos2d::CCArray*_bullets;
cocos2d::CCSprite*player;
cocos2d::CCSprite*bgSprite1;
cocos2d::CCSizevisibleSize;
cocos2d::CCPointorigin;
intbgHeight;
intmonsterSpeed;

在GameScene::init()中添加以下代码

visibleSize=CCDirector::sharedDirector()->getVisibleSize();
origin=CCDirector::sharedDirector()->getVisibleOrigin();
bgHeight=(visibleSize.height+origin.y);
bgSprite1=CCSprite::create("background.png");
bgSprite1->setAnchorPoint(ccp(0.5,0));
bgSprite1->setPosition(ccp(visibleSize.width/2+origin.x,bgHeight));

this->addChild(bgSprite1,0);
player=CCSprite::create("player.png");
player->setPosition(ccp(origin.x+visibleSize.width/2,origin.y+player->getContentSize().height/2));
this->addChild(player,1);

这样,很简单我们就创建了一个背景精灵和一个飞机精灵,由于背景和飞机只有一个,所以我们可以考虑把他们设为类的成员


由于***和敌方飞机有很多,所以我们应该把他们单独写为函数,然后在init中设置一个计时器,通过计时器来设置多少秒调用一次函数,在函数中去添加***和敌方飞机精灵


首先先贴上添加***和敌方飞机的函数的代码

voidGameScene::addMonster(){
CCSprite*pMonster=CCSprite::create("monster.png");
intminX=pMonster->getContentSize().width/2;
intmaxX=visibleSize.width-pMonster->getContentSize().width/2;
intrangeX=maxX-minX;
intactualX=(rand()%rangeX)+minX;
pMonster->setPosition(ccp(actualX,origin.y+visibleSize.height-pMonster->getContentSize().height));
this->addChild(pMonster,1);
inttime=(origin.y+visibleSize.height-pMonster->getContentSize().height)/monsterSpeed;
//times内从原来位置到ccp(actualX,origin.y+pMonster->getContentSize().height/2)位置
CCMoveTo*actionMove=CCMoveTo::create(time,ccp(actualX,origin.y+pMonster->getContentSize().height/2));
CCCallFuncN*actionMoveDone=CCCallFuncN::create(this,callfuncN_selector(GameScene::spriteMoveFinished));
pMonster->runAction(CCSequence::create(actionMove,actionMoveDone,NULL));
voidGameScene::addBullet1(){
CCSprite*pBullet=CCSprite::create("bullet1.png");
floatx=player->getPositionX();
floaty=player->getPositionY();
pBullet->setPosition(ccp(x,y+40));
this->addChild(pBullet,2);
CCMoveTo*actionMove=CCMoveTo::create(1,ccp(x,origin.y+visibleSize.height-pBullet->getContentSize().height));
CCCallFuncN*actionMoveDone=CCCallFuncN::create(this,callfuncN_selector(GameScene::spriteMoveFinished));
pBullet->runAction(CCSequence::create(actionMove,NULL));

第一段代码中首先我们先添加了一个敌方飞机的精灵,注意敌方飞机出现的位置的x值是随机的,所以我们应该把它设为他出现位置的最大x值和最小x值的随机数

然后我们开始设置他的移动,CCMoveTo::create函数中第一个参数是移动的时间,第二个参数是,从原来的点移动到的那个点的值,然后我们设置一个actionMoveDone来设置当敌方飞机移动完了之后就销毁它,销毁的代码我们就设置spriteMoveFinished中

voidGameScene::spriteMoveFinished(CCNode*sender)
{
CCSprite*sprite=(CCSprite*)sender;
this->removeChild(sprite,true);
}

最后我们用runAction来移动精灵


在我们了解了如何移动敌方飞机了之后,我们移动***的代码就和容易理解了,几乎是一模一样的


我们现在只是完成了添加敌方飞机和***并让它们动了起来,然后我们还要在init中添加计时器还添加更多敌方飞机和***

在init中添加以下代码:

//生成敌方飞机
this->schedule(schedule_selector(GameScene::GameLogic),0.5);
//生成***
this->schedule(schedule_selector(GameScene::GameLogicaddBullet1),0.3);

上面函数的意思是,0.5s调用一次GameLogic函数,0.3s调用一次GameLogicaddBullet1函数。所以我们只需要在GameLogic中调用addMonster,在GameLogicaddBullet1中调用addBullet1就可以了

voidGameScene::GameLogic(floatdt)
{
this->addMonster();
}
voidGameScene::GameLogicaddBullet1(floatdt){
this->addBullet1();
}

注意一定要在参数中加上float dt,它是表明多少秒调用一次这个函数。


2.通过触屏移动飞机

现在只有敌方飞机和***会移动,我们玩家的飞机还不会移动,下面就教大家如何移动玩家飞机


首先先在init中添加

this->setTouchEnabled(true);

让程序支持触屏

然后重载ccTouchesBegan函数

voidGameScene::ccTouchesBegan(cocos2d::CCSet*pTouches,cocos2d::CCEvent*pEvent){
CCTouch*touch=(CCTouch*)pTouches->anyObject();
CCPointlocation=this->convertTouchToNodeSpace(touch);
//如果触摸点在屏外则将点设在屏幕边缘
if(location.x<origin.x+player->getContentSize().width/2)
location.x=origin.x+player->getContentSize().width/2;
if(location.x>origin.x+visibleSize.width-player->getContentSize().width/2)
location.x=origin.x+visibleSize.width-player->getContentSize().width/2;
if(location.y<origin.y+player->getContentSize().height/2)
location.y=origin.y+player->getContentSize().height/2;
if(location.y>origin.y+visibleSize.height-player->getContentSize().height/2)
location.y=origin.y+visibleSize.height-player->getContentSize().height/2;

floatx1=player->getPositionX();
floaty1=player->getPositionY();
floatx2=location.x;
floaty2=location.y;
floatlength=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
floatspeed=480;
floattime=length/speed;
//停止之前的动作
player->stopAllActions();
CCMoveTo*actionMove=CCMoveTo::create(time,location);
player->runAction(actionMove);
}

前两句是获取触摸点location,如果触摸点在屏幕外就把它设置在里面

因为CCMoveTo第一个参数是时间不是速度,我们为了让移动任何距离的速度都一样我们需要计算一下把时间设为变量,用勾股定理算出移动的长度,然后设置移动的速度,最后就可以算出移动的时间的


我们之前只是重载ccTouchesBegan函数,我们发现飞机只有在我们鼠标点下去的时候才会移动,飞机并不会随着我们鼠标的拖动而移动,所以我们还需要重载ccTouchesMoved函数

voidGameScene::ccTouchesMoved(cocos2d::CCSet*pTouches,cocos2d::CCEvent*pEvent){
CCTouch*touch=(CCTouch*)pTouches->anyObject();
CCPointlocation=this->convertTouchToNodeSpace(touch);
//如果触摸点在屏外则将点设在屏幕边缘
if(location.x<origin.x+player->getContentSize().width/2)
location.x=origin.x+player->getContentSize().width/2;
if(location.x>origin.x+visibleSize.width-player->getContentSize().width/2)
location.x=origin.x+visibleSize.width-player->getContentSize().width/2;
if(location.y<origin.y+player->getContentSize().height/2)
location.y=origin.y+player->getContentSize().height/2;
if(location.y>origin.y+visibleSize.height-player->getContentSize().height/2)
location.y=origin.y+visibleSize.height-player->getContentSize().height/2;

player->setPosition(location);
}

因为每一次拖动鼠标都会调用ccTouchesMoved函数,所以我们用setPosition就可以了

敌方飞机和***都会移动了,我们最后只需要设置碰撞就可以了


3.碰撞测试

因为,敌方飞机和***不是一个精灵所以我们要用一个容器把他们装起来

在init中添加

cocos2d::CCArray *_monsters;

cocos2d::CCArray *_bullets;

然后在构造函数中把他们初始化为NULL

在虚构函数中添加

GameScene::~GameScene(){
if(_monsters)
{
_monsters->release();
_monsters=NULL;
}
if(_bullets)
{
_bullets->release();
_bullets=NULL;
}
}

我们需要在添加飞机和***精灵的时候把他们装进容器里面

分别在addMonster和addBullet1中添加添加以下代码

//给敌方飞机添加标签,并把敌方飞机添加到数组中
pMonster->setTag(1);
_monsters->addObject(pMonster);

//给***添加标签,并把***添加到数组中
pBullet->setTag(2);
_bullets->addObject(pBullet);

然后在spriteMoveFinished中添加当销毁飞机和***和把他们从容器中删除

在spriteMoveFinished中添加以下代码

if(sprite->getTag()==1)
{
_monsters->removeObject(sprite);
}
elseif(sprite->getTag()==2)
{
_bullets->removeObject(sprite);
}

最后我们就可以做碰撞测试了,我们把碰撞做成一个计时器,让他每一帧调用一次来判断碰撞

在init中添加

voidGameScene::collision(floatdt){
CCArray*bulletsToDelete=CCArray::create();
CCObject*pObject=NULL;
CCObject*pObject2=NULL;
CCARRAY_FOREACH(_bullets,pObject){//遍历***数组
CCSprite*bullet=(CCSprite*)pObject;
CCArray*monstersToDelete=CCArray::create();
CCARRAY_FOREACH(_monsters,pObject2)//遍历敌方飞机数组
{
CCSprite*monster=(CCSprite*)pObject2;
if(bullet->boundingBox().intersectsRect(monster->boundingBox()))//判断***的边界是否碰到敌方飞机的边界
{
monstersToDelete->addObject(monster);//***碰到飞机边界的话就放入monstersToDelete中
bulletsToDelete->addObject(bullet);//同样***也要放入bulletsToDelete中
}
}
CCARRAY_FOREACH(monstersToDelete,pObject2)//遍历monstersToDelete,把待删除的飞机都删除了
{
CCSprite*monster=(CCSprite*)pObject2;
_monsters->removeObject(monster);
this->removeChild(monster,true);
}
monstersToDelete->release();
}
CCARRAY_FOREACH(bulletsToDelete,pObject)//遍历bulletsToDelete,把待删除的***都删除了
{
CCSprite*bullet=(CCSprite*)pObject;
_bullets->removeObject(bullet);
//爆炸点
CCSprite*monsterExplosion=CCSprite::create("monsterExplosion.png");
floatx=bullet->getPositionX();
floaty=bullet->getPositionY();
monsterExplosion->setPosition(ccp(x,y));
this->removeChild(bullet,true);
//爆炸
this->addChild(monsterExplosion,2);
CCActionInterval*fadeout=CCFadeOut::create(1);
CCCallFuncN*actionMoveDone=CCCallFuncN::create(this,callfuncN_selector(GameScene::spriteMoveFinished));
monsterExplosion->runAction(CCSequence::create(fadeout,NULL));
//爆炸音效
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("explosion.mp3");
//分数加一
score+=1;
}
bulletsToDelete->release();
//玩家飞机与敌方飞机碰撞
CCARRAY_FOREACH(_monsters,pObject2)//遍历敌方飞机数组
{
CCSprite*monster=(CCSprite*)pObject2;
if(player->boundingBox().intersectsRect(monster->boundingBox()))//判断玩家飞机的边界是否与敌方飞机碰撞
{
CCSprite*playerExplosion=CCSprite::create("playerExplosion.png");
playerExplosion->setPosition(player->getPosition());
this->addChild(playerExplosion,callfuncN_selector(GameScene::spriteMoveFinished));
playerExplosion->runAction(CCSequence::create(fadeout,NULL));
//失败画面
GameScene::gameOver();
}
}
}

我们把之前的***数组和敌方飞机容器遍历一边,判断他们是否碰撞,碰撞的话就放到一个待删除的容器中去,最后再遍历这个待删除的容器,把里面的精灵都删除了。

另外我们还需要在删除他们之前添加一个爆炸的精灵,达到飞机爆炸的效果。

接着我们遍历敌方飞机容器,判断它们和玩家飞机是否碰撞,碰撞的话就添加一个爆炸精灵,并且弹出失败的画面。


失败的画面我们会在下一章介绍,在下一章的内容中我们会进一步的完善我们的游戏,现在我们的游戏虽然能玩了但是它还缺少一些游戏的因素,例如分数、画面滚动、主菜单界面等等,我们会在下一章中介绍。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是