Алгоритмы, Наработки и Способности
Способ реализации:
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
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.