Способ реализации:
Lua
Версия Warcraft:
Наработка превращает нажатия клавиш W, A, S, D, Ctrl, Space в нормированный Vector3, который можно сразу применять к юниту.
  • Нормализация позволяет обезопасить управление от всех этих страйфов и распрыжек, равномерно направляя юнита в любую из комбинаций сторон.
  • Для удобства использует EventDispatcher, тем самым подключаться к ней можно буквально в GUI.
  • Сама регистрирует на всех игроков-людей.
  • Можно задавать свой набор клавиш.

Демо

Установка

Использование

local EventDispatcher = Imp.import(EventDispatcher)

EventDispatcher.on("input.movement", function(event)
    -- Игрок, нажавший клавишу
    event.data.player

    -- Vector3 норм. вектор назначения
    event.data.destination
    
    -- Vector3 норм. вектор текущей нажатой/отжатой клавиши (напр., для прыжков)
    event.data.rawVector
    
    -- string айди клавиши
    event.data.keyId
end)

Свой набор клавиш

Можно задать свой набор клавиш, вызвав InputMovement.changeKeyMap() после срабатывания 0.01 таймера игрового времени.
local InputMovement = Imp.import(InputMovement)

InputMovement.changeKeyMap({
    FORWARD = OSKEY_W,
    BACKWARD = OSKEY_S,
    LEFT = OSKEY_A,
    RIGHT = OSKEY_D,
    UP = OSKEY_SPACE,
    DOWN = OSKEY_LCONTROL
})
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
Круто! Только при отдельном нажатии Ctrl или Space - юнит всегда поворачивается на право...
34
А как ты обошел проблему с паузой игры?
Это когда нажимаешь к примеру W, потом ходишь в меню, игра ставится на паузу, потом отпускаешь клавишу, выходишь из меню и игра продолжает думать что W нажата. Ну там понятно что игра не отправляет в триггеры событие "клавиша отпушена" во время паузы.
38
Никак, это не проблема системы. Можно повторно кликнуть W и она отпустится.
Близзы пофиксят со временем
25
ScorpioT1000:
Близзы пофиксят со временем
Вот бы так со всеми проблемами, как в наших влажных мечтах, эх.
А система норм, полезная штука
38
Можно повторно кликнуть W и она отпустится
Из-за этого, кстати, пришлось хранить вектора всех клавиш и каждый раз их суммировать вместо добавления/вычитания с каждым нажатием. Т.к. что-то может не пойматься

Я, кстати, знаю, как отловить выход из паузы, так что надо попробовать добавить фикс
34
Я, кстати, знаю, как отловить выход из паузы, так что надо попробовать добавить фикс
даже если отловишь, ничего не изменится. Ты сможешь только программно сбросить вектора в 0.
При этом у меня всё ещё может быть нажата клавиша W при выходе из паузы.
Если её отпустить, вектор будет минусовой, а если потом нажать то 0.
В таком кейсе вообще положительный никак не сделать, кроме манимуляции с паузой.
38
H,
Из-за этого, кстати, пришлось хранить вектора всех клавиш
Ты можешь послать 100500 отпусканий, вектор будет иметь значение 0, а не -100500

Кстати, нажатие клавиш вниз непрерывно шлет событие, а отпускание 1 раз) это здесь тоже безопасится, сравнивая текущий стейт

При этом у меня всё ещё может быть нажата клавиша W при выходе из паузы.
Ну и это редкий кейс
А вот про залипание при нажатии мыши надо будет посмотреть одну хитрость с metakey
33
Кстати, нажатие клавиш вниз непрерывно шлет событие, а отпускание 1 раз) это здесь тоже безопасится, сравнивая текущий стейт
На предпоследнем патче было норм, это завезли с последним патчем, у меня сильно подгорело с этого.. надесюь это случайность, и Близы уберут это
7
Даешь многоуровневое движения по плафтормам и под ними.
38
Вышла новая версия! Прокрутить к ресурсу
Обновление 1.2: обновил описание и тест карту (новая wGeometry)
Теперь при вертикальном движении в тестовой карте юнит не вращается.
38
Вышла новая версия! Прокрутить к ресурсу
Версия 1.5 с исправленным багом зажатия мыши + клавиши
38
Вышла новая версия! Прокрутить к ресурсу
Версия 2.0
  • Добавлена поддержка IMP
  • Убрана поддержка WLPM
  • Имя модуля изменено на EventDispatcher (из нижнего регистра)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.