Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: muryginds on November 17, 2015, 07:37:10 PM

Title: Не выполняется поиск по картинке
Post by: muryginds on November 17, 2015, 07:37:10 PM
Собственно код

$WM_LBUTTONDOWN = 0x0201 // Левая кнопка мыши зажата
$WM_LBUTTONUP = 0x0202 // Левая кнопка мыши отпущена
$MK_LBUTTON = 0x0001 // Левая кнопка мыши в нажатом состоянии
$WM_MOUSEMOVE = 0x0200  // Мышь передвинута
$x1 = 400 // Координата по оси X Начало
$y1 = 950 // Координата по оси Y
$x2 = 400 // Координата по оси X Конец
$y2 = 138 // Координата по оси Y

$wait_like = 0
WHILE($wait_like = 0)
   GETSCREEN
   IF_PICTURE_IN (400,75, 470,40, "level.bmp", -1, 95)
      $wait_like = 1
      MOVE($_return1+3, $_return2+3)
      WAITMS(60)
      LCLICK($_return1+3, $_return2+3)
      MOVE($_xmax,$_ymax)
      WAITMS(1000)
   Else //прокрутить немного
      postmessage($_HWND, $WM_LBUTTONDOWN, $MK_LBUTTON, $x1 + ($y1*65536))
      waitms(60)
      postmessage($_HWND, $WM_MOUSEMOVE, $MK_LBUTTON, $x2 + ($y2*65536))
      waitms(60)
      postmessage($_HWND, $WM_LBUTTONUP, $MK_LBUTTON, $x2 + ($y2*65536))
   END_IF
END_CYC

Суть задачи - поиск по заданному диапазону нужной картинки, при совпадении нажать. Если не нашло - чуть-чуть промотать вниз.

Проблема - не находит искомую картинку level.bmp - постоянно в цикле. Скрипт работает в оконном режиме (привязан к окну) Есть подозрение, что в GETSCREEN попадает что-то не то, как проверить не знаю.

Скриншот экрана с приложением - https://yadi.sk/i/EauGIzYtkXKu4
Title: Re: Не выполняется поиск по картинке
Post by: Oraven on November 17, 2015, 08:18:20 PM
Координаты области заданы не верно
Code: (clickermann) [Select]
IF_PICTURE_IN (400,75, 470,40, "level.bmp", -1, 95)75 больше чем 40

Первые два числа это верхний левый угол области поиска, вторые две это нижний правый угол.

Чтобы посмотреть что видит кликер добавь после GETSCREEN функцию SCREENSHOT
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 17, 2015, 08:54:03 PM
Да, это я опечатался, вместо 40 должно быть 940. Но ситуацию это не спасает - немного изменил код и добавил в него GETSCREEN.

Code: (clickermann) [Select]
$wait_like = 0
WHILE($wait_like = 0)
   GETSCREEN
   SCREENSHOT
   IF_PICTURE_IN (400,75, 470,940, "level.bmp")
      $wait_like = 1
      MOVE($_return1+3, $_return2+3)
      WAITMS(60)
LCLICK($_return1+3, $_return2+3)
   Else
      postmessage($_HWND, $WM_LBUTTONDOWN, $MK_LBUTTON, $x1 + ($y1*65536))
      waitms(60)
      postmessage($_HWND, $WM_MOUSEMOVE, $MK_LBUTTON, $x2 + ($y2*65536))
      waitms(60)
      postmessage($_HWND, $WM_LBUTTONUP, $MK_LBUTTON, $x2 + ($y2*65536))
    waitms(2000)
END_IF
END_CYC

Вот что получилось после первой итерации - https://yadi.sk/i/Z8A_G0MXkXSWQ
Вот что после второй - https://yadi.sk/i/CzFnCHJUkXSWW

По логике цикл должен закончится и картинка найтись на второй итерации, но он идет дальше - не пойму в чем причина
Title: Re: Не выполняется поиск по картинке
Post by: Oraven on November 18, 2015, 08:40:09 AM
Какая тут логика если картинка меняется, сглаживание смазывает пикселы то вверх то вниз. Зачем писать 95% без цветокоррекции?

Скорректировал твою картинку под COLORMODE(6), проверил на твоем скриншоте теперь находит.
Code: (clickermann) [Select]
GETSCREEN
COLORMODE(6)
IF_PICTURE_IN (400,75, 470,940, "level_54.bmp", -1, 75)
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 18, 2015, 09:34:37 AM
Не совсем понял вопрос про логику, почему картинка меняется?
95 - это же точность поиска. Прочитал в справке - думал, может поможет найти

в любом случае спасибо большое за подсказку -  вечером попробую!
Title: Re: Не выполняется поиск по картинке
Post by: Vint on November 18, 2015, 09:43:03 AM
Может и поможет... только без анализа, выставленное на обум - не всегда. Наверно 95 слишком высокий процент.
Но при сглаживании текста одним процентом ничего не добиться. Слишком много пикселов меняется (в процентном соотношении). А выставлять 50%...40%... приведёт к нахождению чего попало там где его нет. Рабочий промежуток примерно 70-100%
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 18, 2015, 09:46:41 AM
Может и поможет... только без анализа, выставленное на обум - не всегда. Наверно 95 слишком высокий процент.
Но при сглаживании текста одним процентом ничего не добиться. Слишком много пикселов меняется (в процентном соотношении). А выставлять 50%...40%... приведёт к нахождению чего попало там где его нет. Рабочий промежуток примерно 70-100%

Понятно, спасибо что доступно объяснили =)

а вы переделали картинку уровня после светокоррекции или просто рамки подрезали?
Title: Re: Не выполняется поиск по картинке
Post by: Vint on November 18, 2015, 09:59:44 AM
Картинка переделана, даже так видно. Особенно если смотреть на фон.
Title: Re: Не выполняется поиск по картинке
Post by: Oraven on November 18, 2015, 10:04:08 AM
а вы переделали картинку уровня после светокоррекции или просто рамки подрезали?

Я сделал скриншот с твоего снимка level.bmp кликером с использованием цветокоррекции, потом обрезал все лишнее.
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 18, 2015, 10:07:16 AM
я примерно так это себе и представил

на 75% нашел 56 вместо 54
на 80% нашел 54 - 1 раз, при следующем запуске - прошел мимо. прямо чудиса =)

попробую с искомой картинкой поиграть

П.С. усе, заработало! спасибо. картинку перевырезал
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 18, 2015, 11:24:17 PM
Назрел вопрос вдогонку.

Code: (clickermann) [Select]
GETSCREEN
   COLORMODE(6)
   SCREENSHOT
   SCREENSHOTEX(273,681, 360,709, "ho", 0)

Делаю скриншот приложения и его фрагмент. Фрагмент статичный. В первом случае текст есть - во втором - сами видите. Скрипт привязан к окну

Скрин - https://yadi.sk/i/Knd3vZ6rkZ8Nn
Фрагмент - https://yadi.sk/i/L5RxiL-bkZ8Mh - это часть кнопки, где размещено слово "домой"
Title: Re: Не выполняется поиск по картинке
Post by: Vint on November 19, 2015, 10:00:41 AM
Где здесь текст?
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 19, 2015, 10:37:04 AM
Вот это нежданчик. Работаю удаленно на другом компьютере через teamviewer, похоже, что зараза кликерманн как-то неправильно координаты мыши считывает. Спасибо!


А вот такой вопрос. В начале скрипта есть объявление метки

Code: (clickermann) [Select]
skip:
LevelSearch
wait(4)

Есть кусок кода, в нем цикл и переход на метку LevelSearch

Code: (clickermann) [Select]
$wait_home = 0
WHILE($wait_home = 0)
   GETSCREEN
   COLORMODE(6)
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "home.bmp", -1, 75)
      $wait_home = 1
      MOVE($_return1+3, $_return2+3)
      WAITMS(100)
      LCLICK($_return1+3, $_return2+3)
      GOTO(LevelSearch)
   END_IF
   wait(5)
END_CYC

Вопрос - правильно ли я понял конструкцию переходов? и второй - в случае успешного поиска в цикле - перейдет - ли исполнение сразу на метку или сперва выполнится wait(5)


Title: Re: Не выполняется поиск по картинке
Post by: Oraven on November 19, 2015, 11:58:15 AM
И добавлю что выпрыгивать через ГОТО из циклов и подпрограмм нельзя, также как и впрыгивать, это не приведет к ошибке но ломает логику, в дальнейшем могут возникнуть необъяснимые глюки . Цикл должен корректно завершаться и после этого через условие можно прыгать куда угодно.
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 19, 2015, 12:10:39 PM
Понял, всем спасибо. Будем ковырять дальше =)

Title: Re: Не выполняется поиск по картинке
Post by: Vint on November 19, 2015, 01:22:17 PM
Вот это нежданчик. Работаю удаленно на другом компьютере через teamviewer, похоже, что зараза кликерманн как-то неправильно координаты мыши считывает. Спасибо!
Скорее всего причина в эмуляторе bluestacks. Там не учитывается строка заголовка, поэтому смещение координат для кликермэна идёт на её высоту.
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 20, 2015, 07:41:14 PM
Вот код:

Code: (clickermann) [Select]
$AUTOFIGHT = 0

AUTOFIGHT:
IF $AUTOFIGHT = 0
   wait(10)
   GETSCREEN
   COLORMODE(6)
   IF_PICTURE_IN (100,750, 173,810, "off.bmp", -1, 75)
      MOVE($_return1+3, $_return2+3)
      WAITMS(100)
      LCLICK($_return1+3, $_return2+3)
   else
      LOGWRITE ("not found - off")
   END_IF
   $AUTOFIGHT = 1
END_IF

Дальше идет код, после исполнения которого идет переход в метку AUTOFIGHT

В моем понимании представленная проверка if else проходит 1 раз при запуске, а при повторном попадании $AUTOFIGHT уже равен 1 и проверка должна пройти мимо. Но этого не происходит и LOGWRITE ("not found - off") всплывает несколько раз. Вопрос - почему?
Title: Re: Не выполняется поиск по картинке
Post by: Oraven on November 20, 2015, 08:18:22 PM
Потому что ты забыл скобки в условии поставить.

Code: (clickermann) [Select]
IF ($AUTOFIGHT = 0)
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 20, 2015, 10:32:38 PM
Holy shit! Thanks =)
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 22, 2015, 02:41:40 PM
А можно сделать свою функцию, чтобы просто передавать туда свои параметры и вызвать ее в произвольном месте

Code: (clickermann) [Select]
IF_PICTURE_IN ($px1,$py1, $px2,$py2, $picture, -1, 90)
         $wait_level = 1
         WAITMS(500)
         MOVE($_return1+3, $_return2+3)
         WAITMS(500)
         LCLICK($_return1+3, $_return2+3)
END_IF

как альтернативой пользуюсь сейчас метками, но подумал - может есть что-то удобнее?
Title: Re: Не выполняется поиск по картинке
Post by: Oraven on November 22, 2015, 03:03:43 PM
А можно сделать свою функцию, чтобы просто передавать туда свои параметры и вызвать ее в произвольном месте

Конечно! Есть подпрограммы.
Code: (clickermann) [Select]
// подпрограмма должна быть описана в верхней части скрипта выше вызова, и не может быть вложена во что либо.
SUB(Поиск, $px1,$py1, $px2,$py2, $picture)
   $wait_level = 0
   WHILE($wait_level = 0)
      GETSCREEN
      IF_PICTURE_IN ($px1,$py1, $px2,$py2, $picture, -1, 100)
         $wait_level = 1
         MOVE($_return1+3, $_return2+3)
         WAITMS(500)
         LCLICK($_return1+3, $_return2+3)
         WAITMS(500)
      ELSE
         WAITMS(50)
      END_IF
   END_CYC   
END_SUB


Поиск(100,100, 400,400, "file 1.bmp") // вызовы
Поиск(400,400, 500,500, "file 2.bmp")
Поиск(0,0, $_xmax,$_ymax, "file 3.bmp")
Title: Re: Не выполняется поиск по картинке
Post by: muryginds on November 22, 2015, 09:19:37 PM
Спасибо! То, что надо.