Kibor |
Отправлено: 29 Сентября, 2013 - 18:44:10
|
Эксперт
Покинул форум
Сообщений всего: 8225
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
По порядку...
Для идентификации таблички моба применен поиск по такому изображению:
Как видим основную часть изображения занимает фоновый цвет не участвующий в поиске.
Почему это сделано? Потому что перед выбором пикселей которые можно использовать в поиске мы воспользовались функцией фильтрующей динамику, то есть определили по каким пикселям можно искать табличку эту:
Нажмите для увеличения
Красным то что имеет не постоянный цвет из за полу прозрачности.
Поиск этой картинки осуществлен функцией Pozicion_Image()
CODE:if (findimage(1, #Tab_Vid[0][0], 0, #P_T_X[0], #P_T_Y[0], 0, 0, xe, ye, -1)==0){messagebox("Не найден в игре рисунок таблички выделеного моба. Выделите моба и повторите попытку."); return -1;}
Zak_T_X=P_T_X[0]+160; Zak_T_Y=P_T_Y[0]+8;// Координаты закрытия таблички
Исходя из этой справки нам известно что в P_T_X[0] и P_T_Y[0] запишутся экранные координаты левого верхнего угла рисунка
Теперь зная координаты определенного пикселя (в данном случае левого верхнего угла рисунка который мы искали) не трудно рассчитать координаты центра крестика на нем. для этого к примеру в паинте открыли рисунок и узнали что координаты крестика = (координаты левого верхнего угла рисунка плюс по X 160, по Y 8):
Поэтому координаты крестика равны
CODE:
Zak_T_X=P_T_X[0]+160; Zak_T_Y=P_T_Y[0]+8;// Координаты закрытия таблички
Аналогично можно найти координаты первого и последнего пикселя XP.
Barabachka пишет: Вот еще один не понятный момент
CODE:
if (baf==15){baf=0; Baf();}//Бафаем себя
baf++;
Там баф проходит раз в 15мин?
Не. Там просто стоит счетчик и каждый 15 тый цикл нажимается на баф. Циклы очень частые.
Просто если баф не откатил, он не пройдет и все. То есть баф получится постоянным, как спадет так бафнет.
По поводу логики как лучше реализовать, то тут не помогу, так как этой игры у меня сейчас нет и я точно не помню логику того скрипта. Я пишу много примеров к разным играм в которые сам не играю и естественно что мои скрипты имеют не самое лучшее решение в конкретной игре. Данный скрипт так же является просто демонстративным и может быть улучшен или вообще (лучше) переписан с нуля человеком который достаточно ознакомился с Кибор и хорошо знает нюансы игры. |
|
|
Kibor |
Отправлено: 30 Сентября, 2013 - 03:51:15
|
Эксперт
Покинул форум
Сообщений всего: 8225
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Barabachka пишет: Оказывается что программа каждый раз когда всплывает
CODE:
getcolor(P_T_X[0]+18, P_T_Y[0]+22)
она ссылается на изображение этой таблички и относительно её ищет координаты пикселя который мне нужно найти
Ага . В P_T_X[0], P_T_Y[0] находятся координаты определенного пикселя таблички (верхнего левого угла рисунка)
и прибавив 18 и 22 мы узнаем координаты первого на XP пикселя. Так же узнается последний пиксель.
Barabachka пишет: Сами координаты смотреть через наведение мыши и Ctrl+Shift+S в ячейках клиентской части окна
Не. В данном варианте для того что бы узнать точное смещение надо сделать скрин таблички, открыть его паинтом, открыть паинтом искомый рисунок, увеличить оба, показать сетку, сравнить рисунки, найти на скрине таблички (там где видна полоска жизни) пиксель который будет левым верхним углом того изображения что ищем. После этого просто в том же паинте посчитать смещение к последнему пикселю полоски.
По поводу цвета... В паинте мы узнаем цвет в RGB, нам надо в int одним числом. Поэтому когда узнали смещение можно при отладке программы просто узнать цвет по координатам которые мы нашли:
CODE:messagebox(getcolor(P_T_X[0]+смещен_X, P_T_Y[0]+смещен_y));
Потом этот цвет записать в скрипт.
Barabachka пишет: Спасибо Kibor, но я только начал постигать эту программу и буду еще много раз вас беспокоить)
Пожалуйста, беспокойте . Всегда рад помочь советом или объяснением. |
|
|
Kibor |
Отправлено: 30 Сентября, 2013 - 13:21:33
|
Эксперт
Покинул форум
Сообщений всего: 8225
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Nikolo12 пишет: Подскажите команду закрытия, завершения работы Kibor, аналог STOP, END или AppTerminate при нажатии key(). На WinXP32 не дает развернуть окно с работающем Kibor, диспетчер задач мелькает.
Во время работы скрипта Кибор нельзя разворачивать. Надо сначала остановить скрипт как сказал Barabachka , Ctrl+Shift+Z. Потом можно закрыть Кибор.
Barabachka , Мне больше нравится кодить под игры, чем играть. Хороший способ слезть с задродства в игре
Barabachka пишет: если приостановить и запустить с места остановки то хз
Для этого в нужное место, где ожидается приостановка по требованию можно вставить такой код:
CODE:a:
//Скрипт
if (getkeystate(192)==1)messagebox("Пауза.");//Если нажали ~
//Скрипт
goto a;
Коды клавиш для getkeystate |
|
|
|