1
Общие вопросы / Re: define и setvar
« on: March 25, 2022, 07:57:39 PM »- а так же, прикольчики типа:А в чём прикольчик? Вроде бы работает так, как написано.
я джавист, мне такое странно)
Добавлена тема оформления "Clickermann" для кода с подсветкой синтаксиса. Выбирается из выпадающего списка "Код" (рядом с "цвет", "размер" и "шрифт") в режиме редактирования поста. Либо просто BB-тегом "code=clickermann"
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.
- а так же, прикольчики типа:А в чём прикольчик? Вроде бы работает так, как написано.
Самый первый вариант мне нравится больше.
Сейчас очень медленно и сильный разброс параметров от линии к линии, не думаю, что это лучше, особенно концевые разбросы.
P.S. Код почти по PEP8
Выходит вот так если карандашом. Красиво, но наверно нужно допилить. Видно что в каких то моментах курсор дергает назад.
Вопросы:
1. как скорость менять
2. что за параметры $wMin, $wMax
3. и еще, почему задержка какая-то после выполнения, курсор уже на месте, а он чето ждет
ШИКАРНЫЙ (и достаточно простой) симулятор человеческого движения мыши WindMouse.Там по ссылке очень много не понятного текста и столько же ссылок. Ты бы точно сказал что качать, и если какие-то нюансы по запуску, то тоже не хотелось бы самому разбираться.
Адаптировано под Clickermann отсюда: https://ben.land/post/2021/04/25/windmouse-human-mouse-movement/
Из справки про define: Инструкция сработает только если переменная не была объявлена раньше. В противном случае инструкция игнорируется. Если параметр value опущен, переменная инициализируется нулем.
Вообще define нужен только в некоторых случаях, когда нужно присвоить значение переменной единожды, а далее она меняется в процессе работы скрипта.
sub(one)
$x = 5
$y = 1
end_sub
sub(two)
$x = 10
$y = "привет"
end_sub
logclear()
logshow(1)
print($x, " ", $y*3) // 0 0
one()
print($x, " ", $y*3) // 5 3
two()
strseparate($y, "и",$res)
print($x, " ", $res[0]) // 10 пр
halt()
Привет опять!Синтаксис первого перестраховочного оператора:
Является ли данная строка кода:Code: (clickermann) [Select]$x = 5
эквивалентной этому:Code: (clickermann) [Select]define($x)
setvar($x, 5)
Для перестраховки лучше использовать второй вариант или первый ничем не хуже?
Спасибо.
DEFINE ($var, [value] )
Так что заносите значение сразу в переменную, раз уж хочется пользоваться DEFINE.
А функция SETVAR предназначена для совсем другого, ваша строка setvar($x, 5) скорее всего, выдаст ошибку. Правильно будет setvar("$x", 5). Только вы так не перестрахуетесь, а наоборот, получите, как мне кажется, дополнительные риски поймать какой-нибудь баг.Точно, у меня было с ошибкой.
// Mouse movement that's affected by gravity and wind physics laws
// https://ben.land/post/2021/04/25/windmouse-human-mouse-movement/
sub(hyp, $A, $B)
$R1 = round(sqrt($A*$A + $B*$B), 0)
end_sub
sub(min, $A, $B)
if($A > $B)
$R1 = $B
else
$R1 = $A
end_if
end_sub
sub(rand, $A, $B, $round) // если round=1, округляет результат
$rand = rnd(0, 1000000)
$rnd = $A + ($B - $A)*$rand/1000000
if($round = 1)
$rnd = round($rnd, 0)
end_if
end_sub
sub(mouse_init)
$SQRT3 = sqrt(3)
$SQRT5 = sqrt(5)
$cX = $_xmouse
$cY = $_ymouse
$mDist = round(dist($cX, $cY, $eX, $eY), 0) + 1
// скорости по осям X и Y
$vX = 0
$vY = 0
$vMag = 0
$wX = 0
$wY = 0
$wMag = 0
$tMMax = $_time_t + rnd(4,6)
rand(8,9,0)
$g0 = $rnd // magnitude of the gravitational force (влияет на амплитуду волны)
rand(0,100,0)
if($rnd < 10) // в 10% сильный ветер
rand(2,4,0)
$w0 = $rnd // magnitude of the wind force fluctuations (влияет на длину волны)
else
rand(0.8,2,0)
$w0 = $rnd
end_if
rand(15,25,0)
$m0 = $rnd // maximum mouse_step size (velocity clip threshold) (влияет на скорость волны)
rand(2,8,0)
$d0 = $rnd // distance where wind behavior changes from random to damped (влияет на затухание волны)
end_sub
sub(mouse_step) // считает скорость по осям X и Y, вычисляет координаты следующего шаг
min($m0, $mDist)
$m0 = $R1
min($w0, $mDist) // чтобы не перепрыгнуть цель
$wMag = $R1
if($mDist > $d0)
rand(-$wMag, $wMag, 0)
$wX = $wX / $SQRT3 + $rnd / $SQRT5
rand(-$wMag, $wMag, 0)
$wY = $wY / $SQRT3 + $rnd / $SQRT5
else
$wX = $wX / $SQRT3
$wY = $wY / $SQRT3
if($m0 < 1)
$m0 = 1
else
if($m0 > 2) // чтобы замедлиться перед остановкой
$m0 = $m0 / $SQRT3
end_if
end_if
end_if
// "ветер" и "гравитация" влияют на скорость мыши по осям
$vX = $vX + $wX + $g0 * ($eX - $cX)/$mDist
$vY = $vY + $wY + $g0 * ($eY - $cY)/$mDist
hyp($vX, $vY)
$vMag = $R1
if($vMag > $m0) // чтобы не перепрыгнуть цель
rand(0,$m0,0)
$vClip = $m0/2 + $rnd/2
$vX = ($vX/$vMag) * $vClip
rand(0,$m0,0)
$vClip = $m0/2 + $rnd/2
$vY = ($vY/$vMag) * $vClip
end_if
$mX = round($cX + $vX, 0) // where to move
min($mX, $_xmax)
max($R1, 0)
$mX = $R1
$mY = round($cY + $vY, 0)
min($mY, $_ymax)
max($R1, 0)
$mY = $R1
if(($cX != $mX) or ($cY != $mY))
move($mX, $mY)
$cX = $_xmouse
$cY = $_ymouse
end_if
end_sub
sub(wind_mouse, $eX, $eY, $wMin, $wMax)
mouse_init()
while(($mDist > 2) and ($_time_t < $tMMax)) // разброс вокруг цели <= 3
mouse_step()
$mDist = round(dist($cX, $cY, $eX, $eY), 0)
end_cyc
waitms(rnd($wMin,$wMax))
end_sub
sub(move_rand)
$m_x = rnd(200, $_xmax-200)
$m_y = rnd(200, $_ymax-200)
wind_mouse($m_x, $m_y, 500, 1500)
end_sub
move_rand()
lclick($_xmouse, $_ymouse)
waitms(100)
ldown($_xmouse, $_ymouse)
for($rmove = 0, $rmove < 10)
move_rand()
end_cyc
lup($_xmouse, $_ymouse)
halt()
даже инт ересно ст ало от чего, Вы желает е
перест раховат ься т аким извращённым способом?
В версии 4.14 массивы копируются очень просто - ARRCONCAT ($arr_in, $arr1, $arr2, ... )Code: (clickermann) [Select]
sub(locator, $param)
print(arrsize($name)) // возвращает 1
print(arrsize($color)) // возвращает 1
for($i = 0, $i < arrsize($color), $param) // $param = кол-во цветов для одного элемента (1 или 2)
getscreen()
contrast(4)
print("Checking: " , $_xmouse-20, "," , $_ymouse-20 , "," , $_xmouse+20 , "," , $_ymouse+20 , "," , $color[$i])
if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $color[$i])
print("Checking: " , $_xmouse-20, "," , $_ymouse-20 , "," , $_xmouse+20 , "," , $_ymouse+20 , "," , $color[$i+$param-1] )
if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $color[$i+$param-1])
print("Вижу: ", $name[int($i/$param)])
end_if
end_if
waitms(rnd(200,500))
print()
print("----------------------")
print()
end_cyc
end_sub
print(arrsize($menuN)) // возвращает 5
print(arrsize($menuC)) // возвращает 10
ARRCONCAT ($name, $menuN) //копируем массивы
ARRCONCAT ($color, $menuC)
locator(2)
undefine($name) //удаляем массивы
undefine($color)
//либо, если в подпрограмме эти массивы будут изменены, то обновляем имеющиеся ранее
Массивы в функцию не передаются, у меня большие подозрения, что они и хранятся не как массивы, а каждый элемент хранится как отдельная переменная.
Массивы не передаются. И нет, они хранятся именно как массивы, не как отдельные переменные. Просто в кликере никто не реализовывал передачу ссылкой, там нигде ссылки не применяются. Обычные аргументы передаются копией. Подозреваю, решение было принято просто на это забить до поры. Массивы копировать - очень долго, при больших массивах и/или частых вызовах подпрограммы, такой подход будет до неприличия медленным и тормозным.
Windows 10, 21H2, Clickermann 4.14.002bМассивы в функцию не передаются, у меня большие подозрения, что они и хранятся не как массивы, а каждый элемент хранится как отдельная переменная.
При передаче массивов как аргументов для подпрограммы, последняя видит только первый элемент массива.
У меня где-то ошибка или это функционал кликера?
Как вариант в обход реализовать считку/запись из/в т.н. буфер обмена в виде текстового файла.
Помощь приветствуется)
sub(locator, $n, $c, $param)
tfreadarr($n, $nam)
tfreadarr($c, $col)
for($i = 0, $i < arrsize($col), $param)
getscreen()
contrast(4)
if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $col[$i])
if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $col[$i+$param-1])
print("Вижу: ", $nam[int($i/$param)])
end_if
end_if
waitms(10)
end_cyc
end_sub
tfclear("name.txt")
tfclear("color.txt")
tfwritearr("name.txt", $menuN)
tfwritearr("color.txt", $menuC)
locator("name.txt", "color.txt", 2)
Ну и все переменные в кликермане глобальные, может, оно и вообще не надо массивы через параметры передавать? Подпрограмма их и так видит.
sub(locator, $name, $color, $param)
print(arrsize($name)) // возвращает 1
print(arrsize($color)) // возвращает 1
for($i = 0, $i < arrsize($color), $param) // $param = кол-во цветов для одного элемента (1 или 2)
getscreen()
contrast(4)
print("Checking: " , $_xmouse-20, "," , $_ymouse-20 , "," , $_xmouse+20 , "," , $_ymouse+20 , "," , $color[$i])
if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $color[$i])
print("Checking: " , $_xmouse-20, "," , $_ymouse-20 , "," , $_xmouse+20 , "," , $_ymouse+20 , "," , $color[$i+$param-1] )
if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $color[$i+$param-1])
print("Вижу: ", $name[int($i/$param)])
end_if
end_if
waitms(rnd(200,500))
print()
print("----------------------")
print()
end_cyc
end_sub
print(arrsize($menuN)) // возвращает 5
print(arrsize($menuC)) // возвращает 10
locator($menuN, $menuC, 2)