Сценарии и циклы Logitech Lua

У меня небольшая проблема с моим скриптом, использующим мышь 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, возможно ли это?


person Ooffffff    schedule 06.01.2021    source источник
comment
Ваш repeat...until цикл здесь бесполезен. Убери это.   -  person Egor Skriptunoff    schedule 06.01.2021
comment
Добро пожаловать в Stack Overflow! Не вандализируйте свои сообщения. Размещая информацию на этом сайте, вы безоговорочно предоставляете сети Stack Exchange право распространять этот контент в соответствии с Лицензия CC BY-SA 4.0 на срок, который сочтет нужным. Альтернативы удалению см. В разделе: Я подумал над своим вопросом лучше; могу я его удалить?   -  person Sabito 錆兎    schedule 13.01.2021


Ответы (2)


Часто проверяйте, нажата ли кнопка, и разрывайте петлю.

Разбейте эти долгие блокирующие сны.

Вместо Sleep(400) подумайте о том, чтобы сделать что-нибудь вроде

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

Вы можете использовать break, чтобы выйти из цикла for, когда IsMouseButtonPressed(3)

    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
person Nifim    schedule 06.01.2021
comment
Использование break между имитацией нажатия и отпускания мыши - плохая идея: кнопка мыши может оставаться нажатой после выхода из OnEvent. - person Egor Skriptunoff; 06.01.2021
comment
@EgorSkriptunoff вне цикла for OP имеет PressAndReleaseKey("1"), что должно предотвратить его застревание. - person Nifim; 06.01.2021
comment
Теперь я вижу, что это нажатие клавиши, а не кнопки мыши. Я добавил вызов освобождения после цикла - person Nifim; 06.01.2021
comment
Первый скрипт работает! Большое спасибо за быстрый ответ. Скрипт действительно работает хорошо. С Новым годом и берегите себя! - person Ooffffff; 07.01.2021
comment
Первый скрипт работает на 300x и не повторяется. Второй и третий скрипт работают отлично. Он повторяет код 300x, а затем зацикливает его, пока я не нажму правую кнопку мыши. Большое спасибо! - person Ooffffff; 07.01.2021