Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Нужен совет по findcolor
Topdeck
сообщение 30.5.2018, 5:39
Сообщение #1


*

Registred
Сообщений: 5
Регистрация: 29.7.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.556
Возраст: 21



Добрый день! Сижу занимаюсь созданием не сложного бота-кликера, в одной изометрической старой онлайн игрушке через findcolor.
Опишу задумку, заменил и вырезал все лишние текстуры на экране, мобы представляют из себя грубо говоря квадратики одного цвета, после того как экран почищен от квадратиков(мобов) бот двигается по указаным цветным точкам далее (условный круг), если замечены мобы они снова выпиливаются.
Идеальный бой - это одиночный клик на моба, ожидание его спилки несколько секунд и после его смерти(исчезания модельки) клик на ближайшего следующего с минимальной задержкой.

Пример моего скрипта, кликает на нужный цвет активируя авто-атаку тем самым ( без передвежений, только на проклик мобов):

set mouseclickdelay 50
set #a findcolor (0, 0 1024, 768 (3613183) %arr 2 -1 3)
if #a > 0
move_smooth %arr [1,1] %arr [1,2]
kleft %arr [1,1] %arr [1,2]
wait 5000
end_if

Столкнулся с несколькими проблемами, которые связаны друг с другом. Не знал даже как сформулировать чтобы воспользоваться поиском.

Первое - это то, что мобы умирают за какой-то рандомный промежуток времени(криты,миссы плюс преодоление расстояния до цели) и никак не угадаешь подходящую задержку через команду wait, если сделать быстро, то персонаж будет метаться и выходит куча недобитых мобов, если медленно, то не эффективно и очень палевно. Хочу сделать здесь так чтобы, если он начал бить какого-то конкретного врага делал это до конца и только после переключался на другого с минимальной задержкой.
(Здесь, была мысль проверять цвет по текущими координатами курсора, но что-то у меня так и не получилось реализовать)

Второе - это то, что через findcolor мне необходимо, чтобы убивались в первую очередь, мобы которые находятся рядом с персонажем(условный центр окна), у меня же ситуация такая, что есть пачка из нескольких мобов убивается один и перс бежит бить моба в противоположном углу экрана, поскольку цвет у всех одинаковый. Уменьшение зоны поиска, желанного результата не даёт, т.к всёравно даже в меньшей зоне может кликнуть на дальний объект.

Ищу советы по решению моих вопросов)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 30.5.2018, 20:11
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Цитата
(Здесь, была мысль проверять цвет по текущими координатами курсора, но что-то у меня так и не получилось реализовать)

Показывайте, что не получилось - ход мысли верный.
Цитата
Второе - это то, что через findcolor мне необходимо, чтобы убивались в первую очередь, мобы которые находятся рядом с персонажем(условный центр окна), у меня же ситуация такая, что есть пачка из нескольких мобов убивается один и перс бежит бить моба в противоположном углу экрана, поскольку цвет у всех одинаковый. Уменьшение зоны поиска, желанного результата не даёт, т.к всёравно даже в меньшей зоне может кликнуть на дальний объект.

Разбивать зону поиска на много мелких и искать в них по очереди. Сначала в текущем положении персонажа, потом вокруг него, потом еще шире и т.д.:
Код

*****
*****
**X**
*****
*****

*****
**X**
*X*X*
**X**
*****

*****
*X*X*
*****
*X*X*
*****

**X**
*****
X***X
*****
**X**

*X*X*
X***X
*****
X***X
*X*X*

X***X
*****
*****
*****
X***X

Примерно такая схема

Сообщение отредактировал DarkMaster - 30.5.2018, 20:13


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Topdeck
сообщение 31.5.2018, 2:24
Сообщение #3


*

Registred
Сообщений: 5
Регистрация: 29.7.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.556
Возраст: 21



Цитата
Показывайте, что не получилось - ход мысли верный.


Я пытался сделать так - использовать команду get mouse_pos #x #y, как у вас записано в примерах, а после делать по этим координатам getcolor и если он совпадает с хотя бы одним из указанных, просто делает ещё левый клик в текущем положении мыши.Как, мне показалось, getcolor просто не работает со значениями #x #y, а только с конкретными координатами. Возможно, есть ещё какой-то метод для реализации такой задумки, или я как-то не так использую эти инстументы? Примеры очень сильно бы всё для меня упростили.

Про последовательную схему поиска понял, но могли бы вы мне указать где можно почитать подробнее о реализации подобной конструкции, а ещё лучше готовый пример.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 31.5.2018, 11:24
Сообщение #4


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Цитата
get mouse_pos

Использовать не рекомендую, вдруг мышь сдвинется. Когда вы делаете клик, то вы же знаете уже координаты, где будет мышь, зачем вам заново получать ее координаты?
Цитата
getcolor просто не работает со значениями #x #y

Для начала он через пробел get color, либо можно использовать просто color()
Цитата
Примеры очень сильно бы всё для меня упростили.

Мне тоже, поэтому я попрошу вас привести вашу реализацию через findcolor, которая не работает для ожидания смерти моба.

Цитата
можно почитать подробнее о реализации подобной конструкции

А что о ней можно читать?) Все на виду, бери да пиши =)
Код

// Область поиска
set #xMin 100
set #xMax 200
set #yMin 300
set #yMax 400

// Текущая позиция
set #xCur 122
set #yCur 364

// Размер шага
set #xStep 10
set #yStep 10

// Рассчет стартовых координат.
// Чтобы текущая позиция оказалась
// в центре одной из областей.
set #xStart #xCur - #xStep / 2 - ((#xCur - #xStep / 2 - #xMin) / #xStep + 1) * #xStep
set #yStart #yCur - #yStep / 2 - ((#yCur - #yStep / 2 - #yMin) / #yStep + 1) * #yStep

set #i 1
for #x #xStart #xMax #xStep
    for #y #yStart #yMax #yStep
        // Создание сетки для поиска.
        set %field[#i 1] #x
        set %field[#i 2] #y
        set %field[#i 3] #x + #xStep - 1
        set %field[#i 4] #y + #yStep - 1

        // Рассчет дистанции от текущей позиции
        set #xAvg (%field[#i 1] + %field[#i 3]) / 2 + 1
        set #yAvg (%field[#i 2] + %field[#i 4]) / 2 + 1
        set %field[#i 5] round(point_distance(#xAvg #yAvg #xCur #yCur))

        set #i #i + 1
    end_for
end_for

sort_array %field 5

for #i 1 size(%field) 1
    log %field[#i 1] %field[#i 2] %field[#i 3] %field[#i 4] %field[#i 5]
    // Тут финдколор set #a findcolor (%field[#i 1] %field[#i 2] %field[#i 3] %field[#i 4] ....
    // if #a > 0
    //   break // нашли и прерываем
    // end_if
end_for


Сообщение отредактировал DarkMaster - 31.5.2018, 13:09


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Topdeck
сообщение 31.5.2018, 13:57
Сообщение #5


*

Registred
Сообщений: 5
Регистрация: 29.7.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.556
Возраст: 21



Цитата(DarkMaster @ 31.5.2018, 11:24) *

Мне тоже, поэтому я попрошу вас привести вашу реализацию через findcolor, которая не работает для ожидания смерти моба.


Свой вариант по клику через findcolor я указал в самом первом посте

Код
set mouseclickdelay 50
set #a findcolor (0, 0 1024, 768 (3613183) %arr 2 -1 3) //
if #a > 0
move_smooth %arr [1,1] %arr [1,2]
kleft %arr [1,1] %arr [1,2]
wait 5000
end_if


Камера находится сверху, моб, допустим в правой части экрана, когда я на него нажму через findcolor персонаж побежит к нему, на каком-то радиусе он спулится и побежит на встречу, но поскольку активируется авто-атака персонаж его рано или поздно убьёт в мили, но позиция моба (квадратика) уже измениться и будет где-то под персонажем в центре экрана, необходимо чтобы программа понимала когда моб пропал и только после этого начала искать остальных. Просто прописанная задержка через wait не стабильная и очень не удобная, т.к расстояние до мобов разное и время их спила тоже, плюс к этому часть мобов уже может саагриться атаковать персонажа в мили. Мышка при этом не двинется, т.к я адаптировал всё это под виртуальную машину.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 31.5.2018, 15:25
Сообщение #6


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Цитата
Свой вариант по клику через findcolor я указал в самом первом посте

Не вариант клика, а вариант ожидания пока цвет не исчезнет.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Topdeck
сообщение 31.5.2018, 17:09
Сообщение #7


*

Registred
Сообщений: 5
Регистрация: 29.7.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.556
Возраст: 21



Цитата(DarkMaster @ 31.5.2018, 15:25) *

Не вариант клика, а вариант ожидания пока цвет не исчезнет.

Вот я не могу придумать как это правильно сделать, поскольку первый клик зачастую происходит в одной точке экрана после цели перемещаются и как отследить именно ту на которой был сделан первый клик, если в мили уже несколько целей, которые выглядят ровно точно так же.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 31.5.2018, 18:08
Сообщение #8


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27680
Пользователь №: 11.279



Цитата
если в мили уже несколько целей

Ну так и проверяйте в мили. Неужели невозможно определить ту самуй цель? А если не по карте, а по панелькам? В крайнем случае можно просто внаглую использовать скрипт выше при условии, что вы сможете вытянуть бой сразу с несколькими мобами и не умереть. Т.е. вы просто будете постоянно атаковать ближайшую цель. Так же могу предложить заменить изображение мобов на что-то очень маленькое, буквально 2 на 2 пикселя и благодаря этому вы сможете точно определять дистанцию до моба. Если моб постоянно находится на дистанции, скажем 15 пикселей, то бой еще не окончен.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Topdeck
сообщение 31.5.2018, 18:25
Сообщение #9


*

Registred
Сообщений: 5
Регистрация: 29.7.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.556
Возраст: 21



Цитата(DarkMaster @ 31.5.2018, 18:08) *

Ну так и проверяйте в мили. Неужели невозможно определить ту самуй цель? А если не по карте, а по панелькам? В крайнем случае можно просто внаглую использовать скрипт выше при условии, что вы сможете вытянуть бой сразу с несколькими мобами и не умереть. Т.е. вы просто будете постоянно атаковать ближайшую цель. Так же могу предложить заменить изображение мобов на что-то очень маленькое, буквально 2 на 2 пикселя и благодаря этому вы сможете точно определять дистанцию до моба. Если моб постоянно находится на дистанции, скажем 15 пикселей, то бой еще не окончен.

Cпасибо за советы, попробую реализовать будут ещё вопросы, апну эту тему.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 19.4.2024, 5:31
Designed by Nickostyle