Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » Динамические изображения

Страниц (2): [1] 2 »
 

1. rev41k - 17 Декабря, 2013 - 06:21:29 - перейти к сообщению
Всем привет!!! Обожаю одну игрушку но никак не хватает времени поиграть и решил написать бота при помощи КИБОР. Игра браузерная (на флэше). Самая большая проблема у меня появилась при написании бота с поиском мобов. Подскажите что лучше использовать finddynamic или findimage !? Я пробовал при помощи findimage , но поиск происходит очень долго ... Finddynamic находит , но по разному( т.е. одного и того же моба может находить по 3 раза). Я думаю , что это из-за того , что не все мобы подходят под динамический поиск , но надеюсь , что я ошибаюсь и вы мне подскажете что к чему.

Скрин локации (без динамики):(для просмотра ссылки Вам необходимо авторизоваться)
Скрин с динамикой :(для просмотра ссылки Вам необходимо авторизоваться)
как видно на скрине из-за взмаха крылье летучих мышей я не могу хорошо подобрать центр моба и на одну и ту же мышь бот может наводить по 2 , а то и по 3 раза.

Мой простой код (поиск и указание курсором на мобов)
CODE:

win w=window (-1, "Chrome_RenderWidgetHostHWND", window ("Òåõíîìàãèÿ - Google Chrome", "Chrome_WidgetWin_1", -1));
int x[20], y[20];
int Mob_X=8, Mob_Y=14;
int Mob_Din_X=16, Mob_Din_Y=51;
finddynamic(0, #x[0], #y[0], 0, 0, 0, 0, 0, 0, 1366, 676, w);
int k=finddynamic(10, #x[0], #y[0], Mob_X, Mob_Y, Mob_Din_X, Mob_Din_Y, 0, 0, 1366, 676, w);
//----------------------------------------------------------

a:
wait(1000);

search();
move();

goto a;
//===================================
function search()
{
poisk:
sleep(500);
if (k>10)goto poisk;
if (k<2)goto poisk;
}

//==================================

function move()
{
int n=0;
b:
if (n<k)
{
mousemove(x[n], y[n],w);
sleep(2000);
n++;
goto b;
}
}
//==================================


Вообщем я хочу максимально точно сделать поиск мобов на локации и чтобы мышь кликала в одинаковые координаты моба. При том чтобы бот находил близжайшего моба на локации от героя и кликал его( но это можно и потом , главное поиск) !
Всем заранее спасибо!
2. Kibor - 17 Декабря, 2013 - 11:11:29 - перейти к сообщению
findimage в смысле медленно? По скринам смотреть если он может не найти просто, так как там даже морда и туловище разные...


Между finddynamic надо ставить паузу небольшую. sleep(200) прмерно.

Надо подобрать
int Mob_X, Mob_Y;
int Mob_Din_X, Mob_Din_Y;


Если по скрину смотреть можно попробовать
int Mob_X=30, Mob_Y=20;
int Mob_Din_X=60, Mob_Din_Y=70;

Может понадобиться увеличение паузы между finddynamic .

Тут важно даже не количество найденных участков, а как определить что это моб именно. Есль механизм который в игре покажет что под мышкой находится моб?
Так же если знать что это моб, то даже если найдено 3 места на мобе то реагировать на первое. Нажать мышь например и не важно сколько там найдено еще.
По поводу сортировки смотрите sort.
3. rev41k - 17 Декабря, 2013 - 16:06:42 - перейти к сообщению
когда курсор наводится на моба то появляется такой рисунок на мобе....(для просмотра ссылки Вам необходимо авторизоваться)
но как это реализовать !? курсор ведь при наведении на моба может быть выше , ниже или с отклонениями в бок... и потом как искать ? при наведении курсора на моба проверять есть ли в заданных координатах( цвета этих канжалов по пикселям !?
4. Kibor - 17 Декабря, 2013 - 16:26:48 - перейти к сообщению

Узнаете в этом рисунке часть мечей?
Делаете похожий с игры и ищите с помощью findimage наличие его на экране после наведения мышки на моба. Если есть - над мобом. Можно ограничить область поиска позицией найденных координат + - сколько надо что бы при любой позиции относительно моба обеспечить что бы рамка поиска охватывала всего моба.
5. rev41k - 26 Декабря, 2013 - 15:11:57 - перейти к сообщению
Написал пару строк для проверки моих мечей при наведении на моба. Простой поиск мечей в окне, но ничего не происходит (( или я снова что-то не правильно написал!?

CODE:

win w=window (-1, "Chrome_RenderWidgetHostHWND", window ("Òåõíîìàãèÿ - Google Chrome", "Chrome_WidgetWin_1", -1));
int Image_0[34][34];
loadimage (#Image_0[0][0], "C:\meci.bmp");
int PosX_0, PosY_0;
a:
if (findimage(-1, #Image_0[0][0], 0, #PosX_0, #PosY_0, 0, 0, 1366, 676, w)==1)
{
mousemove(PosX_0, PosY_0);
sleep(500);
}
goto a;


Моя бмп в оригинальном размере :(для просмотра ссылки Вам необходимо авторизоваться)
6. Kibor - 26 Декабря, 2013 - 16:07:55 - перейти к сообщению
С права возле места пересечения явно фон захвачен.
Проверьте этот файл
Если не будет поиск, используйте расширенную findimage . Тогда может мечи не имеют постоянного цвета.
7. rev41k - 06 Января, 2014 - 05:53:45 - перейти к сообщению
Помучился немного и получил хороший поиск мобов на локации. Теперь появились другие проблемы:
1- при входе в бой чтобы бот кликал по картинке (скиллу) если только есть определенные пксели в в нужных координатах (это будет указывать , что наш ход), и если есть другие цвета пикселей в других координатах , тогда ждать ( это будет указывать на ход противника).
2- когда не будет на экране ни одного ни другого пикселя тогда перейти к поиску монстров на локации.
(Добавление)
Мой код (Отобразить)

(Добавление)
Бой

Верхние головы указывают на "Чей ход". Если слева секунды в голове соответственно мой ход , если справа , то моба.

Ниже в красной рамке скиллы.
8. Kibor - 06 Января, 2014 - 06:10:21 - перейти к сообщению
Укажу ошибки:
 rev41k пишет:
function search()
{
poisk:
sleep(500);
if (k>20)goto poisk;
if (k<2)goto poisk;
}

Что делает эта функция? Вводит скрипт в замкнутый цикл? С которого не выйдет если k>20 иль k<2.

 rev41k пишет:
int n=1;
b:
if (n<k)
{
sort(683, 310, #x[0], #y[0], k);
mousemove(x[n], y[n]+10,w);


Зачем сортировать массивы в каждом цикле. Один раз надо перед циклом:
CODE:
int n=1;
sort(683, 310, #x[0], #y[0], k);
b:
if (n<k)
{
mousemove(x[n], y[n]+10,w);


Ну и не понятно применение указателя на окно игры... То применяется, то нет... Игра наверно во весь экран или около того?
Ну вот пример неверного применения:
 rev41k пишет:
if (findimage(-1, #Image_0[0][0], 0, #PosX_0, #PosY_0, 0, 0, 1366, 676, w)==1)
{
sleep(300);
mouse(LEFT, PosX_0+15, PosY_0+80);


findimage работает с окном, а клик в экранных координатах...
9. rev41k - 11 Января, 2014 - 08:13:53 - перейти к сообщению
[quote=Kibor]Укажу ошибки:
 rev41k пишет:
function search()
{
poisk:
sleep(500);
if (k>20)goto poisk;
if (k<2)goto poisk;
}

Что делает эта функция? Вводит скрипт в замкнутый цикл? С которого не выйдет если k>20 иль k<2.

Здесь я проверяю : "Если динамики больше 20 , то ищем снова динамику на экране (от 3 до 19)" , просто больше 20 и меньше 2 мне не подходит.

По поводу сортировки и указателя на окно СПАСИБО не заметил, спешил и упустил. Но функционал бота не изменился.

Но хотелось бы помощи вот в этом :

 rev41k пишет:
Помучился немного и получил хороший поиск мобов на локации. Теперь появились другие проблемы:
1- при входе в бой чтобы бот кликал по картинке (скиллу) если только есть определенные пксели в в нужных координатах (это будет указывать , что наш ход), и если есть другие цвета пикселей в других координатах , тогда ждать ( это будет указывать на ход противника).
2- когда не будет на экране ни одного ни другого пикселя тогда перейти к поиску монстров на локации.
(Добавление)
Мой код (в предыдущем посте)
(Добавление)
Бой :(для просмотра ссылки Вам необходимо авторизоваться)
Верхние головы указывают на "Чей ход". Если слева секунды в голове соответственно мой ход , если справа , то моба.

Ниже в красной рамке скиллы.


Буду очень признателен всем кто сможет помочь разобраться... Я понимаю , что я не единственный на форуме который не рубит ничего в программировании , но уж очень хочется создать хорошего функционального бота ... А исходники в примеры потом закинуть!
Заранее всем спасибо!
10. Kibor - 11 Января, 2014 - 14:02:25 - перейти к сообщению
 rev41k пишет:
Но хотелось бы помощи вот в этом


Я с логикой помочь не могу, так как не могу вникать в каждую игру.
Вот конкретно с кодом - да, могу.

 rev41k пишет:
Здесь я проверяю : "Если динамики больше 20 , то ищем снова динамику на экране (от 3 до 19)" , просто больше 20 и меньше 2 мне не подходит.

Это понятно.. но Ваш код не работает. Проследите за его выполнением и увидите.

 rev41k пишет:
poisk:
sleep(500);
if (k>20)goto poisk;
if (k<2)goto poisk;


Ну допустим что k<2 и k>20, то что, идем на две строки вверх и код опять выполняется до проверки... При этом k не меняется... то есть цикл замкнутый. Нет с него никогда выхода.
Надо что бы между
poisk:
и
if (k>20)goto poisk;
if (k<2)goto poisk;
был код меняющий k...

Например
CODE:
int k;
poisk: finddynamic(0, #x[0], #y[0], 0, 0, 0, 0, 0, 0, 1366, 676, w);
sleep(100);
k=finddynamic(10, #x[0], #y[0], Mob_X, Mob_Y, Mob_Din_X, Mob_Din_Y, 0, 0, 1366, 676, w);

if (k>20)goto poisk;
if (k<2)goto poisk;

Powered by ExBB FM 1.0 Final