2013-03-02 52 views
2

我目前正在創建一個android java遊戲。一種月球着陸器類型的遊戲。我希望實施某種障礙,併爲隨機放置在屏幕上的小行星而努力。碰撞檢測android(含小行星!!)

但是,我很難理解如何做這些碰撞檢測。我將爲小行星使用圖像,因此可以輕鬆地爲每個圖像使用一個矩形邊界框,但由於小行星是圓形的(或至少是我的!),當在矩形的角落移動時可以檢測到碰撞,這不是小行星的可視部分。

我猜我需要使用某種邊界圓,但不知道如何設置圖像?我想,如果所有的小行星都是相同的大小,我可以硬編碼圓/多邊形邊界框的一些點,然後將它們轉換爲圖像的位置 - 所以實際上,多邊形是小行星?

任何有關如何做這件事的最佳方法的建議都會很棒。此外,如果有人可以掀起一些高水平的碰撞檢測僞代碼,這將不勝感激:)

+1

圓形問題在哪裏?你可以做一些簡單的事情,比如碰撞=距離(c1.center,c2。中心) 2013-03-03 00:37:48

+0

着陸器是一個矩形,小行星是圓形的 - 對不起,沒有更清晰。 – swiss196 2013-03-03 00:47:03

回答

2

如果着陸器矩形是軸對齊(其邊緣平行於座標軸),很容易檢查碰撞界。給定一個半徑爲r和中心(cx, cy)的圓以及一個源於(x, y),寬度爲w,高度爲h的矩形;他們碰撞,如果下列條件之一爲真:

  • (x < cx < x+w)(y-r < cy < y+h+r)
  • (y < cy < y+h)(x-r < cx < x+w+r)
  • 任何矩形的角落和(cx, cy)之間的距離比r低。

正如我在我的評論中所說的,圓圈之間的碰撞更容易,因爲您只需檢查中心之間的距離是否小於半徑之和。

對於非軸對齊的矩形,解決方案有點複雜。給定矩形的四個頂點(A,B,C,D);如果任何以下的爲真,則發生碰撞時:

  • (x < cx < x+w)(y < cy < y+h)
  • intersectCircle(A, B, cx, cy, r)
  • intersectCircle(B, C, cx, cy, r)
  • intersectCircle(C, D, cx, cy, r)
  • intersectCircle(D, A, cx, cy, r)

功能intersectCircle的僞代碼是這樣的:

intersectCircle(P1, P2, a, b, r): 
    x1, y1 = P1 
    x2, y1 = P2 
    p = abs((x1-x2)*(a-x1)+(y2-y1)*(b-y1)) 
    q = sqrt((x1-x2)^2 + (y1-y2)^2) 
    return r > p/q 

該功能是基於this Mathematics' answer公式,這是迄今爲止我發現最簡單的一種。

+0

着陸器本身可以旋轉,所以不幸的是軸不平行。有什麼辦法可以修改它,所以它仍然可以工作嗎? – swiss196 2013-03-04 12:27:06

+1

@ swiss196我已經更新了非軸對齊矩形的答案,希望它有幫助。 – 2013-03-10 00:36:21

+0

感謝您的幫助! – swiss196 2013-03-11 10:56:27