4

私は 2D プラットフォーム ゲームに取り組んでおり、表面 (衝突) 検出を実装するための (パフォーマンス面での) 最善の方法は何かと考えていました。

これまでのところ、線のリストで構成されたレベル オブジェクトのリストを作成することを考えており、線に沿ってタイルを描画しています。

代替テキスト http://img375.imageshack.us/img375/1704/lines.png

上り坂/下り坂を歩いているときにyの位置を簡単に操作するために、すべてのオブジェクトが彼が歩く表面のIDを保持していると思います。

このようなもの:

//Player/MovableObject class
MoveLeft()
{
    this.Position.Y = Helper.GetSurfaceById(this.SurfaceId).GetYWhenXIs(this.Position.X)
}

したがって、「水面での落下/歩行」を検出するために私が使用するロジックは、単純なポイント (プレーヤーの下肢) - タッチ - ライン (表面) のチェックです (いくつかの安全な概算を使用して - ラインから 1 ~ 2 ピクセルとしましょう)。

このアプローチは大丈夫ですか?この問題に関する読み物を見つけるのに苦労しているので、遠慮なくリンクやアドバイスをドロップしてください。

4

8 に答える 8

3

長い間ポリゴン ベースの 2D プラットフォーマーを扱ってきたので、アドバイスをさせてください。

タイルベースのプラットフォーマーを作成します。

ここで、衝突検出に関する質問に直接答えるには:

ワールド ジオメトリを「ソリッド」にする必要があります (プレイヤー オブジェクトをポイントにすることはできますが、ソリッドにしたほうがよいでしょう)。「ソリッド」とは、プレイヤー オブジェクトがワールド ジオメトリと交差しているかどうかを検出する必要があることを意味します。

「プレイヤーはこの世界のジオメトリの端を越えますか」を試してみましたが、実際には機能しません (紙の上では機能するように見えるかもしれませんが、浮動小数点の精度の問題だけが問題になるわけではありません)。

さまざまな形状間の交差テストを行う方法については、オンラインで多くの指示があります。始めたばかりの場合は、Axis-Aligned Bounding Boxes (AABB) を使用することをお勧めします。

任意のジオメトリを使用するよりも、タイルベースのプラットフォーマーを作成する方がはるか簡単です。タイルから始めて、AABB との交差を検出し、それが機能するようになったら、他の形状 (傾斜など) を追加できます。

交差点を検出したら、衝突応答を実行する必要があります。ここでも、タイルベースのプラットフォーマーが最も簡単です - 衝突したタイルのすぐ外側にプレーヤーを移動するだけです (その上に移動しますか、それとも横に移動しますか? - 衝突によって異なります - 方法は後ほど説明します)。エクササイズ)。

(追伸: 正方形のタイルだけで素晴らしい結果を得ることができます。たとえば、Knytt Stories をご覧ください。)

于 2010-06-07T04:05:35.053 に答える
1

Platformer Starter KitXNA のプロジェクトでそれがどのように行われるかを確認してください。基本的に、タイルには、タイルが通行可能か通行不能かなどを判断するための列挙型があり、次にあなたのレベルGetBoundsでタイルを確認し、プレイヤーとの交点をチェックして何をすべきかを決定します。

于 2010-06-04T21:56:07.720 に答える
1

2D 衝突検出を扱うのはとても楽しい時間でした。単純な問題のように見えても、事前に計画を立てていないと、簡単に悪夢になることがあります。

OO の意味でこれを行う最善の方法は、classMapObject などの汎用オブジェクトを作成することです。これには、位置座標と傾きがあります。これから、他の形状などを含めるように拡張できます。

そこから、Solid オブジェクトとの衝突を処理してみましょう。ちょうど 32x32 のブロックだとすると、左、右、上、下から打つことができます。または、コーディングの仕方によっては、上と左から同時に叩きます。では、キャラクターが進むべき道をどのように決定するのでしょうか。たとえば、キャラクターが上からブロックにぶつかって立つ場合、誤ってコード化されていると、うっかりしてキャラクターを横に押しのけてしまう可能性があります。

それで、あなたは何をすべきですか?私が 2D ゲームで行ったことは、衝突にどのように反応するかを決定する前に、人物の以前の位置を確認したことです。キャラクターの Y 位置 + 高さがブロックの上にあり、西に移動している場合は、最初に上部の衝突を確認し、次に左側の衝突を確認します。ただし、キャラクターの Y 位置 + 高さがブロックの上部より下にある場合は、左側の衝突をチェックします。

ここで、傾斜のあるブロックがあるとします。ブロックは、x=32 で幅 32 ピクセル、高さ 32 ピクセル、x=0 で高さ 0 ピクセルです。 これにより、キャラクターがこのブロックに上からぶつかって衝突することしかできないと仮定する必要があります。 このブロックでは、左/右/下衝突の場合は FALSE 衝突を返すことができますが、上からの衝突の場合は、キャラクターが X=0 にいる場合は衝突ポイント Y=0 を返すように指定できます。 . X=16 の場合、Y=16 など。

もちろん、これはすべて相対的です。複数のブロックに対してチェックするので、キャラクターの方向に可能なすべての変更を一時変数に保存する必要があります。したがって、キャラクターが X 方向に 5 だけブロックに重なる場合、その変数から 5 を引きます。X 方向と Y 方向のすべての可能な変更を累積し、それらをキャラクタの現在の位置に適用し、次のフレームのためにそれらを 0 にリセットします。

幸運を。後でさらにサンプルを提供できますが、私は Mac を使用しています (私のコードは WinPC 上にあります)。これも実際のビデオです: http://www.youtube.com/watch?v=uKQM8vCNUTM

于 2010-06-04T22:43:43.023 に答える
0

独自の衝突検出アルゴリズムを作成するのはそれほど簡単ではありません。難しさの簡単な例を 1 つ挙げると、キャラクターが 2 つのフレーム間で線の一方の側から他方の側に移動するほど高速で移動している場合はどうなるでしょうか。そうすると、その間にアルゴリズムを実行する時間がなくなり、衝突が検出されなくなります。

私は Tiendil に同意します: ライブラリを使用してください!

于 2010-06-04T22:07:17.747 に答える
0

私は非常に異なるベースで機能する制限付きの衝突検出アプローチを使用したので、役立つ場合に備えてここに捨てます。

白黒の二次画像。通過できないピクセルは白です。現在設定されている任意のピクセルであるキャラクターのマスクを作成します。予想される動きを評価するには、二次画像からそのマスクのピクセルを読み取り、白いものが戻ってくるかどうかを確認します。

他のオブジェクトとの衝突を検出するには、同じ種類のアプローチを使用しますが、ブール値の代わりに、考えられるすべてのオブジェクトをカバーするのに十分な深さを使用します。オブジェクト番号の「色」で、各オブジェクトをセカンダリに完全に描画します。マスクを読み取ってゼロ以外のピクセルを取得すると、「色」はヒットしたオブジェクト番号です。

これにより、O(n^2) 回の相互作用の計算ではなく、O(n) 時間ですべての可能な衝突が解決されます。

于 2010-06-07T05:35:55.293 に答える
0

Farseer Physicsをお勧めします。これは、必要なことを処理できる強力な物理エンジンです。

于 2010-06-04T22:45:55.997 に答える
0

私はこのようにします:

  1. 厳密には衝突のための線はありません。立体のみ (ボックスと三角形、おそらく球体)
  2. 2D BSP、すべてのレベル形状を格納する 2D パーティショニング、または「スイープ アンド プルーン」アルゴリズム。それぞれが非常に強力になります。スイープとプルーニングを挿入ソートと組み合わせると、衝突する可能性のある何千ものオブジェクト (数十万ではないにしても) を簡単に作成でき、2D 空間分割により、近くにある衝突する可能性のあるすべての形状をオンデマンドですばやく取得できます。

オブジェクトがサーフェス上を歩けるようにする最も簡単な方法は、フレームごとに数ピクセルずつ落下させ、オブジェクトが衝突するサーフェスのリストを取得し、オブジェクトをサーフェス法線の方向に移動することです。2dでは垂線です。このようなアプローチでは、オブジェクトが非水平サーフェス上で滑り落ちますが、法線をわずかに変更することでこれを修正できます。また、衝突検出と「オブジェクトを押しのける」ルーチンをフレームごとに 1 回だけでなく数回実行する必要があります。これは、オブジェクトがヒープにある場合、またはオブジェクトが複数の面に接触している場合の状況を処理するためです。

于 2010-06-07T05:04:06.750 に答える
0

Box2DChipmunkなどの物理エンジンのいずれかを使用してみることができます。彼らは独自の高度な衝突検出システムとさまざまなボーナスを持っています。もちろん、ゲームを高速化するわけではありませんが、最新のデバイスのほとんどのゲームに適しています

于 2010-06-04T16:45:52.330 に答える