Author Topic: Нужно найти одну картинку, а кликнуть на другу.  (Read 4077 times)

0 Members and 1 Guest are viewing this topic.

Zimon

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Здравствуйте!  :)
Подскажите, как написать скрипт с помощью IF_PICTURE_IN.
Нужно что бы находил в определенной области картинку "квадрат.bmp", после того как нашел кликал на "круг_1.bmp" и после на "круг_2.bmp".
И еще было бы не плохо добавить рандомную задержку с плавным передвижением мыши, если возможно.

Engineer

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Померяйте может подойдёт :)
Code: (clickermann) [Select]
//=========== Подпрограмма реалистичного движения мыши ======================
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_Start_X = $_xmouse
   $MOVE_Start_Y = $_ymouse
   $MOVE_X = $MOVE_Start_X
   $MOVE_Y = $MOVE_Start_Y
   
   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
   $MOVE_step = ($dist-1)/INT(SQRT($dist))
   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
   
   FOR($MOVE_i=0, $MOVE_i < INT($MOVE_step))
      $MOVE_X = $MOVE_X + $MOVE_X_step
      $MOVE_Y = $MOVE_Y + $MOVE_Y_step
      MOVE(INT($MOVE_X) + RND(-2,2), INT($MOVE_Y) + RND(-2,2))
      WAITMS(RND(3,9)) // задержка при движении по точкам случайная скорость
   END_CYC
END_SUB

SUB(m_move,$M_X,$M_Y)
   $MOVE_MID_X = INT(($_xmouse+$M_X)/2)
   $MOVE_MID_Y = INT(($_ymouse+$M_Y)/2)
   $otx = INT(ABS($_xmouse - $M_X) * 0.12)
   $oty = INT(ABS($_ymouse - $M_Y) * 0.12)
   mouse_move($MOVE_MID_X+RND(-$otx,$otx), $MOVE_MID_Y+RND(-$oty,$oty))
   mouse_move($M_X,$M_Y)
   MOVE($M_X,$M_Y)
END_SUB
//===========================================================================

//======================== Ваш скрипт =======================================
$kvadrat=0
WHILE($kvadrat=0) // не выйдет из цыкла пока не найдёт "квадрат.bmp"
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "квадрат.bmp")
      $kvadrat=1
   ELSE
      WAIT(1) // будет проверять один раз в секунду
   END_IF
END_CYC

WAITMS(RND(500,1000)) // рандомная задержка 0,5-1 секунды

GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "круг_1.bmp")
   m_move($_return1, $_return2)
   WAITMS(RND(50,60))
   LCLICK($_return1, $_return2) // клик по "круг_1.bmp"
ELSE
   LOGWRITE ("Не нашёл круг_1.bmp")
   LOGSHOW (1, 100,100)
   HALT // остановит скрипт если не найдёт "круг_1.bmp"
END_IF

WAITMS(RND(500,1000))

GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "круг_2.bmp")
   m_move($_return1, $_return2)
   WAITMS(RND(50,60))
   LCLICK($_return1, $_return2) // клик по "круг_2.bmp"
ELSE
   LOGWRITE ("Не нашёл круг_2.bmp")
   LOGSHOW (1, 100,100)
   HALT // остановит скрипт если не найдёт "круг_2.bmp"
END_IF

WAITMS(500) // ждёт пол секунды и начинает всё с начала
//===========================================================================

Zimon

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Померяйте может подойдёт :)

Почему-то сразу кликает на квадрат.

Engineer

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Померяйте может подойдёт :)

Почему-то сразу кликает на квадрат.
Если используете режим привязки к окну, то уберите подпрограмму реалистичного движения мыши (удалите строки с 1 по 31), и в теле вашего скрипта вместо m_move напишите MOVE.
Проверьте не одинаковые ли у вас картинки под именами "квадрат.bmp" и "круг_1.bmp".

Engineer

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
IF_PICTURE_IN  возвращает в системные переменные $_return1 и $_return2 координаты левого верхнего пикселя изображения. Возможно у вас в левом верхнем углу картинки "круг_1.bmp" находится квадрат.
Если круги постоянно видны на одном месте и нужно просто кликнуть по очереди когда появится квадрат, то попробуйте проще.
Code: (clickermann) [Select]
//======================== Ваш скрипт =======================================
$kvadrat=0
WHILE($kvadrat=0) // не выйдет из цыкла пока не найдёт "квадрат.bmp"
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "квадрат.bmp")
      $kvadrat=1
   ELSE
      WAIT(1) // будет проверять один раз в секунду
   END_IF
END_CYC

WAITMS(RND(500,1000)) // рандомная задержка 0,5-1 секунды

MOVE(x, y)   // наведёт курсор (подставте свои координаты первого круга)
WAITMS(RND(50,60))
LCLICK(x, y) // сделает клик (подставте свои координаты первого круга)

WAITMS(RND(500,1000))

MOVE(x, y)    // подставить координаты второго круга
WAITMS(RND(50,60))
LCLICK(x, y) // подставить координаты второго круга

WAITMS(500) // ждёт пол секунды и начинает всё с начала
//===========================================================================

Zimon

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Все, разобрался... Я удалил в середине END_IF в условии, при редактировании. Вернул обратно и все заработало, Огромное спасибо!!!
« Last Edit: September 21, 2016, 05:46:14 PM by Zimon »

Zimon

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Еще нужна помощь  :)
Как теперь сделать так что бы этот скрипт начал работать как только появится зеленый квадрат в заданной области (если зеленого квадрата нет, то не продолжать дальше скрипт). То есть появился зеленый квадрат, дальше начинает сканировать на наличие синего квадрата, после чего кликает на круг_1 и круг_2.

Engineer

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Такой же цикл как и для синего
Code: (clickermann) [Select]
$kvadrat=0
WHILE($kvadrat=0)
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "зелёный квадрат.bmp")
      $kvadrat=1
   ELSE
      WAIT(1)
   END_IF
END_CYC

Zimon

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Спасибо!