高速で正確な2Dコリジョン


17

私は2Dトップダウンシューティングゲームに取り組んでおり、今では基本的な四角形の境界ボックス衝突システムを超える必要があります。

私は多くの異なるスプライトを持つ大きなレベルを持っています。それらはすべて異なる形状とサイズです。スプライトのテクスチャはすべて透明な背景を持つ正方形のpngファイルであるため、プレーヤーが透明な背景ではなくテクスチャの色付き部分に進入したときにのみ衝突する方法も必要です。

次のように衝突を処理する予定です。

  1. プレーヤーの範囲内にスプライトがあるかどうかを確認します
  2. 四角形の境界ボックスの衝突テストを行う
  3. 正確な衝突を行う(助けが必要な場合)

私はすべての要件を念頭に置いてこれを正しくしたいので、高度な技術は気にしませんが、これにどのようにアプローチするのかわかりません。どんなテクニック、さらにはライブラリも試してみてください。私はおそらく、各スプライトから透明な背景を差し引いたものを正確に表す何らかの種類の形状を作成して保存する必要があることを知っています。

私はピクセルごとに遅いことを読んだので、私の大きなレベルとオブジェクトの数を考えると、私はそれが適切だとは思わない。Box2dも調べましたが、多くのドキュメントや、SFMLでそれを実行する方法の例を見つけることができませんでした。

回答:


18
  1. ステップ1、グリッドを作成し、移動するオブジェクトごとに更新します。
  2. 同じ正方形内のオブジェクト間の衝突のみをチェックします。
  3. オブジェクトの境界ボックスが交差するかどうかを確認します(長方形を含む)。
  4. 低解像度バージョンのアウトラインを使用して、ピクセルパーフェクトコリジョンを確認します(ゲーム物理学を参照)。
  5. Game Physics(Q 2)で説明されているように、アウトライントレースの通常のチェックを行います。

ステップ1:

グリッド2D配列を作成します。すべてのオブジェクトは、x、y位置、および幅と高さによって占有する正方形を認識しています。オブジェクトが移動すると、古い正方形からオブジェクトが消去され、占有している新しい正方形が更新されます。

これは、n個のオブジェクトに対して合計でO(n)のみを取ります。特定のオブジェクトO(1)の場合。

ステップ2:

同じ正方形内のオブジェクト間の衝突のすべてのチェックを実行します。異なる正方形のオブジェクト間の衝突のテストを実行する必要はありません。オブジェクトは、平均サイズの場合、最大4つの正方形を占有できます。これは非常に少ないチェックを意味します。

ステップ3:

オブジェクトの長方形間の交差を確認します。交差点が存在しない場合、停止します。

ステップ4:

交差領域内のみでオブジェクトのアウトライン間のピクセル完全な衝突を確認します。それは十分に速いはずです。そうでない場合は、低解像度の2d-boolean配列を作成して最初にチェックします。衝突が見つかった場合は、高解像度の2d-arrayの小さなセグメントをチェックするだけで、貴重な時間を節約できます。

ゲームの世界を正方形のグリッドに分割する方法の概念については、これをお読みください:

効率的な衝突検出システムの作成

ピクセルの完全な衝突を検出する方法についての直感のためにこれをお読みください。

ゲーム物理学/ 2D衝突検出AS3

パフォーマンスを大幅に改善できます。

  1. 最初にチェックするために、アウトラインの低解像度(1/16)バージョンを保存します。

  2. 2つの四角形が交差する領域のみをチェックインします。

  3. アウトラインを大まかにセグメントに分割し、最初にセグメント間の衝突のみをチェックします。

コメントを歓迎し、詳しく説明します。

交差点のエリアをチェックインする


1
アーサーが言ったように、手順1.と2.をグリッドに置き換え、正確な衝突検出については、画像の低解像度バージョンを使用できます。
マルクスフォンブロードー

1
あなたが本当に必要なら、あなたもここに私の答えに同様の手法を使用することができます:gamedev.stackexchange.com/questions/38481/...
マルクス・フォン・Broady

Markusは良いアイデアを指摘しています。2dとして処理される2d-boolean配列または1d-arrayを使用する必要があり、その配列の1/2 1/4 1/8低解像度バージョンを保存して処理を高速化できます。2d-boolean配列の計算は非常に高速であるため、これはおそらく必要ありません。まだ便利なツールです。
wolfdawn

プレーヤーがグリッド上の1つの正方形内に完全に含まれている場合、その正方形内のオブジェクトに対してのみチェックできます。プレイヤーは一度に4つの隣接する正方形にいる可能性があります。それはあなたの言うことですか?長方形間の交差を意味する場合、はい、それらが交差する場合にのみ衝突をチェックする必要があります。
wolfdawn

1
このアップデートが問題を解決するのに役立つことを願っています。いくつかのコードを作成したら、コードレビューに投稿し、コメントのためにリンクしてください。codereview.stackexchange.com
wolfdawn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.