Движение персонажа с одинаковыми максимальными скоростями во всех направлениях с использованием аналогового геймпада

Я хочу перемещать своего персонажа в любом направлении с помощью аналогового входа геймпада с той же максимальной постоянной скоростью.

Обычно для 8 направленного движения я просто умножаю скорость игрока на константу в зависимости от типа направления.

ORTHOGONAL_SPEED = 2
DIAGONAL_SPEED = 1.414

то, что у меня есть, является десятичной из текущих осей от аналогового входа.

joy1_axisDir1 = a number between -1(left) and 1(right)
joy1_axisDir2 = a number between -1(up) and 1(down)

это то, что я теперь должен перемещать персонажа по экрану.

Код Lua:

if joy1_axisDir1 ~= 0 then
  player.x = player.x + (player.move_speed * joy1_axisDir1)
end
if joy1_axisDir2 ~= 0 then
  player.y = player.y + (player.move_speed * joy1_axisDir2)
end

Это приводит к тому, что диагональное движение заметно быстрее, чем в любом другом направлении.

Как мне учесть направление, чтобы ограничить скорость движения игрока?

1 ответ

Решение

Используйте теорему Пифагора, чтобы найти величину вашего вектора скорости, разделите ваши скорости X и Y на эту величину, а затем умножьте каждую на желаемую скорость движения.

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

Другие вопросы по тегам