0

XNA で典型的な BubbleShooter ゲームのスケルトンを作成していますが、ここの図で説明されている衝突検出アルゴリズムに問題があります。

衝突の瞬間に衝突する Rectangle の位置に応じて、衝突する Bubble に新しい位置が割り当てられます。

この問題は、バブルを発射すると発生し、これは衝突の瞬間に発生します。デバッグを段階的に実行しましたが、衝突が発生した瞬間は写真とまったく同じであるため、アルゴリズムは失敗します。
画像を直接投稿しようとしましたが、まだここの新しいユーザーであるため、投稿できないようです。申し訳ありません。

Rectangles の境界が互いに接触するタイミングを正確 検出する方法はありますか?

4

3 に答える 3

1

代わりに、ピクセルごとの衝突を実行できます。ここで説明します。

ここをクリック

于 2012-04-04T16:32:14.897 に答える
0

今はテストする時間がありませんが、フレームごとの衝突の数を1に制限するようにしてください。1つの衝突が検出された場合に更新部分に入るときにカウンターを使用して、同じフレームの他のすべての衝突をブロックします。このように、発射物が下部にある場合、

                if(hitBottomPart)
                {
                  // Logic
                }

発射物がテクスチャの別の長方形に当たる前に、パーツはこの同じフレームで実行されます。これは単なる推測ですが。あなたのゲームで頑張ってください!衝突は常に実装するのが面倒です。

于 2012-04-04T16:56:26.467 に答える
0

それで、私が理解できれば、あなたの問題は衝突の正確な瞬間を逃すことですか?

衝突を慎重に計算していると思います。アルゴリズムが 1 秒間に 60 回実行されたとしても、 1 秒間を無限の瞬間に分割できるのは 60 回だけです。

単純な (そして悪い) 解決策は、オブジェクトの動きを遅くすることです。

良いものは、フレームで何が起こっているかを取得することを意味します。ある種の方向ベクトルとオブジェクトの速度が必要になります。これらの両方の値を使用して、衝突が発生した場所と時期を特定できます。

フレーム間の経過時間も必要になります。これが GameTime オブジェクトの目的です。このオブジェクトには、プロパティ「TotalElapsedMilliseconds」を持つプロパティ「ElpasedGameTime」があります。

GameTime クラスに関する MSDN ドキュメント : http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.gametime.elapsedgametime.aspx

ウィキペディアの衝突検出に関する読み物: http://en.wikipedia.org/wiki/Collision_detection#A_posteriori_.28discrete.29_versus_a_priori_.28continuous.29

「アプリオリ」と「事後」の検出 : これは、見逃している可能性のあるキーワードです。

于 2012-04-04T16:43:40.040 に答える