Я разрабатываю однопользовательский RPG-платформер в XNA 4.0. Я хотел бы добавить способность, которая заставляла бы время «останавливаться» или замедляться, и в котором только персонаж игрока двигался с первоначальной скоростью (аналогично заклинанию «Стоп времени» из серии «Врата Балдура»). Я не ищу точную реализацию, скорее некоторые общие идеи и шаблоны дизайна.
РЕДАКТИРОВАТЬ: Спасибо всем за большой вклад. Я придумал следующее решение
public void Update(GameTime gameTime)
{
GameTime newGameTime = new GameTime(gameTime.TotalGameTime,
new TimeSpan(gameTime.ElapsedGameTime.Ticks / DESIRED_TIME_MODIFIER));
gameTime = newGameTime;
или что-то в этом роде. Таким образом, я могу установить другое время для компонента проигрывателя и другое для остальных. Это, конечно, не достаточно универсально, чтобы работать для игры, где искажение времени, как это, будет центральным элементом, но я надеюсь, что оно должно работать в этом случае. Мне немного не нравится тот факт, что он замусорил основной цикл обновления, но это, безусловно, самый простой способ реализовать его. Я предполагаю, что это в сущности то же самое, что предложил тесселоде, поэтому я собираюсь дать ему зеленую галочку :)
источник
Использование дельта-времени (миллисекунд, прошедших с последнего кадра) может быть недостаточно для замедления врагов. Такие вещи, как скорость атаки могут быть реализованы на основе времени последней атаки. Хотя он будет замедлять движение, если он основан на времени, он будет пренебрегать замедлением скорости атаки, произнесением заклинаний и другими эффектами (регенерация здоровья, длительность эффектов заклинаний) ... и т.
Если вы хотите замедлить большую группу игровых элементов в однопользовательской игре, вы можете создать вторые внутренние часы для каждого существа, часы начинаются в текущее время, когда появляется существо. Когда разыгрывается медленное заклинание, в каждом кадре часы увеличиваются на x% от времени, которое фактически прошло. Все поведение монстра определяется его внутренними часами. Если различные монстры имеют сопротивление замедлению, они могут использовать свои собственные часы, это в основном целое число, которое не требует много места или вычислений.
Когда медленный эффект прекращается, часы все еще используются и увеличиваются на 100% от фактически прошедшего времени.
Это также может работать для заклинаний ускорения.
@ Сидар: я вижу два варианта,
Внутренние часы на существо. Чтобы выяснить, готово ли существо к атаке снова: сохраните последний раз, когда использовалась каждая атака + время перезарядки и проверьте, прошли ли уже внутренние часы за это время.
Один таймер на атаку: вы знаете, сколько времени занимает перезарядка атаки, и вы просто устанавливаете таймер и вычитаете время, которое прошло * (1-замедление%) каждый ход.
Лично я предпочитаю избегать вычитания нескольких индивидуальных таймеров и пользовательских внутренних часов, чтобы сэкономить время и сложность обработки.
Это действительно зависит от предпочтений (это не сильно влияет на производительность).
источник
Вы можете начать с простого решения, такого как Тесселод или Мистер Бист. Но если вы начнете смешивать сложные вещи, например, время пули, когда заклинание замедления наложено, вы застрянете.
Я предлагаю вам реализовать иерархию часов :
Все в вашей игре должно использовать дельта-время от одного из часов: графические эффекты запускаются на часах GFX, AI и анимация запускаются на часах геймплея, существа, на которых воздействует заклинание замедления, запускаются на временных часах заклинания Замедление и т. Д. Затем различные вещи влияют на различные части вашей иерархии: заклинание замедления создает и воздействует на собственные часы, в то время как время маркера будет влиять на всю иерархию трехмерных часов.
источник
Вам просто нужны две разные часы вместо одной, одна на время, относящееся к игровому процессу, и одна «истинная».
Затем вы можете просто изменить gameSpeed, чтобы ускорить (> 1) или замедлить время (<1). Чтобы игрок двигался с разной скоростью, просто проверьте, замедлено ли время или нет.
источник