| 
		
	
	
	
	
	   Поиск Цвета По Слоям., Определяет не тот цвет.  | 
	 
	    
	  | 
	           | 
	 
   
	 
  
 
	
		| 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 можно ли его узнать сняв скриншёт или идёт искажение?  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| DarkMaster | 
		
			
			
				   6.1.2011, 20:23
			 
			
			
		 | 
	 
	
		
        	
  
        		           
  
        		Модератор UOPilot 
        		Сообщений: 9.766 
        		Регистрация: 2.12.2008         		Группа: Супермодераторы Наличность: 30011         		
        		Пользователь №: 11.279
  
        		 
        	 
        	   
        | 
       
			
			 теоретически, если сохранишь в бмп, то проблем не будет. но пилот сохраняет в джепеге. сжатие джепега можно изменить в uopilot.ini, но тебе все равно нужен бмп. т.е. жмешь кнопку принт скрин, вставаляешь в пэинт и там уже проверяешь. скин можно даже не сохранять. set $a findcolor (1, 1 2, 2 1 1 123456 %arr 1) abs тут х и у вообще то не совпадают. в факе вроде писал по совпадении координат в финдколоре. 
			
			
  -------------------- 
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____ Контакт актуален, подпись актуальна. 
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| 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
 
 Знаю, что такая структура условия немного безграмотна, но в моём случае подходит лучше всего.  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
 
	2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0) 
	Пользователей: 0  
 
        				  
  | 
 |