1

我正在用 LUA/logitech 脚本 API 编写脚本。该脚本应执行以下操作:

  • 鼠标键 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 激活脚本,我就会陷入“强制移动”模式,而“自动攻击”模式永远不会起作用。想不通为什么。

  • 4

    1 回答 1

    2

    当您按下鼠标按钮 5 时,您将激活“强制移动”模式。如果同时启用了“开”模式,则会导致无限循环:

    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不变。这样,您可以在 action() 中没有循环的连续运动。

    于 2016-05-25T17:01:30.583 回答