ロックマンエンジンで問題が発生しました。ゲームループの構造により、修正が非常に困難になっています。Rush Jet、または落下するプラットフォームでは、ロックマンは落下してもプラットフォームに接続されたままでいる必要があります。現在、私ができる最善の方法(彼を引き寄せる魔法の力場のような回避策に頼ることなく)は、プラットフォームが最初に落ち始めたときに彼が1フレーム落ちるようにすることです。しかし、これでも、衝突チェック中に落下プラットフォームが彼を引き下げる必要があります。この追加のステップがなければ、プラットフォームが下降するとき、彼は常に「揺らぎ」ます。
ゲームループ内のイベントの順序がこれを実現しています。こんなふうになります:
- ロックマンとラッシュジェットがしばらく水平に飛んでいます。
- 思考フェーズ:プレーヤーが押し下げる-プラットフォームは速度を下向きに設定することを決定します。
- アクションフェーズ:プラットフォームが下に移動します。プレーヤーはこれを認識していません。
- 反応フェーズ:2つは衝突していないため、「拘束力」チェックは行われません。
- 次のフレームでは、ロックマンが落ちます。1フレーム後、重力が追いつき、再びプラットフォームに着地し、y速度を0にリセットします。
ループの基本的な順序がわかります。
- 前のフレームからの衝突やその他の変数を分析して、状態遷移やその他の調整を決定する思考フェーズ。
- アクションフェーズ-全員が速度に従って移動します。
- 反応フェーズ-衝突チェック、位置を調整して修正します。これは、プラットフォームの移動などのエフェクトも処理します。プレーヤーをある程度押します。彼の速度の変更は、アクションフェーズの次のフレームで適用されます。
私はこれらの手順と他のさまざまな変更を並べ替えてみましたが、すべてのバグがあり、すべてが全体をさらに悪化させています。これらのことを正しくするためにエンジンに大幅な変更を加える必要がある場合は、時間を無駄にする前に、「適切な」方法が何かを知りたいと思います。
私が考えられる解決策の1つは、前のフレームでプラットフォームに触れていた人を見て、その人を引き寄せて実際に一緒に移動するという動きのステップになることを知っています。しかし、それは複雑すぎるようで、そのようなコンポーネント間で到達します。私のエンジンコードは、元のゲームよりもずっと複雑に感じられ、何か間違っていることを示唆しています。
それで、イベントの適切なシーケンスはありますか?プラットフォームに沿って物事を移動することについてここで別の質問がありますが、それは私の問題の原因となるイベントの問題の順序には対応していません。また、クラシックロックマンのゲームのやり方を実際に知っている人がいれば、それは大きな助けになります。
https://github.com/Tesserex/C--MegaMan-Engine/tree/master/Mega%20Manで、必要なだけ私のコードを見つけてください。CollisionComponentとMovementComponentが最も便利です。