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

Основной раздел => Общие вопросы => Topic started by: open_78 on January 17, 2017, 10:46:04 AM

Title: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 10:46:04 AM
Здравствуйте Уважаемые знатоки. Подумал что картинка- это определенный набор пикселей и решил искать эту картинку по пикселям. Но не смог решить задачу самостоятельно. Прошу помощи.Ищет первый пиксель-4177919, и если другие не совпадают не переходит на следующий. Как помочь перейти на другой пиксель?
Во вложении образец. Первую картинку находит, но если закрасить пиксель как на третьей, то всё стоит на месте.
Code: (clickermann) [Select]
WAITMS(500)
$check = 0
WHILE($check = 0)
   GETSCREEN
//   COLORMODE(6)                       
   IF_PIXEL_IN(0,0,$_xmax,$_ymax,4177919)
      IF(PXL($_return1-7,$_return2+6)=4161535)
         IF(PXL($_return1,$_return2+2)=8388607)
            IF(PXL($_return1+32,$_return2+2)=8388607)
               $check = 1
               MOVE($_return1-7, $_return2)
            END_IF
         END_IF
      END_IF
   ELSE
      WAITMS(500)
   END_IF
END_CYC
HALT
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 11:59:55 AM
А что должно быть?
Не находит 4 пиксел $_return1+32,$_return2+2 потому что его там нет.
Ты закрасил чёрным, значит в первом поиске 4177919 найдётся следующий за ним по x.
При проверке +32 выходим за границы.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 12:03:02 PM
Это я понимаю. Нужно сделать переход на следующий пиксель, и т.д. пока не совпадет комбинация.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 12:03:30 PM
Почему проверку PXL не пишешь в одном условии? Меньше блоков, меньше END_IF-ов
Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN(0,0,$_xmax,$_ymax,4177919)
    IF((PXL($_return1-7,$_return2+6) = 4161535) & (PXL($_return1,$_return2+2) = 8388607) & (PXL($_return1+32,$_return2+2) = 8388607))
        LOGWRITE("Нашли X/Y  ", $_return1, " / ", $_return2)
        MOVE($_return1-7, $_return2)
    END_IF
END_IF
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 12:04:42 PM
Это я понимаю. Нужно сделать переход на следующий пиксель, и т.д. пока не совпадет комбинация.
Так на твоих примерах она не совпадает больше.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 12:13:50 PM
1. Новичок. Потому и не пишу. Спасибо, теперь буду.
2. Почему не совпадает? Ведь дальше идут повторы картинок (кроме 3)
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 12:34:58 PM
Слишком много у меня картинок получается. Вот и начал "извращаться". И если программа этого не может - так и скажите.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 12:48:53 PM
2. Почему не совпадает? Ведь дальше идут повторы картинок (кроме 3)
При поиске на 3 картинке совпадений нет.
Другие картинки это какие? Все сразу? Тогда найдёт на первой.
Если только 3 и 4, то 4 и искать не будет у тебя так написано.
IF_PIXEL_IN(0,0,$_xmax,$_ymax,4177919) найдёт этот пиксел раньше и другие искать не будет.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 12:50:14 PM
Слишком много у меня картинок получается. Вот и начал "извращаться". И если программа этого не может - так и скажите.
Чего не может? Как написан скрипт так и ищет.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 12:56:47 PM
Если только 3 и 4, то 4 и искать не будет.
IF_PIXEL_IN(0,0,$_xmax,$_ymax,4177919) найдёт этот пиксел раньше и другие искать не будет.

А мне надо чтобы искал дальше.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 12:57:22 PM
но ведь вы избрали совершенно нелепый и дико трудоёмкий способ получения результата.
Хе, хе. Я тоже так делал. Но это было давно. В тех версиях поиск был долгим, небыло % и прозрачности и гетскрин только полный. А вот серия пикселов расположенных со смещениями искалась очень быстро.

Это было давно, сейчас такое не нужно это точно. Версии так с 4.8 примерно.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 12:59:27 PM
но ведь вы избрали совершенно нелепый и дико трудоёмкий способ получения результата.
Хе, хе. Я тоже так делал. Но это было давно. В тех версиях поиск был долгим, небыло % и прозрачности и гетскрин только полный. А вот серия пикселов расположенных со смещениями искалась очень быстро.

Но это было давно, сейчас такое не нужно это точно.
Значит вы тоже, цитирую- "проявления Олигофрении и чем они отличаются от дебильности".
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 01:04:40 PM
Значит вы тоже, цитирую- "проявления Олигофрении и чем они отличаются от дебильности".
Типа того  :D. Тогда это была необходимость, не хватало функционала.
Я думаю и сейчас применимо, если точки отстоят друг от друга далеко.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 01:08:34 PM
Значит вы тоже, цитирую- "проявления Олигофрении и чем они отличаются от дебильности".
Типа того  :D. Тогда это была необходимость, не хватало функционала.
Я думаю и сейчас применимо, если точки отстоят друг от друга далеко.
Не могли бы вы не надолго вернуться в прошлое...?
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 01:09:00 PM
Нашёл свои посты что тогда делал
http://crapware.aidf.org/forum/index.php?topic=119.msg1562#msg1562

И я угадал, январь 2013г. Версия кликера 4.7 SE
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 01:12:00 PM
Нашёл свои посты что тогда делал
http://crapware.aidf.org/forum/index.php?topic=119.msg1562#msg1562

И я угадал, январь 2013г. Версия кликера 4.7 SE
ЭТО начало моего пути(извращений).
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 01:15:13 PM
Проявления психических отклонений, они всегда в деталях и в сравнении с общим фоном. Внимательно читайте контекст, если вы решили разработать новую, удобную или полезную функцию, то вы безусловно гений и при отсутствии имеющихся возможностей текущей версии программы вам следовало-бы оказывать всестороннюю помощь.
НО вот в свете того что ваши разработки ничего такого не несут и вы имея коробку конфет, предпочитаете её выбросить по странной причине" Конфет слишком много" и вместо этого начинаете лепить ещё большее число собственных конфеток из Г...на.
Прошу не обижаться, я просто дал вам виденье ситуации со стороны, в любом случае желаю вам творческих успехов!
Спасибо.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 01:15:27 PM
Не могли бы вы не надолго вернуться в прошлое...?
Зачем? чтоб мотыгой копать?

Я так понимаю на экране находится несколько похожих картинок. Тогда применяемый IF_PICTURE_IN при поиске первого пиксела не применим. Он находит только первый.
Если можно разбить на области (они известны и постоянны) можно искать в разных областях.
Или заменить на SCANPXL, но!... SCANPXL это лютый п...  получится. так как найдёт их вагон и от каждого нужно проверять. В чём тогда весь смысл данной затеи? Почему не искать картинку? Это будет быстрее в несколько раз.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 01:22:32 PM
Области известны и постоянны, их 6. В первой находит если задать точку отсчета (она постоянна). Но бывает в первой нет кнопки "ПРОДАТЬ". Как перенести поиск во вторую?
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Oraven on January 17, 2017, 01:30:09 PM
Если углубиться в прошлое то вот нарыл у себя старый скрипт для поиска всех пикселов заданного цвета на экране с помощью  if_pixel_in
Плюсом является возможность отступать на некоторое количество пикселов от найденного что ускоряет поиск.

Code: (clickermann) [Select]
LOGCLEAR
// область поиска
$x1 = 19 // верхний левый угол
$y1 = 94
$x2 = 741 // нижний правый угол
$y2 = 693

// цвет
$color = 255

// отступ
$size = 10

// задержка "мс" минимум 1
$wait = 1
//================================

getscreen
if_pixel_in($x1, $y1, $x2, $y2, $color)
   $count = 0
   //   move($_return1, $_return2)
   LOGWRITE("X: ", $_return1, " ","Y: ", $_return2)
   waitms($wait)
   
   WHILE($var = 0)
      $sY2 = $_return2 + $size
      $sY1 = $_return2
      $var2 = 0
     
      WHILE($var2 = 0)
         if_pixel_in($_return1 + $size, $sY1, $x2, $sY2, $color)
            //   move($_return1, $_return2)
            LOGWRITE("X: ", $_return1, " ","Y: ", $_return2)
            waitms($wait)
            INC($count, 1)
         Else
            $var2 = 1
         end_if
      END_CYC
     
      if_pixel_in($x1, $_return2 + $size, $x2, $y2, $color)
         //   move($_return1, $_return2)
         LOGWRITE("X: ", $_return1, " ","Y: ", $_return2)
         waitms($wait)
      Else
         $var = 1
      end_if
     
      INC($count, 1)
     
   END_CYC
end_if

LOGWRITE("Количество: ", $count)
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 02:08:49 PM
Зачем ему этот костыль, который медленней в несколько раз. Тогда выбора небыло, а сейчас не понятен выбор.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 02:21:32 PM
Найти кнопки "продать"? Не очень понятно, чем не устраивает картинка.
Code: (clickermann) [Select]
GETSCREEN
SCANPICTURE($SCAN, 0,0,$_xmax,$_ymax, "продать.bmp")

$SCAN_size = ARRSIZE($SCAN)
FOR($i=0, $i < $SCAN_size, 2)
    $X = $SCAN[$i]
    $Y = $SCAN[$i+1]
    LOGWRITE ("X: ", $X, " Y: ", $Y)
    MOVE($X, $Y)
    WAITMS(500)   
END_CYC
UNDEFINE($ARR_SCAN)
HALT
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 02:25:51 PM
Найти кнопки "продать"? Не очень понятно, чем не устраивает картинка.
Code: (clickermann) [Select]
GETSCREEN
SCANPICTURE($SCAN, 0,0,$_xmax,$_ymax, "продать.bmp")

$SCAN_size = ARRSIZE($SCAN)
FOR($i=0, $i < $SCAN_size, 2)
    $X = $SCAN[$i]
    $Y = $SCAN[$i+1]
    LOGWRITE ("X: ", $X, " Y: ", $Y)
    MOVE($X, $Y)
    WAITMS(500)   
END_CYC
UNDEFINE($ARR_SCAN)
HALT
Изначально так и было (по картинке). ПОКАЗАЛОСЬ что попиксельно удобней.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 02:27:25 PM
Оказалось - костыли :D
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 02:44:26 PM
Если бы найти нужно было только одну, то ещё был бы смысл.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 03:02:30 PM
Мой дилетантский мозг подсказал мне что "нарисовать" виртуальную картинку в памяти скрипта проще удобней, чем нарезАть и хранить кучу маленьких кусочков рядом с этим скриптом.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 03:37:28 PM
Клондайк никто не узнал. Хорошо закрасил.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 04:03:29 PM
Клондайк никто не узнал. Хорошо закрасил.
Внимание на кнопках сосредотачивал. ;)
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 04:21:34 PM
Я красиво с переменными писать не умею. Но вот это уродство работает:
Code: (clickermann) [Select]
$_zona1 = 769
$_zona2 = 974
$_zona3 = 1179
$_up = 626
$_down = 878

$check = 0    //продаем склад
WHILE($check = 0)
   WAITMS(100)
   GETSCREEN
   COLORMODE(6)
   IF_PIXEL_IN($_zona1,$_up,$_zona1+1,$_up+1,4177919)
      IF((PXL($_return1+32,$_return2+1)=4177919)&(PXL($_return1-7,$_return2+5)=4161535)&(PXL($_return1+32,$_return2+2)=8388607))
      END_IF
   ELSE
      IF_PIXEL_IN($_zona2,$_up,$_zona2+1,$_up+1,4177919)
         IF((PXL($_return1+32,$_return2+1)=4177919)&(PXL($_return1-7,$_return2+5)=4161535)&(PXL($_return1+32,$_return2+2)=8388607))
         END_IF
      ELSE
         IF_PIXEL_IN($_zona3,$_up,$_zona3+1,$_up+1,4177919)
            IF((PXL($_return1+32,$_return2+1)=4177919)&(PXL($_return1-7,$_return2+5)=4161535)&(PXL($_return1+32,$_return2+2)=8388607))
            END_IF
         ELSE
            IF_PIXEL_IN($_zona1,$_down,$_zona1+1,$_down+1,4177919)
               IF((PXL($_return1+32,$_return2+1)=4177919)&(PXL($_return1-7,$_return2+5)=4161535)&(PXL($_return1+32,$_return2+2)=8388607))
               END_IF
            ELSE
               IF_PIXEL_IN($_zona2,$_down,$_zona2+1,$_down+1,4177919)
                  IF((PXL($_return1+32,$_return2+1)=4177919)&(PXL($_return1-7,$_return2+5)=4161535)&(PXL($_return1+32,$_return2+2)=8388607))
                  END_IF
               ELSE
                  IF_PIXEL_IN($_zona3,$_down,$_zona3+1,$_down+1,4177919)
                     IF((PXL($_return1+32,$_return2+1)=4177919)&(PXL($_return1-7,$_return2+5)=4161535)&(PXL($_return1+32,$_return2+2)=8388607))
                     END_IF
                  ELSE
                     $check = 1
                  END_IF
               END_IF
            END_IF
         END_IF
      END_IF
   END_IF
   MOVE($_return1+45, $_return2-35)
   WAITMS(50)
   LCLICK($_return1+45, $_return2-35)
   WAITMS(50)
   KEYSTRING("999999",5)
   WAITMS(50)
   LCLICK($_return1+65, $_return2+15)
   WAITMS(200)
END_CYC
HALT
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 04:29:27 PM
А нахрена мне тогда IF_PIXEL_IN??? Если я точно знаю координаты всех шести пикселей...
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on January 17, 2017, 04:34:37 PM
А нахрена мне тогда IF_PIXEL_IN??? Если я точно знаю координаты всех шести пикселей...
Вот вот.
Но разработчики не обязаны пиксел в пиксел попадать. В силу отсутствия перфекционистов, они и не попадают.
Вот, например подобное окно в зомби ферме почти всегда в одних координатах вылазит. Но есть моменты на пиксел левее и хоть ты тресни от чего это зависит.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 04:46:09 PM
Попробовал. С  IF_PIXEL_IN лучше.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on January 17, 2017, 06:40:38 PM
Испытал в "полевых условиях" - всё сработало как нужно. Спасибо всем.
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: open_78 on February 05, 2017, 05:17:19 PM
Теперь сделал так. Выглядит симпатичнее, но логику понять не смог. Методом подбора получилось.
Code: (clickermann) [Select]
$check = 0    //продаем склад
WHILE($check = 0)
   WAITMS(200)
   FOR($yy=626, $yy < 1130,252)
      FOR($xx=769, $xx < 1384,205)
         GETSCREEN(760,626,1230,890)
         COLORMODE(6,760,626,1230,890)
         IF_PIXEL_IN($xx,$yy,$xx+39,$yy+6,4177919)
            IF((PXL($_return1+32,$_return2+1)=4177919)&(PXL($_return1-7,$_return2+5)=4161535)&(PXL($_return1+32,$_return2+2)=8388607))
               $xx=564  //тут пришлось отнять 205. Почему?
               $yy=626  // а тут осталось без изменений.
               MOVE($_return1+45, $_return2-35)
               WAITMS(50)
               LCLICK($_return1+45, $_return2-35)
               WAITMS(50)
               KEYSTRING("999999",5)
               WAITMS(50)
               LCLICK($_return1+65, $_return2+15)
               WAITMS(50)
            END_IF
         ELSE
            $check = 1
         END_IF
      END_CYC
   END_CYC
END_CYC
HALT
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Космич on September 01, 2018, 09:56:19 PM
Можно сделать вот так

Code: (clickermann) [Select]
GETSCREEN
SCANPXL($coord, 0,0, $_xmax,$_ymax, 12625556) // Пиксель аватарки open_78

$size = ARRSIZE($coord)
FOR($i = 0,$i < $size, 2)
   IF( (PXL($coord[$i]+1, $coord[$i+1]) = 9266230) & (PXL($coord[$i]+2, $coord[$i+1]) = 11769980) & (PXL($coord[$i]+3, $coord[$i+1]) = 15327713) )
      MOVE($coord[$i], $coord[$i+1])
      HALT
   END_IF
END_CYC
Title: Re: IF_PICTURE_IN заменить на IF_PIXEL_IN/PXL
Post by: Vint on September 03, 2018, 09:36:15 AM
На дату обращаем внимание.  1,5 года теме. open_78 уже и сам что хочешь напишет и в разных вариантах.