"Контроль часу" на 2d платформері


9

Я роблю 2d платформер, де гравець може натиснути кнопку і перезапустити рівень, тільки їх попередній персонаж також буде одночасно запускати рівень, як і вони подорожують назад у часі.

Я знаю, що інші ігри робили це раніше, і те, як я думав це зробити, - це зробити, щоб ігровий персонаж мав набір дій (в режимі очікування, стрибки, ходьба вліво тощо), а потім виявляв зміни в цих діях і входив у них список разом із часом гри. Тоді, коли мені потрібен персонаж, щоб знову запустити рівень самостійно, я можу просто пройти список, змінивши його дії в потрібний час.

Це найкращий спосіб зробити це? Хтось має у цьому досвід?

Дякую.


Те, що ви шукаєте, - це більше «Повтор», ніж контроль часу. Можливо, ви знайдете кілька приємних статей про способи вирішення цього питання, але я все-таки кажу, що відповідь нижче - це також гарний початок у цій галузі. Майте на увазі, що речі, які є "випадковими" в грі, будуть виконувати повтори для персонажа "привид", який запустить його знову, якщо вони можуть вплинути на прогрес.
Джеймс

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. Повтор: Ігнорує введення клавіатури. Просувається по списку відповідно до мілісекунд, що минули з початку рівня. Передає введення символів залежно від записаного стану клавіатури в поточний момент.

Персонажі

Коли ваш персонаж об'єкт побудований, він створює для себе свіжий контролер. Характер може бути в одному з двох режимів у будь-який час:

  1. Активний: Є тільки один активний персонаж, і це той, яким ви керуєте. Коли персонаж знаходиться в активному режимі, його контролер знаходиться в режимі запису. За замовчуванням, коли персонаж побудований, він перебуває в активному режимі.
  2. Привид: це той, який відтворює ваші минулі дії. Коли персонаж переходить у режим «Привид», він змінює зовнішній вигляд і встановлює свій контролер у режим відтворення.

Рівні

Щойно розпочатий рівень

Коли ви запускаєте рівень, створіть один символ. Тепер рівень починається, і гравець робить свою справу.

Коли час скидається

Коли рівень скидається, виконайте три дії:

  1. Скажіть поточному активному персонажу, щоб увійти в режим привидів.
  2. Створіть нового персонажа.
  3. Зателефонуйте всім персонажам, щоб перезавантажитись. Це поверне їх у вихідне положення без руху і т. Д. Вони, в свою чергу, скажуть своїм контролерам повернутись до мілісекунди 0 без натискання клавіш.

Потім починається рівень, і гравець робить свою справу.


Це цілком зрозуміло. Дуже дякую. У мене якось була правильна ідея, але я збирався зробити центральну систему для реєстрації руху, але наявність кожного журналу символів власного руху - це набагато простіший спосіб зробити це. Дякую.
Вуді Зантзінгер

8

Якщо ви відтворюєте записані входи, врахуйте наслідки будь-яких рухомих / руйнуючих / інтерактивних об'єктів у світі, які, можливо, перейшли або змінили стан під час відтворення дій

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


1
+10, якби міг. Великі міркування. Відтворення або векторів руху, або положення було б кращим за відтворення вводу, залежно від бажаного ефекту. Десятки мілісекунд неточності між кадрами, ймовірно, легше враховувати під час роботи з рухом і положенням, ніж при введенні.
doppelgreener


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.