游戏中的碰撞还是比较多的,比如角色与角色的碰撞,角色与墙壁的碰撞,角色与怪物的碰撞等,都需要
进行碰撞的检测,来触发一定的事件

最近在尝试制作一个小游戏的时候需要用到碰撞检测,然后就查了下资料,并在论坛进行提问等算是找到了比较满意的碰撞检测方法,这里记录下来

现在自己知道的方法算是有了三种了,下面一一记录并分析下他们各自的优缺点
1、就是官方提供的,根据getBoundingBox();方法获取要检测的碰撞物体的范围,然后再根据rectIntersectsRect();方法进行判断需要检测的两个精灵是否有重叠,有则发生碰撞;
优点:适合对规则的矩形物体进行检测碰撞,简单,直接
缺点:对于复杂图形不友好,对于碰撞的检测不准确,使用中有种莫名其妙的感觉

  1. var dollRect = sprite.getBoundingBox();
  2. var dollHeadRect = this.catchHand.getBoundingBox();
  3. if(cc.rectIntersectsRect(dollRect, dollHeadRect)){
  4. //发生碰撞事件
  5. }

2、第二种是在网上找到的,我感觉有些麻烦,不过相对于第一种,对于不规则物体支持的好了一些

这里根据BoundingBox 的 上下左右的中间点来判断碰撞,使检测的更准确一些
优点:使碰撞检测更准确一点
缺点:麻烦

  1. var box1 = sprite1.getBoundingBox();
  2. var bottom = cc.p(box1.x +box1.width / 2,box1.y);
  3. var right = cc.p(box1.x +box1.width,box1.y +box1.height / 2);
  4. var left = cc.p(box1.x,box1.y +box1.height / 2);
  5. var top = cc.p(box1.x + box1.width / 2,box1.y + box1.height);
  6. var box2 = sprite2.getBoundingBox();
  7. if(cc.rectContainsPoint(box2, left)||cc.rectContainsPoint(box2, right)||cc.rectContainsPoint(box2, top)||cc.rectContainsPoint(box2, bottom)){
  8. //发生碰撞
  9. }

3、第三种就是我现在使用的,不过这个针对大小比较规矩,即接近正方形比较好,但是对于外形可以复杂
这个碰撞检测就是要给精灵添加一个radius属性,设置精灵以中心为原点,radius为半径的碰撞区域,然后去判断两个精灵的中心点的距离是否小于radius之和,如果是则发生碰撞;
优点:更准确,简单
缺点:对于长的图片碰撞不友好
想判断距离首先要知道一个方法:pDistance();这个方法是cocos2d-html5获取两个坐标点之间的方法,使用这个方法我们就可以获取两个精灵中心的距离

    1. var sprite = this.dolls3[i];
    2. var distance = cc.pDistance(this.catchHand.getPosition(), sprite.getPosition());
    3. var radiusSum = sprite.radius + this.catchHand.radius;
    4. cc.log("distance:" + distance + "; radius:" + radiusSum);
    5. if(distance < radiusSum){
    6. //发生碰撞
    7. }
    8. //针对第三三种方法又加深了一下,使得对矩形类的精灵也能有好的判断,
    9. //主要就是分别对X和Y方向设置不同的Radius,然后去进行分别判断
    10. var distanceX = Math.abs(this.catchHand.getPositionX() - sprite.getPositionX());
    11. var distanceY = Math.abs(this.catchHand.getPositionY() - sprite.getPositionY());
    12. var radiusYSum = sprite.radiusY + this.catchHand.radius;
    13. if(distanceX < sprite.radiusX && distanceY < radiusYSum){
    14. this.catchDollSucceed(sprite);
    15. return;
    16. }

      转自:http://blog.csdn.net/lzan13/article/details/30247447

cocos2d-html5 碰撞检测的几种方法的更多相关文章

  1. 将HTML5封装成android应用APK文件的几种方法(转载)

    越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...

  2. 提高HTML5 canvas性能的几种方法

    简介 HTML5 canvas 最初起源于苹果(Apple)的一项实验,现在已经成为了web中受到广泛支持的2D快速模式绘图(2Dimmediate mode graphic)的标准.许多开发者现在利 ...

  3. HTML5结合CSS的三种方法+结合JS的三种方法

    HTML5+CSS: HTML中应用CSS的三种方法 一.内联 内联样式通过style属性直接套进HTML中去. 示例代码 <pstylepstyle="color:red" ...

  4. 深入理解javascript选择器API系列第三篇——HTML5新增的3种selector方法

    前面的话 尽管DOM作为API已经非常完善了,但是为了实现更多的功能,DOM仍然进行了扩展,其中一个重要的扩展就是对选择器API的扩展.人们对jQuery的称赞,很多是由于jQuery方便的元素选择器 ...

  5. 让你的HTML5&CSS3网站在老IE中也能正常显示的3种方法

    起初,IE其实也是一款非常有进取心的浏览器.但经过一段时间的蛰伏后,它已经成为了我们生活中的一道障碍.微软现在又重新开始向其它浏览器发起挑战,但事实情况是,新版的现代IE浏览器一直滞后于谷歌浏览器和火 ...

  6. HTML5中表单验证的8种方法

    HTML5中表单验证的8种方法 2012-4-21 11:00| 发布者: benben| 查看: 2765| 评论: 0 摘要: 前一篇,我们介绍了HTML5中新的表单特性和函数, 今天就继续来谈谈 ...

  7. html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式

    先上代码   <script type="text/javascript" language="javascript">   var idTmr; ...

  8. HTML5中两种方法实现客户端存储数据

    HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前,这些都是由 coo ...

  9. 今天我们要说的画一个三角形,恩,画一个三角形,第一种呢是利用我们的html标签结合css来实现;而第二种方法就就是我们的html5新增的一个标签canves,这个canves就是网页画幕,那么顾名思义就是在网页里建造一个画板,用来画画,好,那接下来就和我一起去看看吧!

    第一种方法:利用我们的html标签结合css来实现 span{ width:0px; height:0px; border-width:7px; border-style:solid; border- ...

随机推荐

  1. HTML与CSS的一些知识(四)

    续: line-height 用于设置一行文本行高,一般用于文本的垂直居中: display 用于设置元素的显示方式 float 浮动,让元素漂浮起来排列 浮动的影响: a.浮动后,行内元素可以支持宽 ...

  2. Sonar 配置及部署(windows系统)

    Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具. 与持续集成工具(例如 Hudson/Jenkins 等)不同,Sona ...

  3. ios高级开发之多线程(二)NSThread技术

    多线程技术是有多套解决方案的,那么我们该如何选择呢? 技术方案 简介 语言 线程生命周期 使用频率 pthread 1.一套通用的多线程API 2.适用于UNIX,linux,windows等 3.跨 ...

  4. python-文字转语音-pyttsx3

    pyttsx3 python 文字转语音库,支持英文,中文,可以调节语速.语调等. 安装 pip install pyttsx3 示例 import pyttsx3 teacher = pyttsx3 ...

  5. Vue-admin工作整理(六):路由元信息

    路由源信息:每一个路由对象,可以配置一个meta字段,它里面可以存放一些我们定义的信息,比如说页面是否需要一个权限 to.meta && setTitle(to.meta.title) ...

  6. ExtJs写本地ArrayStore,ComboBox调用

    1.自定义本地ArrayStore var sCurStore = new Ext.data.ArrayStore({ //设备状态store fields: ["ckey", & ...

  7. python学习记录-机器学习

    首先安装了anaconda3软件,安装的是最新版,安装时勾选了写入环境变量,支持的是python3.7.3版本. 然后设置了清华大学的镜像,主要是用管理员身份运行 anaconda prompt命令行 ...

  8. MySQL的随机数函数rand()的使用技巧

    咱们学php的都知道,随机函数rand或mt_rand,可以传入一个参数,产生0到参数之间的随机整数,也可以传入两个参数,产生这两个参数之间的随机整数. 而在mysql里,随机数函数rand不能传参, ...

  9. async-await用法

    转载:https://segmentfault.com/a/1190000011526612?utm_source=tag-newest

  10. zzw原创_ipv6下环境配置防火墙及FTP处理一例

    缘由:公司这段时间要将原IPV4地址切换到IPV6,在环境配置的过程中,碰到一坑,平时不太注意的问题,在IPV6下却放大了 实现目标:在IPV6下,机器A可以FTP到机器B,可以传输.下载文件 A机器 ...