Author Topic: Смотрю в книгу и вижу...  (Read 2920 times)

0 Members and 1 Guest are viewing this topic.

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Смотрю в книгу и вижу...
« on: September 22, 2017, 10:39:34 PM »
Доброго времени суток. Знаю, тем полно, даже описание в хелпе читаю, но логики пока не пойму синтаксиса if_pixel_in, а именно роль переменных -
Quote
Возвращаемые параметры
$_return1 - x координата найденного пикселя
$_return2 - y координата
тот случай, когда одеваешь штаны, а трусы проигнорировал.
« Last Edit: September 22, 2017, 10:48:34 PM by ZMAN »

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #1 on: September 22, 2017, 11:38:28 PM »
До меня дошло описание
Quote
Как только первый попавшийся пиксель будет найден, инструкция вернет его координаты в переменные $_return1, $_return2 и прекратит анализ
то есть наличие этих переменных обязательное? если нет этих переменных, то анализ будет продолжаться?

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #2 on: September 23, 2017, 03:02:20 AM »
пример, есть область (0,0,1,1), то есть 2х2, 4 пикселя

первый - красный 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 не обязательно, это системные переменные.

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #3 on: September 23, 2017, 10:48:44 AM »
С переменными $_return1 и $_return2 Разобрались. Можно и без них ежели оперировать с координатами пикселя нет необходимости.
Я преследую такую задачу. есть область в которой в состоянии "покоя" нет нужного пикселя. В этом случае мне необходимо бездействие. Как только состояние меняется и появляется нужный мне пиксель, следует выполнить определенную команду. Я предполагал, что после того, как в буфер ложиться экран, то идет непрерывный анализ, пока не появиться в области нужный пиксель.
« Last Edit: September 23, 2017, 10:54:31 AM by ZMAN »

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #4 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
« Last Edit: September 23, 2017, 12:09:29 PM by ZMAN »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #5 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 //стоп

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #6 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-й поток?

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #7 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)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #8 on: September 23, 2017, 10:43:49 PM »
Вроде нормально всё. Ну, насколько видно с телефона.
Только в 3 потоке не нужен ни чек ни цикл WHILE. Какой в них смысл если идти некуда.
Должно остаться одно условие.

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

И проверяешь один пиксел делая снимок всего экрана... это расточительно.
« Last Edit: September 23, 2017, 10:50:16 PM by Vint »


ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #9 on: September 24, 2017, 11:59:19 AM »
Quote
И так ли нужны эти потоки?
Например 2 первых нужны у них специфическая функция. А вот 3-й можно было и без, но как его вписать в эти два пока не соображу. То есть, его можно в режиме ожидания постоянно использовать.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #10 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

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #11 on: September 24, 2017, 02:03:56 PM »
getscreen по области ::) шикарно :) догадывался, что  имел ввиду Vint под "расточительно"
О - оптимизация :D
С - спасибо  :)
« Last Edit: September 24, 2017, 02:07:27 PM by ZMAN »

ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #12 on: September 24, 2017, 06:00:49 PM »
Quote
А вот 3-й можно было и без, но как его вписать в эти два пока не соображу. То есть, его можно в режиме ожидания постоянно использовать.
Все больше думаю над этим вариантом. 3-й сценарий на пикселе в постоянный цикл, ведь в какой-то ситуации просто могу забыть его включить.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #13 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


ZMAN

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Смотрю в книгу и вижу...
« Reply #14 on: September 24, 2017, 10:08:20 PM »
 :o
блестяще!