cocos2dx基础篇(25) 简单碰撞检测
【3.x】
将数学类 CCPoint、CCRect 改为v3.x版本的 Vec2、Rect 就好了。
【简单碰撞检测】
在一些游戏中经常会遇到碰撞检测的情况,如愤怒的小鸟飞出去后,是否与石头发生碰撞。
虽然说有一个Box2D物理碰撞引擎,但是在这里还是需要掌握一下简单的碰撞检测方法。
(1)矩形与矩形
(2)圆与圆
(3)矩形与圆
1、矩形与矩形
1.1、提出问题
问题:假设有两个矩形rect1,rect2,判断两矩是否碰撞相交(部分区域重叠)。
如下四幅图中,图1、2、4发生碰撞,图3未发生碰撞。


1.2、解决方案
由图可知,判断方法只要计算一下两个矩形相交部分是否能够成一个小矩形。
判断方法如下:(可用于计算相交部分的小矩形信息)
//
bool collision_RectWithRect(CCRect rect1, CCRect rect2)
{
//计算相交部分的矩形
//左下角坐标:( lx , ly )
//右上角坐标:( rx , ry )
float lx = max(rect1.getMinX() , rect2.getMinX() );
float ly = max(rect1.getMinY() , rect2.getMinY() );
float rx = min(rect1.getMaxX() , rect2.getMaxX() );
float ry = min(rect1.getMaxY() , rect2.getMaxY() );
//判断是否能构成小矩形
if( lx > rx || ly > ry ) return false; //矩形不相交
else return true; //发生碰撞
}
//
当然也可以使用cocos2dx引擎中的CCRect类已经存在的一个判断矩形碰撞的函数。
//
//返回bool。相交为true
rect1.intersectsRect(rect2);
//
//
//intersectsRect()函数的源码如下:
bool CCRect::intersectsRect(const CCRect& rect) const
{
return !( getMaxX() < rect.getMinX() ||
rect.getMaxX() < getMinX() ||
getMaxY() < rect.getMinY() ||
rect.getMaxY() < getMinY());
}
//
2、圆与圆
2.1、提出问题
问题:假设有两个圆circle1,circle2,判断两圆是否碰撞相交(部分区域重叠)。
如下三幅图中,图1、2发生碰撞,图3未发生碰撞。


2.2、解决方案
圆的碰撞检测比较简单,只要判断两圆心距离是否小于半径相加(r1+r2)即可。
判断方法如下:
//
bool collision_CircleWithCircle(CCPoint p1, float r1, CCPoint p2, float r2)
{
//计算圆心距离
float dist = p1.getDistance(p2);
//判断两圆是否相交
return dist < (r1+r2) ;
}
//
3、矩形与圆
3.1、提出问题
问题:假设有矩形rect、圆circle,判断矩形和圆是否碰撞相交(部分区域重叠)。
如下四幅图中,图1、2、4发生碰撞,图3未发生碰撞。


3.2、解决方案
矩形和圆的判断比较复杂,请看以下分析。
(1)首先,我们让圆在矩形外沿着矩形的边滚一圈,然后将圆心移动的轨迹连线,就可以得到一个圆角矩形。
(2)如下图红色区域为圆角矩形,显然我们只要判断圆心是否在圆角矩形区域内部即可。

(3)如果除去圆角矩形四个角上的4个四分之一圆的部分,仅仅让你判断圆心是否落在剩下的区域内,你应该能很快想出解决办法吧?
只要判断圆心是否在两个矩形的任意其中之一的内部即可。

(4)然后再判断圆心是否在四个角上的四分之一圆的区域部分即可。
显然,只要判断圆心与矩形的四个顶点的距离是否小于圆的半径即可。
(5)综合上诉:(3)(4)的判断,即可得出圆是否矩形相交。
判断方法如下:
//
bool collision_RectWithCircle(CCRect rect, CCPoint p, float r)
{
//获取矩形信息
//左下角坐标:( lx , ly )
//右上角坐标:( rx , ry )
float lx = rect.getMinX();
float ly = rect.getMinY();
float rx = rect.getMaxX();
float ry = rect.getMaxY();
//计算圆心到四个顶点的距离
float d1 = p.getDistance( ccp(lx, ly) );
float d2 = p.getDistance( ccp(lx, ry) );
float d3 = p.getDistance( ccp(rx, ly) );
float d4 = p.getDistance( ccp(rx, ry) );
//判断是否碰撞
//判断距离是否小于半径
if( d1<r || d2<r || d3<r || d4<r ) return true;
//是否在圆角矩形的,横向矩形内
if( p.x > (lx-r) && p.x < (rx+r) && p.y > ly && p.y < ry ) return true;
//是否在圆角矩形的,纵向矩形内
if( p.x > lx && p.x < rx && p.y > (ly-r) && p.y < (ry+r) ) return true;
//不发生碰撞
return false;
}
//
cocos2dx基础篇(25) 简单碰撞检测的更多相关文章
- cocos2dx基础篇(3) 常用重要类
---------------------------------------- 入口类main.cpp 主要控制类AppDelegate.cpp -------------------------- ...
- 自动化测试基础篇--Selenium简单的163邮箱登录实例
摘自https://www.cnblogs.com/sanzangTst/p/7472556.html 前面几篇内容一直讲解Selenium Python的基本使用方法.学习了什么是selenium: ...
- cocos2dx基础篇(23) 粒子系统CCParticleSystem
[3.x] (1)去掉"CC" (2)粒子位置模式 tPositionType 改为强枚举类型 ParticleSystem::PositionType:: // ...
- cocos2dx基础篇(16) 基本绘图DrawPrimitives
[3.x] (1)去掉前缀 "cc" (2)将 ccDraw***() 封装到了 DrawPrimitives 命名空间中. (3)重写绘图函数: draw(Ren ...
- 【Cocos2d入门教程二】Cocos2d-x基础篇
上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...
- cocos2dx基础篇(22) 基本动画CCAnimation/CCAnimate
[小知识] CCSpriteFrame :精灵帧. 它是相对动画而产生的,其实就是一张纹理图片. CCAnimationFrame :动画帧. 由精灵帧与间隔帧数组成,是动画CC ...
- cocos2dx基础篇(4) 标签CCLabel
[本节内容] cocos2dx三种文字字体的显示:CCLabelTTF(一般字体).CCLabelAtlas(自定义字体).CCLabelBMFont(自定义字体) CCLabelTTF CCLabe ...
- cocos2dx基础篇(18) 数据存储CCUserDefault
在cocos2dx中提供了一个数据存储类CCUserDefault,可以作为一个轻量级的数据库来使用.它支持五种数据bool.int.float.double.string的存储. [3.x] ...
- cocos2dx基础篇(15) 列表视图CCTableView
[3.x] (1)去掉 "CC" (2)TableViewCell 中: > unsigned int getIdx() 返回类型改为 ssize_t(类型为 long) ( ...
随机推荐
- shell_hive
(1)获取参数:从shell文件传来参数,调用:$1,$2,$3 load_date=$1 clearn_date=`date -d"$2 day ago $load_date" ...
- python 继承:重写、拓展(六)
1.继承:父类有的子类也有 2.多继承:若继承多个父类有相同的函数,则继承前面的函数,传递参数的个数也与继承的函数位置有关 3.超继承:针对继承一个父类使用,不仅有父类的特写同时也有自己的新特性 s ...
- IC SPEC相关数据
---恢复内容开始--- 静态电流:静态电流是指没有信号输入时的电流,也就是器件本身在不受外部因素影响下的本身消耗电流. 纹波电压的害处: 1.容易在用设备中产生不期望的谐波,而谐波会产生较多的危害: ...
- 【LuoguP4887】第十四分块(前体)
题目链接 题意 区间两数异或在二进制下有 \(k\) 个 \(1\) 的对数. Sol 普通莫队的话,如果要实时维护好区间内的答案需要支持区间对一个数求答案. 直接做不是很好做,容易发现其实这也就是一 ...
- 在HTML中引入CSS的方式
有 4 种方式可以在 HTML 中引入 CSS.其中有 2 种方式是在 HTML 文件中直接添加 CSS 代码,另外两种是引入 外部 CSS 文件. ㈠内联方式 内联方式指的是直接在 HTML 标 ...
- Hexo + github pages + 阿里云绑定域名搭建个人博客
申请域名 万网购买的域名,地址:https://wanwang.aliyun.com/domain/com?spm=5176.8142029.388261.137.LoKzy7 控制台进行解析 控制台 ...
- Haystack全文检索框架
一.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch,Whoosh ...
- 3.1 JAVA集合框架以及区别
涉及的参考链接:https://www.runoob.com/java/java-collections.html,http://how2j.cn/k/collection/collection-ar ...
- mysql 日期辅助表
MySQL 生成日期表 #.创建一个num表,用来存储数字0 CREATE TABLE num (i int); #.在num表中生成0 ), (), (), (), (), (), (), (), ...
- 20道HTML基础面试题(附答案)
以下是我整理的一些HTML的基础面试体,并自己整理了答案. 1 DOCTYPE有什么作用?标准模式与混杂模式如何区分?它们有何意义? 告诉浏览器使用哪个版本的HTML规范来渲染文档.DOCTYPE不存 ...