| 
		
	
	
	
	
	   Screen Scanner, аналог findcolor и findimage  | 
	 
	    
	  | 
	           | 
	 
   
	 
  
 
	
		| avgur | 
		
			
			
				   13.6.2011, 16:02
			 
			
			
		 | 
	 
	
		
        	
  
        		   
  
        		Novice 
        		Сообщений: 94 
        		Регистрация: 15.8.2010         		Группа: Пользователи Наличность: 0         		
        		Пользователь №: 12.926 
Возраст: 25
  
        		 
        	 
        	   
        | 
       
			
			Спасибо за труд, теперь у меня относительные координаты точно совпадают с пилотовскими. Программа очень нравится и поражает скоростью работы и точностью определения цветов, про файндколор теперь и не вспомню (IMG: style_emoticons/default/smile.gif) Вот еще вопрос по поводу:  " - можно изменять порядок проверки пикселей по осям X и Y (указывая -dx или -dy меньше нуля);" В прямоугольнике в котором я ищу цвет, чаще всего поиск будет заканчиваться быстрее, если поиск будет проходить сначало по оси Y, а потом по Х. Мне не понятно что указывать меньше нуля, а что больше в моем примере: Код exec cscan.exe -x1=360 -y1=2 -x2=557 -y2=57 -dx=1 -dy=1 -hw= #handleWin -c=(3832214) -f=( E:\arr1test.txt )  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| Denker | 
		
			
			
				   15.8.2011, 15:37
			 
			
			
		 | 
	 
	
		
        	
  
        		  
  
        		Neophyte 
        		Сообщений: 46 
        		Регистрация: 28.10.2010         		Группа: Пользователи Наличность: 0         		
        		Пользователь №: 13.148 
Возраст: 30
  
        		 
        	 
        	   
        | 
       
			
			Здравствуйте. Очень нравится ваша прога, пользуюсь как альтернтива findcolor -- работает значительно быстрее, что для меня очень важно. В коде пользуюсь вашей процедурой для неё: код процедуры 
Код  :cscan set $a findcolor (0, 0 1, 1 1 1 88888888 %stone 2) exec e:\resurs\cscan $cscanparam -file= (e:\resurs\stone.txt) :waiting2 wait 200 load_array %stone e:\resurs\stone.txt set #wcscan size (%stone)  if #wcscan < 2   goto waiting2  end_if  set $a %stone [#wcscan 1]  if ($a <> endcscan)   goto waiting2  end_if set #dcscan #wcscan - 1 set #zcscan %krets [#dcscan 3] set #a 0  if #zcscan <> -1000   if #zcscan = -2000    set #a %krets [1 1]   else    set #a #dcscan   end_if   end_if set $a #a return
 
 Поскольку полностью в её работе так и не разобрался, пользуюсь "как есть". Не периодически выдаёт ошибку в строке Код  load_array %stone e:\resurs\stone.txt
 
 но это в последних версиях пилота поправили, зато теперь скрипт намертво зацикливается на строках Код  :waiting2 wait 200 load_array %stone e:\resurs\stone.txt set #wcscan size (%stone)  if #wcscan < 2   goto waiting2  end_if 
 
 На версиях пилота 2.18.8 и 2.19 всё работает правильно, а в версиях 2.20 и 2.21 зацикливается. Это особенность скрипта или в баг пилота? Если проблемма в скрипте, то как это можно решить? В крайнем случаю придётся переделывать под findcolor, благо его значительно улучшили.  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| Denker | 
		
			
			
				   15.8.2011, 19:52
			 
			
			
		 | 
	 
	
		
        	
  
        		  
  
        		Neophyte 
        		Сообщений: 46 
        		Регистрация: 28.10.2010         		Группа: Пользователи Наличность: 0         		
        		Пользователь №: 13.148 
Возраст: 30
  
        		 
        	 
        	   
        | 
       
			
			Спасибо. Задержку увеличивал вплоть до 500, но тут уже скорости скрипта не хватало. К моменту, когда надо кликнуть в найденой точке, эта точка уже уползала. А ошибку выдаёт если долгое время, больше минуты, не находит заданый цвет или изначально файла нет и не находит цвет. Причём, как я уже писал, ошибка возникает не периодически. Проверку на количество циклов и сам могу. Хоть через обычный счётчик с условием на goto, хоть через timer. Буду пробовать переделать на findcolor. Можно подробнее объяснить принцип работы приведённого куска? Код  :waiting2 wait 200 load_array %stone e:\resurs\stone.txt // это массиву присваиваем содержимое файла  set #wcscan size (%stone)             // определяем размерность массива, что равно количество строк в файле  if #wcscan < 2                       // проверка. но если #wcscan < 2, то где и как изменяется файл, чтобы #wcscan стало >= 2?   goto waiting2                       // учитывая, что мы зацикливаем этот кусок  end_if 
 
  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| Denker | 
		
			
			
				   16.8.2011, 8:48
			 
			
			
		 | 
	 
	
		
        	
  
        		  
  
        		Neophyte 
        		Сообщений: 46 
        		Регистрация: 28.10.2010         		Группа: Пользователи Наличность: 0         		
        		Пользователь №: 13.148 
Возраст: 30
  
        		 
        	 
        	   
        | 
       
			
			Цитата(Zeleax @ 15.8.2011, 20:19)    когда screenscanner завершает работу , то в файле должно получится не менее двух строк (последняя = endcscan). В этом куске и проверяется: если число строк меньше двух, значит поиск еще не завершен.
 
 В том-то и дело, что не зависимо от результата поиска, в файле всегда 2 строки, Цитата(Zeleax @ 15.8.2011, 20:19)    Системная ошибка в строке load_array %stone e:\resurs\stone.txt  происходила ранее из-за того, что совпадал момент времени когда cscan пишет в файл, и в этот же момент времени пилот пытался прочитать информацию.
  После выхода новых вресий пилота (>=2.20) пилот не выдает сообщение об ошибке чтения, а просто работает далее, возвращая массив длиной 0 (вроде бы). Потому и происходит зацикливание.
 
 а значит, даже если массив длиной 0, т.е. файл ещё занат системой, то при повторной проверке, когда файл уже освободится,  условие должно выполниться. Upd: проверка показала, что всегда #wcscan = 0. Поставил вместо проверки "set #wcscan 2", выдаёт ошибку на строке "set $a %krets [#wcscan 1]". Скорее всего, причина тут "load_array %stone e:\resurs\stone.txt"  
			
			
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
	
		| Zeleax | 
		
			
			
				   3.1.2012, 8:25
			 
			
			
		 | 
	 
	
		
        	
  
        		         
  
        		ex-Moderator UOPilot 
        		Сообщений: 2.440 
        		Регистрация: 8.10.2010         		Группа: Пользователи Наличность: 0         		Из: Киев 
        		Пользователь №: 13.093
  
        		 
        	 
        	   
        | 
       
			
			Цитата Ищу на экране небольшие изображения - типа 20-21, 20-22, 20-23.. фон не однотонный но правда не переливается и не меняется, но все равно находит через раз, пробовал в шопе избавится от фона, но тогда еще реже находит (( и как допустим привязать и заменить  set $d FindImage (616 387 653 405 (D:\l22-23.bmp) %arr 2 80 1 ) if $d > 0 ... ... ... на cscan? команда пилота findimage почти полностью заменяет собой cscan, поэтому проще и лучше использовать её. Качество работы этих команд сравнить сложно, поскольку используются разные алгоритмы и средства. Кроме того, для использования cscan нужно иметь установленную на компьютере библиотеку Net Framework 3.5 (см. 1-й пост темы) Если всё же хотите использовать cscan - нужно взять процедуру из первого поста этой темы и поместить её в конец вашего скрипта. Кроме того, исправить внутри процедуры строку exec g:\cscan $cscanparam -file= (g:\1.txt) указать путь к временному файлу - где он должен у вас размещаться на компе. Потом для поиска изображения в своём скрипте просто пишите где нужно: Код set $cscanparam 616 387 653 405 -hw= #workwindow -img=( D:\l22-23.bmp ) gosub cscan if #a > 0    msg Изображение найдено в координатах %arr [1 1] %arr [1 2]  else     msg Изображение не найдено end_if
  Понятно, что в #workwindow нужно записать хендл рабочего окна (где искать). Если нужно искать без привязки к окну - просто не пишите этот параметр (-hw= #workwindow) А вообще, создайте новую тему в соответствующем разделе, выложите туда картинки игры (сделанные в формате PNG). Можно закрасить имя перса и что еще нужно спрятать. Тогда будет о чём говорить  
			
			
  -------------------- 
					
		 | 
	 
	
		| 
			
		 | 
		
			
			
			
         	
          | 
	 
	| 
	
	 | 
 
 
 
	2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0) 
	Пользователей: 0  
 
        				  
  | 
 |