Что нового

PixelGetColor неправильно определяет цвет

Banknot

Новичок
Сообщения
2
Репутация
0
Здравствуйте, форумчане. Я только начал пользоваться AutoIt, так что вопрос, скорее всего, совсем нубский, поэтому задам его в общих.

Собственно, если упростить, в игре в различные моменты времени появляется кнопка на экране. Появляется всегда в одном и том же месте, одного из двух цветов. Исчезает после клика на нее. Скрипту просто требуется отслеживать появление кнопки и нажимать, если появилась. Кажется, все элементарно.
Вот что у меня получилось.

Код:
$cvet1=0xC75243    ;Цвет кнопки 1
$cvet2=0xC75344    ;Цвет кнопки 2
$xMouse=0;
$yMouse=0;
MsgBox(0,"Начало.","Бла-бла-бла.")
WinWaitActive("название игры")
MsgBox(0, "Название окна", "Бла-бла-бла")
$work=1
$auto=0
Func Calibr()
   $MousePos=MouseGetPos();
   $xMouse=$MousePos[0]
   $yMouse=$MousePos[1]
 MsgBox (0, "Название окна", "Бла-бла-бла.")
EndFunc

Func Automat()
MsgBox(0, "Название окна", "Бла-бла-бла")
$auto=1;
EndFunc


Func StopIt()
$work=0;
$auto=0;
MsgBox(0, "Завершение", "Бла-бла-бла")
EndFunc


HotKeySet("{F8}","Automat")
HotKeySet("{F9}","StopIt")
HotKeySet("{SPACE}","StopIt")
HotKeySet("{F7}","Calibr")

While $work=1
If $auto=1 then ToolTip("Бла-бла-бла")
Sleep(Random(1000,2000));
If ($auto=1) And ((PixelGetColor($xMouse,$yMouse)=$cvet1) OR (PixelGetColor($xMouse,$yMouse)=$cvet2))  then MouseClick("left", $xMouse, $yMouse, 1, 10)
WEnd


Неправильно работает вот эта строчка
Код:
If ($auto=1) And ((PixelGetColor($xMouse,$yMouse)=$cvet1) OR (PixelGetColor($xMouse,$yMouse)=$cvet2))  then MouseClick("left", $xMouse, $yMouse, 1, 10)


PixelGetColor определяет цвет пикселя не по координатам $xMouse и $yMouse, которые были заданы в Calibr(), а по координатам курсора. Если курсор оставить на кнопке, то скрипт работает правильно, а вот если мышку отодвинуть подальше, чтобы цвет пикселей под ней был другой, то определить, есть ли кнопка, не получается.
Функция Calibr() же запускается только в начали при нажатии F7 и больше никак не влияет на переменные $xMouse, $yMouse.

И самое интересное, что функция MouseClick в той же строке с теми же координатами $xMouse, $yMouse работает правильно и двигает курсор в то место, которое задано при запуске Calibr().

Что-то здесь не сходится.

В конце еще описание работы скрипта под спойлером.
В начале все стандартно, скидываем переменные, задаем цвета, ждем открытия нужного окна.
Потом пользователь должен навести курсор на кнопку, когда она появится и нажимает F7.
Скрипт записывает координаты курсора в переменные $xMouse, $yMouse.
Потом пользователь нажимает F8 и запускается основная часть.
Скрипт ждет немного и проверяет, не появилась ли одна из двух кнопок. Если появилась, то нажимает на нее и ждет дальше.
При нажатии на пробел или F9 программа заканчивает работу.

Помогите, пожалуйста. У меня кончились идеи, почему так происходит.
 
Сообщения
137
Репутация
-2
Функция PixelGetColor работает правильно, просто ты ей не задаёшь точные координаты для определения цвета.
Если у тебя нет точных координат пикселя нужного тебе цвета - определи прямоугольник, где появляется искомый пиксель и используй функцию PixelSearch:
Код:
Найти чисто красный пиксель в прямоугольнике 0,0-20,300
$coord = PixelSearch(0, 0, 20, 300, 0xFF0000)


А если кнопка появляется в одном и том же месте - используй конкретные координаты нужного тебе пикселя вместо твоих $xMouse,$yMouse и функцию PixelGetColor.
 
Автор
Banknot

Banknot

Новичок
Сообщения
2
Репутация
0
Dessan сказал(а):
ты ей не задаёшь точные координаты для определения цвета.
Они заданы в переменных. Так нельзя делать?

Dessan сказал(а):
А если кнопка появляется в одном и том же месте - используй конкретные координаты нужного тебе пикселя вместо твоих $xMouse,$yMouse и функцию PixelGetColor.
А если я, например, разверну игру на весь экран или запущу в другом браузере или, еще хуже, на другом компьютере? Хочется указывать программе нужную точку не залезая в код.
В принципе она работает, просто не совсем так, как было задумано, а я не понимаю почему.
 
A

Alofa

Гость
Попробуйте так (уж извините, не проверял):
Код:
Global $cvet1 = 0xC75243 ;Цвет кнопки 1
Global $cvet2 = 0xC75344 ;Цвет кнопки 2
Global $xMouse = 0;
Global $yMouse = 0;
Global $auto, $work = True

HotKeySet("{F7}", "Calibr") ; Скрипт записывает координаты курсора в переменные $xMouse, $yMouse
HotKeySet("{F8}", "Automat") ; запускается основная часть
HotKeySet("{F9}", "StopIt") ; программа заканчивает работу
HotKeySet("{SPACE}", "StopIt") ; программа заканчивает работу

MsgBox(0, "Начало.", "Бла-бла-бла.")
WinWaitActive("название игры")
MsgBox(0, "Название окна", "Бла-бла-бла")

While $work
	If $auto Then
		ToolTip("Бла-бла-бла")
		Switch '0x' & Hex(PixelGetColor($xMouse, $yMouse), 6)
			Case $cvet1, $cvet2
				MouseClick("left", $xMouse, $yMouse, 1, 10)
		EndSwitch
	EndIf
	Sleep(Random(1000, 2000))
WEnd

; ============= Ф У Н К Ц И И =====================================
Func Calibr()
	$MousePos = MouseGetPos();
	$xMouse = $MousePos[0]
	$yMouse = $MousePos[1]
	MsgBox(0, "Название окна", "Бла-бла-бла.")
EndFunc   ;==>Calibr

Func Automat()
	MsgBox(0, "Название окна", "Бла-бла-бла")
	$auto = 1;
EndFunc   ;==>Automat

Func StopIt()
	$work = False
	$auto = False
	MsgBox(0, "Завершение", "Бла-бла-бла")
EndFunc   ;==>StopIt



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

OffTopic:
Тему впору назвать: "PixelGetColor возвращает цвет неправильного формата". ;D
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Все правильно, каждый уважающий себя ботовод, должен пройти стадию не понимания PixelGetColor и обязательно запутаться в 2 условиях.
Ps. главное не читай советы про '0x' & Hex(..., 6) ;D


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

Alofa
Код:
$a = 1223444
$b = 0x0012AB14
If $a = $b Then
	MsgBox(0, '', 'магия')
EndIf
 
Сообщения
137
Репутация
-2
Возможно, я ещё больше нуб чем автор раз функцию Func Calibr() не увидел. Это каждый раз запускать скрипт потом нажимать на кнопку вызова функции, потом выискивать кнопку, потом кликать по ней для передачи координат в скрипт, да не просто кликать а выискивать цвет пикселя, да не просто пикселя а пикселя, который уже прописан в скрипт?Зачем здесь изначальные координаты 0,0?)Я пониманию, что может такая задумка...но скрипт пишется для упрощения работы вроде как.
 
A

Alofa

Гость
inververs и Dessan
OffTopic:
Это фактически тот же самый скрипт от Banknot, только отсортирован на мой вкус и слегка подправлен. Мы не видим здесь его полную версию, непонятно что там у автора еще есть. Но если он назначил значение переменным, значит ему так нужно.
 
Верх