2012-02-24 76 views
1

我試圖實現一個aabb來圓碰撞。框與圓碰撞AS3

這裏是我的代碼:

 //From another file 
    radius = (sprite.width + sprite.height)/4; 

    private function BoxToCircleCollision(box1:BoundingBox, circle1:BoundingCircle):Boolean 
    { 
     var nBoxMinX:Number = box1.sprite.x - box1.sprite.width/2; 
     //var nBoxMinY:Number = box1.sprite.x + box1.sprite.width/2; 
     var nBoxMaxX:Number = box1.sprite.y - box1.sprite.height/2; 
     //var nBoxMaxY:Number = box1.sprite.y + box1.sprite.height/2; 

     var nCirMinX:Number = circle1.sprite.x - circle1.radius/2; 
     //var nCirMinY:Number = circle1.sprite.y - circle1.radius; 
     var nCirMaxX:Number = circle1.sprite.x + circle1.radius/2; 
     //var nCirMaxY:Number = circle1.sprite.y + circle1.radius; 

     if (nBoxMaxX, 2 > nCirMinX)) 
     { 
      Main.WriteDebug("Box max: " + nBoxMaxX + " | Circle min: " + nCirMinX); 
      return true; 
     } 
     else 
     { 
      Main.WriteDebug("Box max: " + nBoxMaxX + " | Circle min: " + nCirMinX); 
      return false; 
     } 
    } 

不知何故碰撞確實按預期方式工作。 要麼他們永遠不會移動,並且「相撞」被追蹤,或者當我嘗試交換數值時,他們會繼續移動,永遠不會相互碰撞。 collision detection

有什麼我在我的邏輯中失蹤?

我的盒子和圓圈碰撞工作正常。


在此先感謝您的幫助。

回答

2

該行根本就看不到正確的:

var nBoxMaxX:Number = box1.sprite.y - box1.sprite.height/2; 

也許你的意思是這樣的:

var nBoxMaxX:Number = box1.sprite.x + box1.sprite.width/2; 

此行不會編譯:

if (nBoxMaxX, 2 > nCirMinX)) 

編輯:

這裏有一個函數來幫助y你得到AABB < - >圓圈碰撞權。這不是一個完整的解決方案,但你可以用你的AABB最小值和最大值的計算結合起來,應該是微不足道的:

private function collideAABBandCircle(c : Circle, aabb:AABB) : Boolean { 
    var sqDist : Number = sqDist(c.centerPoint, aabb); 

    return sqDist <= c.radius * c.radius: 
} 

private function sqDist(p : Point, aabb:AABB) : Number { 
    /* CALCULATE min and max values of aabb bounds */ 
    var sqDist : Number = 0.0; 

    if(p.x < minX) { 
     sqDist += (minX - p.x) * (minX - p.x); 
    } 
    if(p.x > maxX) { 
     sqDist += (p.x - maxX) * (p.x - maxX); 
    } 

    if(p.y < minY) { 
     sqDist += (minY - p.y) * (minY - p.y); 
    } 
    if(p.y > maxY) { 
     sqDist += (p.y - maxY) * (p.y - maxY); 
    } 

    return sqDist; 
} 
+0

角落碰撞怎麼樣? – DevITper 2012-02-27 09:03:34

+0

你的意思是當圓與AABB的角落碰撞? – Bakapii 2012-02-27 09:14:23

+0

y我該怎麼做? – DevITper 2012-02-28 09:50:01

0

有一個很好的article有關使用分離軸定理的2D碰撞檢測。如果您想了解二維碰撞檢測的工作原理,請仔細閱讀。