高速オブジェクトが壁を通過できないように衝突検出を処理するにはどうすればよいですか?


14

2D横スクロールシューティングゲームを作成していますが、弾丸の衝突検出に少し問題があります。箇条書きを含むすべてのものは、独自のポリゴン/更新メソッドを持つオブジェクトです。

問題は、弾丸が速くなり、60フレーム/秒(ゲームの実行速度)で弾丸が壁をすぐにスキップすることです(更新間隔中に壁の幅を超えて移動するため)。ポリゴンが実際に重複することは決してないので、順調に進んでください。

これについて何ができますか?私が思いついた唯一のことは、古い位置から新しい位置に線を引き、その上で衝突検出を行うことですが、衝突検出のための線描画はslick2dのドキュメントでは推奨されていません。どうすれば解決できますか?


完全な答えではないので、コメント。線をグラフィカルに描画することはお勧めしませんが、数学的にはこれを行うことができます。これは、衝突が発生したかどうかを確認するための単純な光線平面交差です。その後、小さな固定ステップ検出を実行して、回答で提案されているように常に高いレートで実行しなくても、衝突が発生した正確な瞬間(およびそれに付随するすべての情報)を取得できます。費用のかからないチェックを行い、必要に応じて答えを正確に把握するのに時間をかけます。
ジェームズ

回答:


9

標準的なアプローチは次のとおりです(1つを選択)。

  1. 境界幅を大きくするか、弾丸の最大速度を下げて、1回の更新で壁を飛び越えないようにします(最大距離/最小境界幅を計算するには、少しのピタゴラスが必要です)。
  2. 通常、連続する衝突検出(CCD)を実行します。通常は、レイキャスティングにより、移動するオブジェクトの前方の線形(2)または平面(3D)表面との衝突を検出します。これはより高価ですが、より適切なソリューションです。2Dラインに対するレイキャスティングは非常に基本的ですが、この場合、すべての境界を直線のポリゴンとして定義する必要があります。

さらに言えば、あなたの代わりに線としてあなたの弾丸をモデル化することができます-あなたのゲームのルックアンドフィールを持つこと収まる場合は、同様にleft4kdead。そうすれば、弾丸はすでに光線であるため、弾丸を光線として近似する必要はありません。ルックスの観点から、これは、弾丸の端に明るいスポットで線を引くか、単に明るい(弾丸の端)から暗い(後端)へのグラデーションとして線を引くと、まともに見えます。モーション。

ほとんどの状況で、衝突検出にグラフィックスを使用することは少し見当違いですが、ピクセル完璧な衝突検出はまさにそれであり、受け入れられているテクニックです。それはすべて、あなたが何を達成したいのか、そしてどれくらいの速さかによって決まると思います。多くのボディとアクションを備えた非常に高速なゲームが必要ない場合は、それを選択してください。それ以外の場合は、上記で説明したアプローチのいずれかを使用する方が適切です。


素晴らしい答えをありがとう-理想的には、多くの動体で速いペースで歩きたいです。弾丸を物理的なオブジェクトとして扱うのは、他のすべてと同様に重力の影響を受けるためです(弾丸の速度などに応じて、わずかに弧を描くようになります)。これは良い方法ではありませんか?これは私の最初のゲームですので、ベストプラクティスを探し続けています。放物線の方程式を使用することもできますが、弾丸の速度/照準角度に関連する係数をどのように設定したらよいかわかりません
マラ

3
箇条書きの詳細が多すぎるように聞こえます。実際には、弾丸を発射するとき、跳ね返る力、リコシェット角の予測不能性などにより、そのスラッグを見つけることはほとんどありません。私はそれらをただ消滅させるか跳ね返らせ、その後すぐに消滅させます。あなたのコアなゲームプレイに焦点を当ててください。これらの細部についてはあまり心配しないでください。リアリズムは最も重要なことに焦点を当てています。
エンジニア

ええ、私は弾丸に直線を使用することができ、それが重要であると思われる場合は、少し後で弾丸を下に曲げる方法を見つけることができると思います。
マラ

2
弾丸の速度が速すぎない場合(つまり、画面上を移動できないほど速くない場合)、単純な光線を使用して衝突検出をモデリングしながら、速度に重力を適用できます。ユーザーは、他のすべてのオブジェクトも同じことをしていることに気付くよりも、弾丸が一連の直線として動いていることに気付かないでしょう。弾丸の軌跡の場合、曲線軌跡(スプライン)の計算と描画は難しくなく、弾丸の軌跡に対する滑らかな曲線の錯覚を増やします。
ショーンミドルディッチ

3

弾丸が現実的な物理オブジェクトのように動作するようにしたい場合(例えば、弾丸は銃の発射ではなく、カタパルトの矢や石のようです)、物理更新の頻度を増やすこともできます。

そのため、ゲームは毎秒60フレームで実行されますが、物理シミュレーションは毎秒120の更新で実行できます(ここに、レンダリングループとは異なる速度で実行できる優れた物理セットアップを説明するタイムステップ記事があります)。

もちろん、物理エンジンの更新間隔を長くすると、CPUに大きな負荷がかかります。そのため、このアプローチは、発射物があまり速く移動していない場合にのみ賢明です(発射物が弧を描いて移動していることがわかるので、私はそれを仮定していました)。


ありがとう!私はこれを効果的に行っており(線状の発射体を使用しています)、ゲームがより複雑になるにつれてそれが実現可能であることを望んでいます
マラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.