Ich bin auf ein Problem mit meiner Mega Man-Engine gestoßen, und die Struktur meiner Spielschleife macht es sehr schwierig, sie zu beheben. Bei Rush Jet oder einer fallenden Plattform muss Mega Man beim Fallen an der Plattform hängen bleiben. Das Beste, was ich tun kann (ohne auf Problemumgehungen wie magische Kraftfelder zurückzugreifen, die ihn nach unten ziehen), ist, dass er für einen einzelnen Frame fällt, wenn die Plattform zum ersten Mal zu fallen beginnt. Aber selbst dies erfordert, dass die fallende Plattform ihn während der Kollisionsprüfung nach unten zieht. Ohne diesen zusätzlichen Schritt "zittert" er ständig beim Fallen, wenn die Plattform absteigt.
Die Reihenfolge der Ereignisse in meiner Spielschleife macht dies möglich. Es geht so:
- Mega Man und Rush Jet fliegen eine Weile horizontal.
- Denkphase: Spieler drückt nach unten - die Plattform beschließt, ihre Geschwindigkeit nach unten zu setzen.
- Aktionsphase: Die Plattform bewegt sich nach unten, der Spieler ist sich dessen nicht bewusst.
- Reaktionsphase: Die beiden kollidieren nicht, so dass keine Überprüfung der "Bindungskraft" stattfinden kann.
- Im nächsten Frame fällt Mega Man. Einen Frame später holt die Schwerkraft auf und er landet wieder auf der Plattform und setzt seine y-Geschwindigkeit auf 0 zurück.
Sie können dort die Grundreihenfolge meiner Schleife sehen:
- Denkphase, in der Sie Kollisionen aus dem vorherigen Frame und andere Variablen analysieren, um über Zustandsübergänge und andere Anpassungen zu entscheiden.
- Aktionsphase - Jeder bewegt sich entsprechend seiner Geschwindigkeit.
- Reaktionsphase - Kollisionsprüfungen, Positionen anpassen, um sie zu fixieren. Dies behandelt auch Effekte wie das Verschieben von Plattformen, z. Schieben Sie den Spieler um einen gewissen Betrag. Die Änderungen seiner Geschwindigkeit werden im nächsten Frame während der Aktionsphase angewendet.
Ich habe versucht, diese Schritte und verschiedene andere Änderungen neu zu ordnen, aber sie alle machen das Ganze noch schlimmer, mit allen möglichen Fehlern. Wenn ich umfassende Änderungen an meinem Motor vornehmen muss, um diese Dinge richtig zu machen, möchte ich lieber wissen, was der "richtige" Weg ist, bevor ich Zeit verschwende.
Ich weiß, dass eine mögliche Lösung darin besteht, im Bewegungsschritt zu sehen, wer die Plattform im vorherigen Bild berührt hat, und ihn dann zu ziehen, damit sie sich tatsächlich zusammen bewegen. Das scheint jedoch zu komplex, um zwischen solchen Komponenten zu greifen. Mein Engine-Code fühlt sich bereits viel komplizierter an, als es das ursprüngliche Spiel hätte sein können, was darauf hindeutet, dass ich etwas falsch mache.
Gibt es also eine richtige Abfolge von Ereignissen? Es gibt hier eine andere Frage zum Verschieben von Dingen zusammen mit einer Plattform, die jedoch nicht die Reihenfolge der Ereignisse anspricht, die mein Problem verursacht. Wenn jemand wirklich weiß, wie die klassischen Mega Man-Spiele es gemacht haben, wäre das natürlich eine große Hilfe.
Unter https://github.com/Tesserex/C--MegaMan-Engine/tree/master/Mega%20Man finden Sie so viel von meinem Code, wie Sie möchten . Die CollisionComponent und die MovementComponent sind möglicherweise am nützlichsten.