GameScene类虽然是占用游戏最多时间的类,但是里面的东西不是很多,最重要的就是碰撞检测了,碰撞检测代码如下:

 void GameScene::detectionCrash()
{ CCArray* bulletsToDelete = CCArray::create();//创建一个CCArray,用以存放待删除的子弹,也就是此帧中被检测到碰撞的子弹 
bulletsToDelete->retain();//必须调用retain,CCArray内部调用了autoRelease
CCObject* bt,*et; CCArray* enemyToDelete = CCArray::create();//创建一个CCArray,用以存放待删除的敌机,也就是此子弹击中的敌机
enemyToDelete->retain();//调用retain   CCRect rectHero = this->heroLayer->getHero()->boundingBox();
float x = rectHero.origin.x + rectHero.size.width * 0.3;
float y = rectHero.origin.y + rectHero.size.height * 0.4;
float width = rectHero.size.width * 0.3;
float height = rectHero.size.height * 0.6;
CCRect rect_HeroForCrash = CCRectMake(x, y, width, height); //检测敌机和hero是否相撞
CCARRAY_FOREACH(this->enemyLayer->m_enemys,et)//遍历所有敌机
{
//break; Enemy* enemy = (Enemy*)et;
if (enemy->getLife() == )
{
break;
} // CCPoint rect1 = this->heroLayer->getHero()->getPosition();
//boundingBox 获取的是相对于父节点的左下角为原点的一个rect,所以要比较两个精灵是否相交,他们的父节点的坐标原点和大小应该一样
if(enemy->boundingBox().intersectsRect(rect_HeroForCrash))
{ this->heroLayer->setIsHeroLive(false);
this->heroLayer->setHeroLifes(this->heroLayer->getHeroLifes() - ); enemyLayer->stopTakeEnemy();
enemyLayer->bomb(enemy);
enemyLayer->removeAllEnmeys(); SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); int tempHightScore = GameScene::getHightestScore();
if (this->m_totalScore > tempHightScore)
{
GameScene::saveHightestScore(this->m_totalScore);
} char life[];
sprintf(life, "%d", this->heroLayer->getHeroLifes());
CCLabelTTF* lbLife = (CCLabelTTF*)this->getChildByTag(tagOfLife);
lbLife->setString(life); this->heroLayer->heroBomb(0.1f);
if (this->heroLayer->getHeroLifes() == )
{ this->scheduleOnce(schedule_selector(GameScene::gameOverCallback), 2.0f);
}
else
{
this->scheduleOnce(schedule_selector(GameScene::newLife), 2.0f);
} return;
}
} //检测敌机和子弹是否相撞
CCARRAY_FOREACH(this->heroLayer->getBullets()->m_bullets,bt)//遍历所有子弹
{
CCSprite* bullet = (CCSprite*)bt; CCARRAY_FOREACH(this->enemyLayer->m_enemys,et)//遍历所有敌机
{
Enemy* enemy3 = (Enemy*)et; if(enemy3->boundingBox().intersectsRect(bullet->boundingBox()))
{ if (enemy3->getLife() > )
{
enemy3->loseLife();
bulletsToDelete->addObject(bullet);//把待删除子弹放入CCArray  
}
else if (enemy3->getLife() == )
{
enemy3->loseLife();
bulletsToDelete->addObject(bullet);//把待删除子弹放入CCArray  
enemyToDelete->addObject(enemy3);//把待删除敌机放入CCArray  this->m_totalScore += enemy3->getScore(); char str1[];
sprintf(str1, "%d",(int)this->m_totalScore); CCLabelTTF* label1 = (CCLabelTTF*)this->getChildByTag(tagOfScore); label1->setString(str1);
} }
} } CCARRAY_FOREACH(enemyToDelete,et)//遍历所有此帧中碰撞死亡的敌机,必须是死亡
{
CCSprite* enemy3 = (CCSprite*)et;
this->enemyLayer->bomb(enemy3);//执行爆炸
}
enemyToDelete->release();//release CCARRAY_FOREACH(bulletsToDelete,bt)//遍历所有此帧中碰撞的子弹
{
CCSprite* bullet = (CCSprite*)bt;
this->heroLayer->getBullets()->removeBullet(bullet);//执行移除
}
bulletsToDelete->release();//release
}

还记得之前说过 boundingbox 方法是获取节点以父节点左下角为原点的一个矩形吧,该矩形的大小就是节点各种变形后的大小,矩形的左下角坐标就是节点变形后的左下角坐标

bullet是加到 ccspriteBatchNode 上的,ccspriteBatchNode是加到 BulletLayer上面的,ccspriteBatchNode和bulletLayer都是铺满屏幕的。所以子弹调用 boundingbox 获得的矩形是以屏幕左下角为原点的。敌机的原理也是如此。hero是直接加到 herolayer 上的,父节点同样是铺满屏幕的,所以他们的父节点的左下角的坐标都一样的,这就是通过 boundingbox 检测他们是否碰撞的前提。

有些纹理周围有比较大的空白地方,这就会造成两个节点看起来还没有接触就会发生碰撞,这就需要对碰撞进行更精确的判断,可以通过什么像素判断法之类的。我这里采取最简单的处理方法,就是通过节点的boundingbox获取到一个rect,然后对这个rect加工一下:

     CCRect rectHero = this->heroLayer->getHero()->boundingBox();
float x = rectHero.origin.x + rectHero.size.width * 0.3;
float y = rectHero.origin.y + rectHero.size.height * 0.4;
float width = rectHero.size.width * 0.3;
float height = rectHero.size.height * 0.6;
CCRect rect_HeroForCrash = CCRectMake(x, y, width, height);

这样子可以获取节点 boundingbox 里面的某一部分来作为碰撞的检测部分

cocos2dx打飞机项目笔记六:GameScene类和碰撞检测 boundingbox的更多相关文章

  1. cocos2dx打飞机项目笔记三:HeroLayer类和坐标系

    HeroLayer类主要是处理hero的一些相关东西,以及调用bulletLayer的一些方法,因为子弹是附属于hero的~~ HeroLayer 类的成员如下: class HeroLayer : ...

  2. cocos2dx打飞机项目笔记四:Enemy类和EnemyLayer类

    Enemy类没什么内容,就create和init方法,根据参数来创建不同的敌机,头文件代码如下: //飞机的类型 enum planeType {smallPlane, midPlane, bigPl ...

  3. cocos2dx打飞机项目笔记二:BulletLayer类

    BulletLayer.h 内容如下 class BulletLayer : public cocos2d::CCLayer { public: CC_SYNTHESIZE(bool, m_IsHer ...

  4. cocos2dx打飞机项目笔记一:项目结构介绍

    最近在学习cocos2dx引擎,版本是2.1.3,开发环境是win7 + vs2010,模仿微信打飞机游戏,开发中参考了 csdn 偶尔e网事 的系列文章:http://blog.csdn.net/c ...

  5. cocos2dx打飞机项目笔记七:各种回调:定时器schedule、普通回调callFunc、菜单回调menu_selector、事件回调event_selector

    各种回调函数的定义: typedef void (CCObject::*SEL_SCHEDULE)(float); typedef void (CCObject::*SEL_CallFunc)(); ...

  6. cocos2dx打飞机项目笔记五:CCSpriteBatchNode 的使用

    在上一节里,在头文件看到 定义了一个 CCSpriteBatchNode* batchNode;,在addEnemy方法里看到 batchNode->addChild(enemy); 新建的敌机 ...

  7. python学习笔记六--用户自定义类

    一.类: 1. 面向对象. 2. 定义了新的对象类型. 定义了两个属性:name,pay 定义了两个方法:lastName,giveRaise

  8. php笔记(六)PHP类与对象之对象接口

    接口的实现 <?php //interface 关键字用于定义一个接口 interface ICanEat{ //接口里面的方法不需要实现 public function eat($food); ...

  9. python学习笔记(六)、类

    Python与java.c++等都被视为一种面向对象的语言.通过创建自定义类,用于处理各种业务逻辑.面向对象有封装.继承.多态三个特征,这也是面子对象语言的通用特征. 1 封装 封装,是值向外部隐藏内 ...

随机推荐

  1. Struts2框架拦截器:

    Struts 2框架提供了良好的预配置,并准备使用的盒拦截.下面列出了几个重要的拦截器: SN Interceptor & 描述 1 aliasAllows parameters to hav ...

  2. OKhttp3

    针对上一博文订单调用用户使用默认数据交互方式,下面介绍下使用 Okhttp3网络数据交换方式. 1.订单启动类变化 package com.tycoon.orderService; import or ...

  3. CentOS 7.0 防火墙

    CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙.firewall:systemctl start firewalld.service#启动firewalls ...

  4. IOS时间与日期处理

    本文转载至 http://blog.sina.com.cn/s/blog_9cd1705d0102v5x4.html   主要有以下类: NSDate -- 表示一个绝对的时间点NSTimeZone ...

  5. 排序算法 c实现

    c语言实现插入排序.冒泡排序.选择排序.快速排序.堆排序.归并排序.希尔排序示例,需要的朋友可以参考下     实现以下排序 插入排序O(n^2) 冒泡排序 O(n^2) 选择排序 O(n^2) 快速 ...

  6. matlab7.0安装 win7系统详细使用方法附软件下载

    MATLAB 7.0下载地址: 百度网盘下载地址:http://pan.baidu.com/share/link?shareid=414204&uk=2769186556 迅雷快传下载地址:h ...

  7. fiddler抓包工具使用图文教程

    一.软件简介: 一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视.设置断点.甚至 ...

  8. django restframework 的日常使用

    本文讨论 django restframework 的日常使用,满足常用 api 编写的需求,比如 List, Detail, Update, Put, Patch 等等.探讨 django rest ...

  9. 疯狂创客圈 JAVA死磕系列 总目录

    无编程不创客,无案例不学习.疯狂创客圈,一大波高手正在交流.学习中! 疯狂创客圈 Java 死磕系列: [博客园 总入口]  QQ群:104131248 [Java 聊天室] 实战从0开始,打造100 ...

  10. 【python】-- Django ModelForm

    Django ModelForm Django的ModelForm的验证方式相比较form + Model的验证方式有下列区别: ModelForm没有form + Model的低耦合性 ModelF ...