Author Topic: Реалистичное передвижение курсора  (Read 62793 times)

0 Members and 1 Guest are viewing this topic.

WHOIM

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Реалистичное передвижение курсора
« on: September 07, 2015, 12:27:57 AM »
Делаю сборщик коробок для игры DarkOrbit. Столкнулся с такой задачей. Есть инфа, что в игре идет анализ движения мыши. И дабы не попасть в долгий бан хочу сделать более реалистичное, то есть не идеально ровное, передвижение курсора мыши. Скорость передвижения уже отрегулировал, а вот как быть с реалистичностью не пойму. Кликером пользуюсь третий день. Прошу помочь с данной задачей.

Вот часть кода:

Code: [Select]

SUB(MOVE_SLOW,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 10
   
   $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_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
   
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
   
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $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(ROUND($MOVE_X,0), ROUND($MOVE_Y,0))
      WAITMS(1)
   END_CYC
   
   MOVE($MOVE_END_X, $MOVE_END_Y)
END_SUB

IF_PIXEL_IN(*,*,*,*, *)         //НАШЛИ ЦЕЛЬ
   Move_SLOW ($_return1, $_return2)       //двигаем мышь и кликаем на цель
   WAITMS(RND(80,125))
   LDOWN ($_return1, $_return2)           //Нажать ЛКМ
   WAITMS(RND(80,125))                     //Выдержка
   LUP($_return1, $_return2)               //Отпустить ЛКМ
   WAITMS(RND(1098,1989))                   //Ждем остановки
END_IF
« Last Edit: September 07, 2015, 12:31:33 AM by WHOIM »

WHOIM

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #1 on: September 07, 2015, 12:24:39 PM »
Благодарю за новый кусочек кода. Проверил, все работает. Но все таки надо добавить и реалистичное передвижение.

Нашел похожий скрип. Только разобраться не могу как заставить его работать в моем примере.

Code: [Select]
#name "Цветок"
 
// Скрипт, рисующий(в паинте) цветок
 
$r = 100 // Радиус
$f = 24  // Форм фактор
$i = 0.3 // Смещение начала
 
while(($i*100) < 1640) // Начало цикла.
                       // Заглушка для проверки дробей
 
$x = cos($i*$f) // переход от полярных координат
$y = sin($i*$f) // к декартовым
 
$x = $x *($r-$i*$f/2) // Придание формы  спирали
$y = $y *($r-$i*$f/2) // и задание размера
 
  $x = $x + 100 + $r // Центрование
  $y = $y + 100 + $r // на холсте
 
  $x = round($x, 0) //  Округление координат
  $y = round($y, 0) //  Иначе клика не получим
 
  lclick($x, $y) // Сам клик
  waitms(50)  // Пауза: разгружает процессор
  $i = $i + 0.02  // следующая полярная координата
 
end_cyc  // Окончание цикла
 
halt // Точка выхода из скрипта

Еще вопрос. Как заставить подпрограмму повторяться определенное или рандомное кол-во раз.

Code: [Select]
SUB(LEFT FIND UP)
PIXELFINDx2()
LEFT UP()
PIXELFINDx2()
LEFT UP()
WAIT(RND(2,3))
END_SUB

LEFT FIND UP()
« Last Edit: September 07, 2015, 01:01:39 PM by WHOIM »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #2 on: September 07, 2015, 03:52:44 PM »
Quote
Но все таки надо добавить и реалистичное передвижение.
не знаю насколько реалистичное, но вот, добавил движение по синусу.
Code: (clickermann) [Select]
SUB(MOVE_SLOW,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 20
   $MOVE_WAVE = 1 //длина волны
   $MOVE_AMPL = 30  //амплитуда
   
   $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_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
   
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
   
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
   
   IF($MOVE_END_X-$MOVE_Start_X > 0)
      $MOVE_X_X0 = $MOVE_END_X-$MOVE_Start_X
   else
      $MOVE_X_X0 = $MOVE_Start_X - $MOVE_END_X
   END_IF
   IF($MOVE_END_Y-$MOVE_Start_Y > 0)
      $MOVE_Y_Y0 = $MOVE_END_Y-$MOVE_Start_Y
   else
      $MOVE_Y_Y0 = $MOVE_Start_Y - $MOVE_END_Y
   END_IF
   
   IF($MOVE_X_X0 > $MOVE_Y_Y0)
      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
         $MOVE_X = $MOVE_X + $MOVE_X_step
         $MOVE_Y = $MOVE_Y + $MOVE_Y_step                 
         MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y+(sin($MOVE_i*$MOVE_WAVE)*$MOVE_AMPL),0))
         WAITMS(1)
      END_CYC
   ELSE
      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
         $MOVE_X = $MOVE_X + $MOVE_X_step
         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
         MOVE(ROUND($MOVE_X+(sin($MOVE_i*$MOVE_WAVE)*$MOVE_AMPL),0), ROUND($MOVE_Y,0))
         WAITMS(1)
      END_CYC
   END_IF
   
   //   MOVE($MOVE_END_X, $MOVE_END_Y)   
END_SUB
изза такого движения, финишные координаты курсора немного не будут соответствовать заявленным в вызове подпрограммы. чем меньше амплитуда, тем точнее конечные координаты.

Quote
Еще вопрос. Как заставить подпрограмму повторяться определенное или рандомное кол-во раз.
Code: (clickermann) [Select]
SUB(LEFT FIND UP)
   PIXELFINDx2()
   LEFT UP()
   PIXELFINDx2()
   LEFT UP()
   WAIT(RND(2,3))
END_SUB


FOR($a=0,$a<3) // повторяем 3 раза
   LEFT FIND UP()
END_CYC

//или

FOR($a=0,$a<RND(1,4)) // повторяем 1, 2, 3 или 4 раза
   LEFT FIND UP()
END_CYC
« Last Edit: September 08, 2015, 12:01:35 AM by dramster »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #3 on: September 08, 2015, 03:49:59 PM »
вот более реалистичное передвижение с рандомным отклонением от прямой
Code: (clickermann) [Select]
SUB(MOVE_SLOW,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 20
   $MOVE_WAVE = 10//длина волны
   $MOVE_AMPL = 30  //максимальная амплитуда
   
   $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_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
   
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
   
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
   
   IF($MOVE_END_X-$MOVE_Start_X > 0)
      $MOVE_X_X0 = $MOVE_END_X-$MOVE_Start_X
   else
      $MOVE_X_X0 = $MOVE_Start_X - $MOVE_END_X
   END_IF
   IF($MOVE_END_Y-$MOVE_Start_Y > 0)
      $MOVE_Y_Y0 = $MOVE_END_Y-$MOVE_Start_Y
   else
      $MOVE_Y_Y0 = $MOVE_Start_Y - $MOVE_END_Y
   END_IF
   
   
   $RAND=0
   
   IF($MOVE_X_X0 > $MOVE_Y_Y0)
      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
         
         IF($RAND < 0)
            $RAND_mod=(-1)*$RAND
         else
            $RAND_mod=$RAND
         END_IF
         
         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
            IF($WAVE>$MOVE_WAVE)
               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
                  $STEP=rnd(-1,1)
                  $RAND=$RAND+$STEP
               ELSE
                  IF($RAND = $MOVE_AMPL)
                     $STEP=rnd(-1,0)
                     $RAND=$RAND+$STEP
                  else
                     $STEP=rnd(0,1)
                     $RAND=$RAND+$STEP
                  END_IF
               END_IF
               $WAVE=0
            else
               inc($WAVE)
            END_IF
         ELSE
            IF($RAND < INT($MOVE_step)-$MOVE_i)
               $STEP=1
               $RAND=$RAND+$STEP
            ELSE
               $STEP=-1
               $RAND=$RAND+$STEP
            END_IF
         END_IF
         
         $MOVE_X = $MOVE_X + $MOVE_X_step
         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
         MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0)+$RAND)
         WAITMS(1)
      END_CYC
   ELSE
      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
         
         IF($RAND < 0)
            $RAND_mod=-$RAND
         else
            $RAND_mod=$RAND
         END_IF
         
         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
            IF($WAVE>$MOVE_WAVE)
               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
                  $STEP=rnd(-1,1)
                  $RAND=$RAND+$STEP
               ELSE
                  IF($RAND = $MOVE_AMPL)
                     $STEP=rnd(-1,0)
                     $RAND=$RAND+$STEP
                  else
                     $STEP=rnd(0,1)
                     $RAND=$RAND+$STEP
                  END_IF
               END_IF
               $WAVE=0
            else
               inc($WAVE)
            END_IF
         ELSE
            IF($RAND < INT($MOVE_step)-$MOVE_i)
               $STEP=1
               $RAND=$RAND+$STEP
            ELSE
               $STEP=-1
               $RAND=$RAND+$STEP
            END_IF
         END_IF
         
         $MOVE_X = $MOVE_X + $MOVE_X_step
         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
         MOVE(ROUND($MOVE_X,0)+$RAND, ROUND($MOVE_Y,0))
         WAITMS(1)
      END_CYC
   END_IF
   MOVE($MOVE_END_X,$MOVE_END_Y)
END_SUB

и финишные координаты по любому ие что надо.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #4 on: September 08, 2015, 06:58:15 PM »
Можно конечно ещё заморочиться.
Code: (clickermann) [Select]
SUB (m-move_s, $MOVE_END_X, $MOVE_END_Y, $MOVE_SPEED)
   $MOVE_WAVE = 10//длина волны
   $MOVE_AMPL = 30  //максимальная амплитуда
   
   $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_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
   
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
   
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
   
   IF($MOVE_END_X-$MOVE_Start_X > 0)
      $MOVE_X_X0 = $MOVE_END_X-$MOVE_Start_X
   else
      $MOVE_X_X0 = $MOVE_Start_X - $MOVE_END_X
   END_IF
   IF($MOVE_END_Y-$MOVE_Start_Y > 0)
      $MOVE_Y_Y0 = $MOVE_END_Y-$MOVE_Start_Y
   else
      $MOVE_Y_Y0 = $MOVE_Start_Y - $MOVE_END_Y
   END_IF
   
   
   $RAND=0
   
   IF($MOVE_X_X0 > $MOVE_Y_Y0)
      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
         
         IF($RAND < 0)
            $RAND_mod=(-1)*$RAND
         else
            $RAND_mod=$RAND
         END_IF
         
         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
            IF($WAVE>$MOVE_WAVE)
               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
                  $STEP=rnd(-1,1)
                  $RAND=$RAND+$STEP
               ELSE
                  IF($RAND = $MOVE_AMPL)
                     $STEP=rnd(-1,0)
                     $RAND=$RAND+$STEP
                  else
                     $STEP=rnd(0,1)
                     $RAND=$RAND+$STEP
                  END_IF
               END_IF
               $WAVE=0
            else
               inc($WAVE)
            END_IF
         ELSE
            IF($RAND < INT($MOVE_step)-$MOVE_i)
               $STEP=1
               $RAND=$RAND+$STEP
            ELSE
               $STEP=-1
               $RAND=$RAND+$STEP
            END_IF
         END_IF
         
         $MOVE_X = $MOVE_X + $MOVE_X_step
         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
         MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0)+$RAND)
         WAITMS(1)
      END_CYC
   ELSE
      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
         
         IF($RAND < 0)
            $RAND_mod=-$RAND
         else
            $RAND_mod=$RAND
         END_IF
         
         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
            IF($WAVE>$MOVE_WAVE)
               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
                  $STEP=rnd(-1,1)
                  $RAND=$RAND+$STEP
               ELSE
                  IF($RAND = $MOVE_AMPL)
                     $STEP=rnd(-1,0)
                     $RAND=$RAND+$STEP
                  else
                     $STEP=rnd(0,1)
                     $RAND=$RAND+$STEP
                  END_IF
               END_IF
               $WAVE=0
            else
               inc($WAVE)
            END_IF
         ELSE
            IF($RAND < INT($MOVE_step)-$MOVE_i)
               $STEP=1
               $RAND=$RAND+$STEP
            ELSE
               $STEP=-1
               $RAND=$RAND+$STEP
            END_IF
         END_IF
         
         $MOVE_X = $MOVE_X + $MOVE_X_step
         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
         MOVE(ROUND($MOVE_X,0)+$RAND, ROUND($MOVE_Y,0))
         WAITMS(1)
      END_CYC
   END_IF
   MOVE($MOVE_END_X,$MOVE_END_Y)
END_SUB

SUB (m-move2, $MOVE_E_X, $MOVE_E_Y)
   $raznx = ABS($_xmouse - $MOVE_E_X)
   $razny = ABS($_ymouse - $MOVE_E_Y)
   FOR($iter_move=20, $iter_move > 0, RND(-19,-6))
      $procx = INT($raznx/$iter_move)
      $procy = INT($razny/$iter_move)
      $ttx = $MOVE_E_X + RND(0,$procx)*RNDFROM(-1,1)
      $tty = $MOVE_E_Y + RND(0,$procy)*RNDFROM(-1,1)
      IF($ttx < 1)
         $ttx = RND(5,$procx)
      ELSE
         IF($ttx > ($_xmax-3))
            $ttx = $_xmax - RND(5,$procx)
         END_IF
      END_IF
      IF($tty < 1)
         $tty = RND(5,$procy)
      ELSE
         IF($tty > ($_ymax-3))
            $tty = $_ymax - RND(5,$procy)
         END_IF
      END_IF
      IF($iter_move=20)
         $SPEED = RND(16,20)
      ELSE
         $SPEED = 50
      END_IF
     
      m-move_s($ttx,$tty,$SPEED)
   END_CYC
   WAITMS(RND(50,300))
   m-move_s($MOVE_E_X, $MOVE_E_Y,0)
END_SUB

m-move2(150, 150)
WAITMS(500)
m-move2(1020, 370)
HALT


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #5 on: September 08, 2015, 07:58:28 PM »
ABS()  :o :-\? такого в справке нету. всегда приходилось проверять условиями и присваивать значение другим переменным. может я еще чегото не знаю??

WHOIM

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #6 on: September 09, 2015, 12:51:58 AM »
dramster, Vint, благодарю за помощь. Взял скрипт dramster. Vint, скрипт который ты отправил хорош, но чересчур нереалистичный. Прикреплю скрин из пеинта, дабы показать разницу.

Code: [Select]
LDOWN(185,197)
MOVE(165,391)
WAITMS(500)
MOVE(506,770)
LUP($_xmouse,$_ymouse)
WAIT(1)

LDOWN(385,197)
MOVE_SLOW(365,391)
WAITMS(500)
MOVE_SLOW(706,770)
LUP($_xmouse,$_ymouse)
WAIT(1)

LDOWN(585,197)
m-move2(565,391)
WAITMS(500)
m-move2(906,770)
LUP($_xmouse,$_ymouse)
HALT

Повторил код около 5 раз в разных цветах. Кружками обвел начало и конец линий. 1 линия скрипт MOVE. 2 линия скрипт dramster. 3 линия скрипт Vint. А в идеале должно быть как на 4 линии. Ее я нарисовал сам  :)

« Last Edit: September 09, 2015, 12:57:44 AM by WHOIM »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #7 on: September 09, 2015, 07:02:04 AM »
Все оказалось куда проще  ;D Нужно просто добавить рандом в момент перемещения курсора.

Вот что вышло, надеюсь это реалистично?!
Code: (clickermann) [Select]
// подпрограмма обязательно выше вызова
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 1  // множитель скорости
     
   $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_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
   
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
   
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $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(ROUND($MOVE_X,0)+RND(-5,5), ROUND($MOVE_Y,0)+RND(-5,5)) // добавляем рандом
      WAITMS(1)
   END_CYC
   
   MOVE($MOVE_END_X, $MOVE_END_Y) //Передвинуть окончательно в заданную точку
END_SUB



// образец строки MOVE
MOVE(520,380)  // точка 1

LDOWN(520,380) // рисуем

mouse_move(523,602)  // точка 2

mouse_move(637,834) // точка 3

LUP(637,834) // отпускаем

HALT // стоп



Вот еще вариант с промежуточной случайно отклоняющейся точкой
Code: (clickermann) [Select]
// подпрограмма обязательно выше вызова
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 1  // множитель скорости
   
   $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_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
   
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
   
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $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(ROUND($MOVE_X,0)+RND(-2,2), ROUND($MOVE_Y,0)+RND(-2,2)) // добавляем рандом
      WAITMS(1)
   END_CYC
   
END_SUB

SUB(m_move,$M_X,$M_Y)
   $MOVE_MID_X = ($_xmouse+$M_X)/2
   $MOVE_MID_Y = ($_ymouse+$M_Y)/2
   mouse_move($MOVE_MID_X+RND(-30,30),$MOVE_MID_Y+RND(-30,30))
   mouse_move($M_X,$M_Y)
   MOVE($M_X,$M_Y) //Передвинуть окончательно в заданную точку
END_SUB



// образец строки MOVE
MOVE(520,380)  // точка 1

LDOWN(520,380) // рисуем

m_move(637,834) // передвигаем

LUP(637,834) // отпускаем

HALT // стоп
« Last Edit: September 09, 2015, 07:39:19 AM by Oraven »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #8 on: September 09, 2015, 10:39:32 AM »
да, такие рандомные отклонения будут хорошо себя вести на максимальной скорости, где шаг перемещения 40-60пикс. но если поставить скорость на минимум, то курсор будет отклоняться не только со стороны в сторону, но и в зад в перед.
я себе еще ломал немного голову чтобы при перемещении по диагонали, смещятся также и по диагонали перпендикулярно нашему движению, чтобы не было перескоков через пиксели :D, но подумал, что это будет слишком.

хотя, пока писал этот пост, подумал что не так уж это и сложно. мы знаем катеты - корень из суммы квадратов $MOVE_X_step и Y_step это один катет(он у нас будет постоянным на все передвижение), второй это =1, узнаем гипотенузу, и както находим координаты точки в плоскости. и тогда при минимальной скорости передвижения, перескоков через пиксели не должно быть. но наверно это будет лишним.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #9 on: September 09, 2015, 01:17:13 PM »
да, такие рандомные отклонения будут хорошо себя вести на максимальной скорости, где шаг перемещения 40-60пикс. но если поставить скорость на минимум, то курсор будет отклоняться не только со стороны в сторону, но и в зад в перед.

В том и смысл рандома! Все что нужно это добиться чтоб курсор ездил не как по линейке а немного коряво. Кроме того нужна именно высокая скорость, потому что ты там все коробки (в дарк орбит) пропустишь пока доведешь курсор куда нужно.

WHOIM

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #10 on: September 09, 2015, 03:19:45 PM »
да, такие рандомные отклонения будут хорошо себя вести на максимальной скорости, где шаг перемещения 40-60пикс. но если поставить скорость на минимум, то курсор будет отклоняться не только со стороны в сторону, но и в зад в перед.

В том и смысл рандома! Все что нужно это добиться чтоб курсор ездил не как по линейке а немного коряво. Кроме того нужна именно высокая скорость, потому что ты там все коробки (в дарк орбит) пропустишь пока доведешь курсор куда нужно.

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

Такой подход добавляет больше человечности в скрипт. Ведь люди тоже не попадают с первого раза, а иногда и со второго. Плюс скорость движения ни в коем случае не должна превышать "человеческую". Если в игре стоит тех анализ поведения игроков (а он скорее всего стоит), то скорость перемещения и клика будут самые основные показатели, выявляющие "читеров".  ;)

Если возможно заставить адекватно работать последний скрип на скорости от 6 до 8, дабы добавить рандом, буду премного благодарен.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #11 on: September 09, 2015, 04:46:18 PM »
Вот последняя редакция с рандомом
Code: (clickermann) [Select]
// подпрограмма обязательно выше вызова
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 1  // множитель скорости (отвечает за количество точек)
   
   $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_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
   
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
   
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $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(ROUND($MOVE_X,0)+RND(-2,2), ROUND($MOVE_Y,0)+RND(-2,2)) // добавляем рандом
      WAITMS($rnwait) // задержка при движении по точкам
   END_CYC
   
END_SUB

SUB(m_move,$M_X,$M_Y)
   $rnwait = RND(6,15) // случайная скорость
   $MOVE_MID_X = ($_xmouse+$M_X)/2
   $MOVE_MID_Y = ($_ymouse+$M_Y)/2
   mouse_move($MOVE_MID_X+RND(-30,30),$MOVE_MID_Y+RND(-30,30))
   mouse_move($M_X,$M_Y)
   MOVE($M_X,$M_Y) //Передвинуть окончательно в заданную точку
END_SUB

LDOWN(226,265) // рисуем
$MS = $_ms // засекаем время

m_move(839,989) // передвигаем

LUP(839,989) // отпускаем
LOGWRITE ($_ms-$MS, " - ", $rnwait)

HALT // стоп

Время передвижения на картинке занимает от 330 до 730 мс что вполне реалистично.
Code: [Select]
17:35:40 509 - 9
17:35:43 606 - 12
17:35:47 525 - 10
17:35:49 589 - 11
17:36:03 425 - 8
17:36:04 378 - 7
17:36:05 520 - 10
17:36:07 686 - 14
17:36:10 430 - 8
17:36:11 351 - 6
17:36:13 467 - 9
17:36:14 606 - 12
17:36:15 640 - 13
17:36:17 523 - 10
17:36:18 549 - 11
17:36:19 344 - 6
17:36:20 348 - 6
17:36:21 730 - 15

« Last Edit: September 09, 2015, 04:49:04 PM by Oraven »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #12 on: September 09, 2015, 06:05:20 PM »
что то я загнался этим передвижением  :D . и чето подумал, а от чего же зависит скорость передвижения курсора в системе? как оказалось, она зависит только лиш (ну или почти) от шага $MOVE_step. а обновляться местоположение должно в пределах 4-7мс. в изначальном варианте стоит задержка 1мс ($rnwait), и это, как оказывается, маловато. и скорее всего менять эту задержку не желательно, а менять скорость передвижение только шагом $MOVE_step.
проверял так
Code: (clickermann) [Select]
wait(1)
print("бот")
m_move(910,540)
print("не бот")// начинаем дергать мышкай
wait(5)
halt


THREAD(thr_name)
   WHILE(1)
      $t=$_ms
      $x=$_xmouse
      $y=$_ymouse
      WHILE(($x=$_xmouse)&($y=$_ymouse))
         waitms(1)
      END_CYC
      print($_ms-$t)
   END_CYC
END_THREAD
у меня показало : там где бот - ($rnwait+-1);  там где не бот - в пределах 3-7 мс (в основном 4-6 мс), не зависимо от скорости дергания(конечно если не слишком медленно). возможно это только у меня так, а возможно что эта задержка и не играет никакой роли    :D

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #13 on: September 09, 2015, 06:16:47 PM »
Вряд ли игра снимает положение курсора каждую миллисекунду, это большая нагрузка. Достаточно это делать раз в несколько десятков мс. чтобы понять что курсором водят по экрану а не прыгают мгновенно из точки в точку.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #14 on: September 10, 2015, 07:26:09 AM »
что то я загнался этим передвижением  :D . и чето подумал, а от чего же зависит скорость передвижения курсора в системе? как оказалось, она зависит только лиш (ну или почти) от шага $MOVE_step.

Так я на основе этого и писал mouse_move. Скорость только шагом.