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

Демо

Установка

Вручную

Или WLPM

Используя WLPM и import("inputMovement") + import("eventDispatcher"):
wlpm install https://github.com/Indaxia/lua-inputMovement

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

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

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

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

При этом у меня всё ещё может быть нажата клавиша W при выходе из паузы.
Ну и это редкий кейс
А вот про залипание при нажатии мыши надо будет посмотреть одну хитрость с metakey
0
32
4 года назад
0
Кстати, нажатие клавиш вниз непрерывно шлет событие, а отпускание 1 раз) это здесь тоже безопасится, сравнивая текущий стейт
На предпоследнем патче было норм, это завезли с последним патчем, у меня сильно подгорело с этого.. надесюь это случайность, и Близы уберут это
2
7
4 года назад
2
Даешь многоуровневое движения по плафтормам и под ними.
1
37
4 года назад
1
Обновление 1.2: обновил описание и тест карту (новая wGeometry)
Теперь при вертикальном движении в тестовой карте юнит не вращается.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.