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

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

<< < (12/12)

Bereza:
Всем привет!
Похоже самая первая версия наиболее удачна.
Только припаять сверху чутоку  рамдомного алгоритма от dramster-а
и включить мышиные функции в конечной точки траектории и все вполне пригодно.
Наглядная прогонка паинтом тоже идея отличная !
Подпрограмма правда разбухает до пяти параметров, но зато, по моему, пока на все случаи жизни.
Скрин:
https://ibb.co/mH9nFTD
Винда 11-я, а в десятой кнопки паинта вроде другие, если в ней закоментить 130 строчку то вдруг не дай бог чего...



--- Code: (clickermann) ---// подпрограмма обязательно выше вызова

SUB(mouse_move,$IN_X,$Razb_X,$IN_Y,$Razb_Y,$mouse)


   $MOVE_SPEED = 1  // множитель скорости

   
   $MOVE_END_X=$IN_X + rnd(rnd(-1*$Razb_X, 0),rnd(0, $Razb_X))
   $MOVE_END_Y=$IN_Y + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y))
   $rnd_x= $x + rnd(rnd(-100, 0),rnd(0, 100))
   
   $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) //Передвинуть окончательно в заданную точку
   
    //Проверка действия мышиных клавиш
   
      WAITMS(50)
      IF($mouse=0 )
GOTO(mouse)
      END_IF
      IF($mouse=1 )
        LCLICK($MOVE_END_X, $MOVE_END_Y)   // Левый клик
GOTO(mouse)
      END_IF
      IF($mouse=2 )
        RCLICK($MOVE_END_X, $MOVE_END_Y)   // Правый клик
GOTO(mouse)
      END_IF   
      IF($mouse=3 )                             
        MCLICK($MOVE_END_X, $MOVE_END_Y)   //  Средний клик
GOTO(mouse)
      END_IF
      IF($mouse=4 )
        DBLCLICK($MOVE_END_X, $MOVE_END_Y) // Двойной левый
GOTO(mouse)
      END_IF     
      IF($mouse=5 )
        LDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать левую
GOTO(mouse)
      END_IF
      IF($mouse=6 )
        LUP($MOVE_END_X, $MOVE_END_Y)      // Отпустить левую
GOTO(mouse)
      END_IF   
      IF($mouse=7 )
        RDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать правую
GOTO(mouse)
      END_IF
      IF($mouse=8 )
        RUP($MOVE_END_X, $MOVE_END_Y)      //  Отпустить правую
GOTO(mouse)
      END_IF
      IF($mouse=9 )
        MDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать среднюю
GOTO(mouse)
      END_IF
      IF($mouse=10 )
        MUP($MOVE_END_X, $MOVE_END_Y)     // Отпустить среднюю
GOTO(mouse)
      END_IF   
      IF($mouse=11 )
        WHEELDOWN       // Колесико вниз
GOTO(mouse)
      END_IF
      IF($mouse=12 )
        WHEELUP         // Колесико вверх
GOTO(mouse)
      END_IF
      $mouse=0     
      mouse:
 
       
END_SUB

 
// образец

// mouse_move($IN_X,$Razb_X,$IN_Y,$Razb_Y,$mouse)  - 5 параметров


// 1: $IN_X - координата х
// 2: $Razb_X - разброс х
// 3: $IN_Y - координата Y
// 4: $Razb_Y - разброс Y

// 5: $mouse - код действия мыши -
//      - в конечной точке траектории

// $mouse = 0     нет действия
// $mouse = 1  LCLICK      (Левый клик)
// $mouse = 2  RCLICK      (Правый клик)
// $mouse = 3  MCLICK      (Средний клик)
// $mouse = 4  DBLCLICK    (Двойной левый клик)
// $mouse = 5  LDOWN       (Зажать левую)
// $mouse = 6  LUP         (Отпустить левую)
// $mouse = 7  RDOWN       (Зажать правую)
// $mouse = 8  RUP         (Отпустить правую)
// $mouse = 9  MDOWN       (Зажать среднюю)
// $mouse = 10 MUP         (Отпустить среднюю)
// $mouse = 11 WHEELDOWN   (Колесико вниз)
// $mouse = 12 WHEELUP     (Колесико вверх)


//Подготовка паинта

 GOTO(mouse2) // Пропускаем зачистку холста

// Очищаем холст паинта
 
mouse_move(140,8,110,8,1) // кликаем на выделение
WAITMS(50)
mouse_move(10,0,220,0,5) // Верхний угол рамки выделения
WAITMS(50)
mouse_move(1000,0,970,0,6) // Нижний угол рамки выделения
WAITMS(50)
RCLICK(500,250) // стираем все старое
WAITMS(500)
LCLICK(550,262) // стираем все старое
WAITMS(500)

mouse2:
mouse_move(300,5,100,5,4) // включаем карандаш

// рисуем треугольник

mouse_move(100,5,300,8,5)  // точка 1 c зажимом
WAITMS(50)
mouse_move(920,5,300,8,0)  // точка 2
WAITMS(50) 
mouse_move(510,100,900,5,0) // точка 3
WAITMS(150)
mouse_move(100,5,300,8,6) // точка 1 c отпуском
WAITMS(50)

// рисуем прямоугольник
 
mouse_move(300,5,350,8,5)  // точка 4 c зажимом
WAITMS(50)
mouse_move(720,5,350,8,0)  // точка 5
WAITMS(50) 
mouse_move(720,5,530,8,0) // точка 6
WAITMS(50)
mouse_move(300,5,530,8,0) // точка 7
WAITMS(150)
mouse_move(300,5,350,8,6) // точка 4 c отпуском
WAITMS(50)


 
HALT // стоп

--- End code ---


Паинт лучше приклеить в левый верхний, нулевой угол и до тысячной координаты Х включительно, тогда в 11-той все кнопки совпадут с тестовым скриптом.

Bereza:
Переписал скрипт, оказывается в кликермане свищ есть, оператор - недоглядел.
Поменял у подпрограммы порядок чередования параметров, с целю сделать обязательными только два первых, добавляя по одному по необходимости. Но так с подпрограммами ничего не работает - ошибка РОР. Есть ли способ как нибудь извернуться, например инклюдить как нить, вместо подпрограмм?


--- Code: (clickermann) ---// подпрограмма обязательно выше вызова

SUB(mouse, $IN_X, $IN_Y, $mouse, $Razb_X, $Razb_Y)

   $MOVE_SPEED = 1  // множитель скорости

IF(($mouse = 11) or ($mouse = 12))
   $MOVE_END_X=$IN_X + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y))
   $MOVE_END_Y=$IN_Y + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y))
ELSE
   $MOVE_END_X=$IN_X + rnd(rnd(-1*$Razb_X, 0),rnd(0, $Razb_X))
   $MOVE_END_Y=$IN_Y + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y)) 
END_IF

//-------------------------------------------------------

   $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) //Передвинуть окончательно в заданную точку
   
//-------------------------------------------------------
 
SWITCH($mouse)
CASE(0)
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(1)
LCLICK($MOVE_END_X, $MOVE_END_Y)   // Левый клик
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(2)
RCLICK($MOVE_END_X, $MOVE_END_Y)   // Правый клик
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(3)
MCLICK($MOVE_END_X, $MOVE_END_Y)   //  Средний клик
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(4)
DBLCLICK($MOVE_END_X, $MOVE_END_Y) // Двойной левый
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(5)
LDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать левую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(6)
LUP($MOVE_END_X, $MOVE_END_Y)      // Отпустить левую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(7)
RDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать правую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(8)
RUP($MOVE_END_X, $MOVE_END_Y)      //  Отпустить правую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(9)
MDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать среднюю
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(10)
MUP($MOVE_END_X, $MOVE_END_Y)     // Отпустить среднюю
CASE(11)
FOR($i=0, $i < $Razb_X)
print("- ",$i," -")
WHEELDOWN                         // Колесико вниз
WAITMS(200+rnd(rnd(-47,0),rnd(0,37)))
END_CYC
CASE(12)
FOR($i=0, $i < $Razb_X)
print("- ",$i," -")
WHEELUP                           // Колесико вверх
WAITMS(200+rnd(rnd(-47,0),rnd(0,37)))
END_CYC
END_SWITCH

$mouse=0
$Razb_X=0
$Razb_Y=0

END_SUB

//-------------------------------------------------------

//  SUB(mouse, $IN_X, $IN_Y, $mouse, $Razb_X, $Razb_Y)

// 1: $IN_X - координата х
// 2: $IN_Y - координата Y
// 3: $mouse -  действия мыши в конечной точке

// $mouse = 0     нет действия
// $mouse = 1  LCLICK      (Левый клик)
// $mouse = 2  RCLICK      (Правый клик)
// $mouse = 3  MCLICK      (Средний клик)
// $mouse = 4  DBLCLICK    (Двойной левый клик)
// $mouse = 5  LDOWN       (Зажать левую)
// $mouse = 6  LUP         (Отпустить левую)
// $mouse = 7  RDOWN       (Зажать правую)
// $mouse = 8  RUP         (Отпустить правую)
// $mouse = 9  MDOWN       (Зажать среднюю)
// $mouse = 10 MUP         (Отпустить среднюю)
// $mouse = 11 WHEELDOWN   (Колесико вниз)
// $mouse = 12 WHEELUP     (Колесико вверх)

//  Функции при  $mouse от 1 до 10
// 4: $Razb_X - разброс х
// 5: $Razb_Y - разброс Y

//  Функции при $mouse = 11 или 12
// 4: $Razb_X - число строк колесиком
// 5: $Razb_Y - разброс х  и  разброс Y


// Рисуем В  паинте

GOTO(mous) // Пропускаем зачистку холста

// Очищаем холст паинта
 
mouse(140,110,1,8,8) // кликаем на выделение
mouse(10,200,5,0,0) // Верхний угол рамки выделения
mouse(1000,970,6,0,0) // Нижний угол рамки выделения
mouse(500,250,2,0,0)  // Открываем меню
WAITMS(100)
mouse(560,267,1,0,0) // стираем  старое
WAITMS(100)

mous:
mouse(290,96,1,5,5)   // включаем карандаш

// рисуем треугольник

mouse(100,300,5,5,8)   // точка 1 c зажимом
mouse(920,300,0,5,8)   // точка 2 
mouse(510,900,0,100,5) // точка 3
mouse(100,300,6,5,8)   // точка 1 c отпуском

// рисуем прямоугольник
 
mouse(300,350,5,5,8)  // точка 4 c зажимом
mouse(720,350,0,5,8)  // точка 5 
mouse(720,530,0,5,8)  // точка 6
mouse(300,530,0,5,8)  // точка 7
mouse(300,350,6,5,8)  // точка 4 c отпуском

HALT

--- End code ---


200 прогонов вроде неплохо: https://i.ibb.co/NF31nW6/2.png

Navigation

[0] Message Index

[*] Previous page

Go to full version