Мне было интересно, как реализовать путешествие во времени в игре. Ничего сверхсложного, только обращение времени, как в Braid, где пользователь может перемотать время назад / вперед на 30 секунд или что-то еще.
Я много искал в Интернете, но мои результаты обычно ссылались на использование времени, например «сейчас 3 часа» или на таймер и тому подобное.
Единственное, о чем я мог подумать, - это использовать 2 массива, один для позиции x игрока, а другой для позиции y игрока, а затем перебирать эти массивы и помещать персонажа в эту позицию по мере их перемотки назад / ускоренной перемотки вперед. Может ли это работать? Если это сработает, насколько большим должен быть массив и как часто я должен хранить x и y плеера? Если это не сработает, что еще я могу попробовать?
Заранее спасибо!
источник
import universal.back2future.FluxCapacitor;
Ответы:
Идея массива очень похожа на то, как она была реализована в Braid. Когда единственными вещами, действующими на персонажа, являются гравитация, ввод с клавиатуры / джойстика и другие символы, вам достаточно всего лишь сохранять положение и скорость на каждом шаге, чтобы знать все важные сведения об этом персонаже. Если вы сохраняете 10 снимков в секунду на каждого персонажа, то за одну минуту истории одного персонажа это все равно менее 50 КБ - это легко управляемо на большинстве систем, и вы также можете найти способы, более эффективные, чем это.
источник
Читайте о Командном Образце . Он предусматривает отмену действий (и последующее их повторное выполнение). Это будет обрабатывать не только положение корабля, но и все действия, предпринимаемые игроком.
Но я думаю, что твоя идея о массиве тоже правильная.
источник
(x+v)-v
может быть не равнаx
.Вместо того, чтобы иметь два отдельных массива, у вас, вероятно, должен быть один класс, который описывает позицию игрока (возможно, в Java уже есть класс Point ... я в последнее время работаю в C #) и использовать один единственный массив для хранения прошлых позиций.
Вам необходимо установить «кольцевой буфер», то есть, когда вы доберетесь до конца массива, вы вернетесь к началу массива, переписав самые старые записи. Если вы путешествуете во времени, верно обратное (когда вы доберетесь до начала, обведите кружком до конца).
Если вы хотите хранить прошлые данные за 30 секунд, вам нужно знать частоту кадров, если вы хотите предварительно выделить пространство и использовать массив фиксированного размера. Если вы рендерите игру со скоростью 10 кадров в секунду, время 30 секунд, это 300 элементов.
источник
У GDCVault есть лекция Джона Блоу (создателя Braid ) на их сайте под названием «Реализация перемотки в Braid» за $ 3,95. Готов поспорить, что там есть информация, которую вы хотите;)
РЕДАКТИРОВАТЬ: Вероятно, не будет в Java, но идеи должны держаться.
источник
Как сказал Эрик Дж , сохранение прошлых позиций игрока в виде набора точечных объектов в кольцевом буфере звучит разумно.
Тем не менее, я бы предложил использовать очередь для реализации буфера. Обновление гораздо дешевле, чем массив, и вам не нужно заранее знать частоту кадров:
Это еще не учитывает изменяющуюся частоту кадров или то, что должно произойти, если вы действительно совершаете какое-то путешествие во времени, поэтому я предлагаю вам сохранить отметку времени с каждой записью и проверить, что вместо этого:
Надеюсь это поможет!
источник
Есть шаблон дизайна под названием Memento , я думаю, что это отправная точка для такой игры, как Braid
http://en.wikipedia.org/wiki/Memento_pattern
Дополнительная информация здесь: http://dofactory.com/Patterns/PatternMemento.aspx
источник
Была выпущена игра для XBox360, которая включала манипулирование временем. Это было посредственно, поэтому я не могу вспомнить название в настоящее время. Во всяком случае, в интервью с разработчиком они рассказали, как им удалось манипулировать временем:
Каждые X кадров (с более низкими значениями X, ведущими к более детальной манипуляции), вы берете «моментальный снимок» игрового мира в этот момент и связываете его со временем в игре.
При обычном прохождении игры, время вперёд, каждая реакция реагирует на моментальный снимок, установленный в будущем.
Затем игровой мир выполняет итерации между моментальным снимком в текущий момент времени и кадрами X в будущем.
Затем, когда вы хотите повернуть время вспять, просто установите направление времени назад, чтобы оно повторялось между прошлым и текущим кадрами моментального снимка (при отключении возможности создания будущих снимков).
источник
Вы можете просто относиться к виртуальному времени игры как к другому пространственно-подобному измерению. Итак, что такое путешествие во времени извне - это простое n + 1-мерное движение в виртуальной вселенной игры.
Предполагая некоторое взаимодействие с пользователем и какую-то физическую систему, которая определяет поведение вашей вселенной, когда нет ввода пользователя, все, что вам нужно записать, - это влияние взаимодействия с пользователем (например, изменения в векторах скорости / ускорения измерения n + 1) Так как ваша физика должна быть обратимой во времени.
Таким образом, вам понадобится гораздо меньше памяти, чтобы вычислить состояние игровой вселенной в любой момент времени.
источник
(x+v)-v
не может быть равнымx
Допустим, у объекта есть скорость, вращение, положение x и y. Это, с ускорением, основные состояния движения, ценности, как вы это называете. Вы можете сохранить данные двумя способами:
1. Сохранить вращение, координаты x и y
2. Сохранить вращение, скорость x и скорость y
Если у вас есть фиксированная скорость, вы также можете сохранить только вращение или сохранить только одну скорость для обеих осей.
Сохранение ротации необходимо в играх, если только у вашей сущности нет статической ротации, которой в большинстве случаев не является.
Тем не менее, использование списка объектов для нескольких значений необходимо. Если у вас есть хорошая система таймера, которая, например, вызывает методы обновления 20 раз в секунду и, следовательно, не зависит от fps, вы можете создать массив из 20 * 30 объектов для хранения необходимых вам значений движения в течение последних 30 секунд. , Использование простого массива не рекомендуется, так как вам придется перемещать каждый элемент на один индекс влево при каждом вызове обновления.
Исходя из этого, вы можете просмотреть список или что-то еще, чтобы вернуться. Если вы действительно хотите получить «реалистичный» эффект, используйте эту технику для всех движущихся объектов. Но это связано с игровым дизайном.
Если вы уничтожаете предметы, не забудьте объединить их, чтобы не напрягать своего аккуратного друга мистера Мусора;)
источник