Кодирование Lua с обратным перемещением

#lua #logitech-gaming-software

Вопрос:

 function OnEvent(event, arg)

  OutputLogMessage("event = %s, arg = %dn", event, arg)
  if event == "PROFILE_ACTIVATED" then
    EnablePrimaryMouseButtonEvents(true)
  elseif event == "PROFILE_DEACTIVATED" then
    ReleaseMouseButton(2) -- to prevent it from being stuck on
  elseif event == "MOUSE_BUTTON_PRESSED" 
               and (arg == 5 or arg == 4) then 
    recoil = recoil ~= arg and arg
  elseif event == "MOUSE_BUTTON_PRESSED" 
               and arg == 1 and recoil == 5 then
    MoveMouseRelative(0, -3) 
    for i = 1, 17 do
      MoveMouseRelative(0, 2)  
      Sleep(15)
      if not IsMouseButtonPressed(1) then return end

    end

  elseif event == "MOUSE_BUTTON_PRESSED" 
               and arg == 1 and recoil == 4 then
    MoveMouseRelative(0, -3) 
    for i = 1, 35 do
      Sleep(15)
      MoveMouseRelative(0, 2)       
      if not IsMouseButtonPressed(1) then return end
    end
    if not IsMouseButtonPressed(1) then return end
  end
end
 

Это сценарий Lua , мне интересно, как я могу получить начальную позицию мыши и после этого вернуться в исходное положение.

Я попытался добавить MoveMousePosition(x,y)- (32767, 32767 ) в нижней части сценария, но в игре это не сработало . Только на рабочем столе ..

Я просто хочу после перемещения, когда я отпущу щелчок мыши, чтобы вернуться в центр или в первую позицию .

Комментарии:

1. @Егор Скриптунофф — пожалуйста , помогите мне, я знаю вашего эксперта по этим вопросам lua.

2. У меня все еще кружится голова от вашего форматирования, но я думаю, что главная проблема здесь в том, что вы не можете устанавливать абсолютные позиции в относительном режиме (например, в играх). Так ли это на самом деле? Если да, просто используйте MoveMouseRelative и отмените свое движение. Итак, для вашего первого сценария MoveMouseRelative(0, 3 - 17 * 2)

3. я пробовал это раньше, но если я просто нажму на кнопку, похожую на огонь, в течение 2 секунд, она увеличится быстрее, чем в тот момент, когда я захочу, из положения отмены . и если я хочу продолжать нажимать дольше, чем я не могу, потому что функция перемещения(0, 3 — 17 * 2) начнется после того, как «для утверждения» закончится. Мне нужно в этом сценарии ввести , когда щелчок находится на позиции записи, и когда щелчок отпущен, чтобы вернуть эту позицию, в обоих сценариях я хочу добавить это. В любом случае спасибо за информацию об отмене , я подумаю в будущем, чтобы сделать ее с помощью оператора отмены

4. Мне кажется, я понимаю. Следите за общей перемещенной позицией. например, после вызова MoveMouseRelative увеличения MouseMovedY или чего-то еще (возможно, введете функцию, выполняющую и то, и другое). Затем, всякий раз, когда вы хотите сбросить, используйте сохраненное значение и сбросьте его до 0 (в основном ваше undo() ).

5. Я понимаю, что вы сказали, но не могли бы вы привести мне пример ? Я начинаю с этого , мне нужна какая-то переменная, чтобы получить 1, когда мышь перемещается по оси Y, а когда не нажата кнопка(1), чтобы вернуть первую позицию ?

Ответ №1:

Как сказал Luke100000, вам нужно движение «отменить» (то же расстояние с противоположным знаком).

 function OnEvent(event, arg)
   OutputLogMessage("event = %s, arg = %dn", event, arg)
   if event == "PROFILE_ACTIVATED" then
      EnablePrimaryMouseButtonEvents(true)
   elseif event == "MOUSE_BUTTON_PRESSED" and (arg == 5 or arg == 4) then
      recoil = recoil ~= arg and arg
   elseif event == "MOUSE_BUTTON_PRESSED" and arg == 1 and recoil == 5 then
      MoveMouseRelative(0, -3)
      local n = 0
      for i = 1, 17 do
         n = n   1
         MoveMouseRelative(0, 2)
         Sleep(15)
         if not IsMouseButtonPressed(1) then break end
      end
      repeat  -- wait for LMB release
      until not IsMouseButtonPressed(1)
      for i = 1, n do
         MoveMouseRelative(0, -2)
      end
      MoveMouseRelative(0, 3)
   elseif event == "MOUSE_BUTTON_PRESSED" and arg == 1 and recoil == 4 then
      MoveMouseRelative(0, -3)
      local n = 0
      for i = 1, 35 do
         Sleep(15)
         n = n   1
         MoveMouseRelative(0, 2)
         if not IsMouseButtonPressed(1) then break end
      end
      repeat  -- wait for LMB release
      until not IsMouseButtonPressed(1)
      for i = 1, n do
         MoveMouseRelative(0, -2)
      end
      MoveMouseRelative(0, 3)
   end
end
 

Ответ №2:

Для отмены любых операций нам нужна стопка, в которой вы помните все, что сделали. Но так как у нас есть только одна позиция, и поэтому порядок не имеет значения, мы используем вместо этого простое число для хранения общего числа перемещений x и y.

 local movedX = 0
local movedY = 0
function move(x, y)
    MoveMouseRelative(x, y)
    movedX = movedX   x
    movedY = movedY   y
end
 

Теперь вы используете, например move(0, 2) , только.

Чтобы отменить, мы делаем обратное, так как у нас есть число, только вычитая его.

 function undo()
    MoveMouseRelative(-movedX, -movedY)
    movedX = 0
    movedY = 0
end
 

Не связанные, но в вашем цикле не используйте return «но break «. Таким образом, вы можете дойти до конца мероприятия и добавить undo() туда.

Комментарии:

1. Я понял , что мне следует делать, но, как я уже сказал, мне трудно реализовать это в этом сценарии . Даже с первым сценарием мне оказали большую помощь. Я не знаю, как включить это в свой сценарий

2. Надеюсь, это не прозвучит слишком грубо, но я хочу, чтобы вы изучили основы программирования. Stackoverflow может не просто кодировать для вас, а только помогать 🙂