Процедуры и функции для работы с экраном
Экран состоит представляет собой прямоугольник, состоящий из точек-пикселей. Размеры (ширина и высота) этого прямоугольника
обусловлены количеством пикселей в вертикальной и горизонтальной строках. Каждый пиксель на экране имеет свои координаты. В общем все как на уроке геометрии.
В левом верхнем углу находится пиксель с координатами 0,0. Соответственно, если у вас разрешение экрана 800х600, то нижний правый пиксель будет иметь координаты 799х599.
Помимо координат, каждый пиксель имеет свой собственный цвет свечения, образуемый тремя каналами - красным, зеленым и синим. Эти три канала для удобства кодируются в одно число. Это число и представляет собой цвет пикселя.
Для гибкости и удобства кликер работает не с живым экраном, а с его снимком, помещенным в буфер анализа. Это позволяет во первых ускорить работу, во вторых - наделить программу
неким подобием зрительной памяти. Правда одновременно в памяти может храниться только один снимок экрана.
Содержание
GETSCREEN
СинтаксисGETSCREEN ([x1, y1, x2, y2]) - делает снимок экрана и помещает его в буфер анализа программы
x1, y1, x2, y2 - параметры, описывающие область экрана; необязательны
Данная процедура помещает снимок экрана в буфер программы. Затем, из этого буфера берут данные все графические функции, вызываемые в сценарии. Соответственно, в случае когда необходимо обновить хранящееся в памяти состояние экрана, нужно вызвать getscreen еще раз.
В случае, если указаны параметры, описывающие область, будет обновлена только соответствующая область в графическом буфере. На некоторых системах это позволяет ускорить выполнение данной инструкции.
PXL
СинтаксисPXL (x, y) - числовая функция; возвращает код цвета для заданного пикселя
x,y - координаты пикселя
$clr = PXL(50,50)
PXLCOUNT
СинтаксисPXLCOUNT (x, y, x2, y2, color) - числовая функция; производит подсчет количества пикселей заданного цвета в прямоугольной области буфера анализа
x, y - числовые координаты левого верхнего угла области поиска
x2, y2 - числовые координаты правого нижнего угла области поиска
color - код цвета
GETSCREEN
$count = PXLCOUNT (10,20, 100, 40, 255)
logwrite("pixels: ", $count)
Если ни одного пикселя не будет найдено, функция вернет ноль
PXLXOR
СинтаксисPXLXOR (x, y, x2, y2) - числовая функция; производит подсчет контрольной суммы пикселей в заданной области, складывая их цвета оператором XOR
x, y - числовые координаты левого верхнего угла области поиска
x2, y2 - числовые координаты правого нижнего угла области поиска
GETSCREEN
$count = PXLXOR (10,20, 100, 40)
logwrite("Hash: ", $count)
Необходимо понимать что контрольная сумма используется для характеристики области экрана. То есть если была подсчитана сумма, в области изменился хотя бы один пиксель и если подсчитать сумму снова - она будет отличаться от первой. Такой способ не очень надежен, но весьма быстр.
PXLCRC
СинтаксисPXLCRC (x, y, x2, y2) - числовая функция; производит подсчет контрольной суммы пикселей в заданной области, используя алгоритм CRC32
x, y - числовые координаты левого верхнего угла области поиска
x2, y2 - числовые координаты правого нижнего угла области поиска
GETSCREEN
$count = PXLCRC (10,20, 100, 40)
logwrite("Hash: ", $count)
Более актуальный метод подсчета хеша для области экрана. Лишен недостатков PXLXOR, хотя работает примерно в два раза медленнее
PXLREPLACE
СинтаксисPXLREPLACE (x, y, x2, y2, color, newcolor) - производит замену в области графического буфера пикселей одного цвета на пиксели другого цвета
x, y - числовые координаты левого верхнего угла области
x2, y2 - числовые координаты правого нижнего угла области
color - заменяемый цвет
newcolor - новый цвет
GETSCREEN PXLREPLACE(10,20, 100, 40, -1, 255) screenshot
Чтобы заменялись пиксели любого цвета, параметр color должен быть равен -1
IF_PIXEL_IN
СинтаксисIF_PIXEL_IN (x, y, x2, y2, color1, ...) - производит поиск пикселя заданного цвета в прямоугольной области буфера анализа
x, y - числовые координаты левого верхнего угла области поиска
x2, y2 - числовые координаты правого нижнего угла области поиска
color1, ... - цвета, поиск которых будет осуществляться
$_return1 - x координата найденного пикселя
$_return2 - y координата
getscreen // поиск красного пикселя IF_PIXEL_IN (10,20, 100, 40, 255) lclick($_return1, $_return2) END_IF // поиск красного или зеленого пикселя IF_PIXEL_IN (10,20, 100, 40, 255, 65280) lclick($_return1, $_return2) END_IF
Как только первый попавшийся пиксель будет найден, инструкция вернет его координаты в переменные $_return1, $_return2 и прекратит анализ
Добавление каждого цвета увеличивает длительность анализа на 100%
IF_PICTURE_IN
СинтаксисIF_PICTURE_IN (x, y, x2, y2, "file", [bgcolor], [currency]) - производит поиск изображения в прямоугольной области буфера анализа
x, y - числовые координаты левого верхнего угла области поиска
x2, y2 - числовые координаты правого нижнего угла области поиска
file - bmp файл, поиск которого будет осуществляться
bgcolor - необязательный параметр; игнорируемый цвет фона входного изображения
currency - необязательный параметр; точность поиска в процентах (1..99)
$_return1 - x координата найденного изображения
$_return2 - y координата -//-
getscreen IF_PICTURE_IN (10,20, 300, 300, "somefile.bmp") move($_return1, $_return2) END_IF
Работает аналогично IF_PIXEL_IN
Как только первый попавшийся участок будет найден, инструкция вернет его координаты в переменные $_return1, $_return2 (координаты верхнего левого угла) и прекратит анализ
Для того что бы участок признался подходящим, необходимо 100% соответствие пикселей bmp-файла и текущего снимка экрана. Или же можно задать цвет фона изображения, который не будет учитываться при поиске на экране. Если цвет фона не задан, изображение ищется с учетом всех пикселей
Так же можно задать не 100% совпадение. Для этого укажите в параметре currency необходимую точность. Этот параметр определяет на какое от общего числа количество несовпавших пикселей программа "закроет глаза". Однако имейте ввиду, что чем ниже значение точности, тем дольше идет поиск
Если параметр currency не задан, по умолчанию он равен 100. Если параметр bgcolor не задан, по умолчанию он равен -1. Если есть необходимость задать точность, не задавая фон, сделайте bgcolor равным -1
Входные файлы для анализа должны находиться в директории проекта, быть формта BMP и иметь стандартную разрядность 24 бита. В случае использования цветокоррекции, входной файл должен быть уже откорректирован. Чтобы добиться этого результата, выполните код ниже (подставив нужный код для colormode), затем вырежьте нужный участок картинки в каком-нибудь редакторе. Скриншот должен быть в BMP
getscreen colormode(КОД_РЕЖИМА) screenshot
SCANPICTURE
СинтаксисSCANPICTURE ($var, x, y, x2, y2, "file", [bgcolor], [currency]) - производит поиск изображения в прямоугольной области буфера анализа и выводит координаты найденных экземпляров в массив
SCANPICTURE и SCANPXL используют в своей работе массивы. Если вам не понятна работа с массивами, то прочтите учебную статью на официальном форуме в разделе "Учебные статьи"
$var - массив
x, y - числовые координаты левого верхнего угла области поиска
x2, y2 - числовые координаты правого нижнего угла области поиска
file - bmp файл, поиск которого будет осуществляться
bgcolor - необязательный параметр; игнорируемый цвет фона входного изображения
currency - необязательный параметр; точность поиска в процентах (1..99)
getscreen // поиск изображения pict.bmp в области 0,0 - 1250,959 scanpicture($var, 0,0, 1250,959, "pict.bmp") // вывод массива, содержащего результаты поиска while (arrsize($var) > 0) $y = arrpop($var) $x = arrpop($var) print($x,":", $y) end_cyc
Основные параметры и тонкости работы аналогичны IF_PICTURE_IN
Результатом работы является массив $var, в который добавляются координаты найденных экземпляров изображения. Таким образом, координаты первого найденного изображения будут лежать в $var[0] и $var[1] для X и Y соответственно. Для второго экземпляра $var[2] и $var[3] и т.д.
SCANPXL
СинтаксисSCANPXL ($var, x, y, x2, y2, color) - производит поиск пикселей заданного цвета в прямоугольной области буфера анализа
$var - принимающий массив
x, y - числовые координаты левого верхнего угла области поиска
x2, y2 - числовые координаты правого нижнего угла области поиска
color - цвет, поиск которого будет осуществляться
getscreen // поиск всех красный (255) пикселей в области 0,0 - 1250,959 scanpxl($var, 0,0, 1250,959, 255) // вывод массива, содержащего результаты поиска while (arrsize($var) > 0) $y = arrpop($var) $x = arrpop($var) print($x,":", $y) end_cyc
Результатом работы является массив $var, в который добавляются координаты найденных пикселей заданного цвета. Таким образом, координаты первого найденного пикселя будут лежать в $var[0] и $var[1] для X и Y соответственно. Для второго экземпляра $var[2] и $var[3] и т.д.
SCREENSHOT
СинтаксисSCREENSHOT(["pref"]) - сохраняет графический буфер анализа на диск
pref - необязательный параметр; префикс названия
getscreen
// будут созданы скриншоты error0000.bmp, error0001.bmp, error0002.bmp,
screenshot("error")
screenshot("error")
screenshot("error")
// будет создан скриншот shot0000.bmp
screenshot
Скриншот экрана помещается в директорию текущено скрипта в каталог screens и ему присваивается имя вида
pref0000.bmp. При этом номер 0000 будет наращиваться по мере необходимости
Если параметр pref опущен, он считается равным "shot"
В случае использования оконного режима будет сделан скриншот только рабочей области
SCREENSHOTEX
СинтаксисSCREENSHOTEX(x1, y1, x2, y2, ["pref"], [format]) - сохраняет часть графического буфера анализа на диск
x1, y1, x2, y2 - четыре координаты, описывающие сохраняемую область буфера
pref - необязательный параметр; префикс названия
format - необязательный параметр; тип файла (сжатие): 0 - bmp; 1 - jpeg
getscreen // будет создан скриншот небольшого кусочка левого верхнего угла screenshotex(10,10, 50,50)
Скриншот экрана помещается в директорию текущено скрипта в каталог screens и ему присваивается имя вида
pref0000.bmp. При этом номер 0000 будет наращиваться по мере необходимости
Если параметр pref опущен, он считается равным "shot"
В случае использования оконного режима скриншот будет вырезан из привязанной рабочей области
SCREENSHOTFIX
СинтаксисSCREENSHOTFIX(x1, y1, x2, y2, [format]) - сохраняет часть графического буфера анализа на диск в конкретный файл
x1, y1, x2, y2 - четыре координаты, описывающие сохраняемую область буфера
pref - необязательный параметр; префикс названия
format - необязательный параметр; тип файла (сжатие): 0 - bmp; 1 - jpeg
getscreen // будет создан скриншот небольшого кусочка левого верхнего угла screenshotfix(10,10, 50,50, "D:\file.bmp")
В отличие от SCREENSHOTEX, файл сохраняется в конкретное место по относительному или абсолютному пути, каждый раз перезаписываясь. Расширение файла желательно задавать исходя из параметра format (по умолчанию 0).
COLORMODE
СинтаксисCOLORMODE(mode, [x1, y1, x2, y2]) - применяет цветокоррекцию к текущему снимку экрана
mode - число, соответствующее режиму коррекции
x1, y1, x2, y2 - область снимка экрана, к которой будет применена коррекция
Процедура изменяет текущий снимок экрана, применяя к нему фильтр, снижающий количество цветов в палитре. В основной справке есть статья посвещенная цветокоррекции.
Есть возможность указать отдельную область для применения фильтра. Стоит учитывать, что на его применение так же затрачивается время, поэтому если нет необходимости менять весь снимок, указание конкретной области позволит выиграть немного времени в процессе выполнения сценария. Если область не описана, коррекция применяется ко всему экрану
Вызов COLORMODE(0) не имеет смысла. Поддерживается одностороннее увеличение режима (1,2,3..) без необходимости повторного вызова GETSCREEN. Обратно увеличить количество цветов невозможно. Новый "чистый" снимок экрана получается новым вызовом GETSCREEN
| mode | Макс. цветов |
| 0 | 16 777 216 |
| 1 | 2 097 152 |
| 2 | 262 144 |
| 3 | 32 768 |
| 4 | 4 096 |
| 5 | 512 |
| 6 | 64 |
| 7 | 8 |
| 8 | 2 |
COLORGEN
СинтаксисCOLORGEN(red, green, blue) - числовая функция; генерирует код цвета путем соединения значений красного, зеленого и синего каналов
red - значение красного канала (0..255) green - значение зеленого канала (0..255) blue - значение синего канала (0..255)
// создаем цвет
$c = colorgen(234,34,65)
// и разбираем его по каналам
print("red: ", colorR($c) ) // красный
print("grn: ", colorG($c) ) // зеленый
print("blu: ", colorB($c) ) // синий
COLORR, COLORG, COLORB
СинтаксисCOLORR(G)(B)(color) - числовая функция; извлекает из цвета значение красного (зеленого)(синего) канала
color - код цвета
// хватаем произвольный пиксель с экрана
getscreen
$p = pxl(rnd(0,300), rnd(0,300))
// и разбираем его по цветам
print("R:", colorR($p) )
print("G:", colorG($p) )
print("B:", colorB($p) )