Что нового

Цикл нажатия клавиш до появления определённого цвета

Lazy

Новичок
Сообщения
40
Репутация
0
Прочитал много тем про PixelSearch, но не нашёл такого и не пойму, как реализовать.
Нужна реализация данных действий:
Нажимаешь клавишу (допустим 1) 1 раз и начинается цикл нажатия любой 1 клавиши (допустим 2), но когда появляется определённый цвет в определённом месте, то цикл останавливается.
Цвет должен проверяться в нескольких местах.
Так же надо производить выход из цикла при нажатии первой клавиши (клавиши 1).
Приблизительная тема: http://autoit-script.ru/index.php/topic,7990.0.html , но чего то не пойму код.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
HotKeySet("{1}", "knopka1")

$trigger = 0

Func knopka1()				; старт/стоп по кнопке 1
	$trigger = Not $trigger
EndFunc

Func proverka()					; стоп если в определённой области появился пиксел определенного цвета
	Pixelsearch(150,100,1250,950, $color)
	if not @error then $trigger = 0
EndFunc

While 1							; основной цикл
	proverka()
    If $trigger Then Send("{2}")
	Sleep(1000)
WEnd
 
Автор
L

Lazy

Новичок
Сообщения
40
Репутация
0
А как цвет проверять в нескольких местах?
И каким образом можно найти эти координаты 150,100,1250,950?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Это левые координаты, взятые для примера.
когда появляется определённый цвет в определённом месте, то цикл останавливается.
Ты что конкретно имел в виду под "определённым местом" ?
 
Автор
L

Lazy

Новичок
Сообщения
40
Репутация
0
Требуется проверка в нескольких местах.
Как я понял код вкладывается просто.
Если так, то получается таким образом будет производиться проверка?
Код:
HotKeySet("{F1}", "knopka1")

$trigger = 0
$color=0x31F731

Func knopka1()              ; старт/стоп по кнопке 1
    $trigger = Not $trigger
EndFunc

Func proverka()                 
    Pixelsearch(150,100,1250,950, $color)
    if not @error then $trigger = 0
           
    Pixelsearch(150,100,1250,950, $color)
    if not @error then $trigger = 0
                
    Pixelsearch(150,100,1250,950, $color)
    if not @error then $trigger = 0
EndFunc

While 1                         ; основной цикл
    proverka()
    If $trigger Then Send("{F2}")
    Sleep(1000)
WEnd

Чуть поправил код.=)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Не, координаты 150,100,1250,950 это числа для примера. Тебе надо использовать реальные координаты.

1) Делаешь в игре скриншот.
2) Открываешь скриншот программой Paint, которая поставляется вместе с виндой.
3) Водишь мышкой по картинке - справа внизу у тебя пишутся координаты пикселя на который указывает мышка, в формате x,y.
4) переписываешь координаты точек, которые являются верхней левой (x1,y1) и нижней правой (x2,y2) вершинами прямоугольника, который и является областью, которую ты хочешь проверять на наличие пикселя определённого цвета.
5) Pixelsearch вызываешь с этими координатами
Код:
Pixelsearch(x1,y1,x2,y2, $color)


(отдельная история с определением цвета пикселя... можешь взять за основу цвета в том же Paint, а потом подобрать цвет поточнее)
 
Автор
L

Lazy

Новичок
Сообщения
40
Репутация
0
Я разобрался с координатами и цветом.
Цвет я беру из AutoIt Window Info, а координаты запиливаю с помощью Upilot.
Меня интересует проверка данного цвета в 3 местах, а только потом выполнение цикла.
Верно ли будет просто вложить 3 функции Pixelsearch в функцию проверки таким образом?
Код:
HotKeySet("{F1}", "knopka1")

$trigger = 0
$color=0x31F731

Func knopka1()              ; старт/стоп по кнопке 1
    $trigger = Not $trigger
EndFunc

Func proverka()                 
    Pixelsearch(150,100,1250,950, $color) ; проверка цвета в 1ых координатах
    if not @error then $trigger = 0
           
    Pixelsearch(151,101,1251,951, $color) ; проверка цвета в 2ых координатах
    if not @error then $trigger = 0
                
    Pixelsearch(152,102,1252,952, $color) ; проверка цвета в 3ых координатах
    if not @error then $trigger = 0
EndFunc

While 1                         ; основной цикл
    proverka()
    If $trigger Then Send("{F2}")
    Sleep(1000)
WEnd
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Синтаксически верно, но по логике...
Ты ищешь точку одного и того же цвета в практически совпадающих прямоугольниках. Есть ли в этом смысл?
 
Автор
L

Lazy

Новичок
Сообщения
40
Репутация
0
Более чем.
Т.к. цвет может образоваться в каждой из этих точек, но вместе эти 3 точки образовываются только при определённом действии, а ещё лучше делать проверку в 4 местах для надёжности.=)
 
Автор
L

Lazy

Новичок
Сообщения
40
Репутация
0
Выполняет, но частично...
Как я понял из выше сказанного пиксель сёрч ищет заданный цвет в какой то прямоугольной области.
А если требуется 1 пиксель?
Получаем такое?
Код:
Pixelsearch(650, 109, 650, 109, $color)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
можно и так, да

А для одной точки можно и вот так
Код:
If PixelGetColor(650, 109) = $color Then $trigger = 0
 
Автор
L

Lazy

Новичок
Сообщения
40
Репутация
0
Не останавливает вообще...
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А я предупреждал
(отдельная история с определением цвета пикселя... можешь взять за основу цвета в том же Paint, а потом подобрать цвет поточнее)

Я для этих целей вот такой скрипт себе написал
Код:
#include <Color.au3>
#Include <Misc.au3>

HotKeySet("{F3}", "fixcolor")

Func fixcolor()

 For $i=1 to 200

  $coord = PixelSearch( 650, 109, 650, 109, 0x69E6E6, 200-$i)    ; 0x69E6E6 - это мой цвет был
  If Not @error Then
	$color = PixelGetColor($coord[0],$coord[1])
	FileWriteLine($file, $coord[0])
	FileWriteLine($file, $coord[1])
	$stroka= _ColorGetRed($color) & "/" & _ColorGetGreen($color) & "/" & _ColorGetBlue($color)
	FileWriteLine($file, $stroka & @CRLF)
  Else
  EndIf

Next

$file = FileOpen("color.txt", 1)

While 1
 Sleep(60000)
Wend

FileClose($file)


Дождись появления нужной точки и жми F3
 
Автор
L

Lazy

Новичок
Сообщения
40
Репутация
0
Не запускается.
Ругается на FileClose($file)
 
Автор
L

Lazy

Новичок
Сообщения
40
Репутация
0
Не пашет.
включается и моментально выключается.=)
 
Автор
L

Lazy

Новичок
Сообщения
40
Репутация
0
EndFunc
Это как раз таки добавил.=)
Не пашет.
включается и моментально выключается.=)
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Ну для полного счаться функцую fixcolor() можно вырезать вставить в канец скрипта :smile:
 
Верх