Jak wdrożyć grę w podróż w czasie?

10

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ę!

Alex
źródło
11
Nie czytasz wiadomości ( ust.hk/eng/news/press_20110719-893.html )? Właśnie pokazali, że podróże w czasie nie są możliwe. Dlatego kodowanie jest niemożliwe.
Musisz pomyśleć o możliwej semantyce dla podróży w czasie, dopiero potem możesz zacząć myśleć o implementacji.
Paŭlo Ebermann
2
Naucz się matematyki wektorowej . Jeśli proponujesz dwie osobne tablice, które sugerują, że nigdy z nimi nie pracowałeś. Uważam je za niezbędne, aby programista wiedział, jak bardzo mogą uprościć rzeczy.
doppelgreener
5
import universal.back2future.FluxCapacitor;
jhocking 13.09.11

Odpowiedzi:

6

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.

Kylotan
źródło
To jest właściwy utwór. Na przykład przechowuj aktywne polecenia: naciśnięcia klawiszy ze znacznikami czasu. Możesz ekstrapolować większość innych zachowań, jeśli system jest deterministyczny. Śledzenie 10 klatek na sekundę jest odpowiednie dla systemu przewijania do tyłu, jeszcze mniej może być akceptowalne, o ile zachowane są rzeczywiste polecenia, w efekcie stan lub zmiany obiektów.
karmington
4

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
Prawdopodobnie nie jest to świetny pomysł - poza tym , że wymaga więcej pamięci (za każdym razem, gdy dodajesz prędkość bytu do jego pozycji, musisz zapisać to jako „akcję”) , to w zasadzie wymaga matematyki stałoprzecinkowej, ponieważ jeśli używasz zmiennoprzecinkowego -punkt za twoje pozycje / prędkość, (x+v)-vmoże nie być równy x.
BlueRaja - Danny Pflughoeft
1
@BlueRaja - Nie widzę, gdzie to podejście wymagałoby dużej ilości pamięci. Przy 100 FPS i zapamiętywaniu ostatnich 10 sekund musisz przechowywać 1000 n-tupeli poleceń, gdzie n wynosi najwyżej 5 lub więcej. Lub nawet lepiej, przechowujesz tylko bezwzględną pozycję w każdej z tych klatek, a do przewijania po prostu animujesz postać do tyłu wzdłuż tej ścieżki. Pozwoliłoby to również wyeliminować ewentualne problemy z zmiennoprzecinkowe i doprowadziłoby cię z powrotem dokładnie tam, gdzie zacząłeś.
Hackworth,
3

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.

Eric J.
źródło
2

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ć.

NoobsArePeople2
źródło
Czy wiesz, czy sprzedają też transkrypt, czy tylko dźwięk?
o0 ”.
Nie mogłem nic znaleźć dzięki szybkiemu przeszukiwaniu strony. Może mógłbyś użyć oprogramowania do transkrypcji ?
NoobsArePeople2
1

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ę:

update():
   time_queue.push(player.positions)
   if current_time() - start_time > n:
       queue.pop()

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:

update():
    time_queue.push({
        'pos': player.positions,
        'time': current_time()
    })
    first_entry = queue.peek()
    while current_time() - first_entry['time'] > n:
       queue.pop()
       first_entry = queue.peek()

Mam nadzieję że to pomoże!

HumanCatfood
źródło
1

Istnieje wzorzec projektowy o nazwie Memento , myślę, że jest to punkt wyjścia do gry takiej jak Braid

Wzorzec memento to wzorzec projektowania oprogramowania, który umożliwia przywrócenie> obiektu do jego poprzedniego stanu (cofnięcie przez wycofanie).

Wzór pamiątkowy jest używany przez dwa obiekty: pomysłodawcę i dozorcę. Inicjator to jakiś obiekt, który ma stan wewnętrzny. Dozorca zrobi coś z pomysłodawcą, ale chce móc cofnąć zmianę. Opiekun najpierw prosi twórcę o obiekt pamiątkowy. Następnie wykonuje dowolną operację (lub sekwencję operacji), którą zamierza wykonać. Aby przywrócić stan do stanu sprzed operacji, zwraca obiekt memento twórcy. Sam obiekt pamiątkowy to obiekt nieprzezroczysty (taki, którego dozorca nie może lub nie powinien zmienić). Podczas korzystania z tego wzorca należy zachować ostrożność, jeśli twórca może zmienić inne obiekty lub zasoby - wzorzec pamiątkowy działa na pojedynczym obiekcie.

http://en.wikipedia.org/wiki/Memento_pattern

Dodatkowe informacje tutaj: http://dofactory.com/Patterns/PatternMemento.aspx

Marcelo Assis
źródło
2
Nie rozumiem, jak to powinno pomóc. Wygląda na to, że jest to „natychmiastowe wycofanie”, podczas gdy OP poprosił o coś gładkiego, takiego jak Braid. Może coś źle odczytałem?
o0 ”.
Ten wzorzec nie oznacza pojedynczego wycofania, można na przykład utworzyć „oś czasu” działań. Oto post na blogu Brazillian na temat użycia tego wzoru: abrindoojogo.com.br/padroes-de-projeto-memento Oto przykład wykonany we Flashu: abrindoojogo.com.br/files/fasteroids.swf Przesuń: Strzałki | Strzelaj: Space | Operacje przewijania: Backspace
Marcelo Assis,
1

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).

Jordaan Mylonas
źródło
+1 za punkt dotyczący szczegółowości migawek.
Omar Kooheji,
0

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.

biziclop
źródło
Jak wspomniałem w innym komentarzu, fizyka w grach wideo zwykle nie jest odwracalna w czasie, ponieważ przy użyciu liczb zmiennoprzecinkowych (x+v)-vmoże nie być równax
BlueRaja - Danny Pflughoeft
0

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;)

Marco
źródło