Мне интересно, как обычно создаются механизмы манипуляции временем в играх. Я особенно заинтересован в обращении времени (вроде как в последнем SSX или Prince of Persia).
Игра представляет собой 2D шутер сверху вниз.
Механизм, который я пытаюсь разработать / реализовать, имеет следующие требования:
1) Действия сущностей, кроме персонажа игрока, являются полностью детерминированными.
- Действие, которое предпринимает объект, основано на прогрессирующих кадрах с момента начала уровня и / или позиции игрока на экране.
- Объекты создаются в установленное время на уровне.
2) Обратное время работает, возвращаясь обратно в реальном времени.
- Действия игрока также меняются местами, оно повторяет действия игрока. Игрок не имеет контроля в обратном времени.
- Время, затрачиваемое на реверсирование, не ограничено, при желании мы можем полностью вернуться к началу уровня.
Например:
Кадры 0-50: в течение этого времени игрок перемещается на 20 единиц вперед в течение 20 кадра. Враг 1 перемещается влево на 10 единиц в течение кадра 30-40. Игрок стреляет пулей в кадре 45. Пуля движется на 5 вперед (45-50) и убивает врага 1 в кадр 50
Изменение этого положения приведет к воспроизведению в реальном времени: в течение этого времени игрок перемещается назад на 20 единиц. Враг 1 возрождается в кадре 50. Пуля возвращается в кадре 50. Пуля движется назад 5 и исчезает (50-45) Враг перемещается влево 10 (40-30) Враг удаляется в кадр 20.
Просто глядя на движение, у меня были некоторые идеи о том, как этого добиться, я подумал о том, чтобы иметь интерфейс, который изменял поведение в то время, когда время продвигалось или изменялось. Вместо того, чтобы делать что-то вроде этого:
void update()
{
movement += new Vector(0,5);
}
Я бы сделал что-то вроде этого:
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));
}
Однако я понял, что это не будет оптимальной производительностью и быстро усложнится для более продвинутых действий (таких как плавное движение по изогнутым траекториям и т. Д.).