Что нового

Функция определения типа иконок в овервью

Castellan

Новичок
Сообщения
32
Репутация
2
Собственно когда сделал для одной иконки - все заработало на ура, но как сделал для всех - стало колом:
Код:
While 1
	ActWindow ()
	TypeIcon10 ()
	ToolTip ($Icon[0]&$Icon[1]&$Icon[2]&$Icon[3]&$Icon[4]&$Icon[5]&$Icon[6]&$Icon[7]&$Icon[8]&$Icon[9], 0, 0)
WEnd
Func TypeIcon10 ()
Global $Icon[10] = ["0","0","0","0","0","0","0","0","0","0"]
Global $i
For $i = 0 To 10
	TypeIcon()
Next
EndFunc
Func TypeIcon ()
Global $ok = 0
IconStation ()
;If $ok = 1 Then Return $Icon[$i]
IconGate ()
;If $ok = 1 Then Return $Icon[$i]
If $ok = 0 Then $Icon[$i] = "not acepted"
EndFunc
Func IconStation ()
	Local $x = $IconOverx0y0[0], $y = $IconOverx0y0[1]+$i*19
	PixelSearch ($x+7, $y+5, $x+7, $y+5, 0xFFFFFF, 10)
	If Not @error Then
		PixelSearch ($x+7, $y+14, $x+7, $y+14, 0xFFFFFF, 10)
		If Not @error Then
			PixelSearch ($x+16, $y+5, $x+16, $y+5, 0xFFFFFF, 10)
			If Not @error Then
				PixelSearch ($x+16, $y+14, $x+16, $y+14, 0xFFFFFF, 10)
				If Not @error Then
					$ok = 1
					$Icon[$i] = "Station"
				EndIf
			EndIf
		EndIf
	EndIf
EndFunc
Func IconGate ()
	Local $x = $IconOverx0y0[0], $y = $IconOverx0y0[1]+$i*19
	PixelSearch ($x+6, $y+28, $x+6, $y+28, 0xFFFFFF, 10)
	If Not @error Then
		PixelSearch ($x+11, $y+5, $x+11, $y+5, 0xE7E7E7,10)
		If Not @error Then
			PixelSearch ($x+16, $y+9, $x+16, $y+9, 0xE7E7E7, 10)
			If Not @error Then
				PixelSearch ($x+12, $y+14, $x+12, $y+14, 0xE7E7E7, 10)
				If Not @error Then
					$ok = 1
					$Icon[$i] = "Gate"
				EndIf
			EndIf
		EndIf
	EndIf
EndFunc

Код работает, но определяет почему-то только 1-ую иконку :(
 
Автор
C

Castellan

Новичок
Сообщения
32
Репутация
2
За ссылку спасибо. Попробовал, вот что получилось:
Код:
#include-once
#include "ScreenCapture.au3"
AutoItSetOption("WinTitleMatchMode", 4)
Global $hWndList = WinList ("classname=triuiScreen")
if ($hWndList[0][0] = 0) Then
	ConsoleWrite ("клиенты не загружены" & @CRLF)
	Exit
EndIf
Global $WinName = $hWndList[1][1]

while not ( WinActive ($WinName) )
	WinActivate($WinName)
WEnd
ScreenCapture_Lock( $WinName )			; Делаем скринщет
$IconStat = ScreenCapture_SearchEx("IconStation",700,150,1200,700,"EVE.ini")
If IsArray ($IconStat) Then
	if Not ($IconStat[0] = 65535 ) Then
	MsgBox ( 0, "test", "иконка станции найдена в координатах:"&$IconStat[0]&":"&$IconStat[1])
	Else
	MsgBox ( 0, "test", "иконка не найдена")
	EndIf
Else
	MsgBox ( 0, "test", "Что это? О_о")
EndIf

в итоге выдает что иконка найдена в координатах 1345х184 О_о
Вот содержимое ини-файла:
[IconStation]
color = 0xFFFFFF
shade = 0x10
0 = ++++
1 = +---
2 = +---
Возник вопрос - почему не находит там, где положено :\, и как привязать координаты к клинтской части евы?
 
Автор
C

Castellan

Новичок
Сообщения
32
Репутация
2
она находит вообще за экраном, если делаю более сложный шаблон - вообще не находит :\.... как сделать привязку к клиентской части экрана?
Вот взял пример лукаса, ничего практически не меняя (кроме области поиска) и ини файла, вот что вышло:
Код:
#cs


#ce
#include-once
#include "ScreenCapture.au3"

AutoItSetOption("WinTitleMatchMode", 4)
Global $hWndList = WinList ("classname=triuiScreen")

if ($hWndList[0][0] = 0) Then
	ConsoleWrite ("клиенты не загружены" & @CRLF)
	Exit
EndIf

Global $hWndClient = $hWndList[1][1]

while not ( WinActive ($hWndClient) )
	WinActivate($hWndClient)
WEnd
ScreenCapture_Lock( $hWndClient )			; Делаем скринщет

Func SetMouseTo($point_1)
	if IsArray($point_1) Then
		if ($point[0] = 65535 )Then
			ConsoleWrite ("Образ не найден"  & @CRLF)
		Else
			ConsoleWrite( $point_1[0] & ":" &$point_1[1])
			MouseMove   ( $point_1[0], $point_1[1])
		EndIf
	Else
		ConsoleWrite ("фигня какаето" & @CRLF)
	EndIf
EndFunc

; Пожгружаем маску "WarpMenu" и производим поиск "образа" в скринщете.
; При повторном вызове маска уже не подгружается
; Поиск в заданом диапазоне
Global $point
$point = ScreenCapture_SearchEx("WarpMenu",10,10,1024,768,"EVE.ini")
SetMouseTo($point)

Вот что в инифайле:[WarpMenu]
color = 0x00FFFFFF
shade = 0x10
0 = -----------
1 = -+++++++++-
2 = -+-------+-
3 = -+-------+-
4 = -+-------+-
5 = -+-------+-
6 = -+-------+-
7 = -+-------+-
8 = -+-------+-
9 = -+++++++++-
10= -----------
(это иконка станции в овервью)
теперь пишет:
Call SearchMask 10 10 768 1024
Образ не найден
П.С. мде... а если повернуть камеру к солнцу, то находит это самое солнце :\\\
 
Автор
C

Castellan

Новичок
Сообщения
32
Репутация
2
Вот что выдает:

Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: autoit3.exe
Версия приложения: 3.3.8.1
Отметка времени приложения: 4f25baec
Имя модуля с ошибкой: DllProject.dll
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 00000000
Код исключения: c0000005
Смещение исключения: 000014b2
Версия ОС: 6.1.7600.2.0.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789
 

running-frag

why me?
Сообщения
441
Репутация
60
EVEGamer
Есть баг. Непонятного происхождения. Увеличиваем количество пикселей на
Код:
For $Y=0 To 15
    ConsoleWrite ("line"& $Y+1&" =")
    For $X=0 To 10

И у нас вылетает ошибка
Код:
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
на строку
Код:
$Color[$Count]=Chr(97+$A);вносим метку в масив в соответствии с позицией


Попытка отловить ошибку показывает вот что
Код:
a is 1 countMark is 2 count is 40
D:\_autoit\??????\gamer.au3 (34) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$Color[$Count]=Chr(97+$A)
Другими словами переменная $Count переваливает за 40. А т.к. у нас $Color[40] мы натыкаемся на ошибку.


Добавлено:
Сообщение автоматически объединено:

Код:
For $Y=0 To 15
    ConsoleWrite ("line"& $Y+1&" =")
    For $X=0 To 10
. . . 
    Next
    ConsoleWrite (@CRLF)
    $Count = 0 ; обнуляем
Next

Вопрос решается обнуление переменной после вывода.


Добавлено:
Сообщение автоматически объединено:

А с шейдами это чудо работает? Если нет какой в нём смысл? :scratch: Что то у меня не получилось найти опции "shade-variation".
 
Автор
C

Castellan

Новичок
Сообщения
32
Репутация
2
Так в том-то и дело, что за основу я взял код в архиве (где уже вбито начало с 10), да и сам пробовал переставлять( ограничивал зону поиска вообще до 700-1000) все равно вылетает с этой ошибкой :\
 

running-frag

why me?
Сообщения
441
Репутация
60
EVEGamer
На самом деле "шаблонизатор" работает. Но по прежднему вопрос с шэйдами как то упускается из виду и нигде не описуется (это уже речь не о шаблонизаторе а о самой dll).

В ini файле вроде как просто описуется это
Код:
shade=0x10

но вот как его "понимать" я не знаю. К примеру какой прицеп шэйда у PixelSearch () ясно, но как это интерпретировать на нужной значение для шаблонизатора и dll? И какой прицеп перебора цветов (с учётом шэйда).

Откуда такие вопросы. Допустим мы имеем статик иконку (имеется ввиду шаблон). При наведении у нас все цвета разнятся относительно статика. Но, по какому прицепу оно ищет тогда? Т.е. если мы прибавим статик-цвет + цвет мы не получим (допустим) наведённую иконку (её цвета). Потому что тот же TrimColor отдаст разные значения для каждого пикселя (цвета) и "общее" значение на сколько у нас стали "ярче" цвета мы не сможем подвести к одной цыфре. Отсюда возникает вопрос как оно его ищет.
 

running-frag

why me?
Сообщения
441
Репутация
60
EVEGamer [?]
f=0x10999999 красным выделен шейд.
И получается что максимальный шэйд это 99, а минимальный 00 ?

И что на счёт алгоритма в dll?


PS: при чём тут эпик фэил и краткость? это не очевидные вещи, по крайней мере для тех кто смотри на код второй раз
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Эта... Посоны, я вас не понимаю. Зачем вы мучаетесь если любую, абсолютно любую иконку в овервью, можно определить по 3 - максимум 5 пикселям?


Добавлено:
Сообщение автоматически объединено:

Ну вот даже:
Код:
Case $ToCheck = "Overview"
			Local $Overview_1[6] = [844, 7, 844, 12, 0x838383, 10] ;Миникарта, палоске слева от Universe
			Local $Overview_2[6] = [768, 170, 768, 503, 0xC11414, 10] ;Координаты цели которую можно взять на прицел (NPC)
			Local $Overview_3[6] = [768, 170, 768, 503, 0xD8D8D8, 10] ;Координаты цели которую можно взять на прицел (девственно белый Wreck)
			Local $Overview_4[6] = [768, 170, 768, 503, 0x7B7B7B, 5] ;Координаты цели которую можно взять на прицел (темно серый поюзанный Wreck)
			Local $Overview_5[7] = [770,169,772,170,0xFFFFFF,2,"Station Icon Col"]
			Local $Overview_6[7] = [868,175,878,175,0xB6B6B6,50,"Asteroid Name Col"]
			Local $Overview_7[8] = [768, 170, 768, 503, 0xFFFFFF, 10, 1, "Jettison"]
			If $AdvCheck = "Count Actual Targets" Then
				Local $x = 766, $y = 172, $Count = 0
				For $i = 0 To 5 Step 1
					PixelSearch($x, $y+$i*19, $x+5, $y+$i*19, 0xD8D8D8, 20, $CurWin_hwnd)
					If Not @error Then $Count = $Count+1
				Next
				Return $Count
			EndIf
;~    			UpdLog("Проверяю состояние Овервью.")
;~ 			If $Location[0][0] = "Станция" Or $Location[0][0] = "Идет загрузка..." Or $Location[0][0] = "Нахожусь в варпе"  Then Return "#"
			PixelSearch($Overview_1[0], $Overview_1[1], $Overview_1[2], $Overview_1[3], $Overview_1[4], $Overview_1[5], 1, $CurWin_hwnd);Проверяем не сдвинуто ли овервью миникартой
			If Not @error Then
				MouseClick("Left", Random(1014, 1017), Random(7, 10, 1) , 1, 10) ;Закрываем миникарту
;~ 				UpdLog("Закрыл миникарту вызывавшую сбои.")
				Sleep(Random(1000,2000, 1))
			EndIf

			Local $NPC = PixelSearch($Overview_2[0], $Overview_2[1], $Overview_2[2], $Overview_2[3], $Overview_2[4], $Overview_2[5], 1, $CurWin_hwnd) ;Ищим красный цвет неписей
			If Not @error Then
;~ 	   			UpdLog("В овервью обнаружена непись.")
				SetError(1) ;Если еррор = 1 значит мы нашли непись
				If $AdvCheck = "Pos" Then Return $NPC ;Если запрос шел на координаты найденной цели, возвращаем $NPC
				Return "NPC" ;Если же нет, возвращаем что нашли неписей.
			Else
				Local $Jettison = PixelSearch($Overview_7[0], $Overview_7[1], $Overview_7[2], $Overview_7[3], $Overview_7[4], $Overview_7[5], $Overview_7[6], $CurWin_hwnd)
				If Not @error Then
					SetError(4) ;Если Еррор = 4 значит мы нашли джет
					If $AdvCheck = "Pos" Then Return $Jettison ;Если запрос шел на координаты найденной цели, возвращаем $Wreck
					Return "Jettison"
				Else
					Local $Wreck = PixelSearch($Overview_3[0], $Overview_3[1], $Overview_3[2], $Overview_3[3], $Overview_3[4], $Overview_3[5], 1, $CurWin_hwnd) ;Если не нашли неписей - ищим врек белый врек
					If Not @error Then ;Если нашли белый врек
	;~ 					UpdLog("В овервью обнаружены лутабельные вреки.")
						SetError(2) ;Если Еррор = 2 значит мы нашли врек
						If $AdvCheck = "Pos" Then Return $Wreck ;Если запрос шел на координаты найденной цели, возвращаем $Wreck
						Return "Wreck" ;Если же нет, возвращаем что нашли врек
					Else
						Local $Wreck = PixelSearch($Overview_4[0], $Overview_4[1], $Overview_4[2], $Overview_4[3], $Overview_4[4], $Overview_4[5], 1, $CurWin_hwnd) ;Если не нашли белый - ищим сервый врек
						If Not @error Then ;Если нашли серый врек
	;~ 						UpdLog("В овервью обнаружены лутабельные вреки.")
							SetError(2) ;Если Еррор = 2 значит мы нашли врек
							If $AdvCheck = "Pos" Then Return $Wreck ;Если запрос шел на координаты найденной цели, возвращаем $Wreck
							Return "Wreck" ;Если же нет, возвращаем что нашли врек
						Else
							Local $AsterExists = False, $StationExists = False
							Local $Asteroid = PixelSearch($Overview_6[0],$Overview_6[1],$Overview_6[2],$Overview_6[3],$Overview_6[4],$Overview_6[5], 1, $CurWin_hwnd);ищим астероиды
							If Not @error Then Local $AsterExists = True
	;~ 						MsgBox(0,0,1)
							Local $Station = PixelSearch($Overview_5[0],$Overview_5[1],$Overview_5[2],$Overview_5[3],$Overview_5[4],$Overview_5[5], 1, $CurWin_hwnd);ищим станции
							If Not @error Then Local $StationExists = True
							If $AsterExists And Not $StationExists Then
	;~ 							TestMSG($Asteroid[0]&" "&$Asteroid[1])
								If $AdvCheck = "Pos" Then Return $Asteroid
								Return "Asteroid"
							EndIf
							If $AsterExists And $StationExists Then
								If $AdvCheck = "Pos" Then Return $Station
								Return "Station"
							EndIf

						EndIf
					EndIf
				EndIf
			EndIf

			SetError(3) ;Если Еррор = 3 значит мы ничиво нинашли
			Return "Объект не найден"

Не помню что она конкретно определяет, вроде нпц, джет, не свой джет, врек, не свой врек, просмотренный или нет и вроде что-то еще. Не знаю насколько актуальна, в еву я минимум год назад заходил последний раз. Но этот скрипт как бы несколько лет проработал без ошибок.
P.S. И помните. Если вам нужно что-то определить в овервью, вы и пишите функцию конкретно под эти цели. Не надо вносить в функцию то, что определять вам не нужно для конкретного бота.
 

running-frag

why me?
Сообщения
441
Репутация
60
Belfigor [?]
Эта... Посоны, я вас не понимаю. Зачем вы мучаетесь если любую, абсолютно любую иконку в овервью, можно определить по 3 - максимум 5 пикселям?
Сама идея что бы использывать данный dll для определения иконок в овере это по определению дэбилизм. Я смотрю на данный код немного с другой стороны, как развитие это OCR. Поэтому само собой интересен сам алгоритм а не его реализация.

PS: У меня алгоритм запоминание\отображения иконок в разы устойчевей и практичней. И проблемы с иконками нет. ;D
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Да и в конечном итоге, если вам надо определять всё и вся в овервью, вы можете написать не сложный "ocr" который будет создавать текущий битмап строки по колонке иконок и сравнивать его с эталоном.


Добавлено:
Сообщение автоматически объединено:

running-frag сказал(а):
Belfigor [?]
Эта... Посоны, я вас не понимаю. Зачем вы мучаетесь если любую, абсолютно любую иконку в овервью, можно определить по 3 - максимум 5 пикселям?
Сама идея что бы использывать данный dll для определения иконок в овере это по определению дэбилизм. Я смотрю на данный код немного с другой стороны, как развитие это OCR. Поэтому само собой интересен сам алгоритм а не его реализация.

PS: У меня алгоритм запоминание\отображения иконок в разы устойчевей и практичней. И проблемы с иконками нет. ;D
Ну да, это из разряда что мух, можно лупить мухобойкой, а можно стрелять в них из континентальных ракет с термоядерными боеголовками :smile:
 

running-frag

why me?
Сообщения
441
Репутация
60
Belfigor [?]
Да и в конечном итоге, если вам надо определять всё и вся в овервью, вы можете написать не сложный "ocr" который будет создавать текущий битмап строки по колонке иконок и сравнивать его с эталоном.
Ну можно это реализовать и без окр, но как только шрифт меняется то "эта песня хорошая"... А простеньких окр не бывает. :smile: Если делать то так что б "с термоядерными боеголовками". Какой смысл через две недели переделывать? В общем у меня другой взгляд на это дело.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
running-frag сказал(а):
Если делать то так что б "с термоядерными боеголовками". Какой смысл через две недели переделывать? В общем у меня другой взгляд на это дело.
Ну... Против этого не поспоришь. Я ушел из евы тогда, когда раз в неделю приходилось переделывать все вообще. Но овервью модуль работал исправно и в тот момент. Они не меняют иконки. Максимум их шейд, чууууть чуть. Функция SirMaksFromEcho всем в помощь. Уверен что если я щас зайду в игру и начну прилаживать к овервью эту функцию, она даже в первозданном виде будет работать идеально.
Прошу прощения что я не выложил реализацию вышеприведенной функции через функцию SirMaksFromEho. У меня просто с несколькими жесткими дисками, ввиду их износа, случился ректальный коллапс. Все что у меня сейчас осталось это наработки несколько летней давности с того момента как я перестал заходить в еву :(. Хотя одна дичь меня активно пропагандирует вернуться в игру и предлагает взять под контроль какой-нибудь альянс :(. Но я таки не поддамся пропаганде :smile:. Думаю в еву играть я перестал ближайшие года на 3-4 минимум.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
EVEGamer сказал(а):
Со времён войны в дрон регах, твой чар в нпс корпе. ))
Дай бох там он и останется до тех пор пока я вдруг не захочу вернуться в игру :smile:. Ну... Хотя бы один из мейнов :smile:


Добавлено:
Сообщение автоматически объединено:

А какой ник моего чара если не секрет? Лучше в пм :smile:
 
Автор
C

Castellan

Новичок
Сообщения
32
Репутация
2
Мда, все заспамили оффтопом, а на вопрос о причине вылета скрипта не ответили :\
 
Верх