Скрипт получился довольно запутанным с множеством условных ветвлений. Но я постараюсь подробно описать каждое свое действие и ход мыслей, чтоб каждый желающий мог понять и повторить это у себя.
Хочу предупредить лентяев, не пытайтесь скопировать конечный результат, вставить в автокликер и ждать, что это заработает! Вероятность успешного запуска, крайне низкая. Потому что нужно, чтобы совпали все параметры экрана вашего смартфона с моим, а также настройки графики игры должны быть идентичны.
Этот пример создавался не для того, чтоб вы бездумно скопировали скрипт и пошли фармить рыбу в упомянутой игре. Это пример того, как я подхожу к разработке скриптов повышенной сложности. С которого вы можете взять для себя какую-то полезную информацию и стать немного более продвинутым пользователем автокликера.
Скрипт был написана от начала и до конца на моем стареньком смартфоне, во встроенном редакторе автокликера. Поэтому не нужно говорить, что-то по типу: “Ну конечно, вы же на ПК делаете, а у меня ПК нету, поэтому у меня не получается настроить автокликер и бла-бла-бла…”.
В статье будут упомянуты некоторые приложения в Google Play, которые я использую во время разработки скрипта. Это не в коем случае не реклама и не призыв их скачивать/покупать и тд! Я их использую, потому что мне так удобно, вы же вольны использовать любое приложение, которое нравится вам.
На этом, думаю, пора заканчивать с вступлением и приниматься за работу!
Задача
В игре AQ3D есть возможность заниматься рыболовлей. Этот процесс крайне медленный, как для современных игр, поэтому сразу же возникает желание автоматизировать его. Когда персонаж забрасывает удочку в водоем, начинается рыбалка. Спустя какое-то, рандомное, количество времени после начала рыбалки, на экране, в определенном месте, появляется индикатор поклевки. При достижении некоторых показателей индикатора, необходимо нажать на кнопку внутри него для вылова рыбы.

Рыбка, отмеченная на изображении цифрой 1, двигается рядом с полосой индикатора 2. Когда она попадает в зону 3, необходимо нажать на кнопку 4. Если рыба не поймана за время, представленное индикатором 5, рыбалка считается неудачной, рыба срывается и необходимо по новой начинать рыбалку. Если нажать кнопку 4 в то время, когда рыбка(1) на индикаторе не указывает на зону 3, рыбалка также завершается неудачно.
Если сравнить изображения индикатора, можно заметить, что цвет рыбки, а также длина зоны 3 может быть разной, в зависимости от редкости рыбы на крючке. Кроме того, этого не видно на изображении, рыбка двигается хаотично и с разной скоростью. Поэтому нажимать на кнопку по таймеру не вариант.
Прежде чем начать писать скрипт, необходимо зайти в игру и изучить в деталях процесс, который будет поддаваться автоматизации. Я это уже сделал, когда описывал задачу.
После этого сделайте скрины экрана, каждого момента, который будете обрабатывать. Например: есть кнопка на экране, которую необходимо нажать - делаем скрин. После нажатия кнопки открывается окно интерфейса, делаем скрин и запоминаем или записываем приблизительно время открытия. И тд. Скрины лучше всего делать встроенными средствами смартфона, потому как некоторые программы из маркета приложений могут немного искажать картинку для оптимизации. Нам этого не нужно. Для большинства устройств, комбинация для создания скрина экрана это клавиша блокировки экрана + качелька громкости вниз. Изображения помещаются в папку на телефоне по пути Pictures -> Screenshots. Если вы владелец устройства с кастомной прошивкой и скриншоты хранятся в другом месте, тогда погуглите инструкцию для вашего устройства, как их найти.
Зачем вообще делать снимки экрана, спросите вы? Объясняю. У большинства пользователей смартфоны не такие производительные, чтоб удерживать в памяти процесс игры, файлового менеджера, автокликера и каких-то еще приложений, которые нам будут необходимы в процессе создания скрипта. Поэтому Android будет постоянно выгружать их из памяти. В следствии чего вам придется постоянно ждать, пока приложения будут загружаться по новой. Скриншот можно открыть в файловом менеджере во весь экран и работать с ним, как если бы это была игра. На нем можно даже протестировать некоторые функции скрипта, без необходимости тратить время на запуск игры.
На следующем шаге необходимо подготовить набор инструментов, которые будут облегчать работу. Нам понадобится файловый менеджер, которым удобно пользоваться, и который поддерживает открытие изображений во весь экран. Наверное, можно использовать стандартный менеджер, но его использование, лично для меня, это сплошное мучение, настолько в нем ужасен и неудобен интерфейс. Текстовый редактор, для хранение временных записей, чтобы не засорять скрипт лишними данными. Графический редактор, который умеет загружать сторонние изображения, работать со слоями, а также рисовать ровные линии и круги, позже вы поймете зачем это нужно. Ну и, само собой, автокликер Perfect Click, а также, самый главный инструмент, это ваша светлая голова
В качестве файлового менеджера рекомендую приложение, которое называется “Файловый менеджер” разработчика File Manager Plus. Он легковесный, удобный, открывает изображения во весь экран с помощью встроенного средства просмотра, а также поддерживает создание и редактирование простых текстовых файлов. Графический редактор - “Pixel Studio: редактор” разработчика Hippo.
Еще раз напоминаю, вы вольны использовать любое другое, удобное для вас, приложение.
Свяжитесь кто-нибудь с разработчиками вышеупомянутых приложений, пусть оплатят уже наконец-то рекламу их продуктов!
Когда все подготовлено для написания скрипта, возвращаемся к задаче. Рекомендую на первых стадиях разработки не отвлекаться на такие пустяки, как нажатия для запуска рыбалки и тд. Это вещи банальны и будут добавлены на финальном этапе. В начале разработки они будут только занимать место в скрипте и отвлекать от главной проблемы.
Суть проблемы же заключается в том, как связать зону(3) на индикаторе с быстро движущейся рыбкой(1), на некотором отдалении от этой зоны. Здесь, очевидно, нужно подумать, но я пропущу свои размышления и варианты которые мне приходили в голову, потому как статья и так получится большой, если не сказать огромной. Если бы индикатор был ровным, трудностей никаких бы не возникало, меняем х или у координату и проверяем цвет. Но здесь он круглый с элементами рандома в виде зоны 3. Спасибо хоть не извилистый!
Чтоб определить положение зоны 3, необходимо менять координаты х и у одновременно. Причем не как попало, а чтоб выборка цвета происходила именно по телу полосы индикатора. Понятное дело, что для описания всего в мире существуют формулы, поэтому я попытался вспомнить школьный курс геометрии и в частности формулу, описывающую движение по кругу. Естественно, вспомнить то, чего никогда не знал(потому что “геометрия в жизни мне не пригодится”), не получилось. Но хорошо, что есть гугл!
После непродолжительного гугления удалось найти следующую формулу:
x = center.x + cos(i) * radius;
y = center.y - sin(i) * radius;
Где center это центральная точка окружности, а i угол в радианах, на котором нужно определить координаты x и y.
Таким образом получаем новую головоломку, как найти центр индикатора и его радиус. Окружность полосы индикатора(2) не замкнута, начертить две перпендикулярные линии, которые будут вписываться в нее, никак не получиться. Для решения этой проблемы как раз и нужен графический редактор, который поможет нам дорисовать недостающие части индикатора. Если у вас есть компьютер, в таком случае перекиньте скриншот со смартфона, отредактируйте его в стандартном Paint-е и отправьте назад на смартфон. У меня, естественно, есть ПК, но я буду редактировать скриншот на смартфоне.
Открываем Pixel Studio или любой другой графический редактор с нужным функционалом. Загружаем в него наш скриншот игры. Объяснять куда нажимать в редакторе я не буду, это уж вы сами как-нибудь разберетесь.
Первым делом необходимо дорисовать недостающие части изображения, а именно замкнуть окружность. Выбираем инструмент рисования фигур и рисуем окружность, которая будет строго повторять контуры орбиты индикатора. Делать это нужно как можно точнее и аккуратнее. От этого многое будет зависеть в будущем. У меня это получилось вот так:

Не совсем правильно, к сожалению. Если внимательно присмотреться, видно, что сверху окружность заходит немного внутрь индикатора. Я это заметил не сразу, поэтому переделывать всё по новой было лень. Но вы не будьте ленивыми задницами и делайте всё красиво, иначе потом придется страдать! После отрисовки окружности приближаем изображение. С помощью инструмента “Сетка” находим вершины окружности по горизонтали и вертикали, и делаем там маленькие засечки. Я это уже сделал. На изображении выше, вы можете их заметить.
Теперь необходимо начертить линию, которая будет лежать своими концами строго на вершинах окружности. Добавляем новый прозрачный слой и рисуем.

После, с помощью инструмента “Выделить”, выделяем область индикатора таким образом, чтоб выделение строго вмещало в себя окружность. Копируем его. Добавляем еще один, уже третий слой, и вставляем в него только что скопированный участок второго слоя. После этого переходим в инструмент “Функции” и поворачиваем третий слой на 90 градусов.
Должно получиться, что две линии пересекаются под прямым углом и лежат своим концами на вершинах окружности. Но у меня, естественно не получилось, потому что кто-то криво нарисовал окружность)
Если бы линии легли правильно, можно было бы считать, что центр окружности найден. Но мне, для большей уверенности, пришлось рисовать дополнительные линии, пересекающие симметрично расположенные элементы индикатора. В результате получилось как то так.

Полученное изображение необходимо сохранить. В настройках сохранения выбираем х1 и формат .png.
Самое скучное осталось позади, теперь только веселье! Ну, почти…
Переходим по пути, который нам указал Pixel Studio, во время сохранения файла, и открываем изображение во весь экран. Теперь запускаем автокликер Perfect Click. Выбираем инструмент “Пипетка”. Переходим к открытому изображению и определяем пару координат, а именно координаты центра нашего индикатора и середины изогнутой полосы, на которой устанавливается зона 3.

Зачем вообще было так заморачиваться с этим центром? - можете спросить вы. Я отвечу - если центр окружности будет установлен немного криво, буквально на пару пикселей, то выборка цвета пикселей на черной полосе индикатора будет начинаться в нужном месте, но ближе к концу координаты сместятся в сторону, описывая другую окружность, которая не имеет отношения к нашему индикатору.
Итого, в результате проделанных трудов, имеем координаты центра индикатора и его радиус. Ах да, радиус мы получаем из разности точек по х-координате. 1641 - 1514 = 127. Возможно, в будущем нам придется немного подкорректировать эти значения, но пока что будем опираться на них.
Ну и длиннющая статья получается, однако. Вроде бы уже пора дать возможность отдохнуть глазам и голове, а мы еще даже ни одной строки кода не написали. Не правильно как то. Значит так, давайте проверим работоспособность формул, которые были найдены в интернете и будем шабашить на сегодня.
Создадим в нашем автокликере новый скрипт. Назовем его как-нибудь, например, “Отрисовка окружности” и сохраним.
Важное замечание! Не забывайте периодически сохранять свой скрипт после редактирования! Иначе может так случиться, что приложение даст сбой, либо Android решит, что пора освободить оперативную память, вследствии чего, вы потеряете весь не сохраненный код.
В скрипте создадим переменную - точку, которая представляет центр окружности, которую мы хотим нарисовать программно. Рекомендую, для начала, задать координаты этой точки более подходящими для тестирования. Чтоб было удобно проверять работоспособность скрипта в графическом редакторе. Пусть это будет точка где-то примерно в центре экрана смартфона.
Код: Выделить всё
Point cntr = Point.get(474,940);Код: Выделить всё
int r = 127;Создаем переменные для работы с числами с плавающей точкой.
Код: Выделить всё
double pi = 3.14;
double from = 0;
double to = pi * 2;
Код: Выделить всё
int x;
int y;Код: Выделить всё
for(; from < to; from += 0.14){
x = (int)(cntr.x + Math.cos(from) * r);
y = (int)(cntr.y - Math.sin(from) * r);
click(x, y);
sleep(150);
}Наверное, необходимо прояснить некоторые моменты в формулах скрипта. В результате вычисления формулы получается число с плавающей точкой. Нам же нужно знать целочисленные координаты, потому как дробных пикселей не бывает. Поэтому здесь используется прием явного приведения типа (int)(double). Более подробную информацию о приведении типа ищите в интернете. Иначе эта статья потянет на роль методички по программированию, если я начну объяснять все детали:)
Как работают циклы, вы, конечно же, можете найти в открытых источниках. Но и здесь на форуме, в руководстве пользователя, также есть статья с объяснением. Поэтому рекомендую с ней ознакомиться в первую очередь, если что-то не понятно в коде выше.
Math.cos и Math.sin это вызовы функций из библиотеки java, под названием Math, для нахождения косинуса и синуса из радиан угла.
В финале у нас получился вот такой скрипт:
Код: Выделить всё
Point cntr = Point.get(474,940);
int r = 127;
double pi = 3.1416;
double from = 0;
double to = pi * 2;
int x;
int y;
for(; from < to; from += 0.14){
x = (int)(cntr.x + Math.cos(from) * r);
y = (int)(cntr.y - Math.sin(from) * r);
click(x, y);
sleep(150);
}
Давайте подводить итог. В результате проделанной работы, мы смогли найти практически идеальный центр кастомного элемента в игре, используя графический редактор и встроенные в автокликер инструменты. Кроме того, узнали формулу отрисовки окружности и применили её на практике. Это приблизило нас на пару шагов к нашей цели.
На этом пора заканчивать данную часть статьи. В качестве домашнего задания… Так, стоп, когда это мы с примеров перешли на уроки с домашними заданиями?.. В общем, если есть желание, научите автокликер рисовать окружность в обратную сторону от текущей. Поменяйте шаг отрисовки. Ну и наконец попробуйте заставить Perfect Click нарисовать такую фигуру:

Эти знания пригодятся вам в будущем. Если не получиться, тогда ждите следующую статью из данного цикла. В ней мы будем искать пресловутую зону 3 на полупрозрачной полоске индикатора:)
До связи!
Следующая часть