20 x 10 ピクセルの大きさのキャラクターがあり、ピクセルに基づく衝突マップがあります (ワームを考えてください)。
フレームあたり 1 ピクセルを超える速度で、キャラクターの衝突を追跡する最良の方法は何ですか? 速度ベクトルに沿って各ピクセルを反復処理するよりも優れた解決策はありますか?
私は Lua (Love 2D) でこれを行っていますが、一般的なソリューションが理想的です。
バウンディング ボックスの衝突とピクセル完全な衝突を組み合わせます。
したがって、ゲーム内のすべてのエンティティには、スプライトの幅と高さに等しいフレームだけのバウンディング ボックスがあります。これを最初のレベルの衝突テストとして使用してください。これが完了し、衝突が発生したら、衝突マップを使用してより細かいレベルの詳細を取得します。
この最適化は速度を向上させ、すべての衝突がピクセル パーフェクトである必要はないという柔軟性をエンジンに追加します。
実際のピクセル パーフェクト コリジョン アルゴリズムに関しては、説明したとおりに機能します。ただし、速度を上げたい場合は、次の方法を試してみてください。
スプライトごとにビットマスクを作成します (ピクセル マップのように、ただしピクセルごとに 1 ビットのみ)。たとえば、次のようになります。
00000000
00100000
01100000
01110000
あるスプライトが別のスプライトと衝突すると、大きいビットマスクと同じサイズの小さいビットマスクから新しいビットマスクを作成し、スプライト間の位置の違いによって「オフセット」します。
これが完了したら、これら 2 つのマスク内のすべてのバイトをビット単位で「AND」します。いずれかのバイト結果が > 0 の場合、衝突が発生しています。
あなたのソリューションは最も単純なものです - 各ピクセルを繰り返します。
各反復で「新しい」ピクセルのみをチェックするようにしてください。
キャラクターが同時に右と下に移動しているとします。
***** ..... ..... * = "Present"
***** .***** .****# . = "Old and now empty"
***** .***** => .****# # = "New"; check these on iteration 2
***** .***** .****#
***** #####
It. 1 It. 2 "New" pixels
動きに沿った各反復では、チェックするピクセルにほとんど違いはありません。「新規」とマークされたものだけが影響をチェックする必要があります。それらを確認し、衝突がない場合は移動を続けます。これを使用して、多くの計算を最適化できます。