"Zeitsteuerung" in einem 2d Platformer

9

Ich mache einen 2D-Plattformer, bei dem der Spieler einen Knopf drücken und das Level neu starten kann. Nur sein vorheriger Charakter wird das Level zur gleichen Zeit ausführen, als ob er in der Zeit zurückreist.

Ich weiß, dass andere Spiele dies bereits getan haben, und ich habe mir überlegt, den Spielcharakter dazu zu bringen, eine Reihe von Aktionen auszuführen (Leerlauf, Springen, Gehen nach links usw.) und dann Änderungen in diesen Aktionen zu erkennen und sich anzumelden eine Liste zusammen mit der Spielzeit. Wenn ich also den Charakter brauche, um das Level selbstständig erneut auszuführen, kann ich einfach die Liste durchgehen und seine Aktionen zum richtigen Zeitpunkt ändern.

Ist das der beste Weg, es zu tun? Hat jemand irgendwelche Erfahrungen damit?

Vielen Dank.

Woody Zantzinger
quelle
Was Sie suchen, ist eher eine "Wiederholung" als eine Zeitsteuerung. Vielleicht finden Sie einige nette Artikel darüber, wie Sie damit umgehen können, aber ich sage immer noch, dass die Antwort unten auch ein guter Anfang in diesem Bereich ist. Denken Sie daran, dass Dinge, die im Spiel "zufällig" sind, Wiederholungen für den "Geister" -Charakter vermasseln, der sie erneut ausführt, wenn sie den Fortschritt beeinflussen können.
James
3
Guter Punkt über die "zufälligen" Teile. Stellen Sie sicher, dass Sie einen Zufallsgenerator verwenden, der seine Zahlen basierend auf einem Startwert generiert. Speichern Sie dann den Startwert mit Ihrer Wiederholung und verwenden Sie denselben Startwert, wenn Sie diese Wiederholung spielen.
Bummzack
Wie hast du das gemacht? Was ist Ihre Problemumgehung?

Antworten:

8

BEARBEITEN:

Bitte lesen Sie die Antwort von @ Bluescrn auf diese Frage. Er geht eher auf Schwächen bei der Wiedergabe von Steuerelementen als auf Bewegungsvektoren oder Positionen ein.

- -

Du bist auf dem richtigen Weg. Hier ist der Ansatz, den ich verwenden würde:

Controller

Erstellen Sie eine Controller-Klasse, die Tastatureingaben empfängt und an Ihren Charakter weitergibt. Lassen Sie jedoch auch einen Controller genau aufzeichnen, wann die wichtigen Tasten (z. B. Pfeile, Sprünge usw.) gedrückt wurden und wann sie losgelassen wurden. Es würde diese Art von Informationen speichern:

actions[0].milliseconds = 400     actions[0].action = right pressed
actions[1].milliseconds = 1000    actions[1].action = jump pressed
actions[2].milliseconds = 1300    actions[2].action = jump released
actions[3].milliseconds = 2500    actions[3].action = jump pressed
actions[4].milliseconds = 3000    actions[4].action = jump released
actions[5].milliseconds = 5330    actions[5].action = right released

Ein Controller verfügt über zwei Modi:

  1. Aufnahme: Empfängt Tastatureingaben. Zeichnet Eingaben in der Liste auf. Übergibt die Zeicheneingabe basierend auf dem Tastaturstatus.
  2. Wiedergabe: Ignoriert Tastatureingaben. Fortschritte in der Liste nach Millisekunden, die seit Beginn des Levels vergangen sind. Übergibt die Zeicheneingabe basierend auf dem aufgezeichneten Tastaturstatus zum aktuellen Zeitpunkt.

Figuren

Wenn Ihr Character-Objekt erstellt wird, erstellt es einen neuen Controller für sich. Der Charakter kann sich jederzeit in einem von zwei Modi befinden:

  1. Aktiv: Es gibt immer nur einen aktiven Charakter, den Sie steuern. Wenn sich der Charakter im aktiven Modus befindet, befindet sich sein Controller im Aufnahmemodus. Wenn ein Charakter erstellt wird, befindet er sich standardmäßig im aktiven Modus.
  2. Ghost: Dies ist derjenige, der Ihre vergangenen Aktionen wiederholt. Wenn ein Charakter in den Ghost-Modus wechselt, ändert er sein Aussehen und setzt seinen Controller auf den Wiedergabemodus.

Ebenen

Ein frisch begonnenes Level

Wenn Sie das Level starten, erstellen Sie einen einzelnen Charakter. Jetzt beginnt das Level und der Spieler macht sein Ding.

Wenn die Zeit zurückgesetzt wird

Wenn das Level zurückgesetzt wird, machen Sie drei Dinge:

  1. Weisen Sie den aktuellen aktiven Charakter an, in den Ghost-Modus zu wechseln.
  2. Erstelle einen neuen Charakter.
  3. Rufen Sie alle Charaktere auf, um sich selbst zurückzusetzen. Dadurch werden sie ohne Bewegung usw. wieder in die Ausgangsposition gebracht. Sie weisen ihre Controller an, ohne gedrückte Tasten auf Millisekunde 0 zurückzusetzen.

Dann beginnt das Level und der Spieler macht sein Ding.

Doppelgrün
quelle
Das ist völlig klar. Vielen Dank. Ich hatte irgendwie die richtige Idee, aber ich wollte ein zentrales System erstellen, um Bewegungen zu protokollieren, aber es ist viel einfacher, wenn jeder Charakter seine eigene Bewegung protokolliert. Vielen Dank.
Woody Zantzinger
8

Wenn Sie aufgezeichnete Eingaben wiedergeben, berücksichtigen Sie die Auswirkungen von sich bewegenden / zerstörbaren / interaktiven Objekten auf der Welt, die sich bei der Wiedergabe der Aktionen möglicherweise verschoben oder geändert haben

Außerdem funktioniert die Wiedergabe von Eingaben nicht genau, wenn Ihr Spiel einen variablen Zeitschritt verwendet. Vielleicht möchten Sie ein Spiel-Update mit festem Zeitschritt (mit Interpolation für das Rendern mit variabler Framerate) in Betracht ziehen?

Bluescrn
quelle
1
+10 wenn ich könnte. Tolle Überlegungen. Das Wiedergeben von Bewegungsvektoren oder der Position wäre abhängig vom gewünschten Effekt der Wiedergabe von Eingaben überlegen. Ungenauigkeiten von zehn Millisekunden zwischen Frames sind bei der Arbeit mit Bewegung und Position wahrscheinlich leichter zu berücksichtigen als bei der Eingabe.
Doppelgreener
4

Es gibt viele Themen, die sich mit Spielaufzeichnungs- / Wiedergabesystemen usw. befassen, die wahrscheinlich der Grundstein für Ihre früheren Durchläufe sein sollten.

Hier ist eines: So entwerfen Sie ein Wiedergabesystem

Tetrad
quelle
0

Das Aufzeichnen der Tastatureingabe ist in Ihrem Fall möglicherweise nicht so nützlich. Sie können jedoch einen Spline mit einer Zeitleiste generieren. Sie können sogar die Zeit zurückspulen, wenn Sie mit den Kräften, die Sie anwenden müssen, schwierig sind

adrix89
quelle