|
Поиск Цвета По Слоям., Определяет не тот цвет. |
|
|
Denker |
6.1.2011, 5:23
|
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30
|
Игра Фантазиум, пытаюсь автоматизировать рыбалку. Там появляются картинки со стрелками и их за время надо нажать на клавиатуре в правильном порядке. Для начала решил выполнить более простую задачу -- автохил. Но проблемма с определением цвета тоже присутствует. Пока занимался отладкой написал простенький скрипт: Код set #a findwindow (Фантазиум (RU)) set workwindow #a showwindow #a set logging open while #a <> 0 get color #c 123, 456 set logging #c end_while
из которго и выяснил, что цвет для поверки берётся из фона, а не картинки. Пользовался командой if #x, #y 123456 . Поскольку проверяется один конкретный пиксель, то не хотел через fincolor делать, но если через иф не будет работать, то придётся. Можно подробнее про два режима снятия цвета? Про этот я знаю set $a findcolor (1, 1 2, 2 1 1 123456 %arr 1) abs // тут будет проверятся только один пиксель (1,1), поэтому не обязательно в цикл вгонять
|
|
|
|
Denker |
6.1.2011, 13:12
|
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30
|
Цитата(Zeleax @ 6.1.2011, 9:31) Вроде писали, что findcolor не работает, если совпадают x1 с x2 или y1 с y2. Сам не проверял
По поводу второго способа- в конце 2 вместо 1. И abs присутствует/отсутствует
Я проверял, действительно так. Это как в команде random (x) -- получаем случайное целое число в диапазоне [0, х-1]. Поэтому random (0) работать не будет. А я думал, что %arr 1 или %arr 2 это размерность массива для координат найденого пикселя соответствующего условию проверки. Т.е. если мне нужен второй найденый пиксель заданого цвета, то его координаты %arr [1, 2] и %arr [2, 2], если 13-й то %arr [1, 13] и %arr [2, 13] соответственно, а в команде задаётся %arr 13. Ещё вопрос: если не получается определить цвет через get color можно ли его узнать сняв скриншёт или идёт искажение?
|
|
|
|
Denker |
7.1.2011, 17:18
|
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30
|
Цитата(Denker @ 6.1.2011, 4:23) set $a findcolor (1, 1 2, 2 1 1 123456 %arr 1) abs
я дятел. правильное написание такое: set $a findcolor (1, 1 2, 2 1 1 123456 %arr 1 abs)
|
|
|
|
Denker |
7.1.2011, 20:02
|
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30
|
Цитата(Zeleax @ 7.1.2011, 18:43) может быть цвет не был найден, тогда и ошибка появилась в set #x ...
тогда почему выходит из цикла, если ничего не нашло? Код while ( $c1 = 0 ) and ( $c2 = 0 ) and ( $c3 = 0 ) and ( $c4 = 0 ) set $c1 findcolor (535, 645 565, 680 1 1 12694948 %arr 2 abs) set $c2 findcolor (535, 645 565, 680 1 1 4276180 %arr 2 abs) set $c3 findcolor (535, 645 565, 680 1 1 5927549 %arr 2 abs) set $c4 findcolor (535, 645 565, 680 1 1 10327750 %arr 2 abs) end_while
проверил -- находит. на команде move %arr [1 1] %arr [1 2] abs тоже выдаёт ошибку.
|
|
|
|
Denker |
7.1.2011, 21:31
|
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30
|
Цитата(DarkMaster @ 7.1.2011, 19:21) у тебя все массивы одинаковые. может произойти следующее: set $c3 findcolor (535, 645 565, 680 1 1 5927549 %arr 2 abs) // Успешно нашел совпадения цвета и записал их в %arr. set $c4 findcolor (535, 645 565, 680 1 1 10327750 %arr 2 abs) // Ничего не нашел и уничтожил массив %arr в который записались предидущие результаты.
Спасибо, об этом я не подумал. Цитата(DarkMaster @ 7.1.2011, 19:21) По поводу быстродействия основное решение - уменьшайте области поиска. Ведь if'ами вы не проверяете такие большие области. Насколько я понял у вас есть конкретные координаты в которых надо проверить цвет, так зачем тогда такие большие области?
Именно это я и хочу сделать, а для этого нужны координаты найденых точек. Переименовал массивы, всё равно на любую команду с их использованием выдаёт ошибку.
|
|
|
|
Denker |
8.1.2011, 14:30
|
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30
|
Я его сделал! Огромное всем спасибо за помощь. Провозился до утра, но всё же настроил как положено. Вот только сильно раздражало, что findcolor выдаёт координаты точки отрицательные и диаметрально противоположные. Т.е. результат должен вычисляться по формуле: %arr [1 1] = #x + #delta, где %arr [1 1] координата Х найденой точки #x координата Х начала отсчёта #delta разница координат или прирост.
На практике вычисление происходит по формуле %arr [1 1] = #delta - #x. Для Y координаты аналогично. Пример: начало отсчёта (100; 100), findcolor находит точку в координатах (113; 140). В %arr будет записано значение (-87; -60).
Огромное спасибо Zeleax за подсказку о программе FastStone Capture. Действительно очень удобная и сохранила много сил и нервов.
P.S. Поэкспериментировал с заданием координат в findcolor через массив, для уменьшения строк скрипта. set $u findcolor (%xu [#i, 1], 653 %xu [#i, 1] + 1, 654 1 1 7266294 %arr 2 abs) // не работает. Хотя, феномен до конца не изучен.
|
|
|
|
Denker |
9.1.2011, 0:05
|
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30
|
Привожу полный текст скрипта. Правда я его уже причесал как мог и поудалял отладочные вспомагательные команды. Добавил коментарии. Код set #a findwindow (Фантазиум (RU)) set workwindow #a showwindow #a set %ax [1 1] 549 // начальные координаты по которым идёт поиск set %ax [2 1] 608 set %ax [3 1] 666 set %ax [4 1] 726 set %ax [1 2] 539 set %ax [2 2] 598 set %ax [3 2] 656 set %ax [4 2] 716 set %ax [1 3] 558 set %ax [2 3] 617 set %ax [3 3] 675 set %ax [4 3] 735 :begin wait 1500 set $b1 0 set $b2 0 set $b1 findcolor (1062, 754 1063, 755 1 1 1184461 %arr 2 abs) set $b2 findcolor (547, 616 548, 617 1 1 2397184 %arr 2 abs) if ($b1 > 0) and ($b2 > 0) // проверка по двум точкам когда начинать выполнение скрипта for #i 1 4 set $u 0 set $d 0 set $l 0 set $r 0 set #xu1 %ax [#i 1] set #xu2 %ax [#i 1] + 1 set #xl1 %ax [#i 2] set #xl2 %ax [#i 2] + 1 set #xr1 %ax [#i 3] set #xr2 %ax [#i 3] + 1 set $u findcolor (#xu1, 653 #xu2, 654 1 1 7266294 %arr 2 abs) //если тут вместо #xu2 написать #xu1 + 1, то поиск не срабатывает. set $d findcolor (#xu1, 672 #xu2, 673 1 1 2982898 %arr 2 abs) set $l findcolor (#xl1, 662 #xl2, 663 1 1 5355252 %arr 2 abs) set $r findcolor (#xr1, 662 #xr2, 663 1 1 5355252 %arr 2 abs) if $u > 0 post {Up} end_if if $d > 0 post {Down} end_if if $l > 0 post {Left} end_if if $r > 0 post {Right} end_if end_for wait 4000 end_if goto begin
На мониторе стоит разрешение 1280х1024, игра запущена в оконном режиме с разрешением 1280х960. При запуске автоматически центрируется, обычными методами двигать нельзя. По ширине получается в притык по экрану. Скрин прилагается. Если не считать фреймами изображение стрелок, из-за которых и были сложности с определением цвета, то больше в зону поиска ничего не попадает. Скрипт расчитан на 4-х кнопочную комбинацию, на скрине их 7. Это решается расширением масивов с координатами с их заменой на новые и увеличением цикла for с 4 до 7. откопал промежуточный отладочный сейв, может поможет разобраться промежуточная отладка
set #a findwindow (Фантазиум (RU)) set workwindow #a //showwindow #a set %axu [1 1] 549 set %axu [2 1] 608 set %axu [3 1] 666 set %axu [4 1] 726 //712 set %axd [1 2] 545 set %axd [2 2] 604 set %axd [3 2] 662 set %axd [4 2] 722 set %axl [1 3] 558 set %axl [2 3] 606 set %axl [3 3] 675 set %axl [4 3] 735 set $b1 0 set $b2 0 set $b3 0 set $b1 findcolor (1063, 754 1065, 756 1 1 1184461 %arr 2 abs) set $b2 findcolor (548, 616 550, 618 1 1 2397184 %arr 2 abs) set $b3 findcolor (249, 758 250, 759 1 1 9464066 %arr 2 abs) //if ($b1 > 0) and ($b2 > 0) and ($b3 > 0) set #i 4 //repeat 4 //set #i #i + 1 set $u 0 set $d 0 set $l 0 set $r 0 set #xu1 %axu [#i 1] set #xu2 %axu [#i 1] + 1 set #xd1 %axd [#i 2] set #xd2 %axd [#i 2] + 1 set #xl1 %axl [#i 3] set #xl2 %axl [#i 3] + 1
while ( $u = 0 ) and ( $d = 0 ) and ( $l = 0 ) and ($r = 0) set $u findcolor (#xu1, 652 #xu2, 653 1 1 7129819 %arr1 2 abs) set $d findcolor (#xd1, 653 #xd2, 654 1 1 7397878 %arr2 2 abs) if #i = 1 set $l findcolor (558, 648 559, 677 1 1 5795961 %arr3 2 abs) end_if if #i = 2 set $l findcolor (609, 648 610, 677 1 1 6141658 %arr4 2 abs) end_if if (#i = 3) or (#i = 4) set $l findcolor (#xl1, 648 #xl2, 677 1 1 4939129 %arr5 2 abs) end_if if #i = 1 set $r findcolor (539, 648 540, 677 1 1 5796217 %arr6 2 abs) end_if if #i = 2 set $r findcolor (597, 648 598, 677 1 1 5519145 %arr7 2 abs) end_if if #i = 3 set $r findcolor (663, 648 664, 677 1 1 5452838 %arr8 2 abs) end_if if #i = 4 set $r findcolor (716, 648 717, 677 1 1 4939129 %arr9 2 abs) end_if end_while set logging open if $u > 0 post {Up} set #z1 %arr1 [1 1] set #z2 %arr1 [1 2] set logging arr1 #z1 #z2 #i goto end end_if if $d > 0 post {Down} set #z1 %arr2 [1 1] set #z2 %arr2 [1 2] set logging arr2 #z1 #z2 #i goto end end_if if $l > 0 post {Left} if #i = 1 set #z1 %arr3 [1 1] set #z2 %arr3 [1 2] set logging arr3 #z1 #z2 #i end_if if #i = 2 set #z1 %arr4 [1 1] set #z2 %arr4 [1 2] set logging arr4 #z1 #z2 #i end_if if #i = 3 set #z1 %arr5 [1 1] set #z2 %arr5 [1 2] set logging arr5 #z1 #z2 #i end_if if #i = 4 set #z1 %arr5 [1 1] set #z2 %arr5 [1 2] set logging arr5 #z1 #z2 #i end_if goto end end_if if $r > 0 post {Right} if #i = 1 set #z1 %arr6 [1 1] set #z2 %arr6 [1 2] set logging arr6 #z1 #z2 #i end_if if #i = 2 set #z1 %arr7 [1 1] set #z2 %arr7 [1 2] set logging arr7 #z1 #z2 #i end_if if #i = 3 set #z1 %arr8 [1 1] set #z2 %arr8 [1 2] set logging arr8 #z1 #z2 #i end_if if #i = 4 set #z1 %arr9 [1 1] set #z2 %arr9 [1 2] set logging arr9 #z1 #z2 #i end_if goto end end_if :end //end_repeat //end_if end_script
u 5025524 d 5421044 l110325120 l2 10324860 r1 7230537 r2 10325121
|
|
|
|
Denker |
9.1.2011, 14:58
|
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30
|
Ещё немного модифицировал и упростил код. Во время отладки добавил строку set logging $u $d $l $r #i Лог
13:33:33 3 (s_fish.txt): 0 0 0 1 1 13:33:33 3 (s_fish.txt): 0 1 0 0 2 13:33:33 3 (s_fish.txt): 0 1 0 0 3 13:33:33 3 (s_fish.txt): 0 0 1 0 4 13:33:33 3 (s_fish.txt): 0 0 1 0 5 13:33:33 3 (s_fish.txt): 0 0 0 1 6 13:33:33 3 (s_fish.txt): 0 0 0 1 7 13:33:39 3 (s_fish.txt): 0 0--- 0 1 1 13:33:39 3 (s_fish.txt): 1 0 0 0 2 13:33:39 3 (s_fish.txt): 0 0 1 0 3 13:33:39 3 (s_fish.txt): 1 0 0 0 4 13:33:39 3 (s_fish.txt): 0 0 0 1 5 13:33:39 3 (s_fish.txt): 0 1 0 0 6 13:33:39 3 (s_fish.txt): 1 0 0 0 7 13:33:45 3 (s_fish.txt): 0--- 1 0 0 1 13:33:45 3 (s_fish.txt): 1 0 0 0 2 13:33:45 3 (s_fish.txt): 0 0 0 1 3 13:33:45 3 (s_fish.txt): 0 0 0--- 1 4 13:33:45 3 (s_fish.txt): 1 0 0 0 5 13:33:45 3 (s_fish.txt): 0 1 0 0 6 13:33:45 3 (s_fish.txt): 0 0 1 0 7
когда появляются эти "минуса" прога работает не правильно, а значит это присутствует в значении переменной. Ранее в таком случае выходило из цикла проверки цвета.
|
|
|
|
Denker |
10.1.2011, 16:33
|
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30
|
Спасибо за совет, но к этому я уже сам пришёл. А описал ситуацию на случай, если кому-то не известна. У меня конечный вариант этого блока выглядит так: Код if $u = 1 post {Up} else if $d = 1 post {Down} else if $l = 1 post {Left} else post {Right} end_if end_if end_if
Знаю, что такая структура условия немного безграмотна, но в моём случае подходит лучше всего.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|