Як написати бота для гри directx

Отже, ми маємо стандартну DirectX-гру, запущену в вікні. Що нам потрібно? Розпізнати то, що відображено на екрані і послати туди натискання відповідних клавіш. Для розпізнавання / впізнання ми будемо використовувати бібліотеку OpenCV (Open Source Computer Vision Library) - ru.wikipedia.org/wiki/OpenCV

Для початку нам потрібно знайти вікно нашого DirectX-додатки і сдампіть екран. Ми прив'яжемо це до таймера і будемо робити кожні ХХ секунд. Найпростіший варіант:

Але якщо ви не хочете, щоб фокус на це вікно перекладався кожні кілька секунд, і за комп'ютером можна було спокійно працювати (особливо, якщо у вас два монітори), то краще робити все складніше - робити повний дамп всього видимого простору, а в ньому шукати входження головною іконки програми (тієї, сто зліва від заголовка вікна) за допомогою функцій cvMatchTemplate () і cvMinMaxLoc (), щоб обчислювати потрібні координати і вирізати область зображення без зміни фокусу вікна.

Тепер потрібно визначити в якому режимі / діалозі гри ми знаходимося. Як це зробити? Для початку нам потрібно визначити які області екрану мають об'єкти, до наявності / відсутності яких ми можемо прив'язатися. Наприклад, якщо ми бачимо на екрані таку кнопку (обведена червоним на скріншоті), то це означає, що ми в кубковому режимі МЛО, де необхідно натиснути клавішу "Enter" для запуску чергового матчу.

Як написати бота для гри directx

Далі слід вже велика і нудна робота по "підготовці бази" - необхідно зробити скріншоти в різних ігрових ситуаціях, підібрати координати меж об'єктів для порівняння з областю екрану, "відсоток схожості", який можна вважати пороговим (багато менюшки не статичні, так що 100 процентного збігу не буде) і описати емуляцію яких клавіш нам потрібно туди передавати.

bool ImgEq (double percent, char * filename, int x1, int y1, int x2, int y2)
Form1-> ImageEnView2-> Assign (Form1-> ImageEnViewPES);
Form1-> ImageEnView2-> Proc-> Crop (x1-5, y1-5, x2-5, y2-5);
Form1-> ImageEnView1-> IO-> LoadFromFile (filename);
Form1-> ImageEnView1-> Proc-> Crop (x1, y1, x2, y2);
double dPer = Form1-> ImageEnView1-> Proc-> CompareWith (Form1-> ImageEnView2-> IEBitmap, NULL);

return (dPer> = percent);
>

Виклик цієї функції виглядає так:

if (ImgEq (0.98, "cup-menu.bmp", 350,700,520,870)) <…>

Ну все! Тепер наша програма вміє визначати поточний режим, в якому знаходиться гра. Залишилося тільки навчитися передавати туди потрібні комбінації клавіш. Так як нам потрібно робити емуляцію в DirectX додатку, то PostMessage / kbdevent тут працювати не будуть, необхідно передавати сканкоди за допомогою SendInput (). Для того, щоб можна було красиво описувати послідовності натискань викликами типу Key (DIKEYBOARD_X), я зробив таку функцію:

Якщо ви вже давно подумували про те, щоб написати бота для своєї улюбленої гри, але не все не доходили руки - спробуйте, це досить творчий процес, який затягує.

Схожі статті