プラットフォームと物理学
これらのエッジケースは多数あります。楽しい楽しいプラットフォーマーは、物理的に正確な方法で動作しません。マリオのような「完璧な」プラットフォーマーの長年の後にプレイヤーが期待する制御と動作は、Box2Dや他の物理エンジンで得られるような一般的なテクニックでは実装が非常に困難です。ほとんどの優秀なプラットフォーマーは、プレーヤーコントローラーで一般的な物理学や衝突応答を使用しません。
ハルを生成
あなたの特定の質問に関して、最良の解決策はあなたの根拠として箱を使うのをやめることです。一連の接続されたラインセグメント(船体)を使用します。これにより、衝突検出エンジンは、実際に歩行可能な表面のみに焦点を合わせ、ABとBCの間に存在する「偽の」エッジを見ることができなくなります。それが実際、Box2Dの機能です。シェイプは、外表面を生成するために使用され、外表面は互いにリンクされて船体を形成します。
これは、タイルベースのゲームでも、フロアとして機能する他のAABBオブジェクトの隣に2つのAABBオブジェクトがある状況でも必要です。衝突エンジンはこれらの垂直エッジをピックアップし、プレイヤーにそれらをキャッチさせます。ハックがありますが、問題を解決することはできません。解決策は、完全な2Dボックスではなく、表面を表す単一の線分セグメントを持つことです。
ポリゴンを相互にクリップし、クリップポイントをエッジリストに結合することにより、一般的なケースでハルを生成できます。
傾斜面
例には勾配が含まれており、反発やその他の物理的特性に言及しているため、すぐに気付く他のいくつかの問題を指摘します。これは、一般的な衝突検出と応答がプラットフォーマーにうまく機能しない理由をさらに示しています。まず、傾斜したプラットフォームに立ち、ジャンプしてから着陸します。着陸時にキャラクターが少し「スライド」することに気付くでしょう。問題は、あなたが生成している接触法線が通常、傾斜した表面から外に向いていることです。次に、衝突を解決するときに、プレーヤーはその方向に押し出されます。キャラクターが真っ直ぐに倒れたとしても、着地時に彼は少し右に押し上げられ、スライドになります。これは、相対速度を考慮することでハッキングできますが、
気付く2番目の問題は、修正するのがはるかに難しいことですが、ランプを急いで走ろうとするとどうなりますか。プレイヤーは、ランプを「ホップ」します。これは、今日のほとんどのAAAゲームでも非常に顕著です。馬鹿げているように見えるだけでなく、ジャンプするためにプレイヤーが地面に足を踏み入れる必要がある場合、プレイヤーはランプのほんの一部の間にランプに接触するだけなので、ランプを走って途中でジャンプするのが難しくなりますそれを下るのに費やした時間。より簡単な修正方法は、プレーヤーが移動するときにレイキャストをいくつか行い、プレーヤーがジャンプしておらず、かつて地面にいた場合は、プレーヤーの位置を最も近いサーフェス(プレーヤーに非常に近い場合)にスナップします。
また、プレイヤーが通常の剛体であるかのように、プレイヤーの速度、摩擦、反発をモデル化しようとすると、ランプを走るときにプレイヤーが空中に飛び出すことがあります。プレーヤーの動きは、落下/ジャンプしない限り、水平方向の動きに制限する必要があります。もちろん、古い黄金時代のプラットフォーマーをプレイする場合、プレイヤーの水平方向の速度は、水平面と傾斜面の間でしばしば一定であることに気付くかもしれません。これは、坂を上り下りするときにも考慮する必要があります。
最終的には、他の奇妙なコーナーケースもいくつか発生します。優れたプラットフォーマーを作成しようとしている場合、一般的な物理学と衝突応答アルゴリズムに依存するのではなく、物理学とは別にプラットフォーマープレーヤーコントローラーを実装し、必要な動きと制御動作をハードコードするのが最善です。