LUA-скриптинг включение / выключение скрипта

Я пишу скрипт в API сценариев LUA/logitech. Скрипт должен выполнить следующее:

  • клавиша мыши 4 включает / выключает скрипт
  • кнопка мыши 5 переключается с одной функции на другую (принудительное перемещение и автоматическая атака)

    Код следующий:

    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 оставаться прежним. Таким образом, у вас есть непрерывное движение без петли в действии ().

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