• 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



  • 相关阅读:
    访问者模式
    中介者模式
    策略模式
    迭代器模式
    责任链模式
    contentProvider模板
    android studio常用快捷键(不断补充)
    jqgrid表格列动态加载的实现
    Android View.onMeasure方法的理解(转载)
    activity的生命周期
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4548772.html
Copyright © 2020-2023  润新知