Ouroboros |
Отправлено: 06 Января, 2014 - 02:14:48
|
Прохожий
Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014
Репутация: 0
|
В общих словах, нужен был автокликер, который бы в игре за меня нажимал кнопочки в текстовом диалоге. Проблема вот в чем, первые семь шагов в диалоге(квест , суть которого - начал разговор, помешал карты в колоде, вскрыл карты по очереди с первой по пятую, нажал играть снова), так вот сама проблема в последнем пункте, первые 7 клавиш неизменны и вне зависимости от того, какая комбинация карт попадается и в каком порядке открываю карты, клавиши для них останутся на тех же местах, а вот самая последняя меняется в зависимости от того, какую комбинацию собрал игрок, и ее местоположение на экране постоянно меняется.Подумалось мне, что нужно попробовать через программу не автокликера, а непосредственно Кибора.(Думал можно так, первые 7 шагов по экранным координатам, перед этим загрузить изображение последней интерактивной клавиши,и на восьмом шаге сделать if(findimage....)<1)goto loop; но вот загвоздка вышла, как бы я ни старался, он не распознает это самое изображение, хотя делал все и перепроверял .Что могло пойти не так?Вот код который у меня вышел(промежуточный,паузы между кликами и прочее не редактировал)
win w=window ("Lineage II ", "l2UnrealWWindowsViewportWindow", -1);
int Image_0[55][13];loadimage (#Image_0[0][0], "C:\Image_11.bmp"
int PosX_0[512];int PosY_0[512];
if(w!=0){
activate(w);
if (attach(w,1)!=0){
loop:
pause(998);
mouse(LEFT, 1144, 299);
pause(1061);
mouse(LEFT, 1158, 399);
pause(874);
mouse(LEFT, 1161, 327);
pause(967);
mouse(LEFT, 1146, 352);
pause(749);
mouse(LEFT, 1154, 380);
pause(780);
mouse(LEFT, 1166, 414);
pause(1076);
mouse(LEFT, 1163, 436);
pause(1233);
if(findimage(-1, #Image_0[0][0], 0, #PosX_0[0], #PosY_0[0], 0, 0, 1444, 946, -1)<1) goto loop;
else{mouse(LEFT, PosX_0[0],Pos_Y_0[0]);}
goto loop;
}
первые 7 шагов выполняет как положено, на последнем не может "увидеть" изображение и возвращается к началу цикла. Помогите пожалуйста |
|
|
Ouroboros |
Отправлено: 06 Января, 2014 - 12:54:33
|
Прохожий
Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014
Репутация: 0
|
Kibor пишет: Насколько я знаю в линейке все панели и кнопки имеют полупрозрачность, поэтому не находит. Посмотрите тему тут.
Там показано как это проверить и выбрать подходящие части изображения для поиска.
Еще можно воспользоваться расширенной findimage для поиска по неполному совпадению с колебаниями в цветах. Подробнее.
Посмотрю, а так в общем, в коде нету никаких ошибок?Не синтаксических я имею ввиду) |
|
|
Kibor |
Отправлено: 06 Января, 2014 - 13:34:31
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Ouroboros пишет: Посмотрю, а так в общем, в коде нету никаких ошибок?Не синтаксических я имею ввиду)
Есть синтаксическая:
Ouroboros пишет: else{mouse(LEFT, PosX_0[0],Pos_Y_0[0]);}
Разбор кода:
Ouroboros пишет: if (attach(w,1)!=0)
Зачем нужна функция attach? В коде будет проверка курсора? В случае если нет - привязка потока не нужна.
Ouroboros пишет: win w=window ("Lineage II ", "l2UnrealWWindowsViewportWindow", -1);
Зачем получается указатель на окно если потом не используется? Везде экранные координаты.
mouse(LEFT, 1144, 299); - экранные координаты.
С оконными так:
mouse(LEFT, x?, y?, 1, w); - x, y, оконные координаты игры относительно левого и верхнего угла окна.
Узнать их - навести на нужное место в окне игры мышку и нажать CTRL+SHIFT+S. Смотреть координаты в Кибор в (мышь в клиентской части окна)
Опять по поводу оконных координат в findimage. Последний параметр не -1 надо , а указатель на окно w.
Тогда надо будет клик по кнопке так: mouse(LEFT, PosX_0[0],PosY_0[0], 1, w);
Относительно поиска кнопки...
Кнопка должна 1 быть? Зачем тогда массив для приема координат? int PosX_0[512];int PosY_0[512];
Достаточно так int PosX_0, PosY_0;
и в findimage искать 1 изображение. Указать в первом параметре не -1, а 1.
if(findimage(1, #Image_0[0][0], 0, #PosX_0, #PosY_0, 0, 0, 1444, 946, w)<1)
Клик так:
mouse(LEFT, PosX_0,PosY_0, 1, w);
Так же если используем оконные координаты надо искать не по разрешению экрана, а по окну. Поэтому надо
if(findimage(1, #Image_0[0][0], 0, #PosX_0, #PosY_0, 0, 0, w.widthclient, w.heightclient, w)<1)
/////////////////////////////////////
Можно и экранные координаты использовать как у Вас, но тогда при сдвиге окна координаты записанные в
CODE:......
mouse(LEFT, 1161, 327);
pause(967);
mouse(LEFT, 1146, 352);
.......
будут не верные.
Это можно решить вставив такой код после получения указателя:
Цитата: win w=window ("Lineage II ", "l2UnrealWWindowsViewportWindow", -1);
w.widthclient=ширина окна
w.heightclient=высота окна
w.leftclient=левый угол по x
w.topclient=левый угол по y
//Узнаются с помощью CTRL+SHIFT+S ПЕРЕД записью координат
moveclient(w);
Этот скрипт после запуска восстановит позицию и размеры окна как была при записи. Тогда можно использовать экранные координаты.
/////////////////////////////
Сумбурно? Я не могу так просто объяснить все нюансы. Предлагаю почитать
Функции для идентификации окон и контролов.
Переименование, сдвиг и изменение размеров окон.
Сканирование экрана и поиск изображений |
|
|
Ouroboros |
Отправлено: 06 Января, 2014 - 13:38:50
|
Прохожий
Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014
Репутация: 0
|
Все равно не выходит..много перепробовал с разбросом в цветах, процентами совпадений, но все равно никак, ни 1 раза он еще не находил нужную кнопку.В контекстном меню фон бэкграунда как бы черный, но он полупрозрачный и просвечивает местность чаров и т.п. Я подумал, что действительно выставив по неполному совпадению оно что-то да найдет, разные варианты пробовал, достичь результата так и не удалось. Прилагаю собственно кнопочку, которую нужно найти, и само окошко текста чтоли, помогите, может я что-то упускаю...
|
|
|
Ouroboros |
Отправлено: 06 Января, 2014 - 14:01:06
|
Прохожий
Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014
Репутация: 0
|
Kibor пишет: Так я не смогу помочь. Надо смотреть самому как там конкретно надо. Возможно через доступ посмотрю позже.
Все равно спасибо за ответ!
(Добавление)
Кажется мне, что я ввел вас в заблуждение, да и сам не по той дороге пошел.Я написал вам, что нужно нажимать одну кнопку, хотя на самом деле это не является кнопкой,гиперссылка чтоли? Вобщем от всего остального текста в квесте эти гиперссылки выделяются слабо-синим цветом, и буквы,ясно дело, в этих гиперссылках непрозрачные.Первые 7 шагов по координатам окна проходим, а можно ли сделать на последнем шаге так, чтобы искался цвет пикселя?и если цвет найден, то нажатие мыши и цикл по-новой?Возможно возникнет совпадение цветов на экране вокруг персонажа с тем же цветом, что и у ссылки, но это мало вероятно, темболее можно зумом приблизить так, чтобы виднелись совершенно другие оттенки, такое реализовать чисто теоретически можно? |
|
|
Kibor |
Отправлено: 06 Января, 2014 - 18:31:37
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Ouroboros пишет: Проблему решил, вместо картинки целого предложения, максимально приблизил и выделил пиксель из слова и его искал как картинку.
Теоретически и так можно... Но я бы оставил этот способ для других подобных программ
Постарался подробнее описать конкретно на Вашем примере как это надо делать в Кибор.
Подготовка изображений для поиска в Кибор
Ouroboros пишет: можно ли это как-то оформить в фоновый режим
Оформить можно, но в линейке не будет кликать в фоновом режиме. Только клавиатура. |
|
|
|