«Контроль времени» в 2D-платформер


9

Я делаю 2d платформер, в котором игрок может нажать кнопку и перезапустить уровень, только его предыдущий персонаж также будет запускать уровень одновременно, как будто они путешествуют во времени.

Я знаю, что другие игры уже делали это раньше, и я подумал о том, чтобы заставить игрового персонажа выполнять набор действий (Idle, Jumping, Walking Left и т. Д.), А затем обнаруживать изменения в этих действиях и регистрировать их список вместе с игровым временем. Поэтому, когда мне нужно, чтобы персонаж снова запустил уровень, я могу просто просмотреть список, меняя его действия в нужное время.

Это лучший способ сделать это? У кого-нибудь есть опыт в этом?

Спасибо.


То, что вы ищете, это больше «Переигровка», чем контроль времени. Вы можете найти несколько хороших статей о том, как справиться с этим, но я все же говорю, что ответ ниже также является хорошим началом в этой области. Имейте в виду, что «случайные» в игре вещи могут испортить повторы для «призрачного» персонажа, который запускает его снова, если они могут повлиять на прогресс.
Джеймс

3
Хороший вопрос о «случайных» деталях. Обязательно используйте генератор случайных чисел, который генерирует свои числа на основе начального числа. Затем сохраните семя с вашим повтором и используйте то же самое семя при воспроизведении этого воспроизведения.
Bummzack

Как ты это сделал? Какой у вас обходной путь?

Ответы:


8

РЕДАКТИРОВАТЬ:

Пожалуйста, смотрите ответ @ Bluescrn на этот вопрос; он уточняет слабости в воспроизведении элементов управления, а не векторов движения или положения.

-

Вы на правильном пути. Вот подход, который я бы использовал:

Контроллеры

Создайте класс Controller, который получает ввод с клавиатуры и передает его вашему персонажу. Тем не менее, также есть запись контроллера точно, когда значимые клавиши (например, стрелки, прыжок и т. Д.) Были нажаты и когда они были отпущены. Это будет хранить такую ​​информацию:

actions[0].milliseconds = 400     actions[0].action = right pressed
actions[1].milliseconds = 1000    actions[1].action = jump pressed
actions[2].milliseconds = 1300    actions[2].action = jump released
actions[3].milliseconds = 2500    actions[3].action = jump pressed
actions[4].milliseconds = 3000    actions[4].action = jump released
actions[5].milliseconds = 5330    actions[5].action = right released

Контроллер имеет два режима:

  1. Запись: получает ввод с клавиатуры. Записи ввода в список. Руки ввода символов в зависимости от состояния клавиатуры.
  2. Воспроизведение: Игнорирует ввод с клавиатуры. Перемещение по списку в миллисекундах с момента начала уровня. Вручную ввод символов на основе записанного состояния клавиатуры в текущий момент.

Персонажи

Когда ваш объект Character создан, он создает новый контроллер для себя. Персонаж может находиться в одном из двух режимов в любое время:

  1. Активный: всегда есть только один активный Персонаж, и это тот, кем вы управляете. Когда персонаж находится в активном режиме, его контроллер находится в режиме записи.По умолчанию, когда персонаж создается, он находится в активном режиме.
  2. Призрак: это тот, который повторяет ваши прошлые действия. Когда Персонаж входит в режим Призрака, он меняет свой внешний вид и переводит свой Контроллер в режим воспроизведения.

Уровни

Недавно начатый уровень

Когда вы начнете уровень, создайте одного персонажа. Теперь уровень начинается, и игрок делает свое дело.

Когда время сбрасывается

Когда уровень сбрасывается, сделайте три вещи:

  1. Скажите текущему активному персонажу, чтобы войти в режим призрака.
  2. Создайте нового персонажа.
  3. Позвоните всем персонажам, чтобы сбросить себя. Это вернет их в исходное положение без движения и т. Д. Они, в свою очередь, сообщат своим контроллерам обнулить миллисекунду 0 без нажатия клавиш.

Затем начинается уровень, и игрок делает свое дело.


Это совершенно ясно. Большое спасибо. У меня вроде была правильная идея, но я собирался создать центральную систему, чтобы регистрировать движения, но наличие каждого персонажа, регистрирующего свое собственное движение, - гораздо более простой способ сделать это. Спасибо.
Вуди Занцингер

8

Если вы воспроизводите записанные входные данные, учтите последствия любых движущихся / разрушаемых / интерактивных объектов в мире, которые могли переместиться или изменить состояние при воспроизведении действий.

Кроме того, воспроизведение входных данных не будет работать точно, если ваша игра использует переменный временной шаг. Возможно, вы захотите рассмотреть обновление игры с фиксированным временным шагом (с интерполяцией для рендеринга с переменной частотой кадров)?


1
+10 если бы мог. Великие соображения. Воспроизведение либо векторов движения, либо положения будет лучше, чем воспроизведение ввода, в зависимости от желаемого эффекта. Десятки миллисекунд неточности между кадрами, вероятно, легче объяснить при работе с движением и положением, чем с вводом.
Doppelgreener


0

Запись ввода с клавиатуры может быть не очень полезна в вашем случае. Однако вы можете создать сплайн со шкалой времени. Вы даже можете перемотать время, если ваш хитрый с силами, которые вам нужно применить

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.