Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: ZMAN on September 22, 2017, 10:39:34 PM
-
Доброго времени суток. Знаю, тем полно, даже описание в хелпе читаю, но логики пока не пойму синтаксиса if_pixel_in, а именно роль переменных -
Возвращаемые параметры
$_return1 - x координата найденного пикселя
$_return2 - y координата
тот случай, когда одеваешь штаны, а трусы проигнорировал.
-
До меня дошло описание
Как только первый попавшийся пиксель будет найден, инструкция вернет его координаты в переменные $_return1, $_return2 и прекратит анализ
то есть наличие этих переменных обязательное? если нет этих переменных, то анализ будет продолжаться?
-
пример, есть область (0,0,1,1), то есть 2х2, 4 пикселя
(https://i.imgur.com/fNVlpie.jpg)
первый - красный 255
второй - красный 255
третий - белый 16777215
четвертый - красный 255
задача - найти координаты белого пикселя в этой области
GETSCREEN // помещаем скрин экрана в буфер для дальнейшей работы
IF_PIXEL_IN(0,0, 1,1, 16777215) //ищем в области белый пиксель
//идет сканирование четырех пикселей по очереди. с начала певый - не совпал, потом второй - не совпал, потом третий - совпал
//автоматом появляются в памяти кликера две переменные $_return1 и $_return2
//далее с этими переменными делаем что угодно
$x_pix = $_return1
$y_pix = $_return2
//выдаст координаты этого пикселя относительно всего экрана
print("координата х - ",$x_pix)
print("координата y - ",$y_pix)
else
//если всеже в области нет белого пикселя, то делаем соответствующие выводы
print("нет такого пикселя в области")
END_IF
halt // стоп
если к примеру мы будем искать красный пиксель 255 в этой области, то нам выдаст в переменные $_return1 и $_return2 координаты первого пикселя, далее сканирование остановиться.
если будем искать какойто другой цвет, то, проверив все 4 пикселя, условие перескочит на "иначе (else)", и выдаст print("нет такого пикселя в области"). при этом в переменные $_return1 и $_return2 ничего не запишется.
наличие переменных $_return1 и $_return2 не обязательно, это системные переменные.
-
С переменными $_return1 и $_return2 Разобрались. Можно и без них ежели оперировать с координатами пикселя нет необходимости.
Я преследую такую задачу. есть область в которой в состоянии "покоя" нет нужного пикселя. В этом случае мне необходимо бездействие. Как только состояние меняется и появляется нужный мне пиксель, следует выполнить определенную команду. Я предполагал, что после того, как в буфер ложиться экран, то идет непрерывный анализ, пока не появиться в области нужный пиксель.
-
Нашел этот шаблон, но хотел бы разобраться. Как я понимаю, если добавить определенную команду по переменной $check = 1, то цикл закончится? Как мне повторить команду, если этот же пиксель в данный момент прежний?
$check = 0
WHILE($check = 0)
GETSCREEN
IF_PIXEL_IN(200,200, 400,400, 255)
$check = 1
ELSE
WAITMS(50)
END_IF
END_CYC
-
Как я понимаю, если добавить определенную команду по переменной $check = 1, то цикл закончится? Как мне повторить команду, если этот же пиксель в данный момент прежний?
твои вопросы не понять. что значит "добавить определенную команду по переменной $check = 1"? "если этот же пиксель в данный момент прежний" - прежний это какой, изменился с искомого на другой, или наоборот? ты бы лучше написал что именно требуется, и что происходит в искомой области.
$check = 0 //изначально переменная равна 0
WHILE($check = 0) //и пока она будет равна 0, то цикл будет крутить по кругу
GETSCREEN // скрин делаем каждый раз перед поиском пикселя
IF_PIXEL_IN(200,200, 400,400, 255) //ИЩЕМ ПИКСЕЛЬ
$check = 1 //если пиксель нашелся в области, то переменной $check присваеваем "не 0" , любое число не равное нулю
//и в следующей проверке условия цикла, $check уже не равен нулю, и значит что цикл завершится, скрипт пойдет далее, то что после END_CYC
ELSE //если пикселя нет в области
//то небольшая задержка для разгрузки цп, и возврат к GETSCREEN и поискам.
WAITMS(50)
END_IF
END_CYC
halt //стоп
-
Да это потому, что я не совсем понимал(ю) ::) принцип пока не начал его обкатывать :)
Решил ограничиться без поиска по области. Знаю точную координату необходимого мне пикселя
// ожидание пикселя
$check = 0
WHILE($check = 0)
GETSCREEN
IF(PXL(804,768) = 1710830)
$check = 1
KEYDOWN(#4)
WAITMS(RND(73, 121))
KEYUP(#4)
WAIT(RND(63, 101))
ELSE
WAITMS(50)
END_IF
END_CYC
$check = 1 //если пиксель нашелся в области, то переменной $check присваеваем "не 0" , любое число не равное нулю
//и в следующей проверке условия цикла, $check уже не равен нулю, и значит что цикл завершится, скрипт пойдет далее, то что после END_CYC
Если это единственный скрипт в файле, то он начнет с начала?
Если я его хочу интегрировать в фаил с 2-мя потоками, то лучше его реализовать как 3-й поток?
-
Как-то так я представлял интеграцию скрипта в поток, но где-то я допустил ошибку в 3-м потоке. Когда скрипт, который по ожиданию пикселя единственный в файле, он работает так как мне необходимо. То есть повторяет цикл за циклом свои функции. Как я понимаю, после END_CYC он снова возвращался в исходную в этом случае. Но после помещения его среди других скриптов, начались танцы... Где я совершил ошибку? Задача такова - при нажатии l я включаю поток на ожидание пикселя, когда он появляется, выполняется команда, пока пиксель не поменяется на другой. После этого он снова возвращается в режим ожидания. Повторное нажатие l выключает этот поток.
// поток 1
THREAD(cl, 0)
keyDown(#v)
waitms(rnd(73, 121))
keyUp(#v)
waitms(rnd(1711, 2102))
END_THREAD
// переключптель 1
IF(ISKEYDOWN(#p) = 1)
$run = $run ^ 1
IF($run = 0)
SETTHREAD(cl, 2)
waitms(20)
IF(ISKEYDOWN(#v) = 1)
keyUp(#v)
END_IF
ELSE
SETTHREAD(cl, 1)
END_IF
WHILE(ISKEYDOWN(#p) = 1)
waitms(20)
END_CYC
END_IF
waitms(30)
// поток 2
THREAD(cll, 0)
waitms(rnd(262,373))
keyDown(#d)
waitms(rnd(262,373))
move(1027,73)
waitms(rnd(262,373))
DBLCLICK(1027,73)
waitms(rnd(262,373))
keyUp(#d)
waitms(rnd(4325,5046))
END_THREAD
// переключатель 2
IF(ISKEYDOWN(#o) = 1)
$run1 = $run1 ^ 1
IF($run1 = 0)
SETTHREAD(cll,2)
waitms(20)
IF(ISKEYDOWN(#o) = 1)
keyUp(#o)
END_IF
ELSE
SETTHREAD(cll, 1)
END_IF
WHILE(ISKEYDOWN(#o) = 1)
waitms(20)
END_CYC
END_IF
waitms(30)
// поток 3 ожидание пикселя
THREAD(pl, 0)
$check = 0
WHILE($check = 0)
GETSCREEN
IF(PXL(804,768) = 1710830)
$check = 1
KEYDOWN(#4)
WAITMS(RND(73, 121))
KEYUP(#4)
WAIT(RND(63, 101))
ELSE
WAITMS(50)
END_IF
END_CYC
END_THREAD
// переключатель 3
IF(ISKEYDOWN(#l) = 1)
$run2 = $run2 ^ 1
IF($run2 = 0)
SETTHREAD(pl,2)
waitms(20)
IF(ISKEYDOWN(#l) = 1)
keyUp(#l)
END_IF
ELSE
SETTHREAD(pl, 1)
END_IF
WHILE(ISKEYDOWN(#l) = 1)
waitms(20)
END_CYC
END_IF
waitms(30)
-
Вроде нормально всё. Ну, насколько видно с телефона.
Только в 3 потоке не нужен ни чек ни цикл WHILE. Какой в них смысл если идти некуда.
Должно остаться одно условие.
И так ли нужны эти потоки? Ведь нажатие 4 может совпасть с нажатым v или d. А это уже другие сочетания. Да что там могут, это будет происходить не редко.
И проверяешь один пиксел делая снимок всего экрана... это расточительно.
-
И так ли нужны эти потоки?
Например 2 первых нужны у них специфическая функция. А вот 3-й можно было и без, но как его вписать в эти два пока не соображу. То есть, его можно в режиме ожидания постоянно использовать.
-
Вот так правильно.
Кроме того добавил сообщение в трей о состоянии потоков в виде 0:0:0
0 означает выкл, 1 вкл
порядок цифр соответствует 1 2 3 потоку
// переключатель 1
IF(ISKEYDOWN(#p) = 1)
$run1 = $run1 ^ 1
IF($run1 = 0)
SETTHREAD(cl, 2)
waitms(20)
IF(ISKEYDOWN(#v) = 1)
keyUp(#v)
END_IF
ELSE
SETTHREAD(cl, 1)
END_IF
WHILE(ISKEYDOWN(#p) = 1)
waitms(20)
END_CYC
HINTPOPUP(STRCONCAT($run1,":",$run2,":",$run3), "Переключение")
END_IF
// переключатель 2
IF(ISKEYDOWN(#o) = 1)
$run2 = $run2 ^ 1
IF($run2 = 0)
SETTHREAD(cll,2)
waitms(20)
IF(ISKEYDOWN(#d) = 1)
keyUp(#d)
END_IF
ELSE
SETTHREAD(cll, 1)
END_IF
WHILE(ISKEYDOWN(#o) = 1)
waitms(20)
END_CYC
HINTPOPUP(STRCONCAT($run1,":",$run2,":",$run3), "Переключение")
END_IF
// переключатель 3
IF(ISKEYDOWN(#l) = 1)
$run3 = $run3 ^ 1
IF($run3 = 0)
SETTHREAD(pl,2)
waitms(20)
IF(ISKEYDOWN(#4) = 1)
keyUp(#4)
END_IF
ELSE
SETTHREAD(pl, 1)
END_IF
WHILE(ISKEYDOWN(#l) = 1)
waitms(20)
END_CYC
HINTPOPUP(STRCONCAT($run1,":",$run2,":",$run3), "Переключение")
END_IF
waitms(30)
// поток 1
THREAD(cl, 0)
WAITMS(1)
keyDown(#v)
waitms(rnd(73,121))
keyUp(#v)
waitms(rnd(1711,2102))
END_THREAD
// поток 2
THREAD(cll, 0)
WAITMS(1)
waitms(rnd(262,373))
keyDown(#d)
waitms(rnd(262,373))
move(1027,73)
waitms(rnd(262,373))
DBLCLICK(1027,73)
waitms(rnd(262,373))
keyUp(#d)
waitms(rnd(4325,5046))
END_THREAD
// поток 3 ожидание пикселя
THREAD(pl, 0)
WAITMS(1)
GETSCREEN(804,768,804,768)
IF(PXL(804,768) = 1710830)
KEYDOWN(#4)
WAITMS(RND(73,121))
KEYUP(#4)
WAIT(RND(63,101))
ELSE
WAITMS(50)
END_IF
END_THREAD
-
getscreen по области ::) шикарно :) догадывался, что имел ввиду Vint под "расточительно"
О - оптимизация :D
С - спасибо :)
-
А вот 3-й можно было и без, но как его вписать в эти два пока не соображу. То есть, его можно в режиме ожидания постоянно использовать.
Все больше думаю над этим вариантом. 3-й сценарий на пикселе в постоянный цикл, ведь в какой-то ситуации просто могу забыть его включить.
-
Можно сделать чтобы поток изначально работал
// переключатель 1
IF(ISKEYDOWN(#p) = 1)
$run1 = $run1 ^ 1
IF($run1 = 0)
SETTHREAD(cl, 2)
waitms(20)
IF(ISKEYDOWN(#v) = 1)
keyUp(#v)
END_IF
ELSE
SETTHREAD(cl, 1)
END_IF
WHILE(ISKEYDOWN(#p) = 1)
waitms(20)
END_CYC
HINTPOPUP(STRCONCAT($run1,":",$run2,":",$run3), "Переключение")
END_IF
// переключатель 2
IF(ISKEYDOWN(#o) = 1)
$run2 = $run2 ^ 1
IF($run2 = 0)
SETTHREAD(cll,2)
waitms(20)
IF(ISKEYDOWN(#d) = 1)
keyUp(#d)
END_IF
ELSE
SETTHREAD(cll, 1)
END_IF
WHILE(ISKEYDOWN(#o) = 1)
waitms(20)
END_CYC
HINTPOPUP(STRCONCAT($run1,":",$run2,":",$run3), "Переключение")
END_IF
// переключатель 3
IF(ISKEYDOWN(#l) = 1)
DEFINE($run3, 1)
$run3 = $run3 ^ 1
IF($run3 = 0)
SETTHREAD(pl,2)
waitms(20)
IF(ISKEYDOWN(#4) = 1)
keyUp(#4)
END_IF
ELSE
SETTHREAD(pl, 1)
END_IF
WHILE(ISKEYDOWN(#l) = 1)
waitms(20)
END_CYC
HINTPOPUP(STRCONCAT($run1,":",$run2,":",$run3), "Переключение")
END_IF
waitms(30)
// поток 1
THREAD(cl, 0)
WAITMS(1)
keyDown(#v)
waitms(rnd(73,121))
keyUp(#v)
waitms(rnd(1711,2102))
END_THREAD
// поток 2
THREAD(cll, 0)
WAITMS(1)
waitms(rnd(262,373))
keyDown(#d)
waitms(rnd(262,373))
move(1027,73)
waitms(rnd(262,373))
DBLCLICK(1027,73)
waitms(rnd(262,373))
keyUp(#d)
waitms(rnd(4325,5046))
END_THREAD
// поток 3 ожидание пикселя
THREAD(pl, 1)
WAITMS(1)
GETSCREEN(804,768,804,768)
IF(PXL(804,768) = 1710830)
KEYDOWN(#4)
WAITMS(RND(73,121))
KEYUP(#4)
WAIT(RND(63,101))
ELSE
WAITMS(50)
END_IF
END_THREAD
-
:o
блестяще!