Автор Тема: Реалистичное передвижение курсора  (Прочитано 46126 раз)

0 Пользователей и 1 Гость просматривают эту тему.

WHOIM

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

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


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
« Последнее редактирование: Сентябрь 07, 2015, 12:31:33 am от WHOIM »

WHOIM

  • Зашел в гости
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #1 : Сентябрь 07, 2015, 12:24:39 pm »
Благодарю за новый кусочек кода. Проверил, все работает. Но все таки надо добавить и реалистичное передвижение.

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

#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 // Точка выхода из скрипта

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

SUB(LEFT FIND UP)
PIXELFINDx2()
LEFT UP()
PIXELFINDx2()
LEFT UP()
WAIT(RND(2,3))
END_SUB

LEFT FIND UP()
« Последнее редактирование: Сентябрь 07, 2015, 01:01:39 pm от WHOIM »

dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #2 : Сентябрь 07, 2015, 03:52:44 pm »
Цитировать
Но все таки надо добавить и реалистичное передвижение.
не знаю насколько реалистичное, но вот, добавил движение по синусу.
Код: Clickermann
  1. SUB(MOVE_SLOW,$MOVE_END_X,$MOVE_END_Y)
  2.   $MOVE_SPEED = 20
  3.   $MOVE_WAVE = 1 //длина волны
  4.   $MOVE_AMPL = 30  //амплитуда
  5.  
  6.   $MOVE_Start_X = $_xmouse
  7.   $MOVE_Start_Y = $_ymouse
  8.   $MOVE_X = $MOVE_Start_X
  9.   $MOVE_Y = $MOVE_Start_Y
  10.  
  11.   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
  12.  
  13.   $MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
  14.  
  15.   IF($MOVE_SPEEDVAR < 1)
  16.      $MOVE_SPEEDVAR = 1
  17.   END_IF
  18.  
  19.   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
  20.   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
  21.   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
  22.  
  23.   IF($MOVE_END_X-$MOVE_Start_X > 0)
  24.      $MOVE_X_X0 = $MOVE_END_X-$MOVE_Start_X
  25.   else
  26.      $MOVE_X_X0 = $MOVE_Start_X - $MOVE_END_X
  27.   END_IF
  28.   IF($MOVE_END_Y-$MOVE_Start_Y > 0)
  29.      $MOVE_Y_Y0 = $MOVE_END_Y-$MOVE_Start_Y
  30.   else
  31.      $MOVE_Y_Y0 = $MOVE_Start_Y - $MOVE_END_Y
  32.   END_IF
  33.  
  34.   IF($MOVE_X_X0 > $MOVE_Y_Y0)
  35.      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
  36.         $MOVE_X = $MOVE_X + $MOVE_X_step
  37.         $MOVE_Y = $MOVE_Y + $MOVE_Y_step                  
  38.         MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y+(sin($MOVE_i*$MOVE_WAVE)*$MOVE_AMPL),0))
  39.         WAITMS(1)
  40.      END_CYC
  41.   ELSE
  42.      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
  43.         $MOVE_X = $MOVE_X + $MOVE_X_step
  44.         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
  45.         MOVE(ROUND($MOVE_X+(sin($MOVE_i*$MOVE_WAVE)*$MOVE_AMPL),0), ROUND($MOVE_Y,0))
  46.         WAITMS(1)
  47.      END_CYC
  48.   END_IF
  49.  
  50.   //   MOVE($MOVE_END_X, $MOVE_END_Y)  
  51. END_SUB
изза такого движения, финишные координаты курсора немного не будут соответствовать заявленным в вызове подпрограммы. чем меньше амплитуда, тем точнее конечные координаты.

Цитировать
Еще вопрос. Как заставить подпрограмму повторяться определенное или рандомное кол-во раз.
Код: Clickermann
  1. SUB(LEFT FIND UP)
  2.   PIXELFINDx2()
  3.   LEFT UP()
  4.   PIXELFINDx2()
  5.   LEFT UP()
  6.   WAIT(RND(2,3))
  7. END_SUB
  8.  
  9.  
  10. FOR($a=0,$a<3) // повторяем 3 раза
  11.   LEFT FIND UP()
  12. END_CYC
  13.  
  14. //или
  15.  
  16. FOR($a=0,$a<RND(1,4)) // повторяем 1, 2, 3 или 4 раза
  17.   LEFT FIND UP()
  18. END_CYC
« Последнее редактирование: Сентябрь 08, 2015, 12:01:35 am от dramster »

dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #3 : Сентябрь 08, 2015, 03:49:59 pm »
вот более реалистичное передвижение с рандомным отклонением от прямой
Код: Clickermann
  1. SUB(MOVE_SLOW,$MOVE_END_X,$MOVE_END_Y)
  2.   $MOVE_SPEED = 20
  3.   $MOVE_WAVE = 10//длина волны
  4.   $MOVE_AMPL = 30  //максимальная амплитуда
  5.  
  6.   $MOVE_Start_X = $_xmouse
  7.   $MOVE_Start_Y = $_ymouse
  8.   $MOVE_X = $MOVE_Start_X
  9.   $MOVE_Y = $MOVE_Start_Y
  10.  
  11.   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
  12.  
  13.   $MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
  14.  
  15.   IF($MOVE_SPEEDVAR < 1)
  16.      $MOVE_SPEEDVAR = 1
  17.   END_IF
  18.  
  19.   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
  20.   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
  21.   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
  22.  
  23.   IF($MOVE_END_X-$MOVE_Start_X > 0)
  24.      $MOVE_X_X0 = $MOVE_END_X-$MOVE_Start_X
  25.   else
  26.      $MOVE_X_X0 = $MOVE_Start_X - $MOVE_END_X
  27.   END_IF
  28.   IF($MOVE_END_Y-$MOVE_Start_Y > 0)
  29.      $MOVE_Y_Y0 = $MOVE_END_Y-$MOVE_Start_Y
  30.   else
  31.      $MOVE_Y_Y0 = $MOVE_Start_Y - $MOVE_END_Y
  32.   END_IF
  33.  
  34.  
  35.   $RAND=0
  36.  
  37.   IF($MOVE_X_X0 > $MOVE_Y_Y0)
  38.      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
  39.  
  40.         IF($RAND < 0)
  41.            $RAND_mod=(-1)*$RAND
  42.         else
  43.            $RAND_mod=$RAND
  44.         END_IF
  45.  
  46.         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
  47.            IF($WAVE>$MOVE_WAVE)
  48.               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
  49.                  $STEP=rnd(-1,1)
  50.                  $RAND=$RAND+$STEP
  51.               ELSE
  52.                  IF($RAND = $MOVE_AMPL)
  53.                     $STEP=rnd(-1,0)
  54.                     $RAND=$RAND+$STEP
  55.                  else
  56.                     $STEP=rnd(0,1)
  57.                     $RAND=$RAND+$STEP
  58.                  END_IF
  59.               END_IF
  60.               $WAVE=0
  61.            else
  62.               inc($WAVE)
  63.            END_IF
  64.         ELSE
  65.            IF($RAND < INT($MOVE_step)-$MOVE_i)
  66.               $STEP=1
  67.               $RAND=$RAND+$STEP
  68.            ELSE
  69.               $STEP=-1
  70.               $RAND=$RAND+$STEP
  71.            END_IF
  72.         END_IF
  73.  
  74.         $MOVE_X = $MOVE_X + $MOVE_X_step
  75.         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
  76.         MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0)+$RAND)
  77.         WAITMS(1)
  78.      END_CYC
  79.   ELSE
  80.      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
  81.  
  82.         IF($RAND < 0)
  83.            $RAND_mod=-$RAND
  84.         else
  85.            $RAND_mod=$RAND
  86.         END_IF
  87.  
  88.         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
  89.            IF($WAVE>$MOVE_WAVE)
  90.               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
  91.                  $STEP=rnd(-1,1)
  92.                  $RAND=$RAND+$STEP
  93.               ELSE
  94.                  IF($RAND = $MOVE_AMPL)
  95.                     $STEP=rnd(-1,0)
  96.                     $RAND=$RAND+$STEP
  97.                  else
  98.                     $STEP=rnd(0,1)
  99.                     $RAND=$RAND+$STEP
  100.                  END_IF
  101.               END_IF
  102.               $WAVE=0
  103.            else
  104.               inc($WAVE)
  105.            END_IF
  106.         ELSE
  107.            IF($RAND < INT($MOVE_step)-$MOVE_i)
  108.               $STEP=1
  109.               $RAND=$RAND+$STEP
  110.            ELSE
  111.               $STEP=-1
  112.               $RAND=$RAND+$STEP
  113.            END_IF
  114.         END_IF
  115.  
  116.         $MOVE_X = $MOVE_X + $MOVE_X_step
  117.         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
  118.         MOVE(ROUND($MOVE_X,0)+$RAND, ROUND($MOVE_Y,0))
  119.         WAITMS(1)
  120.      END_CYC
  121.   END_IF
  122.   MOVE($MOVE_END_X,$MOVE_END_Y)
  123. END_SUB

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3802
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #4 : Сентябрь 08, 2015, 06:58:15 pm »
Можно конечно ещё заморочиться.
Код: Clickermann
  1. SUB (m-move_s, $MOVE_END_X, $MOVE_END_Y, $MOVE_SPEED)
  2.   $MOVE_WAVE = 10//длина волны
  3.   $MOVE_AMPL = 30  //максимальная амплитуда
  4.  
  5.   $MOVE_Start_X = $_xmouse
  6.   $MOVE_Start_Y = $_ymouse
  7.   $MOVE_X = $MOVE_Start_X
  8.   $MOVE_Y = $MOVE_Start_Y
  9.  
  10.   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
  11.  
  12.   $MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
  13.  
  14.   IF($MOVE_SPEEDVAR < 1)
  15.      $MOVE_SPEEDVAR = 1
  16.   END_IF
  17.  
  18.   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
  19.   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
  20.   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
  21.  
  22.   IF($MOVE_END_X-$MOVE_Start_X > 0)
  23.      $MOVE_X_X0 = $MOVE_END_X-$MOVE_Start_X
  24.   else
  25.      $MOVE_X_X0 = $MOVE_Start_X - $MOVE_END_X
  26.   END_IF
  27.   IF($MOVE_END_Y-$MOVE_Start_Y > 0)
  28.      $MOVE_Y_Y0 = $MOVE_END_Y-$MOVE_Start_Y
  29.   else
  30.      $MOVE_Y_Y0 = $MOVE_Start_Y - $MOVE_END_Y
  31.   END_IF
  32.  
  33.  
  34.   $RAND=0
  35.  
  36.   IF($MOVE_X_X0 > $MOVE_Y_Y0)
  37.      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
  38.  
  39.         IF($RAND < 0)
  40.            $RAND_mod=(-1)*$RAND
  41.         else
  42.            $RAND_mod=$RAND
  43.         END_IF
  44.  
  45.         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
  46.            IF($WAVE>$MOVE_WAVE)
  47.               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
  48.                  $STEP=rnd(-1,1)
  49.                  $RAND=$RAND+$STEP
  50.               ELSE
  51.                  IF($RAND = $MOVE_AMPL)
  52.                     $STEP=rnd(-1,0)
  53.                     $RAND=$RAND+$STEP
  54.                  else
  55.                     $STEP=rnd(0,1)
  56.                     $RAND=$RAND+$STEP
  57.                  END_IF
  58.               END_IF
  59.               $WAVE=0
  60.            else
  61.               inc($WAVE)
  62.            END_IF
  63.         ELSE
  64.            IF($RAND < INT($MOVE_step)-$MOVE_i)
  65.               $STEP=1
  66.               $RAND=$RAND+$STEP
  67.            ELSE
  68.               $STEP=-1
  69.               $RAND=$RAND+$STEP
  70.            END_IF
  71.         END_IF
  72.  
  73.         $MOVE_X = $MOVE_X + $MOVE_X_step
  74.         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
  75.         MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0)+$RAND)
  76.         WAITMS(1)
  77.      END_CYC
  78.   ELSE
  79.      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
  80.  
  81.         IF($RAND < 0)
  82.            $RAND_mod=-$RAND
  83.         else
  84.            $RAND_mod=$RAND
  85.         END_IF
  86.  
  87.         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
  88.            IF($WAVE>$MOVE_WAVE)
  89.               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
  90.                  $STEP=rnd(-1,1)
  91.                  $RAND=$RAND+$STEP
  92.               ELSE
  93.                  IF($RAND = $MOVE_AMPL)
  94.                     $STEP=rnd(-1,0)
  95.                     $RAND=$RAND+$STEP
  96.                  else
  97.                     $STEP=rnd(0,1)
  98.                     $RAND=$RAND+$STEP
  99.                  END_IF
  100.               END_IF
  101.               $WAVE=0
  102.            else
  103.               inc($WAVE)
  104.            END_IF
  105.         ELSE
  106.            IF($RAND < INT($MOVE_step)-$MOVE_i)
  107.               $STEP=1
  108.               $RAND=$RAND+$STEP
  109.            ELSE
  110.               $STEP=-1
  111.               $RAND=$RAND+$STEP
  112.            END_IF
  113.         END_IF
  114.  
  115.         $MOVE_X = $MOVE_X + $MOVE_X_step
  116.         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
  117.         MOVE(ROUND($MOVE_X,0)+$RAND, ROUND($MOVE_Y,0))
  118.         WAITMS(1)
  119.      END_CYC
  120.   END_IF
  121.   MOVE($MOVE_END_X,$MOVE_END_Y)
  122. END_SUB
  123.  
  124. SUB (m-move2, $MOVE_E_X, $MOVE_E_Y)
  125.   $raznx = ABS($_xmouse - $MOVE_E_X)
  126.   $razny = ABS($_ymouse - $MOVE_E_Y)
  127.   FOR($iter_move=20, $iter_move > 0, RND(-19,-6))
  128.      $procx = INT($raznx/$iter_move)
  129.      $procy = INT($razny/$iter_move)
  130.      $ttx = $MOVE_E_X + RND(0,$procx)*RNDFROM(-1,1)
  131.      $tty = $MOVE_E_Y + RND(0,$procy)*RNDFROM(-1,1)
  132.      IF($ttx < 1)
  133.         $ttx = RND(5,$procx)
  134.      ELSE
  135.         IF($ttx > ($_xmax-3))
  136.            $ttx = $_xmax - RND(5,$procx)
  137.         END_IF
  138.      END_IF
  139.      IF($tty < 1)
  140.         $tty = RND(5,$procy)
  141.      ELSE
  142.         IF($tty > ($_ymax-3))
  143.            $tty = $_ymax - RND(5,$procy)
  144.         END_IF
  145.      END_IF
  146.      IF($iter_move=20)
  147.         $SPEED = RND(16,20)
  148.      ELSE
  149.         $SPEED = 50
  150.      END_IF
  151.  
  152.      m-move_s($ttx,$tty,$SPEED)
  153.   END_CYC
  154.   WAITMS(RND(50,300))
  155.   m-move_s($MOVE_E_X, $MOVE_E_Y,0)
  156. END_SUB
  157.  
  158. m-move2(150, 150)
  159. WAITMS(500)
  160. m-move2(1020, 370)
  161. HALT


dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #5 : Сентябрь 08, 2015, 07:58:28 pm »
ABS()  :o :-\? такого в справке нету. всегда приходилось проверять условиями и присваивать значение другим переменным. может я еще чегото не знаю??

WHOIM

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

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 линии. Ее я нарисовал сам  :)

« Последнее редактирование: Сентябрь 09, 2015, 12:57:44 am от WHOIM »

Oraven

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

Вот что вышло, надеюсь это реалистично?!
Код: Clickermann
  1. // подпрограмма обязательно выше вызова
  2. SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
  3.   $MOVE_SPEED = 1  // множитель скорости
  4.  
  5.   $MOVE_Start_X = $_xmouse
  6.   $MOVE_Start_Y = $_ymouse
  7.   $MOVE_X = $MOVE_Start_X
  8.   $MOVE_Y = $MOVE_Start_Y
  9.  
  10.   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
  11.  
  12.   $MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
  13.  
  14.   IF($MOVE_SPEEDVAR < 1)
  15.      $MOVE_SPEEDVAR = 1
  16.   END_IF
  17.  
  18.   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
  19.   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
  20.   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
  21.  
  22.   FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
  23.      $MOVE_X = $MOVE_X + $MOVE_X_step
  24.      $MOVE_Y = $MOVE_Y + $MOVE_Y_step
  25.      MOVE(ROUND($MOVE_X,0)+RND(-5,5), ROUND($MOVE_Y,0)+RND(-5,5)) // добавляем рандом
  26.      WAITMS(1)
  27.   END_CYC
  28.  
  29.   MOVE($MOVE_END_X, $MOVE_END_Y) //Передвинуть окончательно в заданную точку
  30. END_SUB
  31.  
  32.  
  33.  
  34. // образец строки MOVE
  35. MOVE(520,380)  // точка 1
  36.  
  37. LDOWN(520,380) // рисуем
  38.  
  39. mouse_move(523,602)  // точка 2
  40.  
  41. mouse_move(637,834) // точка 3
  42.  
  43. LUP(637,834) // отпускаем
  44.  
  45. HALT // стоп



Вот еще вариант с промежуточной случайно отклоняющейся точкой
Код: Clickermann
  1. // подпрограмма обязательно выше вызова
  2. SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
  3.   $MOVE_SPEED = 1  // множитель скорости
  4.  
  5.   $MOVE_Start_X = $_xmouse
  6.   $MOVE_Start_Y = $_ymouse
  7.   $MOVE_X = $MOVE_Start_X
  8.   $MOVE_Y = $MOVE_Start_Y
  9.  
  10.   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
  11.  
  12.   $MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
  13.  
  14.   IF($MOVE_SPEEDVAR < 1)
  15.      $MOVE_SPEEDVAR = 1
  16.   END_IF
  17.  
  18.   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
  19.   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
  20.   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
  21.  
  22.   FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
  23.      $MOVE_X = $MOVE_X + $MOVE_X_step
  24.      $MOVE_Y = $MOVE_Y + $MOVE_Y_step
  25.      MOVE(ROUND($MOVE_X,0)+RND(-2,2), ROUND($MOVE_Y,0)+RND(-2,2)) // добавляем рандом
  26.      WAITMS(1)
  27.   END_CYC
  28.  
  29. END_SUB
  30.  
  31. SUB(m_move,$M_X,$M_Y)
  32.   $MOVE_MID_X = ($_xmouse+$M_X)/2
  33.   $MOVE_MID_Y = ($_ymouse+$M_Y)/2
  34.   mouse_move($MOVE_MID_X+RND(-30,30),$MOVE_MID_Y+RND(-30,30))
  35.   mouse_move($M_X,$M_Y)
  36.   MOVE($M_X,$M_Y) //Передвинуть окончательно в заданную точку
  37. END_SUB
  38.  
  39.  
  40.  
  41. // образец строки MOVE
  42. MOVE(520,380)  // точка 1
  43.  
  44. LDOWN(520,380) // рисуем
  45.  
  46. m_move(637,834) // передвигаем
  47.  
  48. LUP(637,834) // отпускаем
  49.  
  50. HALT // стоп
« Последнее редактирование: Сентябрь 09, 2015, 07:39:19 am от Oraven »

dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #8 : Сентябрь 09, 2015, 10:39:32 am »
да, такие рандомные отклонения будут хорошо себя вести на максимальной скорости, где шаг перемещения 40-60пикс. но если поставить скорость на минимум, то курсор будет отклоняться не только со стороны в сторону, но и в зад в перед.
я себе еще ломал немного голову чтобы при перемещении по диагонали, смещятся также и по диагонали перпендикулярно нашему движению, чтобы не было перескоков через пиксели :D, но подумал, что это будет слишком.

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

Oraven

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

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

WHOIM

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

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

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

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

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

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3685
  • Котэ
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #11 : Сентябрь 09, 2015, 04:46:18 pm »
Вот последняя редакция с рандомом
Код: Clickermann
  1. // подпрограмма обязательно выше вызова
  2. SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
  3.   $MOVE_SPEED = 1  // множитель скорости (отвечает за количество точек)
  4.  
  5.   $MOVE_Start_X = $_xmouse
  6.   $MOVE_Start_Y = $_ymouse
  7.   $MOVE_X = $MOVE_Start_X
  8.   $MOVE_Y = $MOVE_Start_Y
  9.  
  10.   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
  11.  
  12.   $MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
  13.  
  14.   IF($MOVE_SPEEDVAR < 1)
  15.      $MOVE_SPEEDVAR = 1
  16.   END_IF
  17.  
  18.   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
  19.   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
  20.   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
  21.  
  22.   FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
  23.      $MOVE_X = $MOVE_X + $MOVE_X_step
  24.      $MOVE_Y = $MOVE_Y + $MOVE_Y_step
  25.      MOVE(ROUND($MOVE_X,0)+RND(-2,2), ROUND($MOVE_Y,0)+RND(-2,2)) // добавляем рандом
  26.      WAITMS($rnwait) // задержка при движении по точкам
  27.   END_CYC
  28.  
  29. END_SUB
  30.  
  31. SUB(m_move,$M_X,$M_Y)
  32.   $rnwait = RND(6,15) // случайная скорость
  33.   $MOVE_MID_X = ($_xmouse+$M_X)/2
  34.   $MOVE_MID_Y = ($_ymouse+$M_Y)/2
  35.   mouse_move($MOVE_MID_X+RND(-30,30),$MOVE_MID_Y+RND(-30,30))
  36.   mouse_move($M_X,$M_Y)
  37.   MOVE($M_X,$M_Y) //Передвинуть окончательно в заданную точку
  38. END_SUB
  39.  
  40. LDOWN(226,265) // рисуем
  41. $MS = $_ms // засекаем время
  42.  
  43. m_move(839,989) // передвигаем
  44.  
  45. LUP(839,989) // отпускаем
  46. LOGWRITE ($_ms-$MS, " - ", $rnwait)
  47.  
  48. HALT // стоп

Время передвижения на картинке занимает от 330 до 730 мс что вполне реалистично.
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

« Последнее редактирование: Сентябрь 09, 2015, 04:49:04 pm от Oraven »

dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #12 : Сентябрь 09, 2015, 06:05:20 pm »
что то я загнался этим передвижением  :D . и чето подумал, а от чего же зависит скорость передвижения курсора в системе? как оказалось, она зависит только лиш (ну или почти) от шага $MOVE_step. а обновляться местоположение должно в пределах 4-7мс. в изначальном варианте стоит задержка 1мс ($rnwait), и это, как оказывается, маловато. и скорее всего менять эту задержку не желательно, а менять скорость передвижение только шагом $MOVE_step.
проверял так
Код: Clickermann
  1. wait(1)
  2. print("бот")
  3. m_move(910,540)
  4. print("не бот")// начинаем дергать мышкай
  5. wait(5)
  6. halt
  7.  
  8.  
  9. THREAD(thr_name)
  10.   WHILE(1)
  11.      $t=$_ms
  12.      $x=$_xmouse
  13.      $y=$_ymouse
  14.      WHILE(($x=$_xmouse)&($y=$_ymouse))
  15.         waitms(1)
  16.      END_CYC
  17.      print($_ms-$t)
  18.   END_CYC
  19. END_THREAD
у меня показало : там где бот - ($rnwait+-1);  там где не бот - в пределах 3-7 мс (в основном 4-6 мс), не зависимо от скорости дергания(конечно если не слишком медленно). возможно это только у меня так, а возможно что эта задержка и не играет никакой роли    :D

Oraven

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

Vint

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

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