0

この質問を投稿して以来、多くの新しい情報を発見したので、完全に書き直しました。

タイルベースのゲームで重力とジャンプを実装しているときに、いくつかの問題に遭遇しました。キャラクターがジャンプ後にタイルの間に着地すると、キャラクターがタイルをすり抜けて落ちることがあります。

最大速度はタイル サイズと同じであるため、速度が速すぎることは確かに問題ではありません。また、キャラクターがジャンプするたびに問題が発生することはありません。多くの場合、ジャンプして最大速度に達し、それでもうまく着地できます。しかし、時にはキャラクターがただ失敗することもあります。

私のレベルはタイルのレイヤーで構成されています。各レイヤーには独自の衝突タイプがあります。したがって、同じレイヤー内のすべてのタイルは、衝突について同じルールに従います。私の現在の設定では、すべてのレイヤーがピクセルごとの衝突を使用しています。

これは、プレーヤーの座標を更新する方法です http://pastebin.com/qVc6gv6T

これは、衝突を計算するクラスです。 http://pastebin.com/7GqrFih6

更新では、次のことを行います。

    controls.Update(player); 
    physicsEngine.HandleCollissions(levelManager, player);

問題は、衝突後にプレーヤーが別のタイルに移動したことが原因である可能性があると思います。他のタイルと衝突します。しかし、もう一方のタイルは既に衝突チェック済みなので、それはカウントされませんか? それとも、for ループの代わりに foreach を使用しているからでしょうか?

4

1 に答える 1

0

ジャンプ後にエラーが発生すると言います。したがって、あなたのキャラクターはタイルに向かって落ちて(いくつかの正の値がありますvelocity.Y)、ヒットします。衝突コードは// the player comes FROM ABOVE and collides with the tileブロックを実行します。プレイヤーの速度をゼロに設定し、プレイヤーを衝突から遠ざけるループを実行します。このループは、項tileを引数として使用して関数を呼び出します。複数の正方形と衝突するために一連のタイルをループすると仮定します。私は正しいですか?

もしそうなら、最初の衝突と修正の後に問題が発生します。プレーヤーのvelocity.Yは 0 になりましたが、新しいタイルと衝突しています。したがって、else ブロックの意味についてのコメントにもかかわらず、位置の変更がさらに発生する可能性があります。

if (player.Velocity.Y > 0) 
else // if (moveVector.Y < 0) // what you commented

else // if (moveVector.Y <= 0) // what your else really means

現在、時々 (ピクセルごとの衝突の位置合わせがわずかにずれている場合のみ)、コース修正が間違った方向に発生することがあります。それはフォールスルー効果を生み出します。ブロックにブレークポイントを設定してから、発生し// the player comes FROM UNDER and collides with the tileてはならないシナリオでプログラムを実行してみてくださいplayer.WorldPositionY += 1;。想定されていないときに発生した場合は、犯人がいます。

私はここで多くの憶測をしています。確実に知ることができるように、より多くのコードを投稿する必要があると思います。しかし、おそらくペーストビンが適切な場所でしょう。

于 2012-11-01T03:53:12.250 に答える