Oshibka v kode

Закрыто
Serg72
Сообщения: 25
Зарегистрирован: 12 сен 2022 04:26

Oshibka v kode

Сообщение Serg72 »

Nachal pisat code u poavilas oshibka


Error near by: Point .get ( Battle ) line: 13

Vot sam code

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

//zagrujaem izobrajenie v operativnuy pamat
Image Battle = Image.load("Battle");

//nachinaem zahvat ecrana
startScreenCapture();
sleep(2000);

//beskonechiy cikle
while(!EXIT){

//Ishem izobrajenie na ecrane  
Point p = Point.get(Battle);


  if(p.x > -1){
    click(p.x + 10, p.y + 10);
    break;

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

Re: Oshibka v kode

Сообщение Admin »

Добрый день. Вы пытаетесь передать изображение в точку, это недопустимо. Вместо Battle нужно передавать координаты. Например так

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

Point somePointName = Point.get(123, 456);
Point это обертка над 2 числами, которые представляют из себя координаты пикселя. Почти всегда можно обойтись и без неё. В примере ниже 2 строки вернут один и тот же результат.

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

int color = getColor(somePointName);
int color2 = getColor(123, 456);
Но гораздо удобнее использовать слова-названия переменных оберток, чем держать в голове координаты каждой точки в виде чисел.
Чтоб получить значения, которые хранит в себе обертка, нужно обратиться к переменным х и у этой точки. Делается это так

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

int x = somePointName.x;
int y = somePointName.y;
То есть [название обёртки-переменной точка имя переменной] в которой хранится соответствующее значение.
Что такое переменная можно почитать в руководстве пользователя по ссылке

Таким образом вызовы функции нажатия

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

click(somePointName);
sleep(1000);

click(somePointName.x, somePointName.y);
sleep(1000);

click(123, 456);
Будут нажимать в одну и ту же точку.

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

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

Image Battle = Image.load("Battle");

startScreenCapture(2);
sleep(1000);

Point battleButtonPoint = findImg(Battle);

if(battleButtonPoint.x > -1){
log("координаты точки верхнего левого угла изображения: x-" + battleButtonPoint.x + " y-" + battleButtonPoint.y);
}else{
log("изображение не найдено");
}
То есть, если изображение найдено автокликером, он возвращает координаты левого верхнего угла данного изображения, если не найдено он возвращает точку с координатами -1, -1

Больше функций для работы с изображением и их описание найдете в соответствующем разделе руководства.

ПС пишу "с головы" поэтому в примерах могут быть опечатки.
Admin
Главный админ
Сообщения: 214
Зарегистрирован: 28 окт 2021 14:01

Re: Oshibka v kode

Сообщение Admin »

Пример циклического поиска изображения

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

Image battleButton = Image.load("Battle");

startScreenCapture(2);
sleep(2000);

//перемменная в которую будем
//записывать результат поиска
Point p = Point.get();

while(!EXIT){

 p = findImg(battleButton);

 //проверяем результат функции поиска
 if(p.x > -1){
   log("Обнаружено совпадение");
   log("x:" + p.x);
   log("y:" + p.y);
   break;
 }else{
   log("Not found");
 }
 //цикл повторится после этой 
 //паузы в миллисекундах
 sleep(1000);
}

Serg72
Сообщения: 25
Зарегистрирован: 12 сен 2022 04:26

Re: Oshibka v kode

Сообщение Serg72 »

Спасибо за такой быстрый ответ! И так все стало чуть запутаннеее :lol: . Вот этот пример кода я взял из видео с ютуба там как раз таки в скобках было img как и название искомого изображения. Я сделал вывод что это работает так. В видео как раз приведён пример когда мы сами не ставим координаты для точки нажатия а нажимай туда где была найдена кнопка (с отступом сверху и Лево)
Admin
Главный админ
Сообщения: 214
Зарегистрирован: 28 окт 2021 14:01

Re: Oshibka v kode

Сообщение Admin »

Нет, в видео точно не так, как у вас в скрипте было) внимательно посмотрите что стоит после знака равно. У вас инициализация точки изображением. В видео возврат точки после поиска изображения.

Прочтите про переменные в руководстве. По сути тип Point это контейнер в котром находится 2 контейнера поменьше для хранения целых чисел. То есть х и у координаты пикселя. Он ничего не умеет, кроме как хранить данные и возвращать сам себя. Когда вы пишите Point p = Point.get(0, 0) это значит, что вы хотите создать контейнер-переменную, который будет хранить координаты точки, после создания поместить в него координаты 0, 0, а название контейнера должно быть "р". Если же написано так: Point r = findImg("blabla"); то для смартфона это будет значить: подготовить место для контейнера с названием r и когда функция поиска изображения проверит один кадр с экрана или его участок, то она поместит в этот контейнер результат. Если изображение найдено, это будут его координаты, если не найдено это будут отрицательные координаты, которых не существует на экране. Дальше вы можете заглянуть в контейнер "r" для того, чтоб узнать, что туда положила функция.

Обратите внимание функция findImg может не успеть обрабатывать каждый кадр. Особенно если искать цветное изображение на всём экране. Во время поиска может быть обработано всего 1 кадр в секунду из 30/60. Чем больше площадь поиска тем больше нужно времени для анализа изображения. Если же искать маленькое изображение на маленькой площе, то возможно даже все кадры будут обработаны. Здесь также многое будет зависеть от производительности смартфона.
Serg72
Сообщения: 25
Зарегистрирован: 12 сен 2022 04:26

Re: Oshibka v kode

Сообщение Serg72 »

:cry: Это просто невероятно! Я был бы готов поспорить с кем угодно и битьяся головой об стену что я сделал все так как в видео. Но сейчас я открыл код и сразу увидел что функция совсем другая. :oops: глупо получилось конечно. Спасибо 8-)
Admin
Главный админ
Сообщения: 214
Зарегистрирован: 28 окт 2021 14:01

Re: Oshibka v kode

Сообщение Admin »

Обращайтесь) Тему закрываю.
Закрыто