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

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

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117922.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Spring Boot第八章-数据缓存Cache

    Spring Boot第八章-数据缓存Cache

  • linux上lrzsz工具的安装与使用[通俗易懂]

    linux上lrzsz工具的安装与使用[通俗易懂]lrzsz官网入口:https://ohse.de/uwe/software/lrzsz.htmllrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议,可以用在windows与linux系统之间的文件传输,体积小速度快。1.安装:root用户下输入安装命令:yuminstall-ylrzsz安装完毕2.上传文件:终端输入rz…

  • (转)C# Assembly.Load 使用

    (转)C# Assembly.Load 使用在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:System.Reflection命名空间(1)AppDoma

  • 目前什么挖矿软件比较好用?[通俗易懂]

    目前什么挖矿软件比较好用?[通俗易懂]比特币最近又开始了牛气哄哄的上涨势头,对于想要挖矿赚钱的人来说是一个大好时机目前挖矿对于普通人来说还是存在一定门槛的,别的不说,关于钱包地址的设置,挖矿软件的调试等等,网上搜索出来的挖矿软件教程分分钟都能让你放弃,因此,找到一个好的挖矿软件工具,能让你事半功倍,心旷神怡。那么问题来了,简单好用的挖矿软件有哪些呢?我尝试过10多个挖矿软件,长沙矿工这些老挖矿软件就不说了适合矿场老板,不过…

    2022年10月15日
  • pythonrandom函数用法_python标准库总的random函数用法[通俗易懂]

    pythonrandom函数用法_python标准库总的random函数用法[通俗易懂]Python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等。random中的一些重要函数的用法:1)、random()返回0…

  • linux load average,Linux 平均负载 Load Average 详解[通俗易懂]

    linux load average,Linux 平均负载 Load Average 详解[通俗易懂]一、什么是LoadAverage?系统负载(SystemLoad)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。平均负载(LoadAverage)是一段时间内系统的平均负载,这个一段时间一般取1分钟、5分钟、15分钟。二、如何查看LoadAverage?top命令,w命令,uptime等命令都可以查看系统负载;三、LoadAverage的3个数值各是什…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号