Основной раздел > Общие вопросы
Реалистичное передвижение курсора
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