Что нового

[Автоматизация] Как можно организовать ожидание появления 2х разных цветов?

Teacher

Новичок
Необходимо организовать ожидание появления того или иного цвета типа WaitColor(0xFF0000) or WaitColor(0x00FFFF).
Тобишь:
если появился цвет - черный = делать одно действие
если появился цвет - красный = делать другое действие
Грубо говоря, необходимо одновременно ждать 2 цвета и при появлении того или иного цвета, делать соответственно то или иное действие.
Необходимо именно с WaitColor!
Помогите пожалуйста :(
 

edyapd

Осваивающий
Я конечно многого ещё не знаю, в том числе и такой команды WaitColor.
Но кто мешает ждать так:
Код:
If WaitColor(0xFF0000) or WaitColor(0x00FFFF) Then

А дальше уже разбираться, какой же дождались.
 

InnI

AutoIT Гуру
Teacher [?]
одновременно ждать 2 цвета
Можно и больше. Заполняйте массив нужным количеством цветов и ждите
Код:
; два цвета
Global $ar[] = [0xFF0000,0x00FFFF]
$Color = WaitMultiColor(100, 100, $ar)
Switch $Color
  Case 0
    ConsoleWrite("0xFF0000" & @CRLF)
  Case 1
    ConsoleWrite("0x00FFFF" & @CRLF)
EndSwitch
; пять цветов
Global $ar[] = [0xFF0000,0x00FF00,0x0000FF,0xFFFF00,0x00FFFF]
$Color = WaitMultiColor(200, 200, $ar)
Switch $Color
  Case 0
    ConsoleWrite("0xFF0000" & @CRLF)
  Case 1
    ConsoleWrite("0x00FF00" & @CRLF)
  Case 2
    ConsoleWrite("0x0000FF" & @CRLF)
  Case 3
    ConsoleWrite("0xFFFF00" & @CRLF)
  Case 4
    ConsoleWrite("0x00FFFF" & @CRLF)
EndSwitch

Func WaitMultiColor($X, $Y, ByRef $aColors)
  If Not IsArray($aColors) Then Return -1
  While Sleep(10)
    For $i = 0 To UBound($aColors) - 1
      If PixelGetColor($X, $Y) = $aColors[$i] Then Return $i
    Next
  WEnd
EndFunc
 
Автор
T

Teacher

Новичок
InnI сказал(а):
Teacher [?]
одновременно ждать 2 цвета
Можно и больше. Заполняйте массив нужным количеством цветов и ждите
Код:
; два цвета
Global $ar[] = [0xFF0000,0x00FFFF]
$Color = WaitMultiColor(100, 100, $ar)
Switch $Color
  Case 0
    ConsoleWrite("0xFF0000" & @CRLF)
  Case 1
    ConsoleWrite("0x00FFFF" & @CRLF)
EndSwitch
; пять цветов
Global $ar[] = [0xFF0000,0x00FF00,0x0000FF,0xFFFF00,0x00FFFF]
$Color = WaitMultiColor(200, 200, $ar)
Switch $Color
  Case 0
    ConsoleWrite("0xFF0000" & @CRLF)
  Case 1
    ConsoleWrite("0x00FF00" & @CRLF)
  Case 2
    ConsoleWrite("0x0000FF" & @CRLF)
  Case 3
    ConsoleWrite("0xFFFF00" & @CRLF)
  Case 4
    ConsoleWrite("0x00FFFF" & @CRLF)
EndSwitch

Func WaitMultiColor($X, $Y, ByRef $aColors)
  If Not IsArray($aColors) Then Return -1
  While Sleep(10)
    For $i = 0 To UBound($aColors) - 1
      If PixelGetColor($X, $Y) = $aColors[$i] Then Return $i
    Next
  WEnd
EndFunc
Не могу понять код :(.
Можно ли например - Если цвет в определенных координатах - красный - тогда совершить клик.
Если цвет в тех же координатах - черный - совершить клик.
PixelSeach не подходит немного, так как его нужно описывать в переменную, и в цикле он будет работать постоянно.
А мне нужно чтобы программа не работала вообще при ожидании красного или черного пикселя.
 

madmasles

Модератор
Глобальный модератор
Teacher,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 

InnI

AutoIT Гуру
Teacher [?]
Можно ли например
Код:
While 1                            ; цикл ожидания
  $Color = PixelGetColor(100, 200)   ; цвет в координатах 100:200
  If $Color = 0xFF0000 Then          ; если красный
    MouseClick("left", 300, 400)       ; клик в координаты 300:400
    ExitLoop                           ; выход из цикла
  EndIf
  If $Color = 0x000000 Then          ; если чёрный
    MouseClick("left", 400, 500)       ; клик в координаты 400:500
    ExitLoop                           ; выход из цикла
  EndIf
  Sleep(10)                          ; пауза, чтобы не загружать процессор
WEnd                               ; если не красный и не чёрный - продолжаем ждать

чтобы программа не работала вообще
Это как? :stars:
 
Автор
T

Teacher

Новичок
Ну в смысле чтобы программа не выполняла никаких действий, а только ждала цвет в определенной области...
 

Ksaan

Знающий
Teacher сказал(а):
Можно ли например - Если цвет в определенных координатах - красный - тогда совершить клик.
Если цвет в тех же координатах - черный - совершить клик.
Или вот так
Код:
While 1
   $color = PixelGetColor(100, 200)
   
   If $color = 0xff0000
	  MouseClick("left", 300, 400)
   ElseIf $color = 0x000000
	  MouseClick("left", 300, 400)
   Else
	  Sleep(50)
   EndIf
Wend

Или для многих цветов а не только для двух
Код:
While 1
   $color = PixelGetColor(100, 200)
   
   Select
   Case $color = 0xff0000
	  MouseClick("left", 300, 400)
   Case $color = 0x000000
	  MouseClick("left", 300, 400)
   ;.......... и так далее на любые цвета
   
   ;..........
   Case $color = 0x00ffff
	  MouseClick("left", 300, 400)
   EndSelect
   
   Sleep(50)
Wend

Teacher сказал(а):
Ну в смысле чтобы программа не выполняла никаких действий, а только ждала цвет в определенной области...
Программа не может ждать она всегда что-то делает.
 
Автор
T

Teacher

Новичок
Дело в том что у меня 2 разных области, в которых должен появится цвет (это не определенная координата).
С одним цветом я делал так. А как можно реализовать подобным образом, только с двумя цветами?
Код:
Func Start()
While 1
WaitColor(0x0084FF)
MouseClick("left", 1195, 479, 1, 0)
WEnd
EndFunc

Func WaitColor($Color)
  Do
    Sleep(10)
    PixelSearch(690, 510, 1185, 591, $Color)
  Until Not @error
EndFunc
 

edyapd

Осваивающий
Так чем вас это то не устраивает?
Код:
Func Start()
	While 1
		PixelSearch(690, 510, 1185, 591, 0x0084FF)
		If Not @error Then MouseClick("left", 1195, 479, 1, 0)
		PixelSearch(690, 510, 1185, 591, 0x000000)
		If Not @error Then MouseClick("left", 1195, 479, 1, 0)
		Sleep(10)
	WEnd
EndFunc

Какая разница где у вас будет программа крутится в поисках цвета в одной функции или в другой?
 

ArvenPK

Новичок
Teacher сказал(а):
PixelSeach не подходит немного, так как его нужно описывать в переменную, и в цикле он будет работать постоянно.
А мне нужно чтобы программа не работала вообще при ожидании красного или черного пикселя.
Teacher сказал(а):
Ну в смысле чтобы программа не выполняла никаких действий, а только ждала цвет в определенной области...
Внезапно, ожидание цвета в определённой области - это и есть действие.

Teacher сказал(а):
если появился цвет - черный = делать одно действие
если появился цвет - красный = делать другое действие
Teacher сказал(а):
Если цвет в определенных координатах - красный - тогда совершить клик.
Если цвет в тех же координатах - черный - совершить клик.
Teacher сказал(а):
Дело в том что у меня 2 разных области, в которых должен появится цвет (это не определенная координата).
Так одно действие, или разные? Те же координаты, или разные?

Если одни и те же координаты и одно действие, то просто добавь в свою функцию ещё одну проверку:
Код:
Func WaitColor()
	While Sleep(10)
		PixelSearch(690, 510, 1185, 591, 0xFF0000)
		If Not @error Then Return
		PixelSearch(690, 510, 1185, 591, 0x000000)
		If Not @error Then Return
	WEnd
EndFunc


Или вот ещё лучше вариант. Действительно, нафиг тебе два цикла, вместо одного?

А вообще, хардкод - плохо! Я бы сделал как-то так (для v3.3.13.19 (Beta)):
Код:
main()

Func main()
	Local $actions[] = [ _
		addAction(301, 207, 0xFF0000, redAction), _
		addAction(260, 10, 0x000000, blackAction) _
	]
	waitColor($actions)
EndFunc

Func redAction()
	ConsoleWrite("Найден красный цвет" & @CRLF)
EndFunc

Func blackAction()
	ConsoleWrite("Найден чёрный цвет" & @CRLF)
EndFunc

Func addAction($x, $y, $color, $callback)
	Local $m[]
	$m.x = $x
	$m.y = $y
	$m.color = $color
	$m.callback = $callback
	Return $m
EndFunc

Func waitColor(ByRef $actions)
	While Sleep(10)
		For $act In $actions
			PixelSearch($act.x, $act.y, $act.x, $act.y, $act.color)
			If Not @error Then $act["callback"]()
		Next
	WEnd
EndFunc
 
Автор
T

Teacher

Новичок
Координаты разные и действия разные. Этот код вроде бы подходит, только как совершать разные действия? не пойму... :-\
Код:
Func WaitColor()
    While Sleep(10)
        PixelSearch(690, 510, 1185, 591, 0xFF0000)
        If Not @error Then Return
        PixelSearch(690, 510, 1185, 591, 0x000000)
        If Not @error Then Return
    WEnd
EndFunc
 
Верх