Что нового

Поиск комбинации (нескольких) пикселей

zoxer1

Знающий
Сообщения
72
Репутация
6
Добрый день!

Имееются маленькие рисунки (иконки в игре). Надо игровое поле перевести в Массив. Для этого требуется поиск нескольких пикселей для каждой из вариантов иконок.

имеющиеся значиния пикселя и координаты (брал по 2 значения на иконку)
Код:
цвет пикселя        координаты
0x23BC00            297, 193        0x62B900  303, 212  - Листок
0x929383            320, 204        0x888866   335, 208  - Серебрянная монета
0xB82211            357, 204        0xFC0E0E   373, 200  -  Божья коровока
0xFFAD21            463, 199        0xFFAA1E   408, 200  -  Золотая монета
0x683311            217, 228        0x665530   225, 246  -  Кувшин

Проход по полю выполняется циклами построчно, отступом 34 пикселя.

вопрос, как проверку на соответсвие сделать с помощью 1ой фунции?

скрипт набросал корявый :wacko:

Код:
;0x23BC00 297, 193       0x62B900  303, 212  - Листок
;0x929383  320, 204      0x888866   335, 208  - Серебрянная монета
;0xB82211  357, 204      0xFC0E0E   373, 200  -  Божья коровока
;0xFFAD21  463, 199      0xFFAA1E   408, 200  -  Золотая монета
;0x683311  217, 228      0x665530   225, 246  -  Кувшин
#include <PixelSearchEx.au3>
#include <Array.au3>

Dim $pole[14][14]
WinActivate("Безымянный - Paint")
Local $TestX1 = 203, $TestY1 = 187, $TestX2 =668, $TestY2 = 543
Local $iX =0, $iY = 0
For $i = 0 to 10
	$iX =0
	For $j = 0 To 13
		
	$pix =  PixelSearchEx($TestX1+$iX, $TestY1+$iY, $TestX1+$iX+25, $TestY1+$iY+25, 0x23BC00, 30)
	
	If Not @error Then
        ;MouseMove($pix[0], $pix[1], 10)
		$pix1 = PixelGetColor($pix[0]+6, $pix[1]+29);, $pix[0]+7, $pix[1]+20, 0x62B900, 30)
		$pole[$i][$j] = 1				
    Else			
		; Второй цвет
		$pix =  PixelSearchEx($TestX1+$iX, $TestY1+$iY, $TestX1+$iX+25, $TestY1+$iY+25, 0x929383,10)
		
		If Not @error Then
			;MouseMove($pix[0], $pix[1], 10)
			$pix1 = PixelSearchEx($pix[0]+14, $pix[1]+3, $pix[0]+16, $pix[1]+5, 0x888866, 10)
			if Not @error Then
				MouseMove($pix1[0], $pix1[1], 7)
				;PixelGetColor($pix[0]+8, $pix[1]+18) = 0x665530 Then
				$pole[$i][$j] = 2	
			EndIf
		
		Else
		
			;Третий цвет
			$pix =  PixelSearchEx($TestX1+$iX, $TestY1+$iY, $TestX1+$iX+25, $TestY1+$iY+25, 0xB82211, 5)
		
			If Not @error Then
				;MouseMove($pix[0], $pix[1], 10)
				$pix1 = PixelGetColor($pix[0]+15, $pix[1]+4);, $pix[0]+7, $pix[1]+20, 0x62B900, 30)
				$pole[$i][$j] = 3
			Else
			
				; Четверный Цвет
				$pix =  PixelSearchEx($TestX1+$iX, $TestY1+$iY, $TestX1+$iX+25, $TestY1+$iY+25, 0xFFAD21, 5)
		
				If Not @error Then
					;MouseMove($pix[0], $pix[1], 10)
					$pix1 = PixelGetColor($pix[0]+15, $pix[1]+4);, $pix[0]+7, $pix[1]+20, 0x62B900, 30)
					$pole[$i][$j] = 4
				Else	
					; Пятый Цвет
					$pix =  PixelSearchEx($TestX1+$iX, $TestY1+$iY, $TestX1+$iX+25, $TestY1+$iY+25, 0x683311, 5)
		
					If Not @error Then
						;MouseMove($pix[0], $pix[1], 10)
						
						$pix1 = PixelSearchEx($pix[0]+7, $pix[1]+17, $pix[0]+9, $pix[1]+19, 0x665530, 10)
						if Not @error Then
							;MouseMove($pix1[0], $pix1[1], 7)
							;PixelGetColor($pix[0]+8, $pix[1]+18) = 0x665530 Then
							$pole[$i][$j] = 5	
						EndIf
					EndIf
									
				EndIf
			
			EndIf
		
		
		EndIf
		
		
    EndIf
	
	$iX += 36
	Next
$iY += 36
Next
_ArrayDisplay($pole)


Как бы упростить этот скрипт?
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
не много переделал скрипт, чтот не все определяет...
может кто нить помочь?

Код:
;0x23BC00 297, 193       0x62B900  303, 212  - Листок
;0x929383  320, 204      0x888866   335, 208  - Серебрянная монета
;0xB82211  357, 204      0xFC0E0E   373, 200  -  Божья коровока
;0xFFAD21  463, 199      0xFFAA1E   408, 200  -  Золотая монета
;0x683311  217, 228      0x665530   225, 246  -  Кувшин
#include <PixelSearchEx.au3>
#include <Array.au3>

Dim $pole[14][14]

Global $pix_coord[5][4] = [[297, 193, 303, 212], [320, 204, 335, 208], [357, 204, 373, 200], [463, 199, 408, 200], [217, 228, 225, 246]]
Global $pix_col[5][2] =   [[0x23BC00, 0x62B900], [0x929383, 0x888866], [0xB82211, 0xFC0E0E], [0xFFAD21, 0xFFAA1E], [0x683311, 0x665530]]

Func _Search($pix_col1, $pix_col2, $pix_coordX1, $pix_coordY1, $pix_coordX2, $pix_coordY2)
	
	$pix =  PixelSearchEx($pix_coordX1, $pix_coordY1, $pix_coordX1+25, $pix_coordY1+25, $pix_col1, 20)    
    If Not @error Then
        $pix1 =  PixelSearchEx($pix[0]+$pix_coordX2-1, $pix[1]+$pix_coordY2-1, $pix[0]+$pix_coordX2+1, $pix[1]+$pix_coordY2+1, $pix_col2, 20)
        If Not @error Then
			;MouseMove($pix1[0], $pix1[1], 7)
			Return 1 
		EndIf
    ;Else            
    
    EndIf
   
;~ 	$pix =  PixelSearchEx($TestX1+$iX, $TestY1+$iY, $TestX1+$iX+25, $TestY1+$iY+25, $pix_col1, 30)    
;~     If Not @error Then
;~         $pix1 =  PixelSearchEx($pix[0]+5, $pix[1]+18, $pix[0]+7, $pix[1]+20, $pix_col2, 30)
;~         Return 1              
;~     Else            
;~     
;~     EndIf
EndFunc

MsgBox (0,'',$pix_col[3][0])
WinActivate("Колыбель Рима")
;203, 223
Local $TestX1 = 251, $TestY1 = 207 ;координаты краев
Local $iX =0, $iY = 0
For $i = 0 to 9
	$iX =0
	For $j = 0 To 13
		;MouseMove($TestX1+$iX,  $TestY1+$iY, 3)
		$search = 0
		For $item = 0 To 4
			if Not $search Then
				$pix_col1     = $pix_col[$item][0]
				$pix_col2     = $pix_col[$item][1]
				$pix_coordX1  = $TestX1+$iX
				$pix_coordY1  = $TestY1+$iY
				$pix_coordX2  = $pix_coord[$item][2]-$pix_coord[$item][0]
				$pix_coordY2  = $pix_coord[$item][3]-$pix_coord[$item][1]
		
				$search = _Search($pix_col1, $pix_col2, $pix_coordX1, $pix_coordY1, $pix_coordX2, $pix_coordY2)
				if $search Then
					$pole[$i][$j] = $item+1
				Else
			
				EndIf
			Else
				ExitLoop
			EndIf
		
		Next
	
	$iX += 36
	Next
$iY += 36
Next
_ArrayDisplay($pole)
;MsgBox(0,"",$pix)


ниже скриншот окна на котором ведутся поиски
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Дак протестируй правильно ли у тебя оформлены пресеты пикселей в идущей с PixelSearchEx udf
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
не очень понял о чем ты :wacko:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
В изначальном пакете поставки PixelSearchEx если мне память не изменяет, был отдельный файл под названием CheckPixel.au3 или как-то так, в который и заносились пресеты необходимых проверок пикселей, в который обращалась основная функция. И в случае возврата из этого файла положительного значения и координат, скрипт считал что нужный пресет пикселей найден.
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
пробема в том, что не хочет находить все точки... тоже если shade ставлю 100.
 
Верх