Процедуры и функции для работы с экраном

Экран состоит представляет собой прямоугольник, состоящий из точек-пикселей. Размеры (ширина и высота) этого прямоугольника обусловлены количеством пикселей в вертикальной и горизонтальной строках. Каждый пиксель на экране имеет свои координаты. В общем все как на уроке геометрии.
В левом верхнем углу находится пиксель с координатами 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

modeМакс. цветов
016 777 216
12 097 152
2262 144
332 768
44 096
5512
664
78
82

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) )