„Kontrola czasu” w platformówce 2D

9

Tworzę platformówkę 2D, w której gracz może nacisnąć przycisk i zrestartować poziom, tylko jego poprzednia postać będzie również biegać w tym samym czasie, jakby cofały się w czasie.

Wiem, że inne gry już to robiły, i pomyślałem o tym, aby postać miała zestaw działań (bezczynność, skakanie, chodzenie w lewo itp.), A następnie wykryła zmiany w tych działaniach i zalogowała je lista wraz z czasem gry. Kiedy więc potrzebuję, aby postać ponownie uruchomiła poziom samodzielnie, mogę po prostu przejrzeć listę, zmieniając jej działania we właściwym czasie.

Czy to najlepszy sposób, aby to zrobić? Czy ktoś ma w tym jakieś doświadczenie?

Dzięki.

Woody Zantzinger
źródło
To, czego szukasz, to bardziej „powtórka” niż kontrola czasu. Możesz znaleźć kilka fajnych artykułów na temat tego, jak sobie z tym poradzić, ale nadal twierdzę, że odpowiedź poniżej jest również dobrym początkiem w tej dziedzinie. Pamiętaj, że rzeczy, które są „losowe” w grze, zepsują powtórki dla postaci „ducha”, która uruchomi ją ponownie, jeśli mogą wpłynąć na postęp.
James
3
Dobra uwaga na temat „losowych” części. Pamiętaj, aby użyć losowego generatora, który generuje swoje liczby na podstawie nasion. Następnie zapisz ziarno ze swoją powtórką i użyj tego samego ziarna podczas odtwarzania tej powtórki.
bummzack
Jak to zrobiłeś? Jakie jest twoje obejście?

Odpowiedzi:

8

EDYTOWAĆ:

Zobacz odpowiedź @ Bluescrn na to pytanie; omawia słabości w odtwarzaniu elementów sterowania, a nie wektory ruchu lub pozycję.

-

Jesteś na dobrej drodze. Oto podejście, którego użyłbym:

Kontrolery

Utwórz klasę kontrolera, która odbiera dane z klawiatury i przekazuje je twojej postaci. Jednak należy również mieć zapis kontrolera dokładnie wtedy, gdy naciśnięto znaczące klawisze (np. Strzałki, skok itp.) I kiedy zostały zwolnione. Przechowuje takie informacje:

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

Kontroler ma dwa tryby:

  1. Nagrywanie: odbiera dane z klawiatury. Rejestruje dane wejściowe na liście. Podaje wprowadzane znaki na podstawie stanu klawiatury.
  2. Powtórka: ignoruje wprowadzanie z klawiatury. Postępy w liście według milisekund, które upłynęły od początku poziomu. Podaje wprowadzane znaki na podstawie zarejestrowanego stanu klawiatury w danym momencie.

Postacie

Kiedy twoja postać postaci zostanie zbudowana, sama tworzy nowy kontroler. Postać może znajdować się w jednym z dwóch trybów w dowolnym momencie:

  1. Aktywny: Zawsze jest tylko jedna aktywna postać i to ta, którą kontrolujesz. Kiedy postać jest w trybie aktywnym, jej kontroler jest w trybie nagrywania. Domyślnie, gdy postać jest konstruowana, znajduje się w trybie aktywnym.
  2. Ghost: To ta, która odtwarza twoje poprzednie działania. Kiedy postać wchodzi w tryb ducha, zmienia swój wygląd i ustawia kontroler w trybie powtórki.

Poziomy

Świeżo rozpoczęty poziom

Kiedy zaczynasz poziom, utwórz pojedynczą postać. Teraz zaczyna się poziom, a gracz robi swoje.

Kiedy czas się resetuje

Po zresetowaniu poziomu wykonaj trzy czynności:

  1. Powiedz bieżącej aktywnej postaci, aby przeszła w tryb ducha.
  2. Utwórz nową postać.
  3. Zadzwoń do wszystkich postaci, aby się zresetowały. Spowoduje to umieszczenie ich z powrotem w pozycji początkowej bez ruchu itp. Z kolei każą swoim kontrolerom zresetować do milisekundy 0 bez naciskania klawiszy.

Następnie zaczyna się poziom i gracz robi swoje.

doppelgreener
źródło
To jest całkowicie jasne. Wielkie dzięki. Miałem trochę dobry pomysł, ale zamierzałem stworzyć centralny system do rejestrowania ruchu, ale posiadanie każdej postaci z osobnego ruchu jest o wiele łatwiejszym sposobem. Dzięki.
Woody Zantzinger,
8

Jeśli odtwarzasz zarejestrowane dane wejściowe, weź pod uwagę implikacje wszelkich ruchomych / zniszczalnych / interaktywnych obiektów na świecie, które mogły się przenieść lub zmienić stan podczas odtwarzania akcji

Ponadto odtwarzanie danych wejściowych nie będzie działać dokładnie, jeśli gra wykorzystuje zmienny timepep. Może warto rozważyć aktualizację gry o ustalonym czasie (z interpolacją do renderowania zmiennej prędkości klatek)?

bluescrn
źródło
1
+10, gdybym mógł. Wielkie względy. Odtwarzanie albo wektorów ruchu, albo pozycji byłoby lepsze niż odtwarzanie danych wejściowych, w zależności od pożądanego efektu. Dziesiątki milisekund niedokładności między ramkami są prawdopodobnie łatwiejsze do uwzględnienia podczas pracy z ruchem i pozycją niż przy wprowadzaniu.
doppelgreener
4

Istnieje wiele tematów, które dotyczą systemów nagrywania / odtwarzania gier itp., Które prawdopodobnie powinny być kluczem do twoich przeszłych przeglądów.

Oto jeden: Jak zaprojektować system powtórek

Tetrad
źródło
0

Nagrywanie danych z klawiatury może nie być przydatne w twoim przypadku. Możesz jednak wygenerować splajn za pomocą osi czasu. Możesz nawet cofnąć czas, jeśli masz problemy z siłami, które musisz zastosować

adrix89
źródło