先说下版本 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();
}
}
}

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

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

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


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

cocos2dx之飞机大战简单版1的更多相关文章

  1. AVPlayer不会在iOS9中播放来自网址的视频

    我试图在UIView中嵌入一个AVPlayer并从网址播放mp4视频文件.问题是我只收到一个黑色的空白视图(见截图)在以前的iOS版本中,它对我有用,但自从升级到iOS9后我遇到了这个问题.我的.h文件如下所示:而在我的实现文件中,我有以下内容:我错过了什么吗?

  2. ios – 在Swift Playground中使用AVPlayer播放视频?

    我在使用AVPlayer在快速游乐场内播放视频时遇到问题.这是我的代码.有什么建议?代码完全没有任何作用.我的期望是’v’变量应该显示视频.当我将avplayerlayer连接到故事板的视图时,它似乎在操场外工作.解决方法如果将它放入操场,以下情况应该有效.确保换出路径:

  3. 视频 – MPMoviePlayerController在完成播放后不会自动关闭电影(ios 6)

    我可能没有写出我的标题很好,也许更正确的说,我的NSNotification不会在播放后解散我的电影的观点.我发现其他人有这个问题,但没有解决方案,似乎这可能是iOS6的问题,这是我正在运行.播放视频后,您需要按“完成”才能关闭,但是我希望自动关闭,因为一旦我将其整理出来,我将使用MPMovieControlStyleNone.这是我的代码与未使用的部分被剥离:`解决方法也有这个问题要修复movi

  4. ios – 如何存档和取消归档Swift中的自定义对象?或者如何将自定义对象保存到Swift中的NSUserDefaults?

    我有一个班我想要序列化并保存到用户默认值.首先我不知道如何正确编写编码器和解码器.所以对于init我写了两个方法.当我尝试执行这个代码:应用程式崩溃,我收到这则讯息:我做错了什么?

  5. ios – 如何检查AVPlayer的状态?

    我以为我可以通过属性“rate”来检查AVPlayer的状态.这就是我创建一个播放器实例的方法:稍后我会做这样的事情这是我发现的:>在模拟器中,如果播放器没有运行,我得到“0.0”,如果它正在运行,我得到“1.0”.>如果我启动播放器但中断互联网连接,它会将值从1更改为0.>但是,在我的iPhone上,即使进入飞行模式,该属性仍保持值1?您是否知道为什么会发生这种情况以及如何检查流情况呢?

  6. swift之反初始化

    反初始化在一个类的实例被释放之前,反初始化函数被立即调用。用关键字deinit来标示反初始化函数,类似于初始化函数用init来标示。不允许主动调用自己的反初始化函数。vendCoins方法在bank分发硬币之前检查是否有足够的硬币。这通过player的coinsInPurse属性来体现:每个Player实例都由一个指定数目硬币组成的启动额度初始化,这些硬币在bank初始化的过程中得到。在这发生前一步,其反初始化函数被自动调用,其硬币被返回到bank。

  7. [翻译]Swift编程语言——析构

    使用deinit关键字定义析构方法,和使用init定义构造方法类似。析构方法只对类类型有效。析构如何工作当实例不再被需要,Swift会自动释放它们,来释放资源。析构方便不需要带任何参数也不需要写圆括号了:析构方法会被自动调用,在实例被释放之前。不允许手工调用析构方法。超类的析构方法总会被调用,尽管子类没有提供它自己的析构方法。在这些发生前,这个实例的析构方法被调用,实例中的硬币被返还给了银行。

  8. Swift coreAnimation 加计时器写的游戏《飞机大战》

    最近在学习swift的动画和图层,就用现学的东西写了个游戏,基本思想基本功能都实现了,图片都是在网上找得。希望能帮助大家更好的理解动画和图层、声明下,我是初学者,代码写的不好。大家应该都能看懂。游戏所有代码都是swift加动画加计时器,没有用任何游戏引擎框架。效果图源代码地址:点击打开链接地址失效了的话我可以补上

  9. 用Swift做个游戏Lecture02 —— Player的诞生

    点击运行程序,Player出现在场景之中。将该方法添加至update方法中的最下面。意味着每隔33.3毫秒左右就要更新一次Player的位置。因此,添加一个方法到GameScene类中,用于每次用户点击屏幕时调用,作用是让Player获得向上的速度!

  10. 用Swift做个游戏Lecture10 —— 优化游戏(终结篇)

    FlappyBird整个项目临近尾声,要做的只是对游戏体验的优化,本文首先解决两个,分别是:实现Player静态时的动画,修改早前掉落时直上直下的问题。Player撞击障碍物时,给出一个shake摇晃动画。现在请将该方法添加到switchToMainMenu()以及switchToTutorial()方法中的最后,点击运行,看看Player是否挥动翅膀了。那么什么时候去真正更新Player的状态呢?Shake动画先前说到Player撞击障碍物后要有一个摇晃的动画以及闪烁的小锅,那样显得更有真实感不是吗,这

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部