Что нового

[Автоматизация] Подсчёт количества кликов/распознавание картинки по пиксельно/подсчёт пикселей

Сообщения
137
Репутация
-2
Добрый день,

Мне нужна идея реализации подсчёта количества золота в игре.Не знаю даже как назвать тему, не назову же её "Подсчёт количества кликов и перевод их в золото в зависимости от типа здания на которое кликнуло ". А именно, при клике на шахту добавляется +7 единиц (всегда в одном и том же месте появляется квадрат как на картинке), при клике на домик добавляется +13 единиц, там ещё несколько видов зданий с определённым добавлением единиц золота. Вот как мне отследить сколько золота "накликал" скрипт и вписать в лейбл?
Вот линк на сам скрин http://www.ex.ua/413604808353. Я нашёл вот такую тему http://autoit-script.ru/index.php?topic=11036.0 на форуме. Всё сделал как написал автор, применительно к моему скриншоту для числа +13 и получил 2 файла: log и au3. Вот содержание au3:
Код:
Func _detect_digit()
   If PixelGetColor(810,156) <> 0x4C483F Then Return 6
   If PixelGetColor(810,153) <> 0x4C483F Then Return 4
   If PixelGetColor(810,152) <> 0x4C483F Then Return 5
   If PixelGetColor(811,151) <> 0x4C483F Then Return 2
   If PixelGetColor(810,151) <> 0x4C483F Then Return 1
   If PixelGetColor(810,149) <> 0x4C483F Then Return 3
   If PixelGetColor(810,141) <> 0x4C483F Then Return 7
; не удалось обнаружить уникальные пиксели для цифры 0. Для анализа смотрите лог.
; не удалось обнаружить уникальные пиксели для цифры 8. Для анализа смотрите лог.
; не удалось обнаружить уникальные пиксели для цифры 9. Для анализа смотрите лог.
EndFunc
Понятия не имею куда его дальше всовывать и как именно. Вот основной скрипт:

Код:
начало скрипта, GUI и прорисовка кнопок с лейбл
$iClicksLabel = GUICtrlCreateLabel('0', 50, 49, 50, 17, -1, $WS_EX_CLIENTEDGE)
GUICtrlCreateLabel('123456', 110, 49, 50, 17, -1, $WS_EX_CLIENTEDGE) ; вот сюда вписывается количество золота

While 1

	If $fTrigger Then
		Sleep(3000)
		Opt("WinTitleMatchMode", 2)
		Local $hWnd = WinGetHandle("Forge of Empires – Yandex")
		
		$hControl = ControlGetHandle($hWnd, "", "Chrome_RenderWidgetHostHWND1")
		
		Sleep(400)
		; ищем первый подходящий пиксель
		$aPix = _PixelGetArray($X, $Y, $Width, $Height, $Color, $hControl, True)
		; кликаем по координ

		For $i = 1 To $aPix[0][0] ;Количество строк в массиве (n)

			ConsoleWrite("+1" & ':' & $aPix[0][0] & 'x' & $aPix[$i][0] & 'x' & $aPix[$i][1] & '; ')
			Sleep(1000)
			$iClick += ControlClick($hWnd, "", $hControl, "left", 1, $aPix[$i][0], $aPix[$i][1] + 60)
			;ConsoleWrite("+1" & ':' & $aPix[i][0] & 'x' & $aPix[i][1] & '; ')
			GUICtrlSetData($iClicksLabel, StringFormat('%01d', $iClick))
		Next

	EndIf

WEnd
----------------------------------
функции для кнопок
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ты в логе цифры, нарисованные символом * видишь?
Все цифры 'корректно' нарисованы?

Скриншот у тебя размером 800х749, а координаты определены как 810,ххх
Скриншот не соответствует условиям, в которых происходило распознавание цифр.
 
Автор
D
Сообщения
137
Репутация
-2
То я просто скрин сделал.чтоб понятно было о чём речь.

Вот то, что в логе:

Зона распознавания цифр
X: 810-858
Y: 141-186

Mask 1
**********************Mask 1
*Mask 1
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*Mask 2
*********************Mask 2
*Mask 2
*Mask 2
*Mask 2
*Mask 2
*Mask 2
*Mask 2
Mask 2
*Mask 2
*Mask 2
*Mask 2
*Mask 2
Mask 2
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
**********Mask 3
***********************Mask 3
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
***************************************Mask 4
************************Mask 4
*Mask 4
*Mask 4
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*****************Mask 5
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*********************************************Mask 6
**********************Mask 6
*Mask 6
**Mask 6
*Mask 6
Mask 6
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************Mask 7
***********************Mask 7
*Mask 7
Mask 7
*Mask 7
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
******
Надеюсь, я всё верно сделал.

Как вызывать полученную функцию?И что дальше с полученными этими цифрами делать?То есть вот мы определили Return 1...мне нужно, чтоб при появлении на экране цифры как в Return 1 (что будет соответствовать +13 на экране), в лейбл записывалось это число, при повторном появлении они суммировались. Например, появилось +13, записали 13 в лейбл, ещё появилось +13, записали 26 и т.д. Код писать не нужно, я хочу смысл понять.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Судя по логу цифры не обнаружены скриптом в том месте, где ты указал.
Теперь про смысл.
1. Скрипт пытается распознать цифры, которые расположены в фиксированном месте. Судя по тому что ты описываешь, у тебя нет фиксированного места - "+7" состоит из одной цифры, "+13" из двух. Очевидно что сообщение выравнивается по центру, поэтому место расположения цифр разное.
2. Опять же, судя из твоих слов, все цифры тебе не нужны - ты отлавливаешь всего два события "+7" и "+13". Твоя задача сводится к тому чтобы найти в двух условленных местах пиксель уникальносветлозелёного цвета.
 
Автор
D
Сообщения
137
Репутация
-2
Я имел в виду, что эта цифра появляется в одной и той же области экрана и если для "+7" эта область пусть будет 50*50 pxl,
то для "+13" это будет пускай 70*70 pxl, а для "+500" (уже три цифры) например 90*90 pxl. Берём область 90*90 сразу ("Навести мышку на левый верхний угол этого прямоугольника и нажать Shift+Alt+b. Навести мышку на правый нижний угол этого прямоугольника и нажать Shift+Alt+e.") и ищем там наши пиксели уникальнозелёного цвета. Собственно, на сегодня мне нужны цифры +6, +7, +11, +13, +500. Но, для простоты я взял только два события +7 и +13. И так как эти цифры появляются на экране только после клика на определённое здание и видны только в течение 2-3 секунд,я забиндил +7 на первые 3 или 4 цифры клавиатуры(на всякий случай) , а +13 на ещё 2 или 3 (тоже на всякий случай). Чтоб их снова увидеть - нужно снова нажимать на здание.
 
Верх