Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: ZMAN on September 22, 2017, 10:39:34 PM

Title: Смотрю в книгу и вижу...
Post by: ZMAN on September 22, 2017, 10:39:34 PM
Доброго времени суток. Знаю, тем полно, даже описание в хелпе читаю, но логики пока не пойму синтаксиса if_pixel_in, а именно роль переменных -
Quote
Возвращаемые параметры
$_return1 - x координата найденного пикселя
$_return2 - y координата
тот случай, когда одеваешь штаны, а трусы проигнорировал.
Title: Re: Смотрю в книгу и вижу...
Post by: ZMAN on September 22, 2017, 11:38:28 PM
До меня дошло описание
Quote
Как только первый попавшийся пиксель будет найден, инструкция вернет его координаты в переменные $_return1, $_return2 и прекратит анализ
то есть наличие этих переменных обязательное? если нет этих переменных, то анализ будет продолжаться?
Title: Re: Смотрю в книгу и вижу...
Post by: dramster on September 23, 2017, 03:02:20 AM
пример, есть область (0,0,1,1), то есть 2х2, 4 пикселя
(https://i.imgur.com/fNVlpie.jpg)
первый - красный 255
второй - красный 255
третий - белый 16777215
четвертый - красный 255

задача - найти координаты белого пикселя в этой области

Code: (clickermann) [Select]
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 не обязательно, это системные переменные.
Title: Re: Смотрю в книгу и вижу...
Post by: ZMAN on September 23, 2017, 10:48:44 AM
С переменными $_return1 и $_return2 Разобрались. Можно и без них ежели оперировать с координатами пикселя нет необходимости.
Я преследую такую задачу. есть область в которой в состоянии "покоя" нет нужного пикселя. В этом случае мне необходимо бездействие. Как только состояние меняется и появляется нужный мне пиксель, следует выполнить определенную команду. Я предполагал, что после того, как в буфер ложиться экран, то идет непрерывный анализ, пока не появиться в области нужный пиксель.
Title: Re: Смотрю в книгу и вижу...
Post by: ZMAN on September 23, 2017, 12:07:07 PM
Нашел этот шаблон, но хотел бы разобраться. Как я понимаю, если добавить определенную команду по переменной $check = 1, то цикл закончится? Как мне повторить команду, если этот же пиксель в данный момент прежний?
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PIXEL_IN(200,200, 400,400, 255)
      $check = 1
   ELSE
      WAITMS(50)
   END_IF
END_CYC
Title: Re: Смотрю в книгу и вижу...
Post by: dramster on September 23, 2017, 01:15:00 PM
Как я понимаю, если добавить определенную команду по переменной $check = 1, то цикл закончится? Как мне повторить команду, если этот же пиксель в данный момент прежний?

твои вопросы не понять. что значит "добавить определенную команду по переменной $check = 1"? "если этот же пиксель в данный момент прежний" - прежний это какой, изменился с искомого на другой, или наоборот? ты бы лучше написал что именно требуется, и что происходит в искомой области.

Code: (clickermann) [Select]
$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 //стоп
Title: Re: Смотрю в книгу и вижу...
Post by: ZMAN on September 23, 2017, 01:57:00 PM
Да это потому, что я не совсем понимал(ю) ::) принцип пока не начал его обкатывать :)
Решил ограничиться без поиска по области. Знаю точную координату необходимого мне пикселя
Code: (clickermann) [Select]
// ожидание пикселя
$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
Quote
$check = 1     //если пиксель нашелся в области, то переменной  $check присваеваем "не 0" , любое число не равное нулю
      //и в следующей проверке условия цикла, $check уже не равен нулю, и значит что цикл завершится, скрипт пойдет далее, то что после  END_CYC
Если это единственный скрипт в файле, то он начнет с начала?
Если я его хочу интегрировать в фаил с 2-мя потоками, то лучше его реализовать как 3-й поток?
Title: Re: Смотрю в книгу и вижу...
Post by: ZMAN on September 23, 2017, 03:23:11 PM
Как-то так я представлял интеграцию скрипта в поток, но где-то я допустил ошибку в 3-м потоке. Когда скрипт, который по ожиданию пикселя единственный в файле, он работает так как мне необходимо. То есть повторяет цикл за циклом свои функции. Как я понимаю, после END_CYC он снова возвращался в исходную в этом случае. Но после помещения его среди других скриптов, начались танцы... Где я совершил ошибку? Задача такова - при нажатии l я включаю поток на ожидание пикселя, когда он появляется, выполняется команда, пока пиксель не поменяется на другой. После этого он снова возвращается в режим ожидания. Повторное нажатие l выключает этот поток.
Code: (clickermann) [Select]
// поток 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)
Title: Re: Смотрю в книгу и вижу...
Post by: Vint on September 23, 2017, 10:43:49 PM
Вроде нормально всё. Ну, насколько видно с телефона.
Только в 3 потоке не нужен ни чек ни цикл WHILE. Какой в них смысл если идти некуда.
Должно остаться одно условие.

И так ли нужны эти потоки? Ведь нажатие 4 может совпасть с нажатым v или d. А это уже другие сочетания. Да что там могут, это будет происходить не редко.

И проверяешь один пиксел делая снимок всего экрана... это расточительно.
Title: Re: Смотрю в книгу и вижу...
Post by: ZMAN on September 24, 2017, 11:59:19 AM
Quote
И так ли нужны эти потоки?
Например 2 первых нужны у них специфическая функция. А вот 3-й можно было и без, но как его вписать в эти два пока не соображу. То есть, его можно в режиме ожидания постоянно использовать.
Title: Re: Смотрю в книгу и вижу...
Post by: Oraven on September 24, 2017, 01:03:01 PM
Вот так правильно.
Кроме того добавил сообщение в трей о состоянии потоков в виде 0:0:0
0 означает выкл, 1 вкл
порядок цифр соответствует 1 2 3 потоку

Code: (clickermann) [Select]
// переключатель 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
Title: Re: Смотрю в книгу и вижу...
Post by: ZMAN on September 24, 2017, 02:03:56 PM
getscreen по области ::) шикарно :) догадывался, что  имел ввиду Vint под "расточительно"
О - оптимизация :D
С - спасибо  :)
Title: Re: Смотрю в книгу и вижу...
Post by: ZMAN on September 24, 2017, 06:00:49 PM
Quote
А вот 3-й можно было и без, но как его вписать в эти два пока не соображу. То есть, его можно в режиме ожидания постоянно использовать.
Все больше думаю над этим вариантом. 3-й сценарий на пикселе в постоянный цикл, ведь в какой-то ситуации просто могу забыть его включить.
Title: Re: Смотрю в книгу и вижу...
Post by: Oraven on September 24, 2017, 08:34:31 PM
Можно сделать чтобы поток изначально работал
Code: (clickermann) [Select]
// переключатель 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

Title: Re: Смотрю в книгу и вижу...
Post by: ZMAN on September 24, 2017, 10:08:20 PM
 :o
блестяще!