Author Topic: клик по пикселям  (Read 3578 times)

0 Members and 1 Guest are viewing this topic.

Piano GX

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
клик по пикселям
« on: February 27, 2016, 08:58:18 PM »
Нужно написать программу,которая считывает кол-во пикселей в данной области(команда scanpxl), а после получения данных о координатах пикселей, прокликать по очереди каждый пиксель. Я написал программу, но она бешенно стучит по одной пикселей, помогите)))

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: клик по пикселям
« Reply #1 on: February 27, 2016, 10:09:53 PM »
Все есть в шаблонах

Code: (clickermann) [Select]
GETSCREEN
SCANPXL($ARR_SCAN, 0,0, $_xmax,$_ymax, 255)

$ARR_NUM = 0
$SHIFT_X = 1 // смещение (кол-во игнор пикселов после найденного)
$SHIFT_Y = 1
WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
   $X = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   $Y = $ARR_SCAN [$ARR_NUM]
   INC($ARR_NUM,1)
   IF(($X > $X2) | ($Y > $Y2))
      $X2 = $X + $SHIFT_X
      $Y2 = $Y + $SHIFT_Y
      LCLICK($X, $Y) // Клик
      WAITMS(100)
   END_IF
END_CYC
UNDEFINE($ARR_SCAN)

Piano GX

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
Re: клик по пикселям
« Reply #2 on: February 27, 2016, 10:45:52 PM »
Большое спасибо, работает. Только я не понял, что такое SHIFT , вернее как он работает, и что вы делаете в IF

Piano GX

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
Re: клик по пикселям
« Reply #3 on: February 27, 2016, 10:57:04 PM »
ошибся, не всегда работает

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: клик по пикселям
« Reply #4 on: February 28, 2016, 07:27:36 AM »
Например на экране есть 3 красных объекта размером в 10x10 пикселей. Функция SCANPXL вернет все координаты красных пикселей. Но нам не нужно кликать в каждый пиксел на объекте, нужен лишь 1 клик.
Вот поэтому мы выставляем в параметрах
Code: (clickermann) [Select]
$SHIFT_X = 10 // смещение (кол-во игнор пикселов после найденного)
$SHIFT_Y = 10

чтобы клик пришелся только на первый пиксел а все остальные, в пределах 10x10 ниже и правее от этого пиксела, были пропущены.
Если уж тебе нужно кликать на каждый пиксел то пиши так
Code: (clickermann) [Select]
GETSCREEN
SCANPXL($ARR_SCAN, 0,0, $_xmax,$_ymax, 255)
FOR($a=0,$a<ARRSIZE($ARR_SCAN),2) // здесь в цикле мы выводим все пары координат из массива
   LCLICK($ARR_SCAN[$a], $ARR_SCAN[$a+1]) // Клик
   WAITMS(100)
END_CYC
UNDEFINE($ARR_SCAN)

Piano GX

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
Re: клик по пикселям
« Reply #5 on: February 28, 2016, 12:14:14 PM »
СПАСИБО. if_PIXEL_IN  начинает работать с левого верхнего угла ?

Piano GX

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
Re: клик по пикселям
« Reply #6 on: February 28, 2016, 01:21:53 PM »
getscreen
define($W,0)
if_pixel_in(1058,87,1180,136,2928382)  //ищет моба на карте
$W=1
end_if
IF($W=0) //выходит, если не нашёл моба
KEYPRESS(#S)
end_if

В чем проблема, он не выходит с боя, когда нет мобов

Piano GX

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
Re: клик по пикселям
« Reply #7 on: February 28, 2016, 01:30:32 PM »
ПРограмма у меня такова. если есть моб по близости, делает атаку и делает ход.
Я хочу чтобы он постоянно атаковал. а не чтобы я постоянно запускал прогу, поэтому убрал halt
И почему когда я убераю HALT , он начинает делать программу не с начала. а с конца только???
То есть не атакуя делает ход

Piano GX

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
Re: клик по пикселям
« Reply #8 on: February 28, 2016, 01:33:30 PM »
Code: (clickermann) [Select]
// New Script
// Author: Anonymous
// Version: 1.0 (27.02.2016)

#name "New Script"

// begin your script here
WAIT(2)
IF_PIXEL_IN(975,428,976,429,5587757)
KEYPRESS(#R)
END_iF
getscreen
define($w,0)
if_pixel_in(1058,87,1180,136,2928382)  //ищет моба на карте
$w=1
end_if
IF($w=0) // выходит с боя если не нашел
KEYPRESS(#S)
end_if
DEFINE($E,0)
GETSCREEN
if_pixel_in(194,86, 1049,466, 4867928, 8354971, 6709384,14540253,13224393,12829897)//смотрит моба по близости
INC($E,1)
END_IF
IF($E=0)//пропускает ход если нет моба рядом, кстати это тоже не работает
KEYPRESS($D)
END_IF
if($E>0) //атакует если нашел
getscreen
    define($a,2)
       while($a>0)
          if_pixel_in(194,86, 1049,433, 4867928, 8354971, 6709384,14540253,13224393,12829897,9013641,3092271,9474962)
lclick($_return1, $_return2)
           DEFINE($Y,$_RETURN2)
           END_IF
           inc($a,-1)
          END_CYC //убит 1 моб
          WAITMS(20)
          IF_PIXEL_IN(975,428,976,429,5587757)
KEYPRESS(#R)
END_iF
WAITMS(40)
define($B,2)     //2 моб
       while($B>0)
          if_pixel_in(194,$Y+1, 1049,433, 4867928, 8354971, 6709384,14540253,13224393,12829897,9013641,3092271,9474962)
           lclick($_return1, $_return2)
           $Y=$_RETURN2
           END_IF
           INC($B,-1)
           end_cyc
             WAITMS(20)
          IF_PIXEL_IN(975,428,976,429,5587757)
KEYPRESS(#R)
END_iF
WAITMS(40)
           WAITMS(40)
define($R,2)     //3 моб
       while($R>0)
          if_pixel_in(194,$Y+1, 1049,433, 4867928, 8354971, 6709384,14540253,13224393,12829897,9013641,3092271,9474962)
           lclick($_return1, $_return2)
           $Y=$_RETURN2
           END_IF
           INC($R,-1)
           end_cyc
             WAITMS(20)
          IF_PIXEL_IN(975,428,976,429,5587757)
KEYPRESS(#R)
END_iF
WAITMS(40)
             WAITMS(40)
define($T,2)     //4 моб
       while($R>0)
          if_pixel_in(194,$Y+1, 1049,433, 4867928, 8354971, 6709384,14540253,13224393,12829897,9013641,3092271,9474962)
           lclick($_return1, $_return2)
           $Y=$_RETURN2
           END_IF
           INC($T,-1)
           end_cyc
             WAITMS(20)
          IF_PIXEL_IN(975,428,976,429,5587757)
KEYPRESS(#R)
END_iF
WAITMS(40)
                 WAITMS(40)
define($U,2)     //5 моб
       while($R>0)
          if_pixel_in(194,$Y+1, 1049,433, 4867928, 8354971, 6709384,14540253,13224393,12829897,9013641,3092271,9474962)
           lclick($_return1, $_return2)
           $Y=$_RETURN2
           END_IF
           INC($U,-1)
           end_cyc
           WAIT(1)
KEYPRESS(#R)
     keypress(#D)  //делает ход, вот после того как убераем halt начинает, делать только эту команду
      $w=0
     wait(1)
     end_if
« Last Edit: February 28, 2016, 05:08:08 PM by Oraven »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: клик по пикселям
« Reply #9 on: February 28, 2016, 05:37:43 PM »
прежде чем искать пикселы нужно сделать снимок в буфер кликера командой GETSCREEN. У тебя первый же поиск без снимка.
DEFINE объявляет переменную но потом уже не влияет на неё, поэтому все твои переменные на втором круге остаются со старыми значениями.

Да и вообще все пишется куда проще.

Вот оптимизированный исправленный код.
Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN(975,428,976,429,5587757)
   KEYPRESS(#R)
   WAITMS(100)
END_iF

GETSCREEN
if_pixel_in(1058,87,1180,136,2928382)  //ищет моба на карте
ELSE
   KEYPRESS(#S) // выходит с боя если не нашел
   WAITMS(100)
end_if

SUB(mob,$cor_Y)
   FOR($a=0,$a<2)      //2 моб
      GETSCREEN
      if_pixel_in(194,$cor_Y, 1049,433, 4867928, 8354971, 6709384,14540253,13224393,12829897,9013641,3092271,9474962)
         lclick($_return1, $_return2)
         $Y=$_RETURN2
         WAITMS(50)
      END_IF
   END_CYC
   WAITMS(20)
   
   GETSCREEN
   IF_PIXEL_IN(975,428,976,429,5587757)
      KEYPRESS(#R)
      WAITMS(50)
   END_iF
   WAITMS(40)
END_SUB

GETSCREEN
if_pixel_in(194,86, 1049,466, 4867928, 8354971, 6709384,14540253,13224393,12829897)//смотрит моба по близости
   //атакует если нашел
   mob(86)   // 1 моб
   mob($Y+1) // 2 моб
   mob($Y+1) // 3 моб
   mob($Y+1) // 4 моб
   mob($Y+1) // 5 моб
   
   WAIT(1)
   KEYPRESS(#R)
   WAITMS(50)
   keypress(#D)  //делает ход, вот после того как убераем halt начинает, делать только эту команду
   wait(1)
ELSE
   KEYPRESS($D) //пропускает ход если нет моба рядом, кстати это тоже не работает
   WAITMS(100)
END_IF