Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: open_78 on January 17, 2017, 10:46:04 AM
-
Здравствуйте Уважаемые знатоки. Подумал что картинка- это определенный набор пикселей и решил искать эту картинку по пикселям. Но не смог решить задачу самостоятельно. Прошу помощи.Ищет первый пиксель-4177919, и если другие не совпадают не переходит на следующий. Как помочь перейти на другой пиксель?
Во вложении образец. Первую картинку находит, но если закрасить пиксель как на третьей, то всё стоит на месте. 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
-
А что должно быть?
Не находит 4 пиксел $_return1+32,$_return2+2 потому что его там нет.
Ты закрасил чёрным, значит в первом поиске 4177919 найдётся следующий за ним по x.
При проверке +32 выходим за границы.
-
Это я понимаю. Нужно сделать переход на следующий пиксель, и т.д. пока не совпадет комбинация.
-
Почему проверку PXL не пишешь в одном условии? Меньше блоков, меньше END_IF-ов
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
-
Это я понимаю. Нужно сделать переход на следующий пиксель, и т.д. пока не совпадет комбинация.
Так на твоих примерах она не совпадает больше.
-
1. Новичок. Потому и не пишу. Спасибо, теперь буду.
2. Почему не совпадает? Ведь дальше идут повторы картинок (кроме 3)
-
Слишком много у меня картинок получается. Вот и начал "извращаться". И если программа этого не может - так и скажите.
-
2. Почему не совпадает? Ведь дальше идут повторы картинок (кроме 3)
При поиске на 3 картинке совпадений нет.
Другие картинки это какие? Все сразу? Тогда найдёт на первой.
Если только 3 и 4, то 4 и искать не будет у тебя так написано.
IF_PIXEL_IN(0,0,$_xmax,$_ymax,4177919) найдёт этот пиксел раньше и другие искать не будет.
-
Слишком много у меня картинок получается. Вот и начал "извращаться". И если программа этого не может - так и скажите.
Чего не может? Как написан скрипт так и ищет.
-
Если только 3 и 4, то 4 и искать не будет.
IF_PIXEL_IN(0,0,$_xmax,$_ymax,4177919) найдёт этот пиксел раньше и другие искать не будет.
А мне надо чтобы искал дальше.
-
но ведь вы избрали совершенно нелепый и дико трудоёмкий способ получения результата.
Хе, хе. Я тоже так делал. Но это было давно. В тех версиях поиск был долгим, небыло % и прозрачности и гетскрин только полный. А вот серия пикселов расположенных со смещениями искалась очень быстро.
Это было давно, сейчас такое не нужно это точно. Версии так с 4.8 примерно.
-
но ведь вы избрали совершенно нелепый и дико трудоёмкий способ получения результата.
Хе, хе. Я тоже так делал. Но это было давно. В тех версиях поиск был долгим, небыло % и прозрачности и гетскрин только полный. А вот серия пикселов расположенных со смещениями искалась очень быстро.
Но это было давно, сейчас такое не нужно это точно.
Значит вы тоже, цитирую- "проявления Олигофрении и чем они отличаются от дебильности".
-
Значит вы тоже, цитирую- "проявления Олигофрении и чем они отличаются от дебильности".
Типа того :D. Тогда это была необходимость, не хватало функционала.
Я думаю и сейчас применимо, если точки отстоят друг от друга далеко.
-
Значит вы тоже, цитирую- "проявления Олигофрении и чем они отличаются от дебильности".
Типа того :D. Тогда это была необходимость, не хватало функционала.
Я думаю и сейчас применимо, если точки отстоят друг от друга далеко.
Не могли бы вы не надолго вернуться в прошлое...?
-
Нашёл свои посты что тогда делал
http://crapware.aidf.org/forum/index.php?topic=119.msg1562#msg1562
И я угадал, январь 2013г. Версия кликера 4.7 SE
-
Нашёл свои посты что тогда делал
http://crapware.aidf.org/forum/index.php?topic=119.msg1562#msg1562
И я угадал, январь 2013г. Версия кликера 4.7 SE
ЭТО начало моего пути(извращений).
-
Проявления психических отклонений, они всегда в деталях и в сравнении с общим фоном. Внимательно читайте контекст, если вы решили разработать новую, удобную или полезную функцию, то вы безусловно гений и при отсутствии имеющихся возможностей текущей версии программы вам следовало-бы оказывать всестороннюю помощь.
НО вот в свете того что ваши разработки ничего такого не несут и вы имея коробку конфет, предпочитаете её выбросить по странной причине" Конфет слишком много" и вместо этого начинаете лепить ещё большее число собственных конфеток из Г...на.
Прошу не обижаться, я просто дал вам виденье ситуации со стороны, в любом случае желаю вам творческих успехов!
Спасибо.
-
Не могли бы вы не надолго вернуться в прошлое...?
Зачем? чтоб мотыгой копать?
Я так понимаю на экране находится несколько похожих картинок. Тогда применяемый IF_PICTURE_IN при поиске первого пиксела не применим. Он находит только первый.
Если можно разбить на области (они известны и постоянны) можно искать в разных областях.
Или заменить на SCANPXL, но!... SCANPXL это лютый п... получится. так как найдёт их вагон и от каждого нужно проверять. В чём тогда весь смысл данной затеи? Почему не искать картинку? Это будет быстрее в несколько раз.
-
Области известны и постоянны, их 6. В первой находит если задать точку отсчета (она постоянна). Но бывает в первой нет кнопки "ПРОДАТЬ". Как перенести поиск во вторую?
-
Если углубиться в прошлое то вот нарыл у себя старый скрипт для поиска всех пикселов заданного цвета на экране с помощью if_pixel_in
Плюсом является возможность отступать на некоторое количество пикселов от найденного что ускоряет поиск.
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)
-
Зачем ему этот костыль, который медленней в несколько раз. Тогда выбора небыло, а сейчас не понятен выбор.
-
Найти кнопки "продать"? Не очень понятно, чем не устраивает картинка.
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
-
Найти кнопки "продать"? Не очень понятно, чем не устраивает картинка.
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
Изначально так и было (по картинке). ПОКАЗАЛОСЬ что попиксельно удобней.
-
Оказалось - костыли :D
-
Если бы найти нужно было только одну, то ещё был бы смысл.
-
Мой дилетантский мозг подсказал мне что "нарисовать" виртуальную картинку в памяти скрипта
проще удобней, чем нарезАть и хранить кучу маленьких кусочков рядом с этим скриптом.
-
Клондайк никто не узнал. Хорошо закрасил.
-
Клондайк никто не узнал. Хорошо закрасил.
Внимание на кнопках сосредотачивал. ;)
-
Я красиво с переменными писать не умею. Но вот это уродство работает:
$_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
-
А нахрена мне тогда IF_PIXEL_IN??? Если я точно знаю координаты всех шести пикселей...
-
А нахрена мне тогда IF_PIXEL_IN??? Если я точно знаю координаты всех шести пикселей...
Вот вот.
Но разработчики не обязаны пиксел в пиксел попадать. В силу отсутствия перфекционистов, они и не попадают.
Вот, например подобное окно в зомби ферме почти всегда в одних координатах вылазит. Но есть моменты на пиксел левее и хоть ты тресни от чего это зависит.
-
Попробовал. С IF_PIXEL_IN лучше.
-
Испытал в "полевых условиях" - всё сработало как нужно. Спасибо всем.
-
Теперь сделал так. Выглядит симпатичнее, но логику понять не смог. Методом подбора получилось.
$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
-
Можно сделать вот так
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
-
На дату обращаем внимание. 1,5 года теме. open_78 уже и сам что хочешь напишет и в разных вариантах.