Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: vasyapro on October 31, 2016, 04:15:48 PM
-
THREAD(click)
waitms(30)
if ($i2 > $i)
if ($cl[$i] < $_ms)
lclick(404 + $clx[$i] * 50,302 + $cly[$i] * 50)
$f = $clx[$i] // Удаляем из очереди
$igx[$f] = 0 // $igx[$clx[$i]] выдаёт ошибку, потому используем левак
$f = $cly[$i]
$igy[$f] = 0
$i = $i + 1
end_if
end_if
END_THREAD
$f = 0
for ($i=0,$i<12) // Если этого не сделать - позже выдаст ошибку
arrpush($igx,0)
arrpush($igy,0) // Тут можно всего 6 раз, но зачем делать еще один цикл
end_cyc
$i = 0
$i2 = 0
SetThread(click,1)
while(1)
getscreen
if (PXL(402,476) = 15887871) // Запуск из меню
LClick(444,524)
wait(4)
getscreen
end_if
if (PXL(677,511) = 15887871) // Конец
halt
end_if
// Вот тут начинается основной код
for ($x = 0, $x < 12)
for ($y = 0, $y < 6)
if (($igx[$x] = 0) or ($igy[$y] = 0)) // Что бы десять раз не записало одну и ту же точку в очередь надо проверять не в очереди ли эта точка уже
$cx = 404 + $x * 50 // Эти переменные уже не нужны, остались после версии где ожидать после обнаружения не надо было вообще
$cy = 302 + $y * 50
if (colorR(PXL($cx,$cy)) > 50) // Если цвет не тот, то добавляем в очередь
arrpush($cl,$_ms+300)
arrpush($clx,$x)
arrpush($cly,$y)
$igx[$x] = 1
$igy[$y] = 1
$i2 = $i2 + 1
end_if
end_if
end_cyc
end_cyc
end_cyc
Таблица 12х6, в случайных местах со случайным промежутком времени (могут и 5 одновременно) цвет ячейки меняется и через 300мс после появления нужно по ней кликнуть. То бишь если появится 5 одновременно, то простой waitms(300) после обнаружения уже не канает.
Сделал через очередь в другом потоке. Всё работает, но где то в 70% случаев вместо одного клика по ячейке происходит два и я не могу понять почему.
-
Я думаю проблема в $igx[$x], $igy[$y]
Почему ты используешь два разных массива? Это можно бы было делать если бы там хранилось состояние для одного элемента.
Допустим включено поле по столбец [6] и ряд [2]. Ты проставил там по 1, этим ты включил все клетки по $igx[6] и все по $igy[2]
Допустим, пока не было клика включилась ещё поле $igx[6], $igy[4].
Потом ты кликнул по первой и удаляешь её
$igx[6] = 0
$igy[2] = 0
Теперь для этого условия
if (($igx[$x] = 0) or ($igy[$y] = 0))
вторая точка оказалась свободна... И он её опять запишет.
Или ставь в условии AND, & вместо or
или вместо пары $igx[$x], $igy[$y] используй один массив с нумерацией точек подряд
или псевдо двумерный массив, что то же самое что и преведущее, но представленно в скрипте визуально в привычных тех же [$x], [$y].
И лучше убрать лишнее. Сделать чтоб $clx, $cly не были безразмерными и вечно растущими. Хотя смотря сколько твой скрипт работает и много ли пишется кликов. Ну это не обязательно.
-
Спасибо за совет, сделал через $ig[$x*6+$y]. Действительно со старым кодом иногда пропускались точки.
Однако, основная проблема от этого не пропала. В половине случаев всё так же делается два клика вместо одного, практически сразу после предыдущего.
THREAD(click)
waitms(30)
if ($i2 > $i)
if ($cl[$i] < $_ms)
lclick(404 + $clx[$i] * 50,302 + $cly[$i] * 50)
$ig[$clx[$i]*6+$cly[$i]] = 0
$i = $i + 1
end_if
end_if
END_THREAD
for ($i=0,$i<72)
arrpush($ig,0)
end_cyc
$i = 0
$i2 = 0
SetThread(click,1)
while(1)
getscreen
if (PXL(402,476) = 15887871)
LClick(444,524)
wait(4)
getscreen
end_if
if (PXL(677,511) = 15887871)
halt
end_if
for ($x = 0, $x < 12)
for ($y = 0, $y < 6)
if ($ig[$x*6+$y] = 0)
if (colorR(PXL(404 + $x * 50,302 + $y * 50)) > 50)
arrpush($cl,$_ms+300)
arrpush($clx,$x)
arrpush($cly,$y)
$ig[$x*6+$y] = 1
$i2 = $i2 + 1
end_if
end_if
end_cyc
end_cyc
end_cyc
Кликов не более 100 за раз. Может когда разберусь с основной проблемой то сделаю перезапуск с обнулением вместо halt.
-
THREAD(click,0) иначе ваш поток запустится раньше создания массива
-
Да там как бы без разницы. Условие для клика не выполняется, поскольку $i2 будет меньше (во время создания массива) или равно $i аж до первой записи в очередь.
-
а случайно не
[$y*12 + $x]
хотя, конечно, и в этом направлении можно по столбцам ходить.
-
Даблклик так никто и не видит?
-
Ладно. Исправил сам, судя по всему проблема с работой с одной переменной в двух потоках. Пришлось еще создать очередь на удаление игнора клетки. Авсоь кому пригодится:
Thread(removeignore)
waitms(30)
if($i > $i3)
if ($ri[$i3] < $_ms)
$ig[$clx[$i3]*6+$cly[$i3]] = 0
$i3 = $i3 + 1
end_if
end_if
end_thread
Thread(click)
waitms(30)
if ($i2 > $i)
if ($cl[$i] < $_ms)
lclick(404 + $clx[$i] * 50,302 + $cly[$i] * 50)
arrpush($ri,$_ms+500)
$i = $i + 1
end_if
end_if
end_thread
setthread(removeignore,0)
setthread(click,0)
for ($i=0,$i<72)
arrpush($ig,0)
end_cyc
$i = 0
$i2 = 0
$i3 = 0
setthread(removeignore,1)
setthread(click,1)
while(1)
getscreen
if (PXL(402,476) = 15887871)
LClick(444,524)
wait(4)
getscreen
end_if
if (PXL(677,511) = 15887871)
halt
end_if
for ($x = 0, $x < 12)
for ($y = 0, $y < 6)
if ($ig[$x*6+$y] ! 1)
if (colorR(PXL(404 + $x * 50,302 + $y * 50)) > 50)
arrpush($cl,$_ms+300)
arrpush($clx,$x)
arrpush($cly,$y)
$ig[$x*6+$y] = 1
$i2 = $i2 + 1
end_if
end_if
end_cyc
end_cyc
end_cyc
-
никто ничего не подсказал, потому, что никто не может попробовать. Тупо не на чем. Хотя бы логи порасставлять, скрипт перетасовать.
А 'виртуально', в уме такую проблему не поймать.