11

通常、キャンバス ゲームで衝突を検出するには、次のようなものを使用します。

function collides(a, b) {
   return a.x < b.x + b.width &&
     a.x + a.width > b.x &&
     a.y < b.y + b.height &&
     a.y + a.height > b.y;
}

ただし、これは、フレームの処理時にオブジェクトが接触している場合にのみ衝突を検出します。速度 (ピクセル/フレーム単位) がパス内の障害物の幅よりも大きいスプライトがある場合、衝突が検出されずに障害物を通過します。

スプライトとその宛先の間に何があるかを確認するにはどうすればよいですか?

4

3 に答える 3

2

これは一般的に難しい問題であり、高品質のソリューションには Box 2D ライブラリのようなものが役立ちます。

手っ取り早い解決策 (斜めに移動するオブジェクトに誤検知を与える) — 現在のフレームと前のフレームのオブジェクトの位置をカバーするバウンディング ボックス間の衝突をチェックします。

使用する代わりに、a.x使用するmin(a.x, a.x - a.velocity_x)代わりに、など。a.x + a.widthmax(a.x + a.width, a.x + a.width - a.velocity_x)

高速で移動しているオブジェクトが小さい場合 (弾丸)、線 (原点から原点 + 速度まで) と他のオブジェクトのボックスとの衝突をテストします。

于 2013-05-09T15:53:37.513 に答える
0

障害物をチェックするためのバウンディング ボックスとして、移動するオブジェクトによって (更新間隔で) 掃引される領域全体を使用する必要があります。

于 2013-05-09T13:03:06.430 に答える