NoMad73rus
Продвинутый
- Сообщения
- 124
- Репутация
- 80
Читая этот форум (особое внимание уделяя этой ветке), я встретил не одну и не две темы, которые можно объединить под названием "как сделать чтоб бот не мешал работать?". Такой же вопрос терзал и меня, и прочитав кучу тем и перелопатив кучу инфы, я его решил.
Но обо всём по порядку.
И так наша задача сделать бота который будет качать перса пока мы работаем за компом. При этом мы не можем использовать виртуальную машину из за слабого железа(ну или ещё почему то...). Какие у нас есть варианты?
Решено - создаём кликер! (если вы его еще не создали, и только потом заметили, что он мешается). Что нам понадобится? Да собственно сущие пустяки, а именно:
А вот второе у многих вызывает затруднения. Как считать цвет из свёрнутого окна? Отвечу сразу: НИКАК! из свёрнутого окна средствами автоита (и всего около него) нельзя!
Так как же быть? Не можем читать из свёрнутого, будем читать из развёрнутого. А чтоб оно не мешало разворачивать его будем за пределами видимой области экрана.
Встроенные функции, такие как PGC, PixelChekSum, PixelSearch..., сразу идут лесом! Ну не видят они цвета в координатах -3000,-3000 :wall_brake: Да и координаты такие нам не удобны, потому что не соответствуют тем которые нам в ControlClick нужны.
Тут нам приходит на помощь подаренная мелкомягкими функция PrintWindows, и великая библиотека http://autoit-script.ru/index.php?topic=47.0.
Не буду расписывать всех подробностей, всё можно прочитать в теме http://autoit-script.ru/index.php?topic=1057.msg7526#msg7526
Как результат всего рассмотренного в этой теме (огромный респект всем её участникам) мы получили функцию:
Для работоспособности данной функции нам понадобится только глобально обьявленный $hWnd
В целом она хороша, но как уже говорилось железо у нас слабое, а потребности нашего бота растут, и вот уже нужно опрашивать цвета в больших цыклах, и создавать на основе этого принципа аналоги PixelSerch, и прочее. И вот тут то лежат большие агрессивные грабли. При слишком частом использовании PrintWindow железо начинает затыкаться, всё начинает тормозить, и в конце концов и вовсе перестаёт работать. Избавится от такой проблемы оказалось не сложно. Зачем снимать скриншоты с бедной игрушки на каждый наш запрос?
РАзделим функцию на две:
Теперь наш бот одним глазком раз в пол секунды поглядывает на игру, и работает с тем, что запомнил. Можно ещё написать свои аналоги для PixelSerch и прочего...
Не претендую на оригинальность просто попытался обобщить всё прочитанное по данному вопросу.
Но обо всём по порядку.
И так наша задача сделать бота который будет качать перса пока мы работаем за компом. При этом мы не можем использовать виртуальную машину из за слабого железа(ну или ещё почему то...). Какие у нас есть варианты?
- бот работающий с пакетами и не нуждающийся ни в мышке, ни в клавиатуре
- бот работающий с памятью клиента, и как следствие тоже не требующий нужных нам органов управления
- бот кликер, кликающий без мышки, и видящий не видимое
Решено - создаём кликер! (если вы его еще не создали, и только потом заметили, что он мешается). Что нам понадобится? Да собственно сущие пустяки, а именно:
- Функция кликающая в координаты игрового поля
- Функция узнающая цвет в координатах игрового поля
А вот второе у многих вызывает затруднения. Как считать цвет из свёрнутого окна? Отвечу сразу: НИКАК! из свёрнутого окна средствами автоита (и всего около него) нельзя!
Так как же быть? Не можем читать из свёрнутого, будем читать из развёрнутого. А чтоб оно не мешало разворачивать его будем за пределами видимой области экрана.
Встроенные функции, такие как PGC, PixelChekSum, PixelSearch..., сразу идут лесом! Ну не видят они цвета в координатах -3000,-3000 :wall_brake: Да и координаты такие нам не удобны, потому что не соответствуют тем которые нам в ControlClick нужны.
Тут нам приходит на помощь подаренная мелкомягкими функция PrintWindows, и великая библиотека http://autoit-script.ru/index.php?topic=47.0.
Не буду расписывать всех подробностей, всё можно прочитать в теме http://autoit-script.ru/index.php?topic=1057.msg7526#msg7526
Как результат всего рассмотренного в этой теме (огромный респект всем её участникам) мы получили функцию:
Код:
Func _detekt ($iX, $iY)
Local $hDDC, $hCDC, $hBMP
$iWidth = _WinAPI_GetWindowWidth($hWnd)
$iHeight = _WinAPI_GetWindowHeight($hWnd)
$hDDC = _WinAPI_GetDC($hWnd)
$hCDC = _WinAPI_CreateCompatibleDC($hDDC)
$hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight)
_WinAPI_SelectObject($hCDC, $hBMP)
DllCall("User32.dll", "int", "PrintWindow", "hwnd", $hWnd, "hwnd", $hCDC, "int", 0)
$sColor = _WinAPI_GetPixel($hCDC, $iX, $iY)
_WinAPI_ReleaseDC($hWnd, $hDDC)
_WinAPI_DeleteDC($hCDC)
_WinAPI_DeleteObject($hBMP) ; очищаем битовый массив
;~ Sleep(90)
Return $sColor
EndFunc
Для работоспособности данной функции нам понадобится только глобально обьявленный $hWnd
В целом она хороша, но как уже говорилось железо у нас слабое, а потребности нашего бота растут, и вот уже нужно опрашивать цвета в больших цыклах, и создавать на основе этого принципа аналоги PixelSerch, и прочее. И вот тут то лежат большие агрессивные грабли. При слишком частом использовании PrintWindow железо начинает затыкаться, всё начинает тормозить, и в конце концов и вовсе перестаёт работать. Избавится от такой проблемы оказалось не сложно. Зачем снимать скриншоты с бедной игрушки на каждый наш запрос?
РАзделим функцию на две:
Код:
Global $hDDC, $hCDC, $hBMP
AdlibRegister("_BitmapWin", 500)
Func _detekt ($iX, $iY)
$sColor = _WinAPI_GetPixel($hCDC, $iX, $iY)
Return $sColor
EndFunc
Func _BitmapWin()
_WinAPI_DeleteDC($hCDC)
_WinAPI_DeleteObject($hBMP) ; очищаем битовый массив
$iWidth = _WinAPI_GetWindowWidth($hWnd)
$iHeight = _WinAPI_GetWindowHeight($hWnd)
$hDDC = _WinAPI_GetDC($hWnd)
$hCDC = _WinAPI_CreateCompatibleDC($hDDC)
$hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight)
_WinAPI_SelectObject($hCDC, $hBMP)
DllCall("User32.dll", "int", "PrintWindow", "hwnd", $hWnd, "hwnd", $hCDC, "int", 0)
$sColor = _WinAPI_GetPixel($hCDC, $iX, $iY)
_WinAPI_ReleaseDC($hWnd, $hDDC)
EndFunc
Теперь наш бот одним глазком раз в пол секунды поглядывает на игру, и работает с тем, что запомнил. Можно ещё написать свои аналоги для PixelSerch и прочего...
Не претендую на оригинальность просто попытался обобщить всё прочитанное по данному вопросу.