Author Topic: Клик при пропаже или изминения объекта.  (Read 2261 times)

0 Members and 1 Guest are viewing this topic.

HapMuf

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Хочу понять именно этот момент на примере игры Pop the Lock
Как я понимаю то, что если желтый кружок деформируеться из-за того, что его закрывает палочка, то кликер должен кликнуть.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Тебе нужно отслеживать цвет рядом с красной полоской.
Область снимка нужно ограничить одним пикселом, таким образом снизится нагрузка на процессор при минимальных задержках между снимками.

Code: (clickermann) [Select]
GETSCREEN(812,549, 812,549) // впиши свои координаты
IF(PXL(812,549) = 4509413) // впиши свои координаты, цвет я уже вписал
   LCLICK(464,424) // действие
   WAITMS(100)
ELSE
   WAITMS(5)
END_IF

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
Тебе нужно отслеживать цвет рядом с красной полоской.
Область снимка нужно ограничить одним пикселом, таким образом снизится нагрузка на процессор при минимальных задержках между снимками.
Здесь желтое пятно появляется рандомно на темном кольце. А красная палочка двигается в направлении пятна, и в момент их пересечения нужно кликать в зеленый фон.
« Last Edit: March 20, 2017, 08:12:57 AM by open_78 »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Здесь желтое пятно появляется рандомно на темном кольце. А красная палочка двигается в направлении пятна, и в момент их пересечения нужно кликать в зеленый фон.

О как! Кто бы мог подумать такое по статичному скриншоту....

Тогда по другому.
Code: (clickermann) [Select]
GETSCREEN(755,649, 1119,1026)
IF_PIXEL_IN(755,649, 1119,1026, 4509413) // область синего круга и цвет полоски
   $x1 = $_return1 // запоминаем координаты
   $y1 = $_return2
END_IF
IF_PIXEL_IN(755,649, 1119,1026, 6291678) // область синего круга и цвет кружка
   $x2 = $_return1 // запоминаем координаты
   $y2 = $_return2
END_IF
IF(DIST($x1,$y1,$x2,$y2) < 5) // измеряем расстояние между полоской и кружком
   LCLICK(940,849) // если оно меньше заданного кликаем в нужное место
   WAITMS(500)
END_IF
WAITMS(5)

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
О как! Кто бы мог подумать такое по статичному скриншоту....
Видео:https://www.youtube.com/watch?v=-mYdSHzJDU8

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Алгоритм, с которым я вчера дошел до 71уровня, дальше уж очень нудно и бесполезно мне показалось  :D

По началу - цикл ожидания желтого пикселя в области всей окружности. Как только нашли - запомнили х и у. Но к у добавляем радиус желтого круга, тоесть центр пишем в у, у меня это +7 в блюстаке. Через пару милисек еще один гетскрин и запоминаем цвет пикселя по записаным ранее координата. Выходим из цикла. Новый цикл ожидания смены цвета записанного ранее в координатах записанных ранее. Естественно гетскрин одного пикселя, и минимум задержки, или без нее. Цвет сменился - мув и лклик куда угодно. Небольшая зажержка 150мс.и в начало. Плюс к этому можно добавить в первый цикл таймаут для закрытия рекламы, а во второй таймаут для холостого клика для старта уровня. Размер блюстака на минимум, и выключаем аэро в винде.
Вечером могу поделиться, но попробуй написать сам, хотябы попытайся.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
По просьбе автора темы, выкидываю скрипты по данной игре на общее обозрение. Авось кто еще захочет позабавиться  :D .
[spoiler]скорее всего он просил скрипт только для себя  :D, но это было бы както не честно.[/spoiler]

как оказалось, алгоритм описанный мной выше, не стабилен. скорее всего проблема на моей стороне. почемуто после 80-го уровня заметно уменьшился фпс в игре, и палка стала спотыкаться вместо того, чтобы скользить по кругу. немного сменил тактику. выкидываю и первую и вторую версию.


вариант первый, как оказалось, работает нестабильно при малом фпс:
Code: (clickermann) [Select]
#name "Pop the Lock v1"

//область в которую помещается вся окружность, по которой бегает шарик.
$x1 = 2188
$y1 = 1044
$x2 = 2574
$y2 = 1409

//радиус желтого шарика, зависит от масштаба эмулятора, желательно поточнее
$rad = 17
 
//координаты крестика закрытия рекламы
$x_spam = 2682
$y_spam = 681

//------------------------------------------------------------------------------


$time = $_time_t
$check = 0
WHILE($check = 0)         //ждем пока не появится желтый шарик
   GETSCREEN($x1,$y1,$x2,$y2)
   IF_PIXEL_IN($x1,$y1,$x2,$y2, 4180716)  //сканируем область с окружностью  на предмет желтого пикселя
      $x = $_return1                 //если   нашли
      $y =  $_return2+$rad         //записываем координаты найденного пикселя в переменные, где к переменной У добавляем радиус шарика     
      WAITMS(5)   //немного ожидаем, без задержки возможны ошибки
      GETSCREEN($x,$y,$x,$y)    //снова делаем скрин
      $clr = pxl($x,$y)    //и записываем в переменную цвет центра шарика
      $check = 1        //и выходим из цикла
   ELSE                        //если не нашли
      WAITMS(5)              //то небольшая задержка и возврат к сканированию
      IF($_time_t-$time > 5)    //если в течении пяти сек нет желтого
         MOVE($x_spam,$y_spam)       //значит реклама, закрываем ее
         LCLICK($x_spam,$y_spam)
         WAITMS(350)
      END_IF
     
   END_IF
END_CYC

$time = $_time_t
GETSCREEN($x,$y,$x,$y)
WHILE((pxl($x,$y) = $clr ) & ($_time_t-$time < 3))  //цикл ожидания изменения цвета центра шарика, с таймаутом в 3 сек (если начало уровня - игра в паузе
   WAITMS(5)
   GETSCREEN($x,$y,$x,$y)
END_CYC


MOVE($x,$y)       //как только цвет изменился - клик по шарику. почему по шарику? можно и в любые статичные координаты, просто при отладке так проще было
LCLICK($x,$y)

WAITMS(150)    //небольшое ожидание, и в начало


вариант второй. работает как часики. при любом масштабе эмулятора и любом фпс.
Code: (clickermann) [Select]
#name "Pop the Lock v2"

//область в которую помещается вся окружность, по которой бегает шарик.
$x1 = 2188
$y1 = 1044
$x2 = 2574
$y2 = 1409

//радиус желтого шарика, зависит от масштаба эмулятора, желательно поточнее
$rad = 17

//координаты крестика закрытия рекламы
$x_spam = 2682
$y_spam = 681

//------------------------------------------------------------------------------


$time = $_time_t
$check = 0
WHILE($check = 0)   //ждем пока не появится желтый шарик
   GETSCREEN($x1,$y1,$x2,$y2)
   IF_PIXEL_IN($x1,$y1,$x2,$y2, 4180716)  //сканируем область с окружностью  на предмет желтого пикселя
      $x = $_return1     //если   нашли
      $y =  $_return2+$rad   //записываем координаты найденного пикселя в переменные, где к переменной У добавляем радиус шарика
      $check = 1    //и выходим из цикла
   ELSE        //если не нашли
      WAITMS(5)     //то небольшая задержка и возврат к сканированию
      IF($_time_t-$time > 5)     //если в течении пяти сек нет желтого
         MOVE($x_spam,$y_spam)       //значит реклама, закрываем ее
         LCLICK($x_spam,$y_spam)
         $time = $_time_t
         WAITMS(350)
      END_IF
   END_IF
END_CYC


$time = $_time_t
$check = 0
WHILE($check = 0)    //цикл ожидания появления красной палки в области желтого шарика
   GETSCREEN($x-$rad,$y-$rad,$x+$rad,$y+$rad)
   IF_PIXEL_IN($x-$rad,$y-$rad,$x+$rad,$y+$rad, 6040551)  //сканируем весь желтый шарик на предмет красного пикселя
      MOVE($x,$y)      //как только нашли
      LCLICK($x,$y)   //клик по нему
      WAITMS(150)
      $check = 1  //и выход из цикла
   ELSE          //если красного пикселя нет
      WAITMS(5)  //то немного ждем, и возврат к сканированию
      IF($_time_t-$time > 3) //если в течении трех сек нет красного
         MOVE($x,$y)        //то просто клик, значит начало уровня
         LCLICK($x,$y)
         WAITMS(350)
         $check = 1  //и выход из цикла, вдруг всетаки ошибка, нужно заново искать координаты шарика
      END_IF
   END_IF
END_CYC

конечно все настраиваемые переменные скорее всего можно было высчитать основываясь на размер и положение эмулятора. если кто захочет, пусть считает  :D . както лень напрягать мозг.