3

私はこれを1週間前に機能させていましたが、それから私はそれを壊してしまいました。再び動作させることはできません。2Dスプライトがいくつかありますが、それらは単なる長方形です。ローテーションは含まれません。私はそれらの間の衝突を検出する方法を探していません、私はそれを持っています、そしてそれについてそこに何千もの記事があります。私が見つけられないのは、衝突が発生したときに何をすべきかについてのリソースです。私が欲しいのは、スプライトが重ならないようにすることだけです。バウンスなどはありません。彼らはただ止まります。具体的には、今私はプレーヤーと彼が遭遇するいくつかのレベルタイルを持っています。

単純に聞こえますが、そうではありません。それは非常に正確でなければなりません。さもないと奇妙なことが起こります。私はこれを一日中修正しようとしていて、奇妙な混合結果が出ています。時々私のプレーヤーは床に引っかかって、左右に動くことができません。私がそれを修正すると、彼はブロックを左または右に歩くことができます。

したがって、私の現在の設定は次のように考えています。プレーヤーを行きたい場所に移動してみてください。次に、彼のタイルが何かと衝突するかどうかをマップに尋ねます。その場合、マップには、4つの方向のそれぞれに何ピクセルのオーバーラップがあるかが示されます。ここで注意が必要なのは、プレイヤーがこれらの数字にどのように反応するかです。彼が地面にいるとき、彼が地面にいることを知るために、床と1ピクセルのオーバーラップがあります(そうでない場合、オーバーラップがないと彼の下には何もないと思うので、彼は地面に落ちることと着地することの間で振動します)。この1ピクセルのオーバーラップは、左右のエッジも床に埋め込まれているため、移動できないことを意味します。

プレーヤー用の1つのバウンディングボックスを使用して、すべてを整理するための良い方法はありますか?彼の4つの側面のそれぞれに個別のバウンディングボックスを用意する方がよいでしょうか?

4

5 に答える 5

2

地面と重なる代わりの 1 つの方法は、開始位置を地面のすぐ上に設定することです。その後、常に立ち下がりルーチンを呼び出します。

彼の次の落下部分が地面タイルと重なる場合は、アバターの「地面にある」フィールドを true に設定し (たとえば、ジャンプの目的でそれを追跡する必要があると仮定して)、アバターの y 位置を設定します。地上へ。彼は常に「落下」しているが、視覚的には感知できない.

別の選択肢は、あなたが言及したもので、4 つの境界ボックスがあります。これの難点は、おそらく、4 つの個々のコーナーをどのボックスのメンバーにもしたくないということです。そのため、アバター画像が 16x16 ピクセルの場合、4 つの側面のそれぞれに 4 つの 1x16 ピクセルのバウンディング ボックスとして扱います。これには独自の数学的な頭痛が伴いますが、うまくいくでしょう。

衝突とジャンプの処理に関する限り。私が想像する1つの項目は、動きを2つの個別の動き部分、x軸上の動きとy軸上の動きに分割することです。x 軸上の移動が壁によってブロックされている場合は、x 座標を有効な位置に設定します (したがって、x は、壁/プラットフォームのハグになる値にする必要があります)。y 軸についても同様に行います。この時点で、速度の処理方法も変更できます。必要に応じて x/y 速度コンポーネントを 0 に設定します。これは、探しているゲームの感覚によっては望ましくない場合があります。

于 2009-08-31T00:45:41.350 に答える
0

私がそれを修正すると、彼は左右のブロックを通り抜けることができます。

この段階で、ブロックに足を踏み入れたときの衝突検出から正しい結果が得られていると確信できるのはいつですか?

次に、自分のタイルが何かと衝突するかどうかをマップに尋ねます。その場合、マップには、4 つの方向のそれぞれに何ピクセルのオーバーラップがあるかが示されます。

これからのデータを使用して、移動方向に x オーバーラップがある場合に x モーションを禁止します。個人的には、右のオーバーラップで正を返し、左のオーバーラップで負を返し、xoverlap がゼロであるか符号がモーションの方向と反対の場合にのみ x モーションを許可します。次に、Y に対して行う必要があるのは、ゼロではなく 1 に対するチェックを除いて同じことです。

于 2009-08-31T01:34:56.320 に答える
0

I think I've got it. Mostly inspired by stonemetal's answer. My most recent flaw was that the player was able to "hook" onto walls, because his bounding box would be lodged in the wall by one pixel, and then it would land on the edge of the tile below, stopping him.

I solved everything by splitting up x and y motion. Since gravity is a y deal, I made x the priority. See if you're allowed to move horizontally, then cancel that motion if you can't. Then try vertical, and cancel it if you can't. The separation ensures that neither half gets false information from the other (like thinking that you're on the ground, a Y thing, because you're against a wall, which is an X thing). Thanks guys!

于 2009-08-31T03:46:39.053 に答える