cocos2d-html5 碰撞检測的几种方法

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

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

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

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

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

时间: 2024-11-10 03:16:11

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

毕业课题之------------车辆阴影特征检測的两种方法

A      依据阴影底部边缘确定阴影位置 B    通过阴影的形状(类似矩形)特征找出阴影

Cocos2d-x碰撞检測

假设不适用Box2D物理引擎.那么要进行Cocos2d-x的碰撞检測那我们的方法往往就是进行"矩形和点"."矩形和矩形"这样粗略的碰撞检測.我们一般採取开启scheduleUpdate定时器.然后重写update函数进行每一帧都进行碰撞检測. <1>碰撞检測的代码较为繁琐.恕我无法为你具体列出其思路能够是在update中遍历全部的sprite, 然后推断每一个sprite和其它sprite(还需遍历一遍.刨除自己)是否碰撞. 这样等于推断次数是sprit

Unity3D入门(二):碰撞检測

碰撞器由来 1.系统默认会给每一个对象(GameObject)加入?一个碰撞组件(ColliderComponent),一些背景对象则能够取消该组件. 2.在unity3d中,能检測碰撞发生的方式有两种,一种是利用碰撞器,还有一种则是利用触发器.这两种方式的应用很广泛.为了完整的了解这两种方式,我们必须理解下面概念: (一)碰撞器是一群组件,它包括了非常多种类,比方:Box Collider,Capsule Collider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上.(

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

在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact(b2Contact* contact).两个物体開始接触时会响应,但仅仅调用一次. virtual void EndContact(b2Contact* contact).分离时响应. 但仅仅调用一次. virtual void PreSolve(b2Contact* contact, const

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

玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件.还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸,当子弹与僵尸碰撞的时候子弹自己主动消失,这就这节要说的碰撞检測. 以下详细看代码的实现: 做ios开发有触摸事件cocos2d相同也有 一.先覆写touch事件 .h文件 using namespace cocos2d; class MainScene:public CCLayer { privat

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

转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了.只是感觉程序不怎么稳定啊.并且发现自己写的东西让我重写一遍的话我肯定写不出来.还要继续学习啊! 上次的进度: 实现了坦克的移动,昨天把程序优化了一下,能整合在一起的就整合在一个函数里了.并且对碰到屏幕边缘的情况进行了检測.之前的代码都是部分代码,今天试试把代码整个贴上去. 这两天的进度: 打这么多汉字,自个都看不进去.直接上代码: /////////////////////实

iOS 碰撞检測以及事件响应

*/ //碰撞检測 //碰撞检測de过程 //碰撞检測 //碰撞检測 //碰撞检測 //UIApplication-> UIWindow-> UIController-> 视图控制器view-> 父视图 ->子视图 //事件响应 //事件响应de过程 //事件响应 //事件响应 //事件响应 //反方向处理;UIApplication <- UIWindow <- UIController <- 视图控制器view <- 父视图 <- 子视图;

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

将"Cocos2d-x 精灵碰撞检測(方法一)" update函数改动一下. 使用精灵boundingBox函数获取直接精灵边界框, 不用自己计算精灵矩形大小了,还比較精确,然后调用intersectsRect计算2个精灵矩形是否存在交集. 代码: void HelloWorld::update(float delta) { //返回精灵边界框 CCRect cr1 = sp1->boundingBox(); CCRect cr2 = sp2->boundingBox();

Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測

事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖(小若:32个喷! ),怎么都到第七篇了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/920 文章来源:笨木头与游戏开发 碰撞监听 首先,确保我们创建物理对象的时候,给对象设置了碰撞条件(假设你是一步步按着教程来写的代码,那就是设置好了): body->setCategoryBitmask(1);