Как узнать координаты пикселя на экране ahk
В програмировании шарю очень мало, в туторах тоже, но нахлебником на брокенкоре не буду, поэтому я покажу на примере, как написать скрипт на ахк начиная с дефолт макросов и биндов - заканчивая аимботом по пикселю. Эти знания полезны для всех игр и не только.
В целом способности у AHK огромные, но никак не нашлось еще подобного задрота что б произвел хороший аимбот также голосовое есп согласно считыванию сведений с звуковой карты.
Ставим AHK, уже после кликаем левой клавишей мыши > создать > AutoHotKey script. Набираем название, сохраняем. Нажимаем левой клавишей мыши по скрипту > «edit script» либо «открыть с помощью»
Insert:: PoshelNaXY() //Биндим функцию на клавишу InsertPoshelNaXY() // Задаем функцию
SendInput t//Посылаем нажатие клавиш t
Sleep, 250 //Ожидаем 250 миллисикунд пока откроется окно с чатом
SendInput Poshel //посылаем набор букв и клавишу Enter
>
Зачастую, что бы что-то было понятно и для общего комфорта иногда надо добавлять звуковые уведомления в скрипт.
Сделать это можно 2 способами:
SoundBeep, 1000, 100 //Проигрывает «бииииип» с тональностю 1000, длительностью 100
SoundPlay, Media\shutdown.wav // проигрывает звук shutdown.waw из папки Media
- стандартная функция клавеши не блокируеться, те виндовс воспрнимает нажатие клавиши и скрипт. Другие атрибуты смотрите на сайте AHK;
Sleep 20 //ждем
Loop // создаем цикл
GetKeyState,state,space,P //state — название переменной которая отвечает за статус клавиши, space – имя клавиши, P – режим, когда пользователь давит на клавишу, режим T – когда пользователь включает/ выключает нажатием на клавишу
if state = U //если клавиша был разжата (отпущена) то .
break //завершаем цикл
Send, //посылаем пробел
Sleep,17 //ждем перед повторением цикла
>
ScriptActive = 0
F5::
If ScriptActive = 1 //переменная
ScriptActive = 0
SoundPlay, Media\deactivated.wav
>
else if ScriptActive = 0
ScriptActive = 1
SoundPlay, Media\activated.wav
>
return
далее в функцию суем
If ScriptActive = 1
Работает только в оконном режиме
Loop
PixelGetColor, Color, 18, 729 // cчитывает цвет пикселя по координатам 18,729 и записывает его в переменную Color
if Color = %Color1%
MouseClick, left, 100, 300 //посылаем клик левой кнопкой мыши по координатам 100, 300
>
Важно: координаты пикселей можно узнать с помощью AU3_Spy.exe в папке с AHK
Неплохо работает в кс 1.6, если использовать кастомные модели игроков, то будет работать и в csgo
TColor:=0xFFCC99 //цвета смотрим в AU3_spy.exe
HeadColor:=0x00ED00
CTcolor:=00009E
RButton:: //Если зажата правая кнопка мыши
Sleep 100
Loop
PixelGetColor, Color, 18, 729
if Color = %Color1%
Send
Send
>
GetKeyState,state,RButton,P
if state = U
break
MouseGetPos, mX, mY //записывает координаты мыши в переменные
PixelSearch, nX, nY, mX - 5, mY - 5, mX + 5, mY + 5, 0x00ED00, 100, Fast //nY, nX, mY, mX – углы квадрата на котором считываеются пиксели: 100 – возможное различие цвета, Fast — метод поиска (быстрый)
If ((nX != "") && (nY != ""))
Send,
>
>
Снова, только оконный режим. Рисует маленький квадратик по центру. Можно заменить картинкой используя SplashImage, pic.jpg
Gui Destroy
Gui, +AlwaysOnTop
Gui, Color, fffffa
Winset, TransColor, ff0000
gui, -caption
gui, +border
gui, show, w2 h2, crosshair
Итак, весь примитив мы вроде как выучили, давайте перейдем к чему-то более интересному. К примеру научим "видеть". На что чаще всего мы смотрим в игре? Правильно, на ХП/ЦП/МП.
Рассмотрим это дело на примере авто-ЦП.
Для начала рассмотрим саму структуру полоски ЦП, для этого немного подсобьем его.
Полоска где нету ЦП имеет более темный оттенок, и так-же как и полоска полного ЦП градиентна (не однотонна), но к нашему счастью ее цвет изменяется только по вертикале.
Для определения наличия ЦП на каком-либо промежутке нам понадобится команда PixelSearch.
Она имеет такие параметры: PixelSearch, OutputVarX, OutputVarY, X1, Y1, X2, Y2, ColorID [, Variation, Fast|RGB] (в квадратных скобках не обязательные), где X1, Y1 координаты левого верхнего угла зоны поиска, X2, Y2 - правого нижнего (таким образом задаем прямоугольную зону в которой ищем нужный цвет); OutputVarX, OutputVarY - координаты самой левой верхней точки, в которой этот цвет будет содержаться. ColorID - Код цвета в шестнадцатиричной системе. Variation - принимает значение от 0 до 255, показывает насколько НЕ точным может быть поиск (чем больше, тем более различные оттенки будет определять как искомый цвет).
Если моск включен, то у вас должно было сразу возникнуть минимум 2 вопроса: как мы определим координаты линии ЦП вообще, и как мы определим код цвета. Тут нам на помошь прийдет встроенная в АХК утилита Window Spy.
Если у вас запущен любой скрипт АХК, вызвать эт утилиту можно клацнув по иконке АХК в панеле задачь правой кнопкой мыши:
Появится окно, которое всегда будет на переднем плане. Переключаемся на окно Л2 и подводим мышку к отметке ЦП, при которой по-вашему стоит начинать пить банки.
На скрине не отобразился курсор, но он был где-то в раене дорисованной черной точки. мы нашли координаты (641, 296). Теперь берем некоторый разброс, дабы просматривать область, думаю (635, 290) и (650, 305) будет достаточно. Это и есть координаты Х1, Y1, X2, Y2 соответственно. Запомнили, записали. Но вот проблема, видимо Гейм Гвард блокирует цвет пикселя. на самом деле это не проблема. Включаем мозг и делаем принт скрин и проводим операцию с той-же областю ЦП на скрине, получаем ID цвета, к примеру 0x253B46 (в своем случае я скринил цвет с отсутствующим ЦП)
Вобщем пора открыть блокнот и написать как всегда:
NumPadDiv::clipboard =TOP 1
Теперь делаем метку (Label 1) к в которой прописываем пожирание ЦП банок, стоящих на 8 ячейке 1 панели
Label1:
clipboard = STR 1 /useshortcut 1 8
Return
По нажатию F2 начинаем цикл проверки ЦП:
F2::
loop
PixelSearch, Px, Py, 635, 290, 650, 305, 0x253B46, 50, Fast
; и проверяем, нашелся-лии цвет. Для этого используем команду ErrorLevel. В данном случае она принимает значение 0, если цвет найден, 1 если не найден.
Так как я искал в определенном участке цвет ОТСУТСТВИЯ ЦП, то в случае его нахождения пора пить банки:
if ErrorLevel=0
Gosub, Label1 ;Gosub, метка - переход к заданной метке
Если-же он не найден - продолжаем цикл
else
continue
>
Вот, вроде должно работать, осталось только найти координаты для вашего монитора, ну и на всякий случай проверить цвет.
Все еще работает (все еще бесплатная) консультация на форуме в разделе тех. поддержки, теме Евелина.
На самом деле с координатами можно сделать очень много. Это зависит от того, что вам нужно.
Например можно делать некие квесты, как на работе автобусника, когда проехали точку, вам оповещалось.
Для такого скриптика, нужно сначала получить координаты, которые будите потом проверять, вот скрипт для этого:
Функция getCoordinates() , возвращает массив с вашими координатами, потом сделаю урок по массивам, чтобы вы могли более предпочтительнее понимать это. И координаты сразу копируются в буфер обмена ( Clipboard ).
Теперь покажу вам, как проверять прошли вы нужную точку, или нет.
Функция IsPlayerInRangeOfPoint проверяет, находитесь ли вы в данных координатах, в неё вы передаёте координаты, и радиус, его ставьте на ваше усмотрение.
Теперь попробуем понять, как всё это работает.
addChatMessage ("Вы начали отслеживать положение игрока.")
next_step := 1 ; Мы создали переменную, которая убережёт нас от флуда, если бы её не было, нам бы флудило одно и тоже, пока мы стоим на нужных координатах.
Loop ; Запускаем цикл
addChatMessage ("Вы подошли к лотерее, не проиграйте все деньги ")
next_step := 2 ; И нашей переменной уже присваивает значение 2, и таким образом текст больше не пишет, вы можете убрать её, и посмотреть что произойдёт.
addChatMessage ("Вы подошли к касе.")
next_step := 1
Всё предельно просто, ничего сложного тут нет. Дальше вы можете делать разные скрипты, например получить информацию об игроках в радиусе стрима.
Получить название города и района, в которых находитесь:
Хотя для определения района и города ваших координат есть другие функции, getPlayerZone , getPlayerCity .
Но пример выше подойдёт, если например вы получили координаты преступника, и выдаёте его подробные координаты(город, район).
Ищет пиксель указанного цвета в указанной прямоугольной области экрана.
PixelSearch ( left , top , right , bottom , color [, shade - variation = 0 [, step = 1 [, hwnd ]]] )
left | Координата x левой стороны прямоугольника. |
top | Координата y верхней стороны прямоугольника. |
right | Координата x правой стороны прямоугольника. |
bottom | Координата y нижней стороны прямоугольника. |
color | Цвет пикселя для поиска (в десятичном или шестнадцатеричном виде). |
shade-variation | [необязательный] Число от 0 до 255, показывающее, на сколько может отличаться красная, зелёная и синяя компоненты цвета. По умолчанию 0 (точное совпадение). |
step | [необязательный] Вместо поиска каждого пикселя используйте значения больше чем 1, чтобы пропускать часть пикселей (для ускорения работы). Например, значение 2 означает, что будет использоваться только каждый второй пиксель. По умолчанию 1. |
hwnd | [необязательный] Дескриптор окна. Требуется переключить опцию PixelCoordMode в 0 или 2 |
Успех: | Возвращает двух-элементный массив с координатами пикселя ( $array [ 0 ] = x, $array [ 1 ] = y). |
Ошибка: | Устанавливает @error равным 1, если пиксель указанного цвета не найден. |
Направление поиска изменяется в зависимости от того, как указаны границы прямоугольника:
Слева направо - left PixelSearch () оптимизирована, уменьшение области поиска поможет сильно ускорить результат.
; Найти чисто красный пиксель в прямоугольнике 0,0-20,300
$coord = PixelSearch ( 0 , 0 , 20 , 300 , 0xFF0000 )
If Not @error Then
MsgBox ( 0 , "X и Y равны:" , $coord [ 0 ] & "," & $coord [ 1 ])
EndIf
; Найти чисто красный пиксель или пиксель с отклонением 10 градаций от чисто красного
$coord = PixelSearch ( 0 , 0 , 20 , 300 , 0xFF0000 , 10 )
If Not @error Then
MsgBox ( 0 , "X и Y равны:" , $coord [ 0 ] & "," & $coord [ 1 ])
EndIf
Читайте также: