Пишем автокликер для рыбалки в Adventure Quest 3D (AQ3D) (Часть 2)

Закрыто
Admin
Главный админ
Сообщения: 214
Зарегистрирован: 28 окт 2021 14:01

Пишем автокликер для рыбалки в Adventure Quest 3D (AQ3D) (Часть 2)

Сообщение Admin »

В предыдущей части данной статьи было рассмотрено, как можно применять графический редактор в процессе создания скрипта. Кроме того, были даны некоторые рекомендации, которые могут облегчить жизнь во время скриптинга. Если вы еще не ознакомились с ней, крайне рекомендую это сделать.

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

Ниже пример, как нужно поменять скрипт, чтоб он рисовал только часть окружности.

Код: Выделить всё

Point cntr = Point.get(474,940);
int r = 127;

double pi = 3.1416;
double from = pi * 0.43;
double to = pi * 1.38;

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);
}
Как вы могли заметить, скрипт почти не изменился. Но обратите внимание на переменные from и to. Теперь они инициализируются другим значением градуса угла. Значения были подобраны экспериментальным способом с помощью скриншота экрана игры.

Теперь пришло время научиться использовать инструмент, который я называю, для себя, “средство отладки точек”. С его помощью можно визуализировать точку в пределах экрана смартфона. О нем есть упоминание в руководстве пользователя. В разделе об отладке скриптов. Но сейчас я хочу рассказать более подробно об особенностях этой фичи и способах ее применения.
Задача этого средства крайне проста. Оно может всего лишь устанавливать и удалять одну “точку” на экране устройства. “Точка” представляет из себя виджет плавающего окна, с которым нельзя взаимодействовать с помощью физических касаний. В скрипте, во время вызова функции, можно изменить размер виджета, его цвет и, конечно же, расположение. Все варианты перегрузки функции смотрите по этой ссылке.

Нажатия скрипта отслеживаются визуально, в крайнем случае, можно перейти в средства разработчика на устройстве и включить визуализацию нажатий. Но вот как понять, правильно ли автокликер работает с точками, когда они определяются с помощью вычислений? Прям как в нашем скрипте рыбалки. Здесь как раз может помочь средство отладки точек.
Есть пара важных моментов, о которых необходимо всегда помнить во время отладки точек.
  • Время между вызовами установки/удаления виджета точки не должно быть меньше 200 мс. Несоблюдение этого правила может привести к зависанию графической оболочки, вылета автокликера со сбоем в службе доступности.
  • Виджет может устанавливаться не корректно если устройство было переключено в полноэкранный режим и наоборот.
На самом деле время 200 мс взято с некоторым запасом. Например на моем устройстве зависание графического интерфейса начинается после 10 вызовов функции на секунду. Связано это с тем, что плавающие виджеты предназначены для совершенного других целей. Например для кнопок управления записью экрана, плавающего окна чата в мессенджере либо окна ютуба для просмотра видео поверх других приложений. Все эти виджеты объединяет одно, после создания они, обычно, длительное время находятся на экране. Устройство не может обрабатывать нормально ситуацию, когда нужно десятки раз в секунду закрывать и открывать виджет. Из-за этого оно скорее всего даст сбой. Если такое произошло, используйте принудительную перезагрузку. Для этого нужно нажать и удерживать клавишу включения 5-30 секунд в зависимости от устройства. Может быть такое, что андроид, после включения, восстановит состояние служб до перезагрузки. То есть, зависание графической оболочки пропало, при этом автокликер никак не может подключиться к службе доступности. Для исправления этой проблемы необходимо еще раз, но уже в нормальном режиме перезагрузить систему. Нажмите и удерживайте кнопку питания, пока не появится окно с кнопками “Выключить” и “Перезагрузить”, после чего выберите пункт перезагрузить.
Как видите, функция может быть, как очень полезной, так и добавить хлопот, если использовать ее неправильно.

По поводу второго пункта. Почему виджет точки может устанавливаться некорректно. В системе визуализации андроид существует две глобальные системы координат. Одна отвечает за отображение пикселей и определение касаний. Ее сетка всегда привязана к верхнему левому углу дисплея и занимает все, доступное для отрисовки, пространство. Вторая система привязана к центру экрана. То есть 0 находится по центру дисплея. К тому же она перевернутая. В правый нижний угол идет увеличение значений.

Если на первую систему влияет исключительно поворот экрана, именно экрана, а не устройства, то на вторую влияет все!

Я не очень преувеличиваю. На нее влияет поворот устройства, не экрана, при условии, что кнопки навигации отрисовываются на экране, а не встроены в корпус. Это, к слову, большинство смартфонов, начиная с Андроид 8.0. Также на эту систему влияет, открыто изображение во весь экран или же на экране отрисовывается панель с индикаторами.

Большинство вычислений, связанных с расположением своих виджетов, Perfect Click берет на себя. То есть, когда вы просите установить метку в точке 0, 0 автокликер устанавливает ее на самом деле по координатам, например -1100, -420 (зависит от размера экрана) и поворота устройства.
Кстати, виджет создания скриншота тоже размещается во второй системе координат. Именно по этой причине ваши скриншоты могут обрезаться криво. Чуть ниже я расскажу, как бороться с этой проблемой.

Некоторые пытливые умы замечают эту проблему и, не то чтоб заваливают сообщениями, но довольно часто сообщают мне о “баге в приложении”, когда нажатия и цвет пикселя определяются корректно, но скриншоты обрезаются неправильно и метка устанавливается криво. Еще и требуют, чтоб я это починил. А вот не могу!) В документации к андроид не сказано, как определить, состояние экрана в текущий момент. И как узнать встроены кнопки физически в устройство или реализованы программным способом на экране. Возможно я был не внимателен, когда искал, но вполне вероятно, что такой возможности вообще не существует. Потому что разработчики ОС Android не предполагали, что кому-то может понадобится устанавливать виджеты с точностью до пикселя.

Решение этой проблемы пока что единственное - вам необходимо вручную в настройках автокликера указывать состояние экрана. Возможно в будущем что-то изменится в этом плане, но на момент написания этой статьи дела обстоят именно так.

Поэтому, если вы писали ранее скрипт для управления каким-то приложением, которое работает не на весь экран, и скриншоты для него обрезались корректно, но когда пытаетесь вырезать изображение с экрана игры, оно куда то сползает, или же ситуация наоборот. В таком случае просто перейдите в настройки автокликера и поменяйте положение переключателя “Определить рабочее пространство экрана”. Этим действием вы подскажете автокликеру как правильнее пересчитывать расположение виджетов. Если вдруг это не помогло, когда вы делаете скрины в горизонтальной ориентации, поверните устройство на 180 градусов. Уж это точно должно помочь!

Возвращаемся к нашей рыбалке.

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

Код: Выделить всё

Point cntr = Point.get(1641, 566);
Также, вместо нажатия, теперь будем устанавливать метку по полученным, с помощью формул, координатам точки. Заменим click(х, у) на setMark.

Код: Выделить всё

setMark(x, y, 10, 65536);
Где 10 это размер метки в пикселях, а 65536 ее цвет. Цвет и размер подбираются индивидуально в каждом случае таким образом, чтоб метку было хорошо видно на исходном изображении, при этом она не мешала обзору.
В конце скрипта добавьте вызов функции

Код: Выделить всё

removeMark();
Эта функция удаляет метку с экрана. Также она будет вызвана автоматически, при закрытии окна запуска скрипта, если до этого ее не вызвали программно.

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

На этом хочу завершить данную статью. Я помню, что зону 3 мы все еще не нашли! Но после такого количества теории, не уверен, что кто-то сможет полноценно вникнуть в скрипт. А вникать там будет во что. Обещаю, что в следующих частях статьи кода будет больше. Но без теории тоже невозможно обойтись, иначе у вас остануться пробелы в знаниях, которые вы самостоятельно не сможете заполнить.

В качестве тренировки и для закрепления полученных знаний, предлагаю вам потренироваться в работе с функцией setMark. Поиграйтесь с ее параметрами, а также понаблюдайте на вашем устройстве, когда она даст сбой в полноэкранном или в режиме с индикаторами. Решите данную проблему, чтоб метка начала отображаться в том месте, где вы ее пытались установить. То же самое проделайте со скриншотером. Его, кстати, мы тоже будем использовать в одной из следующий частей статьи. Так что есть повод научиться работать с этим инструментом.

До свидания!
Закрыто