Основной раздел > Общие вопросы

Реалистичное передвижение курсора

(1/12) > >>

WHOIM:
Делаю сборщик коробок для игры DarkOrbit. Столкнулся с такой задачей. Есть инфа, что в игре идет анализ движения мыши. И дабы не попасть в долгий бан хочу сделать более реалистичное, то есть не идеально ровное, передвижение курсора мыши. Скорость передвижения уже отрегулировал, а вот как быть с реалистичностью не пойму. Кликером пользуюсь третий день. Прошу помочь с данной задачей.

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


--- Code: ---
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
--- End code ---

WHOIM:
Благодарю за новый кусочек кода. Проверил, все работает. Но все таки надо добавить и реалистичное передвижение.

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


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

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


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

LEFT FIND UP()
--- End code ---

dramster:

--- Quote ---Но все таки надо добавить и реалистичное передвижение.
--- End quote ---
не знаю насколько реалистичное, но вот, добавил движение по синусу.

--- Code: (clickermann) ---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
--- End code ---
изза такого движения, финишные координаты курсора немного не будут соответствовать заявленным в вызове подпрограммы. чем меньше амплитуда, тем точнее конечные координаты.


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

--- Code: (clickermann) ---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
--- End code ---

dramster:
вот более реалистичное передвижение с рандомным отклонением от прямой

--- Code: (clickermann) ---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
--- End code ---

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

Vint:
Можно конечно ещё заморочиться.

--- Code: (clickermann) ---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
--- End code ---

Navigation

[0] Message Index

[#] Next page

Go to full version