博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2d-html5 碰撞检测的几种方法
阅读量:5094 次
发布时间:2019-06-13

本文共 2082 字,大约阅读时间需要 6 分钟。

游戏中的碰撞还是比较多的,比如角色与角色的碰撞,角色与墙壁的碰撞,角色与怪物的碰撞等,都需要

进行碰撞的检测,来触发一定的事件
最近在尝试制作一个小游戏的时候需要用到碰撞检测,然后就查了下资料,并在论坛进行提问等算是找到了比较满意的碰撞检测方法,这里记录下来
现在自己知道的方法算是有了三种了,下面一一记录并分析下他们各自的优缺点
1、就是官方提供的,根据getBoundingBox();方法获取要检测的碰撞物体的范围,然后再根据rectIntersectsRect();方法进行判断需要检测的两个精灵是否有重叠,有则发生碰撞;
优点:适合对规则的矩形物体进行检测碰撞,简单,直接
缺点:对于复杂图形不友好,对于碰撞的检测不准确,使用中有种莫名其妙的感觉

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

 

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

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

优点:使碰撞检测更准确一点
缺点:麻烦

[javascript]   
 
 
  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.   
  7.   
  8.  var box2 = sprite2.getBoundingBox();  
  9.  if(cc.rectContainsPoint(box2, left)||cc.rectContainsPoint(box2, right)||cc.rectContainsPoint(box2, top)||cc.rectContainsPoint(box2, bottom)){  
  10.       //发生碰撞  
  11.  }  

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

[javascript]   
 
 
    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.   
    10. //针对第三三种方法又加深了一下,使得对矩形类的精灵也能有好的判断,  
    11. //主要就是分别对X和Y方向设置不同的Radius,然后去进行分别判断  
    12. var distanceX = Math.abs(this.catchHand.getPositionX() - sprite.getPositionX());  
    13. var distanceY = Math.abs(this.catchHand.getPositionY() - sprite.getPositionY());  
    14. var radiusYSum = sprite.radiusY + this.catchHand.radius;  
    15. if(distanceX < sprite.radiusX && distanceY < radiusYSum){  
    16.     this.catchDollSucceed(sprite);  
    17.     return;  
    18. }  

 

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

转载于:https://www.cnblogs.com/jiajunjie/p/7562596.html

你可能感兴趣的文章
new Image().src资源重复请求问题
查看>>
20155308 2017-2018-1 《信息安全系统设计基础》第十三周学习总结
查看>>
python—模块-sys
查看>>
门面模式
查看>>
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre
查看>>
Android LayoutInflater详解
查看>>
CSS3 关系选择器 演示
查看>>
9.4笔记
查看>>
Java正则表达式实例详解
查看>>
hdu 5040 bfs
查看>>
VMD的相关命令(转载)
查看>>
百度搜索设置定位
查看>>
POJ 3669 简单BFS
查看>>
sqlalchemy 多对多关系
查看>>
EMC Documentum DQL整理(三)
查看>>
Nginx valid_referer 防盗链
查看>>
BZOJ3223 文艺平衡树
查看>>
HTML Button.onclick事件汇总
查看>>
mysql 开启binlog
查看>>
Java中多态的一些简单理解
查看>>