わかりました、これは私がかなり長い間理解しようとしてきた問題です。Mineは2Dプラットフォーマーゲームで、ワールドは(通常)不動のタイルとモバイルスプライトで構成され、どちらもAABBを使用してヒットボックスを表します。このゲームは、タイルのレイヤーの移動に伴う複雑さのため、グリッドベースではありません。
衝突を検出し、衝突の深さを簡単に把握できます。「最短軸メソッド」を使用して、スプライトとタイルの間の衝突を解決する方法を決定します。スプライトが垂直よりも水平に深い場合、解決する方向は上または下になります。スプライトが水平よりも垂直に深い場合、解決する方向は左または右です。
これは非常に単純で、かなりうまくいきます。つまり、スプライトが複数のタイルと衝突するまでです。その性質上、各衝突は個別にチェックする必要があるため、衝突が異なると解決する方向も異なる場合があります。たとえば、スプライトがタイルの行を横切って移動しようとしている場合、1つのフレームで次のタイルと交差します。水平深度が垂直深度よりも短いこと。衝突が「左に解決」と言っているので、それは押し戻され、コーナーにスタックします。
私はかなり長い間この問題を何度も何度も検討してきましたが、いくつかの解決策が思い付きましたが、すべてに欠陥があります。特定の側面を到達不能としてマークすることもできますが、グリッドベースのエンジンがないと、「到達不能」の判定は非常に複雑で、特にタイルのレイヤーの移動は常に可能です。
別の可能な方法は、衝突が発生する前に衝突を予測し、衝突のポイントまで移動を「ワークバック」することですが、私はその数学がどのように機能するのかわかりません。
特に80年代のゲームはすでにこの問題を解決しているので、私には信じられないほど明白なものが欠けているように感じます。