1

Тема: AHK: Не работает PixelSearch, не понимаю почему.


#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
Pause

F12::
Pause

;Проблема: В онлайн игре прокачивается четверка лошадей. Они движутся по заданному маршруту. В режиме карты мира видно не лошадей и повозку, а их синюю иконку. При длительной работе игра может глюконуть и движение по маршруту прекратится. Об этом нужно уведомить пользователя, что-бы он исправил ситуацию. Определить факт глюка (микроразрыва соединения с сервером) можно проверяя, изменилось положение иконки или нет.
;Задача. Определить перемещается ли иконка с заданным цветом по заданному окну (игры, но в данном случае по окну Win 7 Paint'a, ибо скрипт тестируется на другом компе.). Если да, то всё норм, иначе - уведомить пользователя об этом

Loop
{
	;Ищем, где на экране окно
	WinGetPos , GameWindowPosX, GameWindowPosY, GameWindowWidth, GameWindowHeight, Безымянный - Paint
	if (GameWindowPosX = "") {
	MsgBox, Не могу найти окно игры, наверное она закрыта.
	Break
	}

	;Этот кусок кода нужен что-бы определить цвет искомой иконки, если мы его не знаем. Если бы скрипт не глючил и не тестировался на Paint'е вместо Black Desert, то закоментированый кусок был-бы не нужен. Пока что целевой цвет изменен на правый верхний цвет (Фиолетовый) в палитре Paint'а
	;MouseGetPos, MouseX, MouseY
	;PixelGetColor, color, %MouseX%, %MouseY%
	;MsgBox, The color at the current cursor position is %color%.
	TargetColor = 0xA449A3

	;Получаем величину разрешения экрана и проверяем, не уходит ли окно за его границы
	SysGet, ScreenWidth, 78
	SysGet, ScreenHeight, 79
	if (GameWindowPosX + GameWindowWidth > ScreenWidth) OR (GameWindowPosY + GameWindowHeight > ScreenHeight) {
	MsgBox, Окно не полностью видно, возможно ложное срабатывание.
	Break
	}
	
	;Ищем, где на экране искомая иконка, если скрипт только запустился, то по всему окну, иначе, в окрестностях того места где оно было в последний раз
	if (CurrentHorseIconPosX = "")
		PixelSearch, CurrentHorseIconPosX, CurrentHorseIconPosY, GameWindowPosX, GameWindowPosY, (GameWindowPosX + GameWindowWidth), (GameWindowPosY + GameWindowHeight), %TargetColor%
	else
		PixelSearch, CurrentHorseIconPosX, CurrentHorseIconPosY, CurrentHorseIconPosX - 70, CurrentHorseIconPosY - 70, CurrentHorseIconPosX + 70, CurrentHorseIconPosY + 70, %TargetColor%
	if (ErrorLevel = 1) {
		MsgBox, Не видно искомой иконки. Откройте карту и убедитесь, что иконку видно на всей длинне маршрута.
		Break
	}

	;Ждем пока иконка переместится, предпологается, что она должна двигаться. В случае тестирования на Paint'е нужно просто переместить окно на 140 пикселей, или не перемещать. Если она не найдена в прежних координатах, то всё норм. Если нет, то в игре бы это значило что на короткое время оборвалось интернет-соединение с сервером игры и это привело к тому что повозка встала. Об этом нужно уведомить пользователя. В процессе тестирования MsgBox нужно раскоментировать.
	Sleep 3000
	PixelSearch, CurrentHorseIconPosX, CurrentHorseIconPosY, CurrentHorseIconPosX - 70, CurrentHorseIconPosY - 70, CurrentHorseIconPosX + 70, CurrentHorseIconPosY + 70, %TargetColor%
	if (ErrorLevel = 1) {
		;MsgBox, Отлично, повозка передвинулась.
		continue
	}
	else if (ErrorLevel = 0) {
		MsgBox, Увы, повозка встала.
		Break
	}
}


2

Re: AHK: Не работает PixelSearch, не понимаю почему.

CoordMode?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Не работает PixelSearch, не понимаю почему.

Ну, координаты поиска у меня считаются от монитора, а не от окна, так-что действительно CoordMode стоит поменять. Добавил сие в начало

CoordMode, Pixel, Screen

Но почему-то скрипт один фиг не работает.

4

Re: AHK: Не работает PixelSearch, не понимаю почему.

Я по играм не спец, вроде PixelSearch в некоторых случаях может не работать. Тут на форуме есть посты Malcev'а, как можно получать информацию с экрана другими способами.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: NektoN95, 2023-02-21 21:31:23)

Re: AHK: Не работает PixelSearch, не понимаю почему.

teadrinker
Я его сейчас на Paint'е - виндоузовской рисовалке (коменты в коде почитайте) тестирую, от работы в игре разница в 2х переменных. Не работает даже на paint. Причем я предпологал, что у скрипта проблемы в игре и проверил работает ли PixelGetColor - работает, в Paint, разумеется, - тоже. А PixelSearch - почему-то нет.

6

Re: AHK: Не работает PixelSearch, не понимаю почему.

Используйте параметр Variation.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Не работает PixelSearch, не понимаю почему.

NektoN95 пишет:

Не работает даже на paint.

Ищите у себя ошибку. PixelSearch должен работать хотя бы в Paint'е.

8 (изменено: NektoN95, 2023-02-22 00:14:00)

Re: AHK: Не работает PixelSearch, не понимаю почему.

teadrinker
Нафига? Реальный и искомый цвета точно совпадают. Проблемма в том что функция не возвращает ни 1 ни 0 в ErrorLevel, и то что должно происходить после первого и третьего PixelSearch не происходит.
ypppu
В первом по счету PixelSearch первые две переменные выходные. Ещё две это верхняя левая граница поиска, ещё две, нижняя правая, где обе координаты заданы выражением. Данная строка кода используется в первой итерации.
Третий по счету PixelSearch ищет нужный цвет в квадрате от - 70 пикселей влево и вверх до +70 вправо и вниз от места, где нужный цвет был найден в первом PixelSearch.
И второй по счету PixelSearch это аналог первого, только он должен использоваться на второй и следующих итерациях для поиска только в квадрате 140 на 140 вокруг того места где цвет был найден в третьем PixelSearch на прошлой итерации.

TLDR: Там вроде негде ошибиться!

9 (изменено: NektoN95, 2023-02-22 00:37:36)

Re: AHK: Не работает PixelSearch, не понимаю почему.

И вообще, неплохо-бы заменить поиск по экрану на поиск в не активном невидимом (но и не свëрнутом) окне. Я тут нагуглил про нужную функцию https://forum.script-coding.com/viewtopic.php?id=12959 тут. Вот только нормального описания к этой функции найти не могу. Может знаете где искать?
Update: Нашёл: https://forum.script-coding.com/viewtopic.php?id=8574
https://www.autohotkey.com/boards/viewtopic.php?t=6517

10 (изменено: ypppu, 2023-02-22 19:05:39)

Re: AHK: Не работает PixelSearch, не понимаю почему.

Я особо не вчитывался, бегло просмотрел Ваш код, и меня смутила строка

PixelSearch, CurrentHorseIconPosX, CurrentHorseIconPosY, GameWindowPosX, GameWindowPosY, (GameWindowPosX + GameWindowWidth), (GameWindowPosY + GameWindowHeight), %TargetColor%

Правильный синтаксис:

PixelSearch, OutputVarX, OutputVarY, X1, Y1, X2, Y2, ColorID [, Variation, Fast|RGB]

Добавлено: Вообще-то код верный - в обычных программах работает. Значит игра "не дружит" с  AutoHotKey.