Author Topic: Попытался разобраться, но сломал себе голову, помогите, а?  (Read 1456 times)

0 Members and 1 Guest are viewing this topic.

SeiSu

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Добрый день. Возникла идея, не столько необходимая, сколько спортивно интересная.
Есть, значится, игра на андроид(запускаю на компьютере через блюстакс), в этой игре, как и во многих других есть донат который можно получить за просмотр рекламы. Там по экрану плывет кораблик, и на него надо успеть кликнуть, тогда реклама откроется, и иногда после просмотра самой рекламы выпадает окно с ошибкой, на которой надо нажать кнопку, вот в кораблике то и заключается сложность.
[spoiler]
скрин https://pp.userapi.com/c845521/v845521626/d07bb/_agpa0XzCmg.jpg
скрин https://pp.userapi.com/c845521/v845521626/d07c4/VNauRbOPYa4.jpg
[/spoiler]
Необходим следующий скрипт:
- Скрин и анализ правого верхнего угла(если там иконка чата(1), то ничего не делать, если там не эта иконка, то жмакать до момента её появления);
- скрин и анализ всей нижней части экрана на предмет поиска движущегося объекта(2) (если объекта нет - ничего не делать, если есть - жмакнуть в центр самого объекта(3), а не экрана);
- Скрин и анализ середины экрана на поиск уведомления с кнопкой(4), как и в предыдущих случаях, если там ничего нет - пропуск действия, если есть кнопка - нажать.
Как сие можно организовать? Буду благодарен за любую помощь.

З.Ы. на летающем кораблике все время меняется изображение, так что думаю, логично будет фильтровать его по цвету обрамления, бежевому.

SeiSu

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Создавал я эту тему ничего не зная о кликере и писании скриптов, спустя пару-тройку часов на меня снизошло озарение, и я сделал следующее:
Code: [Select]
   GETSCREEN
   IF_PICTURE_IN (1203,51, 1269,115, "pic_to_clc\Chat.bmp", -1, 100)  //скан иконки чата
       WAIT(1)
       LCLICK(1070, 558)                                               //если есть, клацаем в центр экрана в ожидании кораля с рекламой
   ELSE                                                                   //если нет, то
      IF_PICTURE_IN (455,478, 903,532, "pic_to_clc\Error.bmp", -1, 100)    //скан на наличие окна с ошибкой
         LCLICK(555, 508)                                                   //если есть, то клацаем по ошибке
         WAIT(1)                                                 
      ELSE                                                                   //если нет, то
         LCLICK(1233, 81)                                                  //клацаем на крестик закрытия рекламы
         WAIT(1)   
         END_IF
      END_IF
 

В принципе, оно работает, ибо довольно простенькое, однако(всегда есть "однако"). Есть реклама, которая неверно отображается(чёрным экраном) и лечится только переоткрытием самого приложения. При добавлении в скрипт вот такой штуки:
Code: [Select]
   ELSE                                                                  //если нет, то
        IF_PICTURE_IN (84,49, 1277,719, "pic_to_clc\BR.bmp", -1, 100)  //скан на наличие чёрного экрана
           WAIT(5)
           LCLICK(518, 16)                                               //закрываем игру
   WAIT(5)
   LCLICK(405, 177)                                              //запускаем заново
   WAIT(5) 
         
кликермен зависает, и закрыть его можно только через диспетчер задач.

И у меня осталась пара вопросов: Оно же постоянно скринит экран? Эти скрины куда-то сохраняются и засоряют память? Как их после каждой проверки удалять?
Как сделать так, чтобы после, например, 10 минут ожидания корабля(если пропала реклама) вылетало окно с ошибкой, мол всё, реклама закончилась. Примерно так: 10 минут сканит и 10 минут видит чат - всё, тормозим, ошибка.

Oraven

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

Code: (clickermann) [Select]
GETSCREEN
IF(PXLCOUNT(100,100, 500,500, 0) > 1000)
  // действие если в зоне 100,100, 500,500 более 1000 черных (0) пикселов
END_IF

Кликер делает снимки в свой буфер в оперативной памяти. Буфер каждый раз после вызова GETSCREEN переписывается. Так что ничего у тебя там не захламляется.

Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN (1203,51, 1269,115, "pic_to_clc\Chat.bmp", -1, 100)    //скан иконки чата
   WAIT(1)
   LCLICK(1070, 558)                                                 //если есть, клацаем в центр экрана в ожидании кораля с рекламой
   DEFINE($time, $_time_t + 600) // Создаем таймер на 10 минут. DEFINE создает переменную только если её не существует
   IF($time < $_time_t) // если записанное время в переменой $time стало меньше текущего времени системной переменной $_time_t
      HALT // стоп или другие действия
   END_IF
ELSE                                                                 //если нет, то
   IF_PICTURE_IN (455,478, 903,532, "pic_to_clc\Error.bmp", -1, 100) //скан на наличие окна с ошибкой
      LCLICK(555, 508)                                               //если есть, то клацаем по ошибке
      WAIT(1)
      UNDEFINE($time) // Удаляем переменную. В этом случае DEFINE снова сможет создать переменную $time и присвоить значение + 10 минут к текущему времени.
   ELSE                                                              //если нет, то
      LCLICK(1233, 81)                                               //клацаем на крестик закрытия рекламы
      WAIT(1)
      UNDEFINE($time) // Удаляем переменную
   END_IF
END_IF

SeiSu

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Спасибо за ответ. Поковырялся, сделал вот это:
Code: [Select]
GETSCREEN
IF_PICTURE_IN (1203,51, 1269,115, "pic_to_clc\Chat.bmp", -1, 100)          //скан иконки чата
   WAIT(1)
   LCLICK(1070, 558)                                                       //если есть, клацаем в центр экрана в ожидании корабля с рекламой
   DEFINE($time, $_time_t + 240)                                           //ставим таймер на 4 минуты
   IF($time < $_time_t)                                                    //если да, то
      HALT                                                                 //стоп
      HINTPOPUP("Реклама закончилась.", "Стоямба, Барсик")              //вывод сообщения
   END_IF
ELSE                                                                       //если нет, то
   IF_PICTURE_IN (455,478, 903,532, "pic_to_clc\Error.bmp", -1, 100)       //скан на наличие окна с ошибкой
      LCLICK(555, 508)                                                     //если есть, то клацаем по ошибке
      WAIT(15)
   ELSE                                                                    //если нет, то
      LCLICK(1233, 81)                                                     //клацаем на крестик закрытия
      WAIT(1)
      UNDEFINE($time)                                                      //значит реклама появилась и можно сбросить таймер
   END_IF
END_IF

WAIT(1)

IF($time2 < $_time_t)
   $time2 = $_time_t + 60                                                     //проверка на черный экран раз в 5 минут
   GETSCREEN
   IF_PICTURE_IN (600,600, 630,630, "pic_to_clc\BR.bmp", -1, 100)             //скан на наличие чёрного экрана
      WAIT(15)                                                               //если находит - ждем 15 секунд, затем ещё раз проверяем
      IF_PICTURE_IN (600,600, 630,630, "pic_to_clc\BR.bmp", -1, 100)          //повторная проверка, если находим, то
         LCLICK(518, 16)                                                      //закрываем игру
         WAIT(5)
         LCLICK(405, 177)                                                     //запускаем заново
         WAIT(10)
      ELSE                                                                    //если повторная проверка ничего не нашла, то
         WAIT(1)
      END_IF
   END_IF
END_IF

WAIT(1)

Всё работает, можно ли это как-то оптимизировать, или и так сойдет?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Code: (clickermann) [Select]
IF_PICTURE_IN (600,600, 630,630, "pic_to_clc\BR.bmp", -1, 100)          //повторная проверка, если находим, тоА с чего б не найти то, ведь нового снимка то не делали! Где GETSCREEN?