【问题标题】:Logitech Lua Scripting and Looping罗技 Lua 脚本和循环
【发布时间】:2021-04-12 09:33:11
【问题描述】:

我在这里使用 Logitech 鼠标的脚本有点问题。我将在游戏中使用它进行耕作。

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))停止,这真的很难计时(300x 是很多)

如何在 for 循环期间暂停/停止它,可以吗?

【问题讨论】:

  • 你的 repeat...until 循环在这里没用。删除它。
  • 欢迎来到 Stack Overflow!不要破坏你的帖子。通过在本网站上发布,您已不可撤销地授予 Stack Exchange 网络以CC BY-SA 4.0 license 分发该内容的权利,只要它认为合适即可。有关删除的替代方法,请参阅:I've thought better of my question; can I delete it?

标签: loops lua repeat logitech


【解决方案1】:

经常检查按钮是否被按下并中断循环。

打破那些长期阻塞的睡眠。

而不是Sleep(400) 考虑做类似的事情

for i = 1, 400, 50 do
  Sleep(50)
  if IsMouseButtonPressed(3) then break end
end

【讨论】:

    【解决方案2】:

    IsMouseButtonPressed(3)时可以使用break跳出for循环

        for i = 0, 300 do
            if IsMouseButtonPressed(3) then
                break -- exit for loop.
            end
            PressAndReleaseKey("f9")
            Sleep(400)
            PressAndReleaseKey("enter")
            Sleep(600)
            PressAndReleaseKey("f5")
            Sleep(50)
            PressMouseButton(1)
            Sleep(50)
            ReleaseMouseButton(1)
        end
    

    这样做意味着您可以预期由于睡眠调用而导致的最大延迟为 1.1 秒,以便注册退出。


    您可以通过添加一个函数来更改您的代码,以便在您的睡眠间隔期间轮询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
    

    【讨论】:

    • 在按下鼠标和释放鼠标模拟之间使用break 是个坏主意:从 OnEvent 退出后鼠标按钮可能保持按下状态。
    • @EgorSkriptunoff 在 for 循环 OP 之外有 PressAndReleaseKey("1") 应该可以防止它卡住。
    • 我现在看到这是按键而不是鼠标按钮。我在循环之后添加了一个发布调用
    • 第一个脚本有效!非常感谢您的快速回复。脚本确实运行良好。新年快乐,注意安全!
    • 第一个脚本适用于 300x,不再重复。第二个和第三个脚本完美运行。它重复代码 300x 然后循环它直到我按下右键单击按钮。非常感谢!
    猜你喜欢
    • 2021-08-14
    • 2021-08-13
    • 2020-11-02
    • 2021-02-04
    • 2021-11-12
    • 2022-01-07
    • 2020-01-26
    • 2021-08-13
    • 2021-05-27
    相关资源
    最近更新 更多