Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - Kashey

Pages: [1]
1
Интересные наблюдения. Однако, по скольку нет графика время - перемещение, то визуально по графикам нельзя их сопоставить.

Нагляднее было бы, если сюда добавить ещё и трёхмерный график с временем по оси х, по осям y и z - координаты мышки (x, y). Так можно было бы его наглядно сравнить его с другими графиками и увидеть, где именно скорость падает, а где нарастает.

Или можно раскрасить точки первого графика в градиент синий - красный в зависимости от скорости, ускорения.

Интересно было бы посмотреть график ускорения в зависимости от угла поворота и от начала - конца пути.


2
Сам когда-то думал о Безье. Глянул, там формулы трёхэтажные, думаю куда там кликером их считать. И не думал что можно так упростить.

Красиво конечно выходит, но хочу задать пару вопросов. Если двигать не совсем уж по прямой, как в старых скриптах, какой алгоритм будет это вылавливать? Кто там отличит плавные Безье от случайных отклонений и сколько на это нужно ресурсов. Никто столько не выделит.
Если определять визуально, то перемещения похожи, но похожи на задумавшегося человека, так водят мышкой в размышлениях или от скуки. При жёсткой и быстрой работе с интерфейсом, таких вензелей минимум. Ну, по крайней мере большая часть.
И главное это скорость! Курсор "тяжёлый", человек разгоняет его сначала, потом идёт движение на максимальной скорости и торможение. Торможение медленнее, чем разгон, т.к. идёт прицеливание.

Задание на дальнейшее развитие скрипта, чтоб прям "ну как человек"  ;D  -  Сделать изменение скорости по наклонённой параболе или как там оно должно быть.
Вопрос, конечно не по адресу. Я не знаю, что они там используют для выявления автомитизации и сколько ресурсов на это надо.

Лично мне не нравилось наличие в других предложенных скриптах большого количества углов. Движения должны быть плавнее.
И третье, забанить человека за то, что он слишком задумчивый - это надо быть очень жёстким админом :)

Скрипт, как я уже писал, - настраиваемый, можно свести количество вензелей к минимуму , оставив только плавное перемещение. Для этого поставьте
Code: (clickermann) [Select]
$steps = 1


Изменять скорость в данном скрипте нецелесообразно, поскольку интерпретатор Кликерманна снижает эту самую скорость до минимума. Глазом заметно как он мышкой водит. Но Вы, если будете писать его в С++ и подключать внешней библиотекой, можете реализовать данную возможность.

Кстати, курсор не такой уж и тяжёлый, если, конечно, тефлоновые подставки на мышке не стёрты и на коврике чисто. Можете, кстати, собрать статистику на эту тему, я с удовольствием посмотрю.

3
Ну чем не современное искусство?


4
Ну после такой высокой оценки алгоритм можно назвать симулятором ребёнка :)

Правки мне очень понравились, особенно хитро получилось с этими с этим циклом, сам что - то я до такого не додумался:

Code: (clickermann) [Select]
      For ($a = $steps+2, $a > 1, -1)
         For ($i = 0, $i < ($a-1))
            $tempPointsX[$i] = ($tempPointsX[$i+1]-$tempPointsX[$i])*($time/100)+$tempPointsX[$i]
            $tempPointsY[$i] = ($tempPointsY[$i+1]-$tempPointsY[$i])*($time/100)+$tempPointsY[$i]
         END_CYC
      END_CYC

Немного опишу работу алгоритма. Он состоит из двух частей, первая рисует ломаную кривую, вторая сглаживает её алгоритмом Безье.
Ломанная кривая рисуется так: сначала весь путь делится на количество шагов steps и потом к каждому шагу добавляется случайное отклонение, которое, в свою очередь, вычисляется в соответствии с длинной пути перемещения. То есть на небольшие пути будет малое отклонение, на большие - большое. За влияние этого отклонение отвечает переменная noise.

 




5
Алгоритм не очень сложный, я вроде комментарии везде написал. Посмотрите ссылки в начале поста, по ним много полезной инфы. Если будет желание, надеюсь, разберётесь.

Алгоритмом управляют 3 переменных, все они вынесены в шапку кода и каждую можно сделать случайной. Если надо, пользуйтесь.

Про сетвар, это особенности языка. Без него код лаконичнее, но, чтобы понять как это работает надо хорошо знать эти особенности.

У меня просьба, я там ошибку нашёл, не могли бы вы её исправить в своём посте тоже. В предложении:

Code: (clickermann) [Select]
// шаг в расчёте кривых Безье. От этого параметра зависит то, насколько сглаженная будет конечная прямая.
$bezierStep = 2
заменить "прямая" на "кривая".

Я надеюсь, что это хорошая заявка на полное решение проблемы реалистичного передвижения мышки. Если у кого есть свои мысли на этот счёт, пишите.

А кривые, да, красивые. Выкладывайте их больше!


6
dramster

Ответ для чего мне необходимо было реализовать инициализацию массива на один элемент меньше можно найти в этой теме:

http://crapware.aidf.org/forum/index.php?topic=5442.0

Спасибо за подсказку по подсветке кода.

7
Здравствуйте.

К сожалению, авторы игр борются с автоматизацией рутинных действий. Одним из способов для того, чтобы узнать, использовались ли инструменты автоматизации во время игры является оценка движений мышки пользователя по их внутренним критериям. Возможно предположить, что по этим критериям быстрые и прямолинейные движения могут оцениваться как автоматические, ненатуральные. В этом есть своя правда, рукой сделать прямые быстрые точные до пикселя движения мышкой практически невозможно. Хоть подобного рода перемещения и являют собой наиболее простые и лаконичные движения, из - за того, что они могут послужить поводом до вероятных санкций со стороны администраторов игры, при создании скрипта автоматизации их следует избегать. Для этого придумано много вариантов движений, некоторые из них читатель может найти по этой ссылке: http://crapware.aidf.org/forum/index.php?topic=2112.0

Ниже я предлагаю свой вариант движения.

Кривые Безье, как говорит Википедия, являются частным случаем многочленов Бернштейна. С теорией и практикой реализации алгоритмов можно ознакомиться по следующим ссылкам:
https://habr.com/ru/post/344814/
https://habr.com/ru/post/249103/
https://www.cat-in-web.ru/bezier-curves/

Для построения кривых Безье обычно используется рекурсивный алгоритм де Кастельжо. К сожалению из - за ограничений скриптового языка Кликермэнна, непосредственное применение этого алгоритма в нём невозможно. В настоящей реализации я изменил алгоритм де Кастельжо убрав из него рекурсию и адаптировав его к потребностям автоматизации рутинных действий.

К сожалению, алгоритм кривых Безье требует некоторых вычислительных мощностей, что может привести Кликермэнн, не страдающий быстродействием, в некоторое замешательство. Для увеличения быстродействия может быть полезно написать код в другом, более быстром, языке программирования и подключать его внешней скомпилированной библиотекой.

Также замечу, что алгоритм всегда передвигает мышку точно в назначенное ему место, и, если это требуется, необходимо решить проблему размытия координат внешне.


Code: (clickermann) [Select]
// Алгоритм передвижения мышки по траекториям Безье.
// На вход подаются координаты конца пути,
// алгоритм осуществляет движение.

// Алгоритм полностью настраиваемый.

// При большом сглаживании может работать медленно.

// Характер кривых подобран так, чтобы
// основные изменения кривизны происходили
// в самом начале пути. Это отображает
// неосознанные движения пользователя мышкой
// в тот момент, когда он ещё только ищет глазами
// элемент, на который надо нажать.

// Автор реализации алгоритма Kashey.
 
#name "Bezier_move"
// ================ Глобальные переменные
// Количество отрезков, на которое делится путь передвижения. От этого параметра зависит порядок функции Безье и количество петель передвижения. Сильно влияет на производительность.
$steps = 5
// Фактор отклонения отрезков от прямой линии пути. Этот параметр влияет на то, насколько сильно полученный путь будет не похож на прямой отрезок.
$noise = 1
// шаг в расчёте кривых Безье. От этого параметра зависит то, насколько сглаженная будет конечная кривая.
$bezierStep = 2
// Служебные
$tempX = 0
$tempY = 0

// ================ Подпрограммы  

// Расчёт точки на отрезке со смещением ptime.
SUB(pointsCalc, $x1, $y1, $x2, $y2, $rx, $ry, $ptime)
setvar($rx, ($x2-$x1)*($ptime/100)+$x1)             
setvar($ry, ($y2-$y1)*($ptime/100)+$y1)
END_SUB

// Алгоритм передвижения по кривым Безье
SUB(bezier_move,$_X,$_Y)
// Расчёт длины одного отрезка.   
$snipX = ($_X - $_xmouse)/$steps 
$snipY = ($_Y - $_ymouse)/$steps
// Расчёт отклонения отрезка.
$divX = INT(ABS($_xmouse - $_X) * $noise)
$divY = INT(ABS($_ymouse - $_Y) * $noise)
// Копирование координат мышки.
$tempX = $_xmouse
$tempY = $_ymouse
// Инициализация массивов с концами отрезков.
$pointsX[0] = $_xmouse
$pointsY[0] = $_ymouse
// Расчёт и запись координат концов отрезков.   
FOR($a=0, $a < $steps)
$pointsX[$a+1] = $tempX + $snipX + RND(-$divX, $divX)
$pointsY[$a+1] = $tempY + $snipY + RND(-$divY, $divY)
// Здесь можно подключить свой алгоритм движения. Но тогда алгоритм Безье надо выключить.
// MOVE($tempX + RND(-$divX, $divX), $tempY + RND(-$divY, $divY))
END_CYC
$pointsX[$steps+1] = $_X
$pointsY[$steps+1] = $_Y
// Инициализация вспомогательного массива для временного содержания найденных отрезков Безье.
$arrX[0] = 0
$arrY[0] = 0 
// Начало алгоритма кривых Безье.                   
for($time = $bezierStep, $time < 101, $bezierStep)
// Иницилизируем основной массив концов отрезков, с которым будем работать. $tempPointsX - основной массив, $pointsX - образец.
for($i = 0, $i < arrsize($pointsX))
$tempPointsX[$i] = $pointsX[$i]
$tempPointsY[$i] = $pointsY[$i]
END_CYC
// повторяем до тех пор, пока не останется только Один отрезок.
WHILE(arrsize($tempPointsX) > 2)   
For ($i = 0, $i < (arrsize($tempPointsX) - 1))
// Выбираем по два конца отрезков и считаем среднюю точку.           
pointsCalc($tempPointsX[$i], $tempPointsY[$i], $tempPointsX[$i + 1], $tempPointsY[$i + 1], "$tempX", "$tempY", $time)
// Складываем во вспомогательный массив.
$arrX[$i] = $tempX
$arrY[$i] = $tempY 
END_CYC
// Переписываем точки из вспомогательного массива в основной. 
For ($i = 0, $i < (arrsize($tempPointsX) - 1))
$tempPointsX[$i] = $arrX[$i]
$tempPointsY[$i] = $arrY[$i]
END_CYC
// Значений в мвссиве стало на один меньше, удаляем ненужный элемент.         
$i = arrpop($tempPointsX)
$i = arrpop($tempPointsY)
END_CYC
// Остался только один отрезок, считаем на нём точку.
pointsCalc($tempPointsX[0], $tempPointsY[0], $tempPointsX[1], $tempPointsY[1], "$tempX", "$tempY", $time)
// Мы получили точку кривой Безье.
$arrX[0] = $tempX
$arrY[0] = $tempY
// Передвигаем в неё мышку.   
move(ROUND($arrX[0], 0),ROUND($arrY[0], 0))
// Если вдруг понадобится дополнительно замедлить алгоритм, то в этом месте можно добавить соответствующую команду ожидания.
END_CYC
END_SUB

// Эта часть не является частью алгоритма, написана только с целью демонстрации его работы.

LDOWN($_xmouse,$_ymouse)
$x = $_xmouse
$y = $_ymouse
Bezier_move($x + 500, $y + 500)     

LUP($_xmouse,$_ymouse)



8
Спасибо за наводку, dramster, но всё равно не работает.
Там, чтобы работало, надо ещё перед этим инициализировать все элементы массива.
То есть, одного
Code: (Kashey) [Select]
$arrX[0] = 0 недостаточно.
Надо обязательно
Code: (Kashey) [Select]
For ($i = 0, i < (arrsize($arr) - 1))
      arrX[i] = 0
END_CYC

Но там тоже проблема, ему конструкция
Code: (Kashey) [Select]
i < (arrsize($arr) - 1) не нравится.

Использую сейчас другой костыль - обмен через глобальные переменные.

P.S. А есть возможность, чтобы тэг 'code=Kashey' ручками не набирать? И где моя подсветка синтаксиса?



9
И как же её заменить массивом?
Допустим, перед вызовом pointsCalc я сделал инициализацию всех элементов массива. Всё равно случается ошибка.

Code: [Select]
   for ($ii = 0, $ii < arrsize($pointsX) - 2)
      $arrX[$ii] = 0
      $arrY[$ii] = 0
   end_cyc

10
В этой подпрограмме происходит ошибка.
Code: [Select]
SUB(pointsCalc, $x1, $y1, $x2, $y2, $rx, $ry, $time)
   $tmpx = ($x2-$x1)*($time/100)+$x1
   $tmpy = ($y2-$y1)*($time/100)+$y1   
   setvar($rx, 4)
   setvar($ry, 5)   
END_SUB
А вот её вызов:
Code: [Select]
pointsCalc($pointsX[$i], $pointsY[$i], $pointsX[$i + 1], $pointsY[$i + 1], "$arrX[$i]", "$arrY[$i]", $time)Помогите разобраться, почему происходит ошибка и как её исправить?

Pages: [1]