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.
Antworten:
Ich weiß, dass diese Antwort nicht zum Titel dieser Frage passt, aber ich denke, sie könnte Ihr Problem lösen.
Ich habe mir Ihre Codebasis angesehen und Sie haben ein aggregiertes Komponentendesign zum Erstellen von Spielentitäten. Ich vermute, der Rush Jet hat eine eigene Spieleinheit und eine Liste von Komponenten ("Rush Jet" nenne ich diese bewegliche Plattform, ja, ich weiß nichts über Mega-Man-Spiele). Wenn dies der Fall ist, sollten Sie versuchen, den Rush Jet einer Spieler-Spieleinheit zu übergeben und eine Art Brücke einzurichten (nicht der beste Begriff).
Für diese "Brücke" hätte ich den Rush Jet nicht über die Tastatur eingegeben. Stattdessen würde der Spieler Eingaben vornehmen und in Ihrem Nachrichtensystem (das für die Spielkomponenten in einer Entität) könnte eine andere Spielkomponente an den Rush Jet gebunden sein, die auch die Bewegungsnachricht abfängt. Somit würden sowohl der Spieler als auch die Plattform zusammen bewegt. Sobald der Rushjet verschwunden ist, wird die Spielkomponente, die als Brücke zwischen dem Rushjet und dem Spieler dient, entsorgt und entfernt.
Ich denke, das ist eine plausible Alternative. Die Bewegung findet in Ihrer Spielschleife statt, und dann werden die Kollisionsprüfungen durchgeführt, um sicherzustellen, dass sich der Rush Jet und der Spieler innerhalb der Grenzen befinden. Ich glaube auch, dass es vollkommen in Ordnung ist, wenn der Rush-Jet auf diese Weise vom Spieler abhängig ist. Es ist nicht die großartigste Lösung, aber es wird wahrscheinlich funktionieren.
PS: Ich mag deine Codebasis. Der Code ist nicht der beste, aber es ist schön.
quelle
Okay, in seiner einfachsten Form sieht eine Spielschleife so aus:
In Ihrem Fall sollte Folgendes passieren:
Und so funktionieren die meisten Spiele, die ich schreibe.
Update: Wenn Sie weitere Informationen zum Schreiben einer guten Spieleschleife benötigen, lesen Sie jetzt weiter als diese gute Anleitung .
quelle