AutoHotKey - повторение, если оператор продолжает обрабатывать свое условие как истинное в цикле - PullRequest
1 голос
/ 25 октября 2019

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

Я пытался сделать это, используя PixelGetColor (как показано ниже), чтобы найти определенный пиксель, который заканчивается белым при появлении восклицательного знака, но никогда не обнаруживает восклицательный знак и, что более важно, при обнаруженииконкретный пиксель на моем экране должен быть белым, условие оператора if, следующее за PixelGetColor, всегда возвращает true.

Toggle = False

loop 
{
  if (Toggle = "true")
  { 
    Sleep, 100
    PixelGetColor, color, 966, 463
    if (color = 0xFFFFFFFF) {
          MsgBox, It works!
    }
  }
}

F1::
if (Toggle = "true") {
  Toggle = False
}
else {
  Toggle = True
}

F1 привязан к логическому значению, которое определяет, выполняется код внутри цикла или нет. Последние два входа для PixelGetColor, 966 и 463, являются позициями x и y определенного пикселя соответственно.

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

Проще говоря, что, черт возьми, происходит? Я пытался понять это некоторое время сейчас. Если бы кто-нибудь мог дать объяснение того, что я сделал неправильно, а также фрагмент кода для того, что должно быть сделано внутри цикла, чтобы заставить программу работать как задумано, я был бы вечно (хорошо, почти) благодарен.

1 Ответ

1 голос
/ 25 октября 2019

Когда я запускаю ваш код как есть, я не получаю окно сообщения после нажатия F1 . (Я удостоверился, что пиксель в указанных координатах был белым.) Изменение соответствия цвета на «0xFFFFFF» (два байта на RGB) сделало его работающим для меня, и это сработало так, как вы хотели в своем описании.

Однако,Я удивлен, что это сработало, потому что true / false хранится в виде строки в переменной Toggle, и я полностью ожидал, что «True» не будет соответствовать «true» из-за разницы в регистре. (Еще немного покопавшись, я обнаружил, что = в выражениях нечувствителен к регистру; == чувствителен к регистру - наверное, я сегодня кое-что узнал.)

Кроме цвета, я ничего не виделв коде, который будет препятствовать его работе. Ниже приведена ваша модифицированная версия, которая рассматривает истину / ложь как логические значения и немного упрощена. Надеюсь, это сработает и для вас.

Loop 
{
    If Toggle
    { 
        Sleep , 100
        PixelGetColor , color , 966 , 463
        If ( color = 0xFFFFFF )
            MsgBox ,,, It works! , 0.5
}   }

f1::Toggle := !Toggle

Редактировать: Добавлена ​​область и дисперсия для поиска по комментарию ниже. Замените две строки операторов PixelGetColor и If на две строки ниже.

        PixelSearch ,,, 900 , 400 , 1000 , 500 , 0xFFFFFF , 20 , FastRGB
        If !ErrorLevel

При этом в области размером 100x100 пикселей будет получен чистый белый цвет с 20 оттенками дисперсии. Возможно, вам придется настроить размер и расположение прямоугольника, а также дисперсию, чтобы заставить его работать на вас. Подробнее здесь .

...