2015-04-06 168 views
1

我想要檢測Android遊戲畫布上動態繪製的形狀(SurfaceView)之間的碰撞。如何檢測形狀碰撞 - Android

我可以很容易地使用Rect或RectF對象的交叉方法,但結果不是很好(參見下圖,我有一個「false」檢測)。

enter image description here

我不想使用位圖,因此不可能使用「像素完美」的方法。

你知道一個方法來做這個圓,矩形,三角形和其他基本形狀的交集?

求助THX)

+0

看看碰撞檢測算法,如AABB和OBB –

回答

4

對於你要落後創建自己的模型了良好的碰撞檢測。在這些模型中,您可以指定兩個對象所在的條件。

例如,圓形由中心位置和半徑來描述。正方形由左下角和邊長表示。

您不必描述所有可能的poligons,您可以使用所謂的邊界框,這意味着,對於複雜的隨機poligon,您可以使用正方形或任何形狀最適合它(也可以使用多個形狀對於單個對象)。

在您記住這些對象之後,計算它們中的每一個都會與包括它自身在內的所有其他形狀混合在一起的條件。

在你的例子中如果正方形的任何角落之間的距離大於圓的半徑,球體和正方形就會變成colides。

在這裏,你可以閱讀更多http://devmag.org.za/2009/04/13/basic-collision-detection-in-2d-part-1/

這個問題可能會非常複雜,保持它的簡單,如果你想要的東西簡單。

+0

我認爲你的解決方案是最好的,但它似乎很難找到一個足夠通用的算法足夠所有類型的形狀...我應該改變我的想法和使用像素完美算法的位圖。 –

0

要知道2d中的多邊形是否與圓形發生碰撞,可以針對其每條線測試最接近圓心(this might help)的線上的點。

然後,檢查您發現的點是否在兩條形成直線的拐角之間 - 也就是說,該點實際上位於直線上,而不僅僅位於直線上 - 以及該點與圓的中心小於或等於圓的半徑。如果兩者都適用於多邊形的任何一條線,那麼您就會發生勾結。您還必須檢查多邊形邊角可能位於的邊緣情況,或者觸摸該圓。

對於兩個圓圈,這更容易。檢查中心之間的距離,並將其與其半徑之和進行比較。如果距離小於或等於總和,那麼您就會勾結。

0

這是一個直接適用的方法,我用我自己的遊戲來檢測圓和矩形的交集。它將球(這是本例中的視圖)和矩形(也是視圖)檢查爲與球碰撞作爲參數。您可以將該方法放在Timer中,並設置要檢查圓和矩形以確定碰撞的時間間隔。

這裏是方法:

public boolean intersects(BallView ball, Rectangle rect) { 
     boolean intersects = false; 
     if (ball.getX() + ball.getR() >= rect.getTheLeft() && 
      ball.getX() - ball.getR() <= rect.getTheRight() && 
      ball.getY() + ball.getR() <= rect.getTheBottom() && 
      ball.getY() - ball.getR() >= rect.getTheTop()) 
     { 
      intersects = true; 
     } 

     return intersects; 

    } 

getR()得到圓的半徑

getX()得到圓的x位置值的中心

getTheLeft()得到矩形的左X值

getTheRight()獲取矩形的右邊X值

getTheTop()得到矩形的頂部Y值

getTheBottom()得到矩形的下Y值

如果您不能直接在代碼中使用這種方法,你仍然可以推測它需要實現它在邏輯它會爲你工作。它可以檢測所有的碰撞,而不會像使用碰撞盒那樣使用僞碰撞檢測。

祝你好運!如果你有任何問題隨時問,我來幫忙!