2

PSM Studio で 2D ゲームの簡単な衝突検出を行っています。

私の現在の方法では、すべてのゲーム オブジェクトを繰り返し処理し、別のゲーム オブジェクト間の距離を見つけてから、2 つのオブジェクトが特定の距離 (通常は各オブジェクトを合わせた幅の 1/2) 内にあるかどうかを確認します。そうであれば、衝突したと見なされます。

この方法は多くの場合に機能しますが、大きなフォールバックがあります。フレームあたりの動きが潜在的な衝突オブジェクトの幅よりも大きいような速度でオブジェクトが移動する場合 (つまり、敵に向かって高速で移動する発射体)、オブジェクトは本質的に他のオブジェクトの上にテレポートします。彼らはしません。

2 つの線分で 2 つの粒子をテストするメソッドを作成することを考えています。線分は、更新中の各オブジェクトの始点と終点の位置で構成されます。

各オブジェクトの極移動 (角度とマグニチュード) とそれぞれの線分がわかれば、2 つの粒子がその魔法の距離内に入るかどうか、つまり衝突したかどうかを計算できますか?

4

1 に答える 1

0

私もこの問題に遭遇しました。私の解決策は、オブジェクトの移動中に衝突を検出することでした。

サイクル中に移動した距離がオブジェクトのサイズよりも大きい場合、その動きをいくつかの小さな動きに分解し、これらの分解ごとに衝突を解決します。

例:

1

ボックスはそれ自体のサイズよりも速く移動しているため、赤い のような検出は検出されません。したがって、動きは小さな動きに分解され、各ステップで赤い線との衝突をチェックします。

3 番目のステップでは、衝突が検出されます。

このソリューションがあなたのシクル構造に合うかどうかはわかりませんが、少なくとも新しいアイデアをもたらす可能性があります.

編集:

衝突が確実に検出されるようにするには、動きに隙間がないようにする必要があります。このプロセスをできるだけ速くし、領域全体を確実にチェックするには、動きをオブジェクトのサイズの一部に分解する必要があります。

例: 上の図で、移動前のオブジェクトの位置を 0 単位、最後に 100 単位と想像してみましょう。

オブジェクトのサイズが 30 単位の場合、次の位置をチェックインする必要があります。

0, 30, 60, 90, 100

各イタリオンでは、目的地に到達するまで、オブジェクトのサイズによって位置をインクリメントします。

実行している場合、たとえば...毎秒40サイクルであることに注意してください。この例では、オブジェクトは次のように移動します。

40 cicles x 100 units = 4000 units per second 

各単位がピクセルで、解像度が 800x600 の場合、オブジェクトは 1 秒あたり 4 画面以上で移動します。これは非常に高速です。

ここで指摘したいのは、「高速」はかなり相対的なものであり、非常に小さなオブジェクトで作業していない限り、このプロセスは最初に期待したほど頻繁には発生しないということです。

于 2014-03-20T15:07:51.967 に答える