回答:
私の解決策は、ゲームマップ内のすべての物理エンティティをツリーノードとして扱い、マップ自体をルートノードとして扱うことです。ノードには他のノードを含めることができます。すべてのノードは、マップノード内に(直接的または間接的に)含まれています。
たとえば、あなたのキャラクターがプラットフォームに立っているとしましょう。プラットフォームのノードには、キャラクターのノードが含まれています。そのため、プラットフォームが移動するたびに、プラットフォームに含まれるノード(この場合はキャラクター)も移動します。
これを実現するには、すべてのノードに親ノードに対する(x、y)位置が必要です。たとえば、キャラクターはプラットフォームに対して(1,0)に配置され、プラットフォーム自体はゲームマップに対して(10,10)に配置されます。そうすれば、プラットフォームが移動すると、キャラクターは暗黙的に移動します。
この階層ツリーでは、すべてのノードの位置は、自分の位置と各親ノードの位置の合計に等しくなります。マップ上のキャラクターの位置を取得したいとしましょう。計算します:
(文字の位置)+(親ノードの位置)+(ルートノードの位置)=(1,0)+(10,10)+(0,0)= (11,0)
さて、これであなたのキャラクターはプラットフォーム上に立っています。ジャンプはどうですか?さて、彼がジャンプした瞬間に、あなたは彼をプラットフォームから切り離し、プラットフォームを含むノードに彼を取り付けます。この場合、マップ(ルートノード)。
彼が再び着陸したら、彼が着陸したノードに彼を取り付けます。
これを擬似物理問題として扱い、地面摩擦を使用して解決することをお勧めします。
すでに重力を使ってキャラクターを地面に固定しています。これにより、プラットフォームが上下に移動する状況に対応できます。左右の動きを処理するには、地面がキャラクターに大きな摩擦を及ぼす必要があります。通常、この摩擦レベルは1.0または100%です。
キャラクターが静止している場合、速度は0になり、摩擦のためにプラットフォームの速度の100%を継承します。次のようなもの:
character_velocity = friction * platform_velocity
このアプローチの利点は、急な坂道での摩擦を克服してキャラクターをスライドさせるなど、追加のプラットフォームメカニズムに簡単に役立つことです。また、摩擦を簡単に減らして、キャラクターが滑る氷を作成できます。
また、壁が低く垂れ下がっているなどの問題に対処することも簡単で、移動するプラットフォームからプレーヤーをノックすることができます。キャラクターを単純に親プラットフォームの子として扱う場合、多くの作業なしでは、衝突検出の他の部分と簡単にやり取りできない可能性が高くなります。