2

私は現在、AndroidJavaゲームを作成しています。月着陸船型ゲームの一種。ある種の障害物を実装したいので、画面上にランダムに配置される小惑星を探しました。

しかし、私はこれらの衝突検出をどのように行うかを理解するのに苦労しています。小惑星の画像を使用するので、各画像に長方形のバウンディングボックスを簡単に使用できますが、小惑星は円形であるため(または、少なくとも私の場合はそうなります)、長方形の角を越えて移動すると衝突が検出される可能性があります。 、それは視覚的に小惑星の一部ではありません。

ある種の境界円を使用する必要があると思いますが、これを画像でどのように設定できるか本当にわかりませんか?

すべての小惑星が同じサイズの場合、円形/ポリゴンの境界ボックスのいくつかのポイントをハードコーディングして、それらを画像の位置に変換できると思います-実際には、ポリゴンは小惑星の形状ですか?

これを行うための最良の方法に関する提案は素晴らしいでしょう。さらに、誰かが高レベルの衝突検出擬似コードを作成できれば、それはありがたいです:)

4

1 に答える 1

2

着陸船の長方形が軸に沿って配置されている場合(そのエッジが座標軸に平行である場合)、円との衝突を簡単に確認できます。半径rと中心を持つ円と、原点、幅、高さ(cx, cy)を持つ長方形が与えられます。次のいずれかに該当する場合、それらは衝突します。(x, y)wh

  • (x < cx < x+w)(y-r < cy < y+h+r)
  • (y < cy < y+h)(x-r < cx < x+w+r)
  • 長方形の任意の角との間の距離が。(cx, cy)よりも小さいr

コメントで述べたように、中心間の距離が半径の合計よりも小さいかどうかを確認するだけでよいため、円間の衝突はさらに簡単になります。

軸に揃えられていない長方形の場合、解決策はもう少し複雑です。長方形の4つの頂点(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

この関数は、この数学の答えの公式に基づいています。これは、私が見つけた中で最も単純なものです。

于 2013-03-03T02:40:52.477 に答える