天天看點

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;
     }
           

總結:綜上所述,碰撞檢測的方法不止一種,(應該還有其他的方法是我不知道的)在适合的時候選擇合适的方法才是最好的

更多内容可以去我的個人站點:https://melove.net

繼續閱讀