Как я могу заставить игроков двигаться по диагонали с равной скоростью?

В 2D RPG на основе плитки персонаж должен пройти во все восемь направлений.

Однако, если мы слепо скажем игроку двигаться в направлении (1, 1), он будет примерно на 41% (√2 раза) быстрее. Таким образом, моя следующая идея заключалась в нормализации вектора направления перед перемещением.

К сожалению, поскольку вектор (1, 1) нормализуется до (√2 /2, √2 /2) ≈ (0,71, 0,71), но игра функционирует на основе всего пикселя, это заставит игрока достичь неверные 2D-местоположения. Моя следующая идея состояла в том, что я должен как-то сделать диагональное движение медленнее на √2.

Итак, я попробовал другой подход: когда я получаю вход и игрок еще не идет, я устанавливаю точку назначения игрока. Затем я вычисляю, сколько его пути к месту назначения игрок может фактически ходить в одном кадре, учитывая скорость игрока в «пикселах за кадр». Я буду повторять обновление позиции игрока в каждом кадре, пока не будет достигнут пункт назначения.

Так, например, если игроку необходимо переместиться из начала (0, 0) в направлении (1, 1) со скоростью 1, его спрайт будет отображаться на (0.71, 0.71) после одного кадра и в следующий кадр привязывается к месту назначения (1, 1). Это нормально, потому что игрок заканчивается с действительной координатой.

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

Как вы обычно решаете это?

4 голоса | спросил Chiru 7 J0000006Europe/Moscow 2017, 23:47:28

2 ответа


1

Существует несколько способов обхода.

  • Не основывайте движение на пикселях экрана. Базовое перемещение на более тонкой сетке (например, использование float) и только привязка к пикселям для отображения.
  • Объявить более быстрое диагональное движение «особенностью» игры.
  • Используйте шестнадцатеричную сетку.
ответил Peter 8 J0000006Europe/Moscow 2017, 01:11:34
0

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

Я думаю, что на практике вы вряд ли будете иметь дело с примерами, близкими к вашему временному разрешению. Это то, что @Charanor получает, когда они предлагают вам определить, если это даже проблема. Это вряд ли проблема, потому что вы, вероятно, не собираетесь перемещаться по 1 единице за кадр . Вы будете перемещать что-то гораздо медленнее, поэтому разрешение кадра намного меньше.

ответил MichaelHouse 8 J0000006Europe/Moscow 2017, 00:49:50

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132