Logitech Lua脚本和循环

我在使用罗技鼠标进行游戏农场时遇到了一些小问题。

function OnEvent(event, arg)
   if event == "MOUSE_BUTTON_PRESSED" and arg == 5 then
    for i = 0, 300 do
            PressAndReleaseKey("f9")
            Sleep(400)
            PressAndReleaseKey("enter")
            Sleep(600)
            PressAndReleaseKey("f5")
            Sleep(50)
            PressMouseButton(1)
            Sleep(50)
            ReleaseMouseButton(1)
    end
            PressAndReleaseKey("1")
    repeat
    until IsMouseButtonPressed(3)
   end
end

因此,它将循环300次,然后在完成操作后按下1,然后再次循环300次,以此类推。我面临的问题是,当我试图中止脚本时,它会首先完成for循环,然后使用右键按钮(IsMouseButtonPressed(3))停止,这非常难以计时(300倍是很多的)

如何在for循环期间暂停/停止它,是否可能?

点赞
用户2858170
用户2858170

经常检查按钮是否被按下并跳出循环。

将那些长时间的阻塞睡眠分解成段。

考虑使用类似下面的代码代替 Sleep(400)

for i = 1, 400, 50 do
  Sleep(50)
  if IsMouseButtonPressed(3) then break end
end
2021-01-06 16:14:31
用户7396148
用户7396148

IsMouseButtonPressed(3) 时,你可以使用 break 来跳出 for 循环。

    for i = 0, 300 do
        if IsMouseButtonPressed(3) then
            break -- 退出循环。
        end
        PressAndReleaseKey("f9")
        Sleep(400)
        PressAndReleaseKey("enter")
        Sleep(600)
        PressAndReleaseKey("f5")
        Sleep(50)
        PressMouseButton(1)
        Sleep(50)
        ReleaseMouseButton(1)
    end

这样做意味着你可以预期最大延迟为 1.1 秒,因为有 sleep 调用,以便可以注册退出。


你可以通过添加一个函数在 sleep 间隔期间来轮询 IsMouseButtonPressed(3) 来更改代码。

local function MousePollingSleep(time)
    loopCount = time / 50
    for i = loopCount, 0, -1 do
        if IsMouseButtonPressed(3) then
            return false
        end
        sleepTime = (i >= 1 and 1 or i) * 50
        Sleep(sleepTime)
    end
    return true
end

并将你的 for 循环改为

function OnEvent(event, arg)
   if event == "MOUSE_BUTTON_PRESSED" and arg == 5 then
      repeat
          for i = 0, 300 do
              PressAndReleaseKey("f9")
              if MousePollingSleep(400) == false then break end
              PressAndReleaseKey("enter")
              if MousePollingSleep(600) == false then break end
              PressAndReleaseKey("f5")
              if MousePollingSleep(50) == false then break end
              PressMouseButton(1)
              if MousePollingSleep(50) == false then break end
              ReleaseMouseButton(1)
          end
          ReleaseMouseButton(1)
          PressAndReleaseKey("1")
      until IsMouseButtonPressed(3)
   end
end
2021-01-06 16:17:58