Zastanawiałem się, jak zaimplementować podróż w czasie do gry. Nic super skomplikowanego, po prostu odwrócenie czasu, tak jak w Braid, gdzie użytkownik może przewijać do tyłu / do przodu o 30 sekund lub cokolwiek innego.
Dużo szukałem w Internecie, ale moje wyniki zwykle odnosiły się do używania czasu, na przykład „jest 3:00” lub licznika czasu i tym podobnych.
Jedyne, o czym myślałem, to użycie 2 tablic, jednej dla pozycji x gracza, a drugiej dla pozycji y gracza, a następnie iteracji przez te tablice i umieszczenia postaci w tej pozycji podczas przewijania do tyłu / do przodu. Czy to może zadziałać? Gdyby zadziałało, jak duża musiałaby być tablica i jak często powinienem przechowywać xiy odtwarzacza? Jeśli to nie zadziała, co jeszcze mogę spróbować?
Z góry dziękuję!
źródło
import universal.back2future.FluxCapacitor;
Odpowiedzi:
Pomysł tablicowy jest podobny do tego, jak został zaimplementowany w Braid. Gdy jedynymi czynnikami działającymi na znak są grawitacja, wprowadzanie z klawiatury / klawiatury i inne znaki, wystarczy zapamiętać pozycję i prędkość na każdym kroku, aby poznać wszystko, co ważne o tym znaku. Jeśli przechowujesz 10 migawek na sekundę na postać, to wciąż mniej niż 50 KB na minutę historii jednej postaci - łatwe do zarządzania w większości systemów, a także możesz znaleźć sposoby, które są bardziej wydajne.
źródło
Przeczytaj wzorzec poleceń . Zapewnia cofanie akcji (i późniejsze ich ponowne wykonanie). To zajmowałoby się czymś więcej niż tylko pozycją statku, ale wszystkimi akcjami, które gracz podejmuje.
Ale myślę, że twój pomysł na tablicę też jest dobry.
źródło
(x+v)-v
może nie być równyx
.Zamiast mieć dwie osobne tablice, powinieneś prawdopodobnie mieć jedną klasę, która opisuje pozycję gracza (prawdopodobnie jest już klasa Point w Javie ... Ostatnio jestem facetem C #) i użyj jednej tablicy do utrzymywania poprzednich pozycji.
Musisz ustawić „bufor buforowy”, co oznacza, że kiedy dojdziesz do końca tablicy, powrócisz do początku tablicy, zastępując najstarsze wpisy. Jeśli cofniesz się w czasie, prawda jest odwrotna (kiedy dojdziesz do początku, zakreśl w górę do końca).
Jeśli chcesz przechowywać dane z ostatnich 30 sekund, musisz znać częstotliwość klatek, jeśli chcesz wstępnie przydzielić miejsce i użyć tablicy o stałym rozmiarze. Jeśli renderujesz grę z prędkością 10 klatek na sekundę, razy 30 sekund, to 300 elementów.
źródło
GDCVault ma wykład Jona Blow (twórcy Braid ) na swojej stronie o nazwie Realizacja Rewind w Braid za 3,95 USD. Założę się, że zawiera informacje, które chcesz;)
EDYCJA: Prawdopodobnie nie będzie w Javie, ale pomysły powinny się trzymać.
źródło
Jak powiedział Erik J , przechowywanie przeszłych pozycji gracza jako zbioru obiektów punktowych w buforze pierścieni wydaje się rozsądne.
Sugerowałbym jednak użycie kolejki do zaimplementowania bufora. Aktualizacja jest znacznie tańsza niż tablica i nie musisz wcześniej znać liczby klatek na sekundę:
Nie uwzględnia to jeszcze różnych częstotliwości wyświetlania klatek ani tego, co powinno się stać, jeśli faktycznie podróżujesz w czasie, więc sugeruję, aby przechowywać znacznik czasu dla każdego wpisu i sprawdzić, czy zamiast tego:
Mam nadzieję że to pomoże!
źródło
Istnieje wzorzec projektowy o nazwie Memento , myślę, że jest to punkt wyjścia do gry takiej jak Braid
http://en.wikipedia.org/wiki/Memento_pattern
Dodatkowe informacje tutaj: http://dofactory.com/Patterns/PatternMemento.aspx
źródło
Na XBox360 wydano grę, która wymagała manipulacji czasem. To było przeciętne, więc w tej chwili nie pamiętam tytułu. W każdym razie, w wywiadzie dla programisty, nakreślili, w jaki sposób poradzili sobie z manipulacją czasem:
Co X klatek (z niższymi wartościami X prowadzącymi do bardziej precyzyjnych manipulacji), robisz „migawkę” świata gry w tym momencie i kojarzysz go z czasem gry.
Podczas normalnej gry, z wyprzedzeniem, każde wejście reakcji przyczynia się do ustawienia migawki w pewnym momencie w przyszłości.
Świat gry dokonuje następnie iteracji między migawką w bieżącym czasie, a klatkami migawek X w przyszłości.
Następnie, jeśli chcesz cofnąć czas, po prostu ustaw kierunek czasu do tyłu, aby iterował między obecną i klatkami migawki X w przeszłości (wyłączając jednocześnie możliwość tworzenia przyszłych migawek).
źródło
Możesz po prostu traktować wirtualny czas gry jako kolejny kosmiczny wymiar. Zatem podróż w czasie z zewnątrz jest prostym ruchem n + 1 w wirtualnym wszechświecie gry.
Zakładając pewną interakcję użytkownika i pewnego rodzaju układ fizyki, który determinuje zachowanie twojego wszechświata, gdy nie ma wkładu użytkownika, wszystko, co musisz zarejestrować, to efekt interakcji użytkownika (na przykład zmiany w wektorach prędkości / przyspieszenia wymiaru n + 1) , ponieważ twoja fizyka powinna być odwracalna w czasie.
W ten sposób będziesz potrzebować znacznie mniej pamięci, aby obliczyć stan wszechświata gry przy dowolnej współrzędnej czasu.
źródło
(x+v)-v
może nie być równax
Załóżmy, że jednostka ma prędkość, obrót, pozycję xiy. Są to, z przyspieszeniem, podstawowe stany ruchu, wartości, jakkolwiek to nazwiesz. Możesz zapisać dane na dwa sposoby:
1. Zapisz obrót, pozycję xiy
2. Zapisz obrót, prędkość xi prędkość y
Jeśli masz stałą prędkość, możesz również zapisać tylko obrót lub tylko jedną prędkość dla obu osi.
Zapisywanie rotacji jest konieczne w grach, chyba że twoja istota ma rotację statyczną, co nie jest w większości przypadków.
To powiedziawszy, konieczne jest użycie listy obiektów dla wielu wartości. Jeśli masz ładny system timera, który na przykład wywołuje metody aktualizacji 20 razy na sekundę, a zatem jest niezależny od fps, możesz utworzyć tablicę 20 * 30 obiektów do przechowywania potrzebnych wartości ruchu przez ostatnie 30 sekund . Korzystanie z prostej tablicy nie jest zalecane, ponieważ każdy element musiałby zostać przesunięty o jeden indeks po każdym wywołaniu aktualizacji.
Na tej podstawie możesz przejrzeć listę lub cokolwiek, aby wrócić. Jeśli naprawdę chcesz uzyskać efekt „realistyczny”, użyj tej techniki dla wszystkich poruszających się obiektów. Ale to jest związane z projektowaniem gry.
Jeśli niszczysz przedmioty, pamiętaj o ich zebraniu, aby nie stresować swojego zgrabnego przyjaciela, Pana Śmiecia;)
źródło