Zastanawiam się, jak zwykle zaprojektowane są mechanizmy manipulacji czasem w grach. Szczególnie interesuje mnie cofanie czasu (podobnie jak w najnowszym SSX lub Prince of Persia).
Ta gra to strzelanka 2D z góry.
Mechanizm, który próbuję zaprojektować / wdrożyć, ma następujące wymagania:
1) Działania podmiotów poza postacią gracza są całkowicie deterministyczne.
- Działanie podejmowane przez byt jest oparte na postępach klatek od początku poziomu i / lub pozycji gracza na ekranie
- Istoty odradzają się w ustalonym czasie na poziomie.
2) Odwrócenie czasu działa poprzez cofanie w czasie rzeczywistym.
- Działania gracza również są odwrócone, odtwarza w odwrotnej kolejności to, co zrobił gracz. Gracz nie ma kontroli podczas odwrotnego czasu.
- Czas cofania nie jest ograniczony, w razie potrzeby możemy cofnąć się do początku poziomu.
Jako przykład:
Klatki 0-50: Gracz porusza się w tym czasie o 20 jednostek Wróg 1 odradza się w klatce 20 Wróg 1 porusza się w lewo o 10 jednostek podczas klatki 30-40 Gracz strzela kulą w klatkę 45 Kula przemieszcza się 5 w przód (45-50) i zabija wroga 1 w rama 50
Cofnięcie tego odtwarzałoby się w czasie rzeczywistym: Gracz porusza się w tym czasie o 20 jednostek Wróg 1 odradza się w klatce 50 Kula pojawia się ponownie w klatce 50 Kula porusza się do tyłu 5 i znika (50-45) Wróg porusza się w lewo 10 (40-30) Wróg usunięty przy ramka 20.
Patrząc na ruch, miałem kilka pomysłów, jak to osiągnąć, pomyślałem o interfejsie, który zmieniałby zachowanie, gdy czas się zbliżał lub cofał. Zamiast robić coś takiego:
void update()
{
movement += new Vector(0,5);
}
Zrobiłbym coś takiego:
public interface movement()
{
public void move(Vector v, Entity e);
}
public class advance() implements movement
{
public void move(Vector v, Entity e)
{
e.location += v;
}
}
public class reverse() implements movement
{
public void move(Vector v, Entity e)
{
e.location -= v;
}
}
public void update()
{
moveLogic.move(new vector(5,0));
}
Jednak zdałem sobie sprawę, że nie byłoby to optymalne pod względem wydajności i szybko skomplikowałoby się w przypadku bardziej zaawansowanych działań (takich jak płynny ruch po zakrzywionych ścieżkach itp.).