Что нового

некорректная работа PixelCheckSum на flash игре

sherlock

Новичок
Сообщения
6
Репутация
0
Господа, помогите, в чем может быть проблема

В работающем скрипте - PixelCheckSum на двух компах, соответственно в одной игре (статическое изображение) на одной области выдает разное значение
на обоих компах стоит Win7 x64, только разрешение разное, цветопередача одинакова 32 бита, версия Хрома тоже одна 22.0.1229.96
используется встроенный в него flash, на вкладке chrome://plugins -
Flash - Версия: 11.4.31.110, Shockwave Flash 11.4 r31

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

Whited

Знающий
Сообщения
79
Репутация
10
Вообще использование PixelCheckSum не приведет тебя ни к чему хорошему, используй PixelSearEx. И ищи цвет с оттенками shade=3 примерно. Тогда на любом разрешении будет правильно определять, версии Flash тут совершенно ни к чему.
 
Автор
S

sherlock

Новичок
Сообщения
6
Репутация
0
в моем случае не покатит, т.к. требуется не искать какой-то определенный цвет, а именно объект, скажу больше
он там появляется не сразу после загрузки приложения, а скажем так, периодически, объектов несколько
я точно знаю координаты где этот объект будет, потому и использую PixelChecksum, один раз снял код всех объектов в массив и теперь достаточно просто сравнивать, чтобы скрипт понимал, что там за объект, от этого и дальнейшая работа
получается быстро, просто видать на разных машинах по разному рендерится картинка, может даже от дров видюхи зависит
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
sherlock сказал(а):
просто видать на разных машинах по разному рендерится картинка, может даже от дров видюхи зависит
Тебе потому и говорят использовать PixelSearchEx, а не пытаться изобретать 10 колесный велосипед
 

Whited

Знающий
Сообщения
79
Репутация
10
Просто поверь что использование PixelSearchEx облегчит тебе задачу, тоже самое, запишешь в массив все свои объекты и будешь оперировать ими. У тебя малейший сдвиг окна приложения приведет в негодность твой код. А с помощью PixelSearch и вспомогательных пикселей ты можешь в режиме онлайн определять положение нужных объектов, даже (!) если они поменяют положение на экране(x,y). ;)
 
Автор
S

sherlock

Новичок
Сообщения
6
Репутация
0
спасибо, задумался, возможно Вы реально правы
сейчас потестю как по скорости поиска примерно будет
попутно еще 2 вопроса:

1. PixelSearchEx это и есть функция PixelSerch? (в документации к ней нет описания параметров shade-variation и последующих)
или это какая-то библиотека, в папке установки AutoIt в include поиском не нашел

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

Whited

Знающий
Сообщения
79
Репутация
10
1. PixelSearchEx - это отдельная UDF, можно найти на сайте этом же. Я справился со своей задачей и обычным PixelSearch.

2. Нужно сразу же писать логику в функции, чтобы безошибочно определять нужные объекты.Можно сравнить несколько точек соседних для точного определения объекта, допустим находим 1-ю точку, потом ищем 2-ю точку другого цвета и т.д.
Чтобы не было ложных срабатываний, нужно указывать примерные координаты поиска объекта.
 
Автор
S

sherlock

Новичок
Сообщения
6
Репутация
0
Вот что я примерно накидал:

Код:
ConsoleWrite(@HOUR & ":" & @MIN & ":" & @SEC & " start" & @CRLF)
$find = PixelSearchEx(1000, 400, 1300, 600, 0xFEF8FF, $CheckColor)
ConsoleWrite(@HOUR & ":" & @MIN & ":" & @SEC & " end" & @CRLF)

If IsArray($find) Then
	ConsoleWrite("find: x = " & $find[0] & ", y = " & $find[1] & @CRLF)
EndIf

Func PixelSearchEx($iLeft, $iTop, $iRight, $iBottom, $Color, $CheckColor, $Shade = 0, $Step = 1)
Local $x, $y, $find
	$y = $iTop
	while $y <= $iBottom
		$x = $iLeft
		While $x <= $iRight
			$find = PixelSearch($x, $y, $iRight, $y, $Color, $Shade, $Step)
			If Not IsArray($find) Then
				$y += 1
				ContinueLoop 2
			EndIf
			If 	PixelGetColor($find[0] - 1, $find[1] - 1) = $CheckColor[0] And PixelGetColor($find[0] + 1, $find[1] - 1) = $CheckColor[1] And _
				PixelGetColor($find[0] + 1, $find[1] + 1) = $CheckColor[2] And PixelGetColor($find[0] - 1, $find[1] + 1) = $CheckColor[3] Then Return $find
			$x = $find[0] + 1
		WEnd
		$y += 1
	Wend
	Return False
EndFunc


нашла успешно, но поиск занял целых 9 сек
14:02:21 start
14:02:30 end
find: x = 1283, y = 524
много, к сожалению, не знаю пока как оптимизировать, игрушка грешит кучей всплывающих окон и рекламных тоже
потому в боте через adLib зарегана функция, которая каждые 5 сек запускается, отслеживает 11 вариантов окошек и просто закрывает их
уже только одна она не даст работать скрипту, если на поиск каждого окна она будет тратить по 2-3 сек

пока бот работает в виртуалке, там проблем с PixelCheckSum нет, просто хотел уйти от виртуалки, чтобы еще побыстрее работало
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Посмотри пример который идет с PixelSearchEx.
Прямо внутри этой UDF ты можешь определить зависимости пикселей. Она будет искать первый подходящий пиксель, проверять последовательно заданные пиксели относительно найденного, в случае несоответствия хотя бы одного пикселя поиск будет продолжен далее.
Код:
$pix = PixelSearchEx($TestX1, $TestY1, $TestX2, $TestY2, 0x00E125, 5, 1)
    If Not @error Then
        MouseMove($pix[0], $pix[1], 10)
    Else
        MsgBox(0,"","Группа из двух пикселей не найдена.", 1)
    EndIf

Вот кусок кода из примера который ищет на экране два заранее заданных пикселя, независимо от количества заданных пикселей код будет занимать несколько строк а не как у тебя, пол страницы.
 
Автор
S

sherlock

Новичок
Сообщения
6
Репутация
0
Вот кусок кода из примера который ищет на экране два заранее заданных пикселя, независимо от количества заданных пикселей код будет занимать несколько строк а не как у тебя, пол страницы.

посмотрел я UDF и пример, замечание о коде на полстраницы не принимается :smile:
т.к. не вижу особой разницы, где этот код, в скрипте или в подключаемой библиотеке, размер сравним

логика работы точно такая-же, а значит и скорость будет сопоставима, хотя каюсь, проверять уже не стал, после выходных попробую, но что-то мне подсказывает, что результат будет таким-же

за весь срок жизни, размер бота вырос до 2683 строк кода или 159к текста, так что если переписывать + 50 строк текста вообще не критично
главное скорость, чего к сожалению с PixelSearch пока не удается добиться, к сожалению
 

Whited

Знающий
Сообщения
79
Репутация
10
чего к сожалению с PixelSearch пока не удается добиться, к сожалению

Незнаю, у меня квадратное поле массивом 6х6 сканирует секунды 2 и то, мышь перемещается по этому полю чтобы показать эффект.Каждый элемент массива 41 пиксель.
 

darkwhite

Знающий
Сообщения
129
Репутация
5
OffTopic:
за весь срок жизни, размер бота вырос до 2683 строк кода или 159к текста, так что если переписывать + 50 строк текста вообще не критично
ну да ну да
жаль что все так стали думать и забыли что такое оптимизация кода и производили ОС и игр.
Дествительно а зачем ведь у всех и так супер компы и оперативки до фигища и процы 6 ядер.
А ведь когда то все работало на 133 Мг и занимало 64К
главное скорость, чего к сожалению с PixelSearch пока не удается добиться, к сожалению
ну тогда явно надо искать другой метод
 
Автор
S

sherlock

Новичок
Сообщения
6
Репутация
0
спасибо всем за помощь
пока оставил так как есть, хотя конечно ответа на свой вопрос я все-же не получил, но это надо спрашивать не здесь
сейчас на обновленном хроме новая фишка, после простоя игруха впадает как бы в спящий режим, скрипт просыпается для очередного действия, закрывает окно сна (его корректно определяет) и опа, все коды объектов поменялись (отрендились по другому что-ли), тут и фокус с поиском цвета может не пройти, ну меняется что-то (наделаю скриншотов, попытаюсь в гр. редакторе по пикселам прям посмотреть)
скрипт это дело просекает, перегружает хром, все встает на свои места, до следующего сна :blink:
 
Верх