一、七说八说
大家都发现了= =,做了那么多,发现就是摆设,完全没有打飞机的感觉,没有实现碰撞的监测。比如说呢,子弹和敌机,玩家与敌机就是需要有碰撞检测的说,然后在这篇我想会很长很长的教程中我们一步步的进行完善的说~。
二、子弹与灰机的碰撞检测
(1)加入爆炸的动画~(加到EnemyLayer中)
a、通用的敌人爆炸动画的创建函数~
Animate* EnemyLayer::playAnimation(std::string formatstring, int count)
{
auto animation = Animation::create(); //创建一个帧动画序列
for (int i = 1; i < count + 1; i++) //把对应敌人名字相对应的爆炸的图片放进去~
{
char szName[100] = { 0 };
sprintf(szName, formatstring.c_str(), i);
auto spriteFrame = SpriteFrameCache::getInstance()->spriteFrameByName(szName);
animation->addSpriteFrame(spriteFrame);
}
// 下面的是爆炸的时间间隔~
animation->setDelayPerUnit(0.08f);
animation->setRestoreOriginalFrame(true);//设置爆炸动画播放完之后要不要回到第一帧,肯定是要的。 auto animate = Animate::create(animation);//创建动画~ return animate;
}
b、动画的创建
因为最大的那个敌人飞机爆炸的时候是有6帧的动画,而其他的小飞机只有4帧的爆炸动画,这决定了我们调用上面动画制作的参数,所以千万不能错~
void EnemyLayer::playEnemyExplosionAnimation(Enemy* enemy, int enemyType)
{
int frame = 4; if (enemyType == ENEMY_MAX)
{
frame = 6;
}
//上面根据飞机的类型选择应该播放的动画~
auto animationName = StringUtils::format("enemy%d", enemyType);
enemy->setIsPlayAnimation(true);//设置正在播动画 auto animation = this->playAnimation(animationName + "_down%d.png", frame);//调用上面的函数~
auto acionDone = CallFunc::create([=](){
enemy->setVisible(false); //炸完之后就消失~
enemy->setIsPlayAnimation(false);//改成没有播动画~
}); auto action = Sequence::create(animation, acionDone, nullptr); enemy->getSprite()->runAction(action);
}
到这里就完成了敌机爆炸的动画效果~。
(2)加入碰撞检测~(在GameScene中加入)
a、碰撞检测
其实就是遍历子弹的数组还有就是飞机的数组,看看有没有2个撞到一起,有的话,就life--,到0 的时候就播放飞机翘掉的动画~,这就是碰撞检测的函数(方法),下面看代码~
void GameScene::onEnemyBulletCollsionDetection(Vector<Sprite*> BulletArray, Vector<Enemy*> EnemyArray, int enemyType)
{
for (auto& bullet : BulletArray)
{
if (bullet->isVisible()) //子弹是否可见
{
for (auto& enemy : EnemyArray)
{
if (enemy->isVisible()) //敌机是否可见
{
Rect bulletRect = bullet->getBoundingBox(); //获得子弹和敌人的区域~
Rect enemyRect = enemy->getBoundingBox();
//如果在播动画,说明敌机已经死掉了= =,然后后面就是是不是碰在一起了。
if (!enemy->IsPlayAnimation() && enemyRect.intersectsRect(bulletRect))
{
enemy->loseLife(); //扣血~
_bullet->removeBullet(bullet); //把子弹去掉~
if (enemy->getLife() == 0) //翘掉的时候~
{
if (enemyType == ENEMY_MIN)
{
enemy->stopAllActions();//停止飞机的所有动作(比如向下飞)
_enemyLayer->playEnemyExplosionAnimation(enemy, ENEMY_MIN);
enemy->setLife(ENEMY_MIN_LIFE);
//记得重置飞机的生命值,很重要的~
}
else if (enemyType == ENEMY_MED)
{
enemy->stopAllActions();
_enemyLayer->playEnemyExplosionAnimation(enemy, ENEMY_MED);
enemy->setLife(ENEMY_MED_LIFE); }
else if (enemyType == ENEMY_MAX)
{
enemy->stopAllActions();
_enemyLayer->playEnemyExplosionAnimation(enemy, ENEMY_MAX);
enemy->setLife(ENEMY_MAX_LIFE); }
}
}
}
}
}
}
}
b、GameLoop
碰撞检测其实就是整个一个gameLoop内很关键的东西,还有就是游戏里面就有一个gameLoop,控制着整个游戏,现在我们就来添加以下GameLoop
void GameScene::gameLoop(float dt)
{
//调用碰撞检测~~~~
this->onEnemyBulletCollsionDetection(_bullet->getBulletsArray(), _enemyLayer->getEnemyArray1(), ENEMY_MIN);
this->onEnemyBulletCollsionDetection(_bullet->getBulletsArray(), _enemyLayer->getEnemyArray2(), ENEMY_MED);
this->onEnemyBulletCollsionDetection(_bullet->getBulletsArray(), _enemyLayer->getEnemyArray3(), ENEMY_MAX); if (!_player->getisAlive()) //如果玩家死掉的话,就结束游戏~
{
this->gameover();
} }
下面是gameover()的代码·,暂时简单的实现下~
void GameScene::gameover()
{
_enemyLayer->stopAllEnemiesSpaw();
_bullet->stopSpawBullet();
_background->stopBackground();
}
最后把GameLoop加入schedule
this->schedule(schedule_selector(GameScene::gameLoop), 1.0 / 60);
搞定收工~。
c、小细节~
大家可能发现有好多很小的函数,我在这里直接调用,而以前却没有在教程中提出,由于那些事很简单的传出数据的方法,大家可以直接看源码,就很简单的会理解,在这里我就不在贴出来啦·~,要不好多好多~
(3)效果图~
大家发现了,我们现在是无敌模式= =,因为我们玩家飞机死不了 = = ,所以我们要加入玩家和敌机的碰撞检测
三、玩家和敌人的碰撞检测
a、玩家飞机爆炸的动画~(在PlayerLayer中加入)
void PlayerLayer::playPlayerBlowAnimation()
{
auto animation = Animation::create();
for (int i = 1; i < 5; i++)
{
char szName[100] = { 0 };
sprintf(szName, "hero_blowup_n%d.png", i);
auto spriteFrame = SpriteFrameCache::getInstance()->spriteFrameByName(szName);
animation->addSpriteFrame(spriteFrame);
}
// should last 2.8 seconds. And there are 14 frames.
animation->setDelayPerUnit(0.08f);
animation->setRestoreOriginalFrame(true); auto animate = Animate::create(animation);
auto actionDone = CallFunc::create([=]()
{
_playerplane->setVisible(false); //播完动画就消失掉~
}); auto action = Sequence::create(animate, actionDone, nullptr); _playerplane->runAction(action);
}
基本上跟敌机爆炸是一样的说,所以就不加过多的叙述
b、如何死~~~
void GameScene::onEnemyPlayerCollsionDetection(Sprite* player, Vector<Enemy*> EnemyArray, int enemyType)
{
for (auto& enemy : EnemyArray)
{
// 敌机和玩家飞机是否活着,还有是否碰到一起~
if (enemy->isVisible() &&
_player->getisAlive() &&
enemy->getBoundingBox().intersectsRect(_player->getPlayerPlane()->getBoundingBox()))
{
//大家一起死= =
enemy->stopAllActions();
_enemyLayer->playEnemyExplosionAnimation(enemy, enemyType); _player->playPlayerBlowAnimation(); switch (enemyType)//还是要记住回血= =
{
case ENEMY_MIN: enemy->setLife(ENEMY_MIN_LIFE); break;
case ENEMY_MED: enemy->setLife(ENEMY_MED_LIFE); break;
case ENEMY_MAX: enemy->setLife(ENEMY_MED_LIFE); break;
default:
break;
} _player->setisAlive(false); //把玩家状态调成死亡~
}
}
}
(2)加入到GameLoop
this->onEnemyPlayerCollsionDetection(_player->getPlayerPlane(), _enemyLayer->getEnemyArray1(), ENEMY_MIN);
this->onEnemyPlayerCollsionDetection(_player->getPlayerPlane(), _enemyLayer->getEnemyArray2(), ENEMY_MED);
this->onEnemyPlayerCollsionDetection(_player->getPlayerPlane(), _enemyLayer->getEnemyArray3(), ENEMY_MAX);
(3)效果图~
这样就默默实现完打飞机的主要过程啦,后面的教程就是不断的进行完善了 = =,虽然还是很麻烦~
cocos2dx游戏开发——微信打飞机学习笔记(十)——碰撞检测的搭建的更多相关文章
-
cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建
一.场景与层的关系: cocos2dx的框架可以说主要由导演,场景,层,精灵来构成: 1.其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏. 2.场景就像电影的一幕剧情,所以说,懂得如何 ...
-
cocos2dx游戏开发——微信打飞机学习笔记(七)——Enemy的搭建
一.文件创建~ Enemy.h Enemy.cpp 二.How to do? 由于我是已经完成成个游戏的功能,所以我会将游戏中enemy所需要的很多功能基本上都先考虑到了,如果大家自己在做的时候也许没 ...
-
cocos2dx游戏开发——微信打飞机学习笔记(一)——开发准备
一.环境的搭建 1.Windows开发准备: (1)软件下载及安装 •下载Cocos2d-x 最新版本:http://www.cocos2d-x.org/download 或者从Cocos2d-x G ...
-
cocos2dx游戏开发——微信打飞机学习笔记(九)——BulletLayer的搭建
一.创建文件~ BulletLayer.h BulletLayer.cpp 二.How to do? (1)实例化BulletLayer方法的实现~ Bullet(PlayerLayer* temp) ...
-
cocos2dx游戏开发&mdash;&mdash;微信打飞机学习笔记(八)&mdash;&mdash;EnemyLayer的搭建
一.创建文件= = EnemyLayer.h EnemyLayer.cpp Ps:我绝对不是在凑字数~. 二.How to do? (1)一些宏 ...
-
cocos2dx游戏开发——微信打飞机学习笔记(五)——BackgroundLayer的搭建
一.创建文件~ 文件名:BackgroundLayer.h BackgroundLayer.cpp 架构就跟前面的一样,我就直接进入正题 啦,而且github有完整代码,欢迎下载~ 二.创建滚动的背景 ...
-
cocos2dx游戏开发——微信打飞机学习笔记(二)——游戏框架
一.游戏的基本框架: WelcomeScene ——> GameScene ——> GameOverScene || ...
-
cocos2dx游戏开发——微信打飞机学习笔记(六)——PlayerLayer的搭建
一.创建文件~ PlayerLayer.h PlayerLayer.cpp 一般类名都会和文件名有关系的~(在这里当然是一样) 二.How to do? 1.首先就是放一个飞机~ CC_SYNTHES ...
-
cocos2dx游戏开发——微信打飞机学习笔记(四)——GameScene的搭建
一.创建文件 首先呢,就是那个创建新的.h 和 .cpp 的文件,然后可以起名为GameScene 最重要的就是一定要创建在Classes的目录下哦= =,别手抖= =. 二.GameScene.h和 ...
随机推荐
-
maven下读取资源文件的问题(转)
原文链接:http://shenchao.me/2016/04/20/maven%E4%B8%8B%E8%AF%BB%E5%8F%96%E8%B5%84%E6%BA%90%E6%96%87%E4%BB ...
-
HDOJ 题目分类
HDOJ 题目分类 /* * 一:简单题 */ 1000: 入门用:1001: 用高斯求和公式要防溢出1004:1012:1013: 对9取余好了1017:1021:1027: ...
-
SpringCloud的应用发布(四)vmvare+linux,网关代理
一.配置方式 1.代理同一个Eureka中注册的服务 2.代理url 二.访问方式:get - list 1.直接访问应用 2.代理访问应用
-
Android Studio 2.1及其以上版本中的instant run功能 介绍
Android Studio 2.0及其以后版本中的instant run功能 介绍 转 https://blog.csdn.net/zy987654zy/article/details/514961 ...
-
清除Windows 10的文件夹浏览痕迹
windows 10有一个功能就是在快速访问时显示“最近访问的文件”,“常用文件”.如果是一台共用电脑,这个功能会经常暴露自己的“行踪”. 可以在“文件夹选项”-“隐私”中去掉勾选,并点击“清除”来清 ...
-
Makefile 中符合的使用
1. $@: 表示规则中的目标文件集.在模式规则中,如果有多个目标,那么,"$@"就是匹配于 目标中模式定义的集合 2. $^ : 所有的依赖目标的集合.以空格分隔.如果在依赖目 ...
-
poj 2449 k短路+A*算法
http://poj.org/problem?id=2449 K短路的定义: 1.如果起点终点相同,那么0并不是最短路,而是要出去一圈回来之后才是最短路,那么第K短路也是一样. 2.每个顶点和每条边都 ...
-
在函数后面加上const
1.现象 在c++类中,有些成员函数在声明时,后面加了const,如 2.作用 ①.提高程序可读性,可以一眼看出此函数不能修改类成员变量: ②.提高程序可靠性,此函数试图修改成员变量时,编译器会通不过
-
【转】UNITY之LUA加密
来自:Lua加密 两种方式:一种用luac,一种用luajit luac加密: 1.lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,去官网下载Lua源代码包(http:/ ...
-
Java基础(二):基本数据类型和变量类型
一.java基本数据类型: 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间.内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. Java 的两 ...