Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Prorok.18 on November 30, 2014, 06:30:15 PM
-
$speed=1 // Скорость (от 1 до ∞)
$start1=500 // X цели
$start2=500 // Y цели
$x=$_xmouse
$y=$_ymouse
$sign=$start1-$x
$xk=$sign/SQRT($sign*$sign)
FOR ($var, $var<($sign*$xk/$speed))
$yk=INT(($_xmouse+$xk)*($start2-$y)/($start1-$x)+$y-($start2-$y)*$x/($start1-$x))
MOVE(INT($_xmouse+$xk*$speed),$yk)
END_CYC
HALT
И пример использования:
$speed=1 // Скорость (от 1 до ∞)
SUB(Motion,$start1,$start2)
$x=$_xmouse
$y=$_ymouse
$sign=$start1-$x
$xk=$sign/SQRT($sign*$sign)
FOR ($var, $var<($sign*$xk/$speed))
$yk=INT(($_xmouse+$xk)*($start2-$y)/($start1-$x)+$y-($start2-$y)*$x/($start1-$x))
MOVE(INT($_xmouse+$xk*$speed),$yk)
END_CYC
END_SUB
$c1=666
$c2=777
Motion($c1,$c2) // Вызываем процедуру с параметрами (стрелка дойдет до координат $c1, $c2)
LCLICK($c1,$c2)
HALT
-
Там где деление нужно добавить INT а то ошибка если курсор находится в 500,500 но даже и так, если 500,0 то курсор не двигается.
Есть давно уже написанный скрипт, тут хоть и сложнее но работает как часы.
// подпрограмма обязательно выше вызова
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
$MOVE_SPEED = 3 // множитель скорости
$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, $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
// образец строки MOVE
mouse_move(215,224) // двигаем мышь сюда
WAITMS(500)
mouse_move(1205,294) // туда
WAITMS(500)
mouse_move(1347,1016) // и еще раз
WAITMS(500)
HALT // стоп
-
Спасибо за код, надеюсь у моего тоже есть право на жизнь)
Новый апгрейд (+ работа над ошибками):
SUB(Motion,$start1,$start2,$speed)
$x=$_xmouse
$y=$_ymouse
$sign_X=$start1-$x
$sign_y=$start2-$y
IF($sign_x=0)
$yk=$sign_y/SQRT($sign_y*$sign_y)
FOR ($var,$var<INT(($sign_y*$yk/$speed)))
MOVE($_xmouse,$_ymouse+$yk*$speed)
END_CYC
ELSE
$xk=$sign_X/SQRT($sign_X*$sign_X)
FOR ($var, $var<INT(($sign_x*$xk/$speed)))
$yk=INT(($_xmouse+$xk)*($start2-$y)/($start1-$x)+$y-($start2-$y)*$x/($start1-$x))
MOVE($_xmouse+$xk*$speed,$yk)
END_CYC
END_IF
MOVE($start1,$start2) // На всякий пожарный)
END_SUB
Motion(666,540,1) // Координаты и скорость, разве не круто?)
Motion(303,100,3)
HALT
-
Давай ещё. Пока сыро. Костылёк совсем кривой.
$sign_y ввёл это хорошо, но зависимость пока кривая. Если $sign_X не равен 0 и разница иксов гораздо меньше разницы игреков, то скорость бешенная.
Всё это из-за того, что зависит от одного, а не обоих параметров.
Ставим мышь левее цели, запуск, смотрим скорость.
Ставим выше... и выходим на вторую космическую.
Приколола конструкция
$yk=$sign_y/SQRT($sign_y*$sign_y)
Это просто для упражнения? Почему не написать просто и понятно
IF($sign_X > 0)
$xk = 1
ELSE
$xk = -1
END_IF
А то индусский код (http://lurkmore.to/%D0%98%D0%BD%D0%B4%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BE%D0%B4) получается :)
"Индусский код написан наиболее неочевидным и неестественным из всех возможных способов."
-
В прошлом скрипте чем выше/ниже над целью, тем выше скорость передвижения.
Вот другой алгоритм на индусском (здесь скорость не меняется), все работает норм:
SUB(Motion,$start1,$start2,$speed)
$x=$_xmouse
$y=$_ymouse
$sign_X=$start1-$x
$sign_y=$start2-$y
$dist=DIST($x,$y,$start1,$start2)
IF($sign_x!0)
FOR($var,$var<$dist+$var,$speed)
INC($dist,-$speed)
$xk=INT($start1-$sign_x*$dist/($dist+$var))
$yk=INT(($xk)*($start2-$y)/($start1-$x)+$y-($start2-$y)*$x/($start1-$x))
MOVE($xk,$yk)
END_CYC
ELSE
FOR($var,$var<$dist+$var,$speed)
INC($dist,-$speed)
$yk=INT($start2-$sign_y*$dist/($dist+$var))
MOVE($_xmouse,$yk)
END_CYC
END_IF
MOVE($start1,$start2) // На всякий пожарный
END_SUB
Motion(500,500,10) // Координаты и скорость
Motion(321,46,1)
HALT
-
Работает. Но действительно код индусский. Вот, кто прям сходу скажет как работает вот такой цикл? По каким элементам перебирает:
FOR($var,$var<$dist+$var,$speed)
INC($dist,-$speed)
//...
END_CYC
Это в целях обфускации? Как это настраивать или сопровождать я не знаю.
Почему не сделать понятно и просто:
$dist2 = $dist
FOR($var,$var < $dist2,$speed)
$dist = $dist2-$var-$speed
//...
END_CYC
Мне одному кажется, что изменение обоих параметров в условии цикла заведёт когда нибудь на кривую дорожку?
-
Это в целях обфускации? Как это настраивать или сопровождать я не знаю.
Да, конкретно для оптимизации, но на самом деле я просто почему-то не люблю вводить новые переменные
-
Да, конкретно для оптимизации, но на самом деле я просто почему-то не люблю вводить новые переменные
Оптимизация она ведь не только выражается количеством переменных и строк кода. Иногда важнее понятность.
Я переменные не экономлю, хотя и стараюсь не создавать лишних.
В некоторых языках явно запрещено изменять значения переменной цикла в теле этого цикла.
Или бывает нельзя использовать параметр цикла при определении начального и конечного значений.
А иногда и запрета нет, но результат не тот какой хотелось бы. Лучше не привыкать, хотя в кликермэне с этим и свобода-демократия.
Вспомнилось. Тут была одна тема, в коде человек для сокращения скрипта и экономии одной переменной ... ввёл 3 GOTO, 2 метки, нафиг сломал стройный и нормально читаемый скрипт сделав из него ребус. При этом скрипт стал короче всего на строку или две. Сэкономил короче :) ;D
-
Использую довольно примитивный скрипт с диапазоном нажатия клевой кнопки мыши в случайную точку области. реально ли в него добавить "плавное движение" мыши со случайной скоростью 1-3, чтобы курсор тупо не прыгал от координаты к координате? в идеале вижу движение внутри очень узкого эллипса по дуге между двумя точками, а не по прямой, если это реально реализовать ;D
(https://i.ibb.co/5W2KZtX/image.jpg) (https://ibb.co/5W2KZtX)
go:
WAIT(RND(1,5)) // случайная задержка в сек
LCLICK(RND(614,667),RND(504,512)) //Открыть
WAIT(RND(260,275))
LCLICK(RND(118,140),RND(421,443)) //Закрыть
WAIT(RND(11,14))
LCLICK(RND(118,140),RND(421,443)) //Закрыть
WAIT(RND(8,10))
LCLICK(RND(118,140),RND(421,443)) //Закрыть
WAIT(RND(2,5))
goto(go)
-
А что, давно используемый скрипт не подходит?
http://crapware.aidf.org/forum/index.php?topic=2112.msg12611#msg12611