タイルベースのマップの衝突検出の問題
私はタイルベースのマリオクローンに取り組んでいます。 これは、ウォーキングや落下の際にすべて正常に機能します。しかし、プレイヤーが壁の近くにジャンプして空中を右に歩くと、プレイヤーは壁に引っかかってしまいます。プレーヤーがキーを離すと、プレーヤーのスプライトは再び落ちます。 セットアップはかなり簡単で、問題を見つけることができません。マップは、マップブロックを持つ2D配列として構築されます。ブロックは固体でもそうでなくてもかまいません。プレーヤーは固体オブジェクトを移動できません。 ゲームループでは: プレーヤーの位置が更新されます(重力、動きなど)。 衝突の地図を確認してください。Yで衝突が検出されると、プレーヤーの位置が更新され、ブロックの上または下(プレーヤーの方向に応じて)になり、その後、衝突ボックスが新しい位置で更新されます。次に、Xの同じプロセス。 コリジョンボックスが新しい場所(空き場所)に更新されます。ボックスが調整され、プレイヤーの下にあるブロックが着地したかどうかを確認するのが少し高くなります。これは、プレイヤーの状態を、スプライトの飛行からアイドル状態に変更するためです。 また、XとYのチェックを入れ替えて、プレーヤーがX線上を移動するようにしました。その後、プレイヤーが移動すると、動きが非常に遅くなります。ボタンを押して離して移動すると、プレイヤーはより速く移動しますが、チャックの中にいます。とても奇抜です。 誰かがエラーを見たり、これのためのより良い衝突アルゴリズムを私に与えることができますか? 更新(コードを更新していません) xとyのチェック方法を入れ替えて、isonland変数を実装しました。したがって、壁に向かって歩いたりジャンプしたりするときは、完璧に機能します。今だけ、プレイヤーがジャンプすると、マリオは着地したときに戻ってきます。これは、Xチェックメソッドが最初に実行され、マリオの位置を調整するためです。 どうすれば解決できますか? マップクラス更新メソッド: public void update(int timeElapsed) { //update entities for(Entity entity : _mapEntities) { entity.update(timeElapsed); } //update objects for(MapObject mapObt : _mapObjects) { mapObt.update(timeElapsed); } //check for collisions checkMapCollision(); } エンティティ(抽象)更新メソッド: public void update(int timeElapsed) { _velocity = new …