游戏中的碰撞还是比較多的,比方角色与角色的碰撞,角色与墙壁的碰撞,角色与怪物的碰撞等,都须要

进行碰撞的检測,来触发一定的事件





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





如今自己知道的方法算是有了三种了,以下一一记录并分析下他们各自的优缺点

1、就是官方提供的,依据getBoundingBox();方法获取要检測的碰撞物体的范围,然后再依据rectIntersectsRect();方法进行推断须要检測的两个精灵是否有重叠,有则发生碰撞;

长处:适合对规则的矩形物体进行检測碰撞,简单,直接

缺点:对于复杂图形不友好,对于碰撞的检測不准确,使用中有种莫名其妙的感觉

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

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

这里依据BoundingBox 的 上下左右的中间点来推断碰撞,使检測的更准确一些

长处:使碰撞检測更准确一点

缺点:麻烦

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

3、第三种就是我如今使用的,只是这个针对大小比較规矩,即接近正方形比較好,可是对于外形能够复杂

这个碰撞检測就是要给精灵加入一个radius属性,设置精灵以中心为原点,radius为半径的碰撞区域,然后去推断两个精灵的中心点的距离是否小于radius之和,假设是则发生碰撞;

长处:更准确,简单

缺点:对于长的图片碰撞不友好

想推断距离首先要知道一个方法:pDistance();这种方法是cocos2d-html5获取两个坐标点之间的方法,使用这种方法我们就能够获取两个精灵中心的距离

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

总结:综上所述,碰撞检測的方法不止一种,(应该还有其它的方法是我不知道的)在适合的时候选择合适的方法才是最好的,

很多其它cocos2d-html5开发文章能够关注牛人 touchsnow的博客:http://blog.makeapp.co

也能够去我的个人博客网站:Melove 我爱http://www.melove.net

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

  1. Cocos2d-x碰撞检測

    假设不适用Box2D物理引擎.那么要进行Cocos2d-x的碰撞检測那我们的方法往往就是进行"矩形和点"."矩形和矩形"这样粗略的碰撞检測.我们一般採取开启sc ...

  2. cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检測

    玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件.还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸, ...

  3. Unity3D入门(二):碰撞检測

    碰撞器由来 1.系统默认会给每一个对象(GameObject)加入一个碰撞组件(ColliderComponent),一些背景对象则能够取消该组件. 2.在unity3d中,能检測碰撞发生的方式有两种 ...

  4. Cocos2d-x教程(35)-三维拾取Ray-AABB碰撞检測算法

    欢迎增加Cocos2d-x 交流群:193411763 转载时请注明原文出处 :http://blog.csdn.net/u012945598/article/details/39927911 --- ...

  5. Cocos2d-x教程(34)-三维物体OBB碰撞检測算法

    欢迎增加Cocos2d-x 交流群:193411763 个中心点.1个旋转矩阵和3个1/2边长(注:一个旋转矩阵包括了三个旋转轴,若是二维的OBB包围盒则是一个中心点,两个旋转轴,两个1/2边长). ...

  6. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  7. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  8. Cocos2d-x 精灵碰撞检測(方法二)

    将"Cocos2d-x 精灵碰撞检測(方法一)" update函数改动一下. 使用精灵boundingBox函数获取直接精灵边界框, 不用自己计算精灵矩形大小了,还比較精确,然后调 ...

  9. cocos2d-x 旅程開始--(实现瓦片地图中的碰撞检測)

    转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了.只是感觉程序不怎么稳定啊.并且发现自己写的东西让我重写一遍的话我肯定写不出来. ...

随机推荐

  1. Qt4创建工程的几种方法:linux系统

    方法一:以Qt Creator 作为IDE 1.启动Qt Creator,并创建一个空项目 2.输入路径和工程名字 3.添加cpp文件 4.添加代码,并且编译执行 5.执行结果 方法二:利用linux ...

  2. hdu 4714 Tree2cycle dp

    用树形dp做的,dp[t][i]表示t及其孩子入度都已经小于等于2并且t这个节点的入度等于i的最优解. 那么转移什么的自己想想就能明白了. 关键在于这个题目会暴栈,所以我用了一次bfs搜索出节点的顺序 ...

  3. POJ 3619 Speed Reading(简单题)

    [题意简述]:有K头牛,N页书,每次第i头牛每分钟仅仅能读Si页书,连续读Ti分钟,之后歇息Ri分钟.如今问我们第i头牛花费多少时间能够读完这N页书. [分析]:简单的模拟 //220K 32Ms # ...

  4. find查找大于1M小于10M的文件 $ find . -size +1M -size -10M

    查找大于1M小于10M的文件$ find . -size +1M -size -10M

  5. 简单概率dp(期望)-zoj-3640-Help Me Escape

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4808 题目大意: 有n条路,选每条路的概率相等,初始能力值为f,每 ...

  6. JPA的Embeddable注解

    来源于http://zjsword2000.blog.163.com/blog/static/4583983320083184844734/ 在hibernate中实现自定义类型,只要实现UserTy ...

  7. CF 327D - Block Tower 数学题 DFS 初看很难,想通了就感觉很简单

    D. Block Tower time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  8. wiki 3143 二叉树的前序、中序及后序遍历

    先序遍历:訪问根.遍历左子树.遍历右子树,简称:DLR. 中序遍历:遍历左子树,訪问根,遍历右子树,简称:LDR. 后序遍历:遍历左子树,遍历右子树.訪问根.简称:LRD. 数组搞的: #pragma ...

  9. 跟我一起学extjs5(11--自己定义模块的设计)

    跟我一起学extjs5(11--自己定义模块的设计)        从这一节開始我们来设计并完毕一个自己定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息. 下面信息仅仅是我自己在开发过程中 ...

  10. 单页应用Scrat实践

    单页应用Scrat实践 1.开始 随着前端工程化深入研究,前端工程师现在碉堡了,甚至搞了个自己的前端网站http://div.io/需要邀请码才能注册,不过里面的技术确实牛.距离顶级的前端架构,目前博 ...