LUA脚本开关控制

我正在使用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激活脚本后,我会被卡在“强制移动”模式中,而“自动攻击”模式永远不起作用。无法弄清原因。

点赞
用户3197530
用户3197530

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

while(on) do
    if(forceMove) then
        ForceMove()
    else
        StartAttack()
    end
end -- 不管按什么鼠标按钮都会进入循环

你将永远停留在这里,无论你按下哪个鼠标按钮。你需要将代码执行移出鼠标事件处理程序。处理程序只应该更新诸如 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 和 actions 两个函数访问。这些函数每个周期会被调用(可以是计算一个帧),假设你不再按任何按钮,则 forceMoveon 保持不变。这样,你就有了连续移动,而不需要在 action() 中使用循环。

2016-05-25 17:01:30