Pracuję nad grą wyścigową i właśnie wdrożyłem ducha duchowego do odtwarzania poprzednich wyścigów. Korzystam z silnika fizyki i po wielu lekturach doszedłem do wniosku, że najlepszym sposobem przechowywania danych o duchach do odtworzenia byłoby zapisanie pozycji i obrotów samochodu w danych punktach czasowych, jak na przykład opisano tutaj: https: // gamedev. stackexchange.com/a/8380/26261 .
Ale jaki byłby dobry sposób na znalezienie tych punktów czasowych podczas powtórki? Przykładem może być zapis z tymi danymi:
time: +3.19932 (seconds since race start)
position: 180,40 (position at that time)
rotation: 30.4 (rotation at that time)
Ale mam z tym kilka problemów:
Kiedy ponownie odtwarzam, jest mało prawdopodobne, że ponownie dotrę do dokładnego punktu czasowego 3.19932 - bardziej prawdopodobne, że będę miał punkt czasowy około 3.1 i będę musiał znaleźć najbliższy pasujący rekord. Podczas interpolacji nawet najbliższe dopasowanie powyżej i poniżej. Brzmi bardzo nieefektywnie i zajmuje dużo czasu?
W jakiej strukturze listy mogę przechowywać te rekordy do późniejszego odtworzenia? Tablica? Czy to nie znaczy, że czas wyszukiwania rekordów pasujących do określonego czasu wydłuży się, im dłużej trwa wyścig?
Jakiej częstotliwości powinienem użyć dla punktów czasowych? Każda klatka byłaby - myślę - przesadą, raczej powinnam zapisać, tj. Każdą nią klatkę i interpolować pomiędzy nimi, co sprawia, że pytania w 2. pamięci są jeszcze trudniejsze.
Czy ten pomysł jest nawet właściwym podejściem? Jeśli tak, w jaki sposób mogę skutecznie przechowywać i odzyskiwać dane? Należy pamiętać, że generalnie chciałbym skorzystać z powyższej struktury danych, a nie deterministycznych gamestate i rejestrować dane wejściowe użytkownika itp.
Dzięki za wszelką pomoc!
EDYCJA: Zdaję sobie sprawę, że powinienem opisać środowisko, którego używam: Cocos2D na iPhone'a. Istnieje metoda update:(ccTime)delta
. Najlepiej byłoby, gdyby ta metoda była wywoływana co 1/60 sekundy, ale nie ma gwarancji - delta
jest to rzeczywisty czas, jaki upłynął od ostatniego gametu i może być znacznie większy lub mniejszy niż 1/60. Właśnie w tej metodzie chciałbym zapisać bieżący stan gry.
Odpowiedzi:
Nie :)
Załóżmy, że przechowujesz go jako tablicę (pamiętaj, że migawki są uporządkowane chronologicznie, ale nie są równomiernie rozmieszczone):
Następnie, gdy rozpoczyna się powtórka / gra, otrzymujesz pierwszy i drugi element z tablicy:
Następnie w każdej klatce (
currentTime
jest aktualny czas w tej nowej grze):Oczywiście można to zoptymalizować, buforując niektóre obliczenia. Nie ma przeszukiwania tablicy, tylko wyszukiwanie określonych wskaźników.
źródło
To nie jest zbyt trudne. Możesz przechowywać swoje dane w dowolnych punktach czasowych (im więcej, tym lepiej), i możesz interpolować wartości danych na podstawie poszukiwanego znacznika czasu oraz danych z dwóch najbliższych zarejestrowanych znaczników czasu, np .:
Teraz wyobraź sobie, że chcesz uzyskać pozycję i obrót w czasie 0.10. Ponieważ 0,10 znajduje się między punktami „1” (co oznacza czas 0,05) i „2” (co oznacza czas 0,15), musisz je interpolować.
Lerp
jest po prostu interpolacją liniową .Wypełnijmy zatem luki kilkoma przykładami (*).
HTH.
źródło