LUA-скриптинг включение / выключение скрипта
Я пишу скрипт в API сценариев LUA/logitech. Скрипт должен выполнить следующее:
Код следующий:
forceMove = false
on = false
function OnEvent(event, arg)
--OutputLogMessage("event = %s, arg = %s\n", event, arg);
if IsMouseButtonPressed(5) then
forceMove = not forceMove
while(on) do
if(forceMove) then
ForceMove()
else
StartAttack()
end
end
ReleaseMouseButton(5)
end
if IsMouseButtonPressed(4) then
on = not on
ReleaseMouseButton(4)
end
end
function StartAttack()
PressAndReleaseMouseButton(1)
Sleep(1000)
end
function ForceMove()
MoveMouseWheel(1)
Sleep(20)
MoveMouseWheel(-1)
end
но однажды в игре, если я активирую сценарий с помощью кнопки мыши 4, я застреваю в режиме "принудительное движение", и режим "автоматической атаки" никогда не работает. Не могу понять, почему.
1 ответ
Когда вы нажимаете кнопку мыши 5, вы активируете режим "принудительное движение". Если одновременно включен режим "on", вы получите бесконечный цикл:
while(on) do
if(forceMove) then
ForceMove()
else
StartAttack()
end
end -- loops regardless of mouse buttons
Вы останетесь здесь навсегда, независимо от нажатия кнопок мыши. Вам нужно перейти к выполнению кода из обработчика событий мыши. Обработчик должен обновлять только такие значения, как forceMove, для выполнения действия необходима другая функция. В этих функциях вы делаете только ОДИН шаг, а не много. Затем вы снова проверяете наличие нажатых кнопок мыши, выполняете действия и так далее. Пример кода:
function update()
if IsMouseButtonPressed(4) then
on = not on
end
if IsMouseButtonPressed(5) then
forceMove = not forceMove
end
end
function actions()
if on then
if forceMove then
ForceMove()
end
end
end
Как собрать все вместе: вы должны использовать какой-то цикл, но в идеале игровой движок должен сделать это за вас. Это будет выглядеть примерно так:
local is_running = true
while is_running do
update()
actions()
end
Теперь, если вы нажмете кнопку, вы сохраните текущее состояние в некоторых глобальных переменных, к которым получают доступ как обновление, так и действия. Функции вызываются каждый цикл (который может быть вычислением одного кадра). Предполагая, что вы не нажимаете никаких дальнейших кнопок, update() ничего не делает, поэтому forceMove
а также on
оставаться прежним. Таким образом, у вас есть непрерывное движение без петли в действии ().