Что нового

Одновременный поиск сразу нескольких пикселей и задание событий для каждого

Can

Новичок
Сообщения
59
Репутация
1
Здравствуйте!
Подскажите пожалуйста, как сделать в нижеприведённом скрипте, чтобы поиск пикселей по цвету производился одновременно не для одного заданного пикселя, а сразу для нескольких, и в зависимости от результата выполнялись разные заданные события для каждого из них?

HotKeySet ( "{ESC}" ,"_Exit")

While 1
PixelSearch( 0, 0, 50, 150, 0xC71F25, 0, 1)
If Not @error Then
MouseClick("left", 536, 432, 2, 5)
MsgBox(0,"","Пиксель найден!")
EndIf
WEnd

Func _Exit()
Exit
EndFunc

Заранее большое спасибо за помощь.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Попробуйте так, для двух пикселей:

Код:
HotKeySet ( "{ESC}" ,"_Exit")

While 1
    $p1 = PixelSearch( 160, 240, 200, 270, 0xFF8800) ; Orange
	If @error Then $p1 = @error
    $p2 = PixelSearch( 690, 220, 710,  230, 0x009933, 0, 1) ;  Green
	If @error Then $p2 = @error
		
    If $p1 <> 1 And $p2 <> 1 Then
		Beep(1000,100)
		ToolTip("   Click! ", $p1[0], $p1[1])
        MouseClick("left", $p1[0], $p1[1], 2, 5)
        MsgBox(0,"","Пиксель P1 найден!")
		Beep(1000,100)
		ToolTip("   Click! ", $p2[0], $p2[1])
        MouseClick("left", $p2[0], $p2[1], 2, 5)
        MsgBox(0,"","Пиксель P2 найден!")
	ElseIf $p1 <> 1 Then
		;Beep(1000,100)
		ToolTip("   Click! ", $p1[0], $p1[1])		
        MouseClick("left", $p1[0], $p1[1], 2, 5)
		MsgBox(0,"","Пиксель P1 найден!")
	ElseIf $p2 <> 1 Then
		;Beep(1000,100)
		ToolTip("   Click! ", $p2[0], $p2[1])
        MouseClick("left", $p2[0], $p2[1], 2, 5)
		MsgBox(0,"","Пиксель P2 найден!")
	Else
		MsgBox(0,"","Ничего не найдено!")
		Exit
	EndIf
	
WEnd


Func _Exit()
    Exit
EndFunc


По аналогии можно увеличить количество искомых пикселей.


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

P.S. Для очень большого количества пикселей нужно будет писать другую конструкцию, более изящную, потому как IF разрастётся. :smile:
Но для небольшой задачи ИМХО вполне подойдёт.
 
Автор
C

Can

Новичок
Сообщения
59
Репутация
1
Жаль, что это сильно тормозит запущенное приложение.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Can сказал(а):
Жаль, что это сильно тормозит запущенное приложение.
А в чем цель поставленной задачи, и какое приложение?
 
Автор
C

Can

Новичок
Сообщения
59
Репутация
1
Garrett сказал(а):
Can сказал(а):
Жаль, что это сильно тормозит запущенное приложение.
А в чем цель поставленной задачи, и какое приложение?

Приложение- онлайн игра, цель- предотвратить смертельные события путём нахождения заданного пикселя в небольшой области и мгновенное отключение этого активного окна на заданное время, либо мышкой(переключение на трей и обратно), либо системой просто отключить окно (и обратно через заданное время), но не успевает в 80% случаев.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Если эта игра не браузерная то можно попробовать горячие клавиши, или перехват пакетов данных клиент <-> сервер. А если браузерная то думаю что решение должно быть. А вы этот вариант попробовали? И ещё, вы пользуетесь скомпилированным скриптом (exe)?
 
Автор
C

Can

Новичок
Сообщения
59
Репутация
1
Garrett сказал(а):
Если эта игра не браузерная то можно попробовать горячие клавиши, или перехват пакетов данных клиент <-> сервер. А если браузерная то думаю что решение должно быть. А вы этот вариант попробовали? И ещё, вы пользуетесь скомпилированным скриптом (exe)?

Я Вам написал в личку, незнаю пришло сообщение или нет, а самый лучший результат показал вот этот скрипт:
Код:
HotKeySet ( "{ESC}" ,"_Exit")

While 1 
    PixelSearch( 150, 441, 980, 463, 0xA38E00, 0, 1)
    If Not @error Then
        MouseClick("left", 536, 5, 2, 0)
		Sleep(3000)
		MouseClick("left", 536, 14, 2, 0)
	EndIf
	PixelSearch( 150, 441, 980, 463, 0xA38C00, 0, 1)
    If Not @error Then
        MouseClick("left", 536, 5, 2, 0)
		Sleep(3000)
		MouseClick("left", 536, 14, 2, 0)
	EndIf
	PixelSearch( 150, 441, 980, 463, 0xC36600, 0, 1)
    If Not @error Then
        MouseClick("left", 536, 5, 2, 0)
		Sleep(5500)
		MouseClick("left", 536, 14, 2, 0)
	EndIf
	PixelSearch( 150, 441, 980, 463, 0xC46700, 0, 1)
    If Not @error Then
        MouseClick("left", 536, 5, 2, 0)
		Sleep(5500)
		MouseClick("left", 536, 14, 2, 0)
	EndIf
WEnd

Func _Exit()
Exit
EndFunc


Тут заданны страховочные пиксели, если не сработает один, чтобы сработал другой, но к сожалению тоже этот скрипт подвел через час.
Работал постоянно как Вы ранее предлагали, и он действительно работает, но к сожалению не четко, и 20% сбоев, не срабатывает отключение активного окна, а это не допустимо...
Вот и хочется узнать ответ от профессионалов, существует ли решение?

Огромное спасибо за внимание!
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Can
Предупреждение
Оформляем кода в соответствующий тэг [autoit][/autoit]
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
А у Вас точно в этой области нет статичного пикселя с одним из этих цветов. Просто если есть хотя бы один такой пиксель то программа у вас постоянно тыкает мышкой, но при этом есть еще и слипы, в момент которых и может появится пиксель на который надо бы отреагировать. Но скрипт у Вас просто спит в этот момент.
 

JFR

Новичок
Сообщения
6
Репутация
0
Попробуй воспользоваться командой WinMinimizeAll
 

ORLANGUR-M3

Новичок
Сообщения
15
Репутация
0
Попроуй сделать нечто подобное, может поможет:
Код:
;подключаемый к проэкту модуль Fire_Resist_Pixel_Analysis.au3 с функцией поиска пикселей с диапазоном цветов из области.

#include-once
;----------------INCLUDES---------------
#include <Color.au3>
#include <Misc.au3>
#include <Array.au3>
;-----------------------------------------
AutoItSetOption ( "PixelCoordMode", 0 )
;----------------CONSTANTS--------------
Dim $ps[4]=[76,729,105,732];x_start, y_start, x_end, y_end 30*4 (область поиска)
Dim $col[3]=[200,50,50] ;color RED, GREEN, BLUE (Искать будем красный цвет с переменной прозрачностью)
;--------------------------------------------------------
Func FR_PA(); (функция поиска пикселей диапазона цветов в области. при успешном результате =1)
	$x=$ps[0]
	$y=$ps[1]
	For $y=$ps[1] To $ps[3]
		For $x=$ps[0] To $ps[2]
			$color=_ColorGetRGB(PixelGetColor($x,$y));поиск цвета FF0203 в слове Fire! Танк горит на панели [Red,Green,Blue]
;Сравнение составляющих цвета: если красного>200, зеленого и синего < 50 то цвет найден
			if ($color[0]>$col[0])And($color[1]<$col[1])And($color[2]<$col[2]) Then
				$res=1
				Else
				$res=0
			EndIf
			If $res=1 Then
				ExitLoop(2);Если результат есть то остальные пикселы проверять смысла нет
			EndIf
		Sleep(10); делаем разгрузку проца, чтобы клиент не вис
		Next
		Sleep(500);делаем разгрузку проца, чтобы клиент не вис
	Next

Return $res
EndFunc

;Основной модуль

#include "Includes\Fire_Resist_Pixel_Analysis.au3"

HotKeySet("^!s", "Exit_Program")
SoundPlay('Sounds\automedic_on.wav')
While 1
	If WinActive('W.o.T. Client') Then
		$G_P_A=FR_PA()
	If $G_P_A Then
		Send('4') ;тушим пожар
 		SoundPlay ( "Sounds\fire.wav", 0) 
		Sleep(10000)
		
	EndIf
	Sleep(2000)
	
	EndIf
WEnd

В блоке сравнения аналогично предыдущему посту можно задать несколько диапазонов и событий для каждого.
Почему именно диапазон: появляющиеся сообщения в играх в виде текста, иконок имеют место сдвигаться на несколько пикселей, мигают. Поэтому если мы зададим определенный пиксел с определенным цветом, то наш скрипт может его не найти.
Область советую выбирать не большую тк это сокрощает время работы этой части скрипта.
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Yashied давно показал тут на форуме пример самого быстрого поиска с поиском пикселей, честно говоря на тот момент быстрее не было, да и сомневаюсь что сейчас есть именно для AutoIt вот ссылка на его ответ лучше конечно почитать всю тему
http://autoit-script.ru/index.php?topic=3943.msg29329#msg29329
 
Верх