Ich arbeite an einem Autorennspiel und habe gerade ein Ghost Sprite implementiert, um vergangene Rennen wiederzugeben. Ich benutze eine Physik-Engine und bin nach langem Lesen zu dem Schluss gekommen, dass der beste Weg, die Geisterdaten für die Wiedergabe zu speichern, darin besteht, die Position und Drehung des Autos zu bestimmten Zeitpunkten aufzuzeichnen, wie hier beispielsweise beschrieben: https: // gamedev. stackexchange.com/a/8380/26261 .
Aber was wäre ein guter Weg, um diese Zeitpunkte während der Wiedergabe zu finden? Ein Beispiel wäre ein Datensatz mit diesen Daten:
time: +3.19932 (seconds since race start)
position: 180,40 (position at that time)
rotation: 30.4 (rotation at that time)
Aber ich habe einige Probleme damit:
Wenn ich wiederhole, ist es unwahrscheinlich, dass ich den genauen Zeitpunkt um 3.19932 wieder erreiche. Wahrscheinlicher ist, dass ich einen Zeitpunkt um 3.1 habe und den am besten passenden Datensatz finden muss. Bei der Interpolation auch die engste Übereinstimmung oben und unten. Das klingt sehr ineffizient und zeitaufwändig?
In welcher Listenstruktur könnte ich diese Datensätze für eine spätere Wiedergabe speichern? Eine Anordnung? Bedeutet das nicht, dass die Suchzeit für Datensätze, die einer bestimmten Zeit entsprechen, umso länger wird, je länger das Rennen dauert?
Welche Frequenz soll ich für Zeitpunkte verwenden? Jeder Frame wäre - ich denke - übertrieben, eher sollte ich dh jeden n-ten Frame speichern und dazwischen interpolieren, was die Speicherfragen in 2. noch schwieriger macht.
Ist diese Idee überhaupt der richtige Ansatz? Wenn ja, wie kann ich die Daten effizient speichern und abrufen? Bitte beachten Sie, dass ich im Allgemeinen die obige Datenstruktur verwenden möchte, nicht deterministische Spielzustände und Benutzereingaben usw. aufzeichnen möchte.
Vielen Dank für jede Hilfe!
EDIT: Mir ist klar, dass ich die Umgebung beschreiben sollte, die ich benutze: Cocos2D für iPhone. Es gibt eine Methode update:(ccTime)delta
. Idealerweise wird diese Methode alle 1/60 Sekunden aufgerufen, es gibt jedoch keine Garantie - delta
ist die tatsächliche Zeit, die seit dem letzten Gametick vergangen ist, und kann viel mehr oder weniger als 1/60 betragen. Bei dieser Methode möchte ich den aktuellen Spielstatus speichern.
Antworten:
Nein :)
Angenommen, Sie speichern es als Array (beachten Sie, dass die Schnappschüsse in chronologischer Reihenfolge, aber nicht gleichmäßig verteilt sind):
Wenn dann die Wiederholung / das Spiel beginnt, erhalten Sie das erste und zweite Element aus dem Array:
Dann in jedem Frame (
currentTime
ist die aktuelle Zeit in diesem neuen Spiel):Dies könnte natürlich durch Zwischenspeichern einiger Berechnungen optimiert werden. Es wird nicht im Array gesucht, sondern nur nach bestimmten Indizes gesucht.
quelle
Es ist nicht zu schwer. Sie können Ihre Daten zu beliebigen Zeitpunkten speichern (je mehr, desto besser) und die Werte der Daten basierend auf dem gesuchten Zeitstempel und den Daten von zwei am nächsten aufgezeichneten Zeitstempeln interpolieren, z.
Stellen Sie sich nun vor, Sie möchten Position und Drehung zum Zeitpunkt 0.10 erhalten. Da 0,10 zwischen den Punkten '1' (was 0,05 Zeit bedeutet) und '2' (was 0,15 Zeit bedeutet) liegt, müssen Sie diese interpolieren.
Lerp
ist nur lineare Interpolation .Füllen wir also die Lücken mit einigen Beispielen (*).
HTH.
quelle