【3.x】

将数学类 CCPointCCRect 改为v3.x版本的 Vec2Rect 就好了。

【简单碰撞检测】

在一些游戏中经常会遇到碰撞检测的情况,如愤怒的小鸟飞出去后,是否与石头发生碰撞。

虽然说有一个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) 简单碰撞检测的更多相关文章

  1. cocos2dx基础篇(3) 常用重要类

    ---------------------------------------- 入口类main.cpp 主要控制类AppDelegate.cpp -------------------------- ...

  2. 自动化测试基础篇--Selenium简单的163邮箱登录实例

    摘自https://www.cnblogs.com/sanzangTst/p/7472556.html 前面几篇内容一直讲解Selenium Python的基本使用方法.学习了什么是selenium: ...

  3. cocos2dx基础篇(23) 粒子系统CCParticleSystem

    [3.x]     (1)去掉"CC"     (2)粒子位置模式 tPositionType 改为强枚举类型 ParticleSystem::PositionType:: // ...

  4. cocos2dx基础篇(16) 基本绘图DrawPrimitives

    [3.x] (1)去掉前缀 "cc" (2)将 ccDraw***() 封装到了 DrawPrimitives 命名空间中. (3)重写绘图函数:         draw(Ren ...

  5. 【Cocos2d入门教程二】Cocos2d-x基础篇

    上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...

  6. cocos2dx基础篇(22) 基本动画CCAnimation/CCAnimate

    [小知识] CCSpriteFrame     :精灵帧.    它是相对动画而产生的,其实就是一张纹理图片. CCAnimationFrame  :动画帧.    由精灵帧与间隔帧数组成,是动画CC ...

  7. cocos2dx基础篇(4) 标签CCLabel

    [本节内容] cocos2dx三种文字字体的显示:CCLabelTTF(一般字体).CCLabelAtlas(自定义字体).CCLabelBMFont(自定义字体) CCLabelTTF CCLabe ...

  8. cocos2dx基础篇(18) 数据存储CCUserDefault

    在cocos2dx中提供了一个数据存储类CCUserDefault,可以作为一个轻量级的数据库来使用.它支持五种数据bool.int.float.double.string的存储. [3.x]     ...

  9. cocos2dx基础篇(15) 列表视图CCTableView

    [3.x] (1)去掉 "CC" (2)TableViewCell 中: > unsigned int getIdx() 返回类型改为 ssize_t(类型为 long) ( ...

随机推荐

  1. 第三章 指令-- 30 指令-使用钩子函数的第二个binding参数拿到传递的值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  2. 第二章 Vue快速入门-- 16 vue中通过属性绑定为元素绑定style行内样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  3. IView 使用Table组件时实现给某一列添加click事件

    通过给 columns 数据的项,设置一个函数 render,可以自定义渲染当前列,包括渲染自定义组件,它基于 Vue 的 Render 函数. render 函数传入两个参数,第一个是 h,第二个是 ...

  4. 【LuoguP4557】[JSOI2018]战争

    题目链接 题意 给你两个点集. q次询问 , 每次把其中一个点集往一个方向移动 , 问两个点集的凸包还有没有交. Sol 闵可夫斯基和板子题. 把问题做如下转换: 我们本来两个凸包相交是相当于是对于移 ...

  5. Unity3D资源

    1.ShareSDK 地址:https://github.com/MobClub/New-Unity-For-ShareSDK 文档:产品集成步骤 2.Protobuf https://github. ...

  6. 当心JavaScript奇葩的逗号表达式

    看看下面的代码输出什么? let a = 2; switch (a) { case (3, 2, 5): console.log(1); break case (2, 3, 4): console.l ...

  7. Spring、SpringMVC和Springboot的区别

    spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc. spring mvc 是只是spring 处理web层请求的一个模 ...

  8. 计算机网络(八),TCP的滑动窗口

    目录 1.RTT和RTO 2.TCP使用滑动窗口做流量控制与乱序重排 3.滑动窗口的基本原理 八.TCP的滑动窗口 TCP头部中的窗口字段:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端 ...

  9. CentOS7 服务器上如何安装python3

    1.官网下载python3的源码包 网址:https://www.python.org/ 进去之后点击导航栏的Downloads,也可以鼠标放到Downloads上弹出菜单选择Source code, ...

  10. win10下MYSQL 8.0.16的下载、安装以及配置

    win10系统MySQL 8.0的下载安装超详细教程 https://blog.csdn.net/qq_34444097/article/details/82315587 下载安装配置链接:https ...