Author Topic: Помогите написать скрипт.  (Read 3218 times)

0 Members and 1 Guest are viewing this topic.

Jack

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Помогите написать скрипт.
« on: March 19, 2019, 10:11:50 PM »
Нужно чтобы в определенной области делался клик по цвету кроме черного. Помогите пожалуйста.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Помогите написать скрипт.
« Reply #1 on: March 19, 2019, 10:42:31 PM »
А область большая? И насколько твой черный - черный, прямо черныйпричерный - 0х000000? Или в пределах черного?
« Last Edit: March 19, 2019, 10:44:24 PM by dramster »

Jack

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Помогите написать скрипт.
« Reply #2 on: March 19, 2019, 11:46:26 PM »
А область большая? И насколько твой черный - черный, прямо черныйпричерный - 0х000000? Или в пределах черного?
Цвет: 0; hWND: 2490994 (не знаю что это значит), область примерно LCLICK(180,195) до LCLICK(1063,975).

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Помогите написать скрипт.
« Reply #3 on: March 20, 2019, 01:20:37 PM »
Средствами кликера, с такой областью, это сложная задача. Сложная - не значит невыполнимая, вариантов много, но время на выполнения будет исчисляться с десятках секунд. Еще все зависит от процента этого черно цвета от всего остального в области.

Может покажешь скрины, и вместе поищем альтернативные пути решения, цветокоррекции там всякие, контраст кстати в 4.14 добавили. Я думаю должно быть все проще  ;)

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Помогите написать скрипт.
« Reply #4 on: March 20, 2019, 04:20:09 PM »
 :D Всеже заинтересовала задача, хоть она и бесполезная  ;)

Решил задачу с минимальными последствиями для времени выполнения.

Тестовый стенд - черный квадрат 1000х1000, примерно как у тебя, и рандомно кидал точки (любого цвета) на него для теста. Время на поиск точки ~ 500-600мс

Code: (clickermann) [Select]
$x1 = 200
$y1 = 200
$x2 = 1200
$y2 = 1200


//проверяем в области на наличие не черного
SUB(check_white, $yy1, $yy2)
   IF(PXLCOUNT ($x1,$yy1, $x2,$yy2,0)=($x2+1-$x1)*($y2+1-$y1))
      $check = 0
   ELSE
      $check = 1
   END_IF
END_SUB


//$ms = $_ms

GETSCREEN($x1,$y1, $x2,$y2)

//первая проверка на всей области
check_white($y1,$y2)
IF($check = 0)
   print("Все чернО")
ELSE
   
   //создаем массив всех горизонтальных линий
   undefine($arr_y)
   FOR($a=$y1,$a<$y2)
      arrpush($arr_y,$a)
   END_CYC
   
   
   WHILE(($y2-$y1)>0)  //пока не останется одна линия
     
      //с каждым проходом цикла, делим пополам и смотрим где есть светлый
      $y1 =$arr_y[0]
      $y2 =$arr_y[int((arrsize($arr_y)-1)/2)]
      $y1_rem = $y1
      $y2_rem = $y2
      check_white($y1,$y2)
     
      IF($check = 0)
         $y1 =$arr_y[int((arrsize($arr_y)-1)/2)]
         $y2 =$arr_y[arrsize($arr_y)-1]
         $y1_rem = $y1
         $y2_rem = $y2
         check_white($y1,$y2)
      END_IF
     
     
      undefine($arr_y)
     
      FOR($a=$y1,$a<$y2)  //массив тоже пополам
         arrpush($arr_y,$a)
      END_CYC
 
   END_CYC
   
   $check = 0      //небольшая подгоночка для точности
   check_white($y1,$y2)   
   WHILE($check = 0)
      inc($y1)
      inc($y2)
      check_white($y1,$y2)
   END_CYC
   
   
   // print("Светлый в координате Y - ",$y1)
   FOR($a=$x1,$a<$x2)
      IF(pxl($a,$y1) > 0)
         $x = $a
         $y = $y1
      END_IF
   END_CYC
   
   
   /////////////////////////////////////////////////////////
   //готовый результат
   
   print("нужный не черный пиксель в координате - ",$x,"x",$y)
   
END_IF

//print(($_ms - $ms),"ms затрачено." )


halt

Jack

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Помогите написать скрипт.
« Reply #5 on: March 20, 2019, 06:02:37 PM »
:D Всеже заинтересовала задача, хоть она и бесполезная  ;)

Решил задачу с минимальными последствиями для времени выполнения.

Тестовый стенд - черный квадрат 1000х1000, примерно как у тебя, и рандомно кидал точки (любого цвета) на него для теста. Время на поиск точки ~ 500-600мс

Code: (clickermann) [Select]
$x1 = 200
$y1 = 200
$x2 = 1200
$y2 = 1200


//проверяем в области на наличие не черного
SUB(check_white, $yy1, $yy2)
   IF(PXLCOUNT ($x1,$yy1, $x2,$yy2,0)=($x2+1-$x1)*($y2+1-$y1))
      $check = 0
   ELSE
      $check = 1
   END_IF
END_SUB


//$ms = $_ms

GETSCREEN($x1,$y1, $x2,$y2)

//первая проверка на всей области
check_white($y1,$y2)
IF($check = 0)
   print("Все чернО")
ELSE
   
   //создаем массив всех горизонтальных линий
   undefine($arr_y)
   FOR($a=$y1,$a<$y2)
      arrpush($arr_y,$a)
   END_CYC
   
   
   WHILE(($y2-$y1)>0)  //пока не останется одна линия
     
      //с каждым проходом цикла, делим пополам и смотрим где есть светлый
      $y1 =$arr_y[0]
      $y2 =$arr_y[int((arrsize($arr_y)-1)/2)]
      $y1_rem = $y1
      $y2_rem = $y2
      check_white($y1,$y2)
     
      IF($check = 0)
         $y1 =$arr_y[int((arrsize($arr_y)-1)/2)]
         $y2 =$arr_y[arrsize($arr_y)-1]
         $y1_rem = $y1
         $y2_rem = $y2
         check_white($y1,$y2)
      END_IF
     
     
      undefine($arr_y)
     
      FOR($a=$y1,$a<$y2)  //массив тоже пополам
         arrpush($arr_y,$a)
      END_CYC
 
   END_CYC
   
   $check = 0      //небольшая подгоночка для точности
   check_white($y1,$y2)   
   WHILE($check = 0)
      inc($y1)
      inc($y2)
      check_white($y1,$y2)
   END_CYC
   
   
   // print("Светлый в координате Y - ",$y1)
   FOR($a=$x1,$a<$x2)
      IF(pxl($a,$y1) > 0)
         $x = $a
         $y = $y1
      END_IF
   END_CYC
   
   
   /////////////////////////////////////////////////////////
   //готовый результат
   
   print("нужный не черный пиксель в координате - ",$x,"x",$y)
   
END_IF

//print(($_ms - $ms),"ms затрачено." )


halt
Я попробовал ваш скрипт. У меня он не нажимает почему-то. Есть ли более подходящая программа для моей задачи?
« Last Edit: March 20, 2019, 06:07:12 PM by Jack »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Помогите написать скрипт.
« Reply #6 on: March 20, 2019, 06:47:06 PM »
Я попробовал ваш скрипт. У меня он не нажимает почему-то. Есть ли более подходящая программа для моей задачи?

 :o

Code: (clickermann) [Select]
$x1 = 200      //КООРДИНАТЫ СВОИ.
$y1 = 200
$x2 = 1200
$y2 = 1200


//проверяем в области на наличие не черного
SUB(check_white, $yy1, $yy2)
   IF(PXLCOUNT ($x1,$yy1, $x2,$yy2,0)=($x2+1-$x1)*($y2+1-$y1))
      $check = 0
   ELSE
      $check = 1
   END_IF
END_SUB


//$ms = $_ms

GETSCREEN($x1,$y1, $x2,$y2)

//первая проверка на всей области
check_white($y1,$y2)
IF($check = 0)
   print("Все чернО")
ELSE
   
   //создаем массив всех горизонтальных линий
   undefine($arr_y)
   FOR($a=$y1,$a<$y2)
      arrpush($arr_y,$a)
   END_CYC
   
   
   WHILE(($y2-$y1)>0)  //пока не останется одна линия
     
      //с каждым проходом цикла, делим пополам и смотрим где есть светлый
      $y1 =$arr_y[0]
      $y2 =$arr_y[int((arrsize($arr_y)-1)/2)]
      $y1_rem = $y1
      $y2_rem = $y2
      check_white($y1,$y2)
     
      IF($check = 0)
         $y1 =$arr_y[int((arrsize($arr_y)-1)/2)]
         $y2 =$arr_y[arrsize($arr_y)-1]
         $y1_rem = $y1
         $y2_rem = $y2
         check_white($y1,$y2)
      END_IF
     
     
      undefine($arr_y)
     
      FOR($a=$y1,$a<$y2)  //массив тоже пополам
         arrpush($arr_y,$a)
      END_CYC
     
   END_CYC
   
   $check = 0      //небольшая подгоночка для точности
   check_white($y1,$y2)
   WHILE($check = 0)
      inc($y1)
      inc($y2)
      check_white($y1,$y2)
   END_CYC
   
   
   // print("Светлый в координате Y - ",$y1)
   FOR($a=$x1,$a<$x2)
      IF(pxl($a,$y1) > 0)
         $x = $a
         $y = $y1
      END_IF
   END_CYC
   
   
   /////////////////////////////////////////////////////////
   //готовый результат
   
   print("нужный не черный пиксель в координате - ",$x,"x",$y)
   
   
   /////////////////////////////////////////////////////////////
   LCLICK($x,$y)  // КЛИК ПО НАЙДЕнНому!!!!!
   ///////////////////////////////////////////////////////////////
   
END_IF

Jack

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Помогите написать скрипт.
« Reply #7 on: March 21, 2019, 04:09:32 PM »
Я попробовал ваш скрипт. У меня он не нажимает почему-то. Есть ли более подходящая программа для моей задачи?
Это за гранью добра и зла. Человек решил за вас задачу, но из-за собственной рукожопости приведшей к "ненажатиям", сразу требуете вместо Clickermann новую программу. Смените уж сразу гражданство или пол, раз так любите радикальные решения.
Возможно вы правы, но может существует другая программа для моей задачи которая справиться лучше. Я ведь не специалист в этой области, а вы вроде как опытные.

Jack

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Помогите написать скрипт.
« Reply #8 on: March 21, 2019, 04:19:19 PM »
Я попробовал ваш скрипт. У меня он не нажимает почему-то. Есть ли более подходящая программа для моей задачи?

 :o

Code: (clickermann) [Select]
$x1 = 200      //КООРДИНАТЫ СВОИ.
$y1 = 200
$x2 = 1200
$y2 = 1200


//проверяем в области на наличие не черного
SUB(check_white, $yy1, $yy2)
   IF(PXLCOUNT ($x1,$yy1, $x2,$yy2,0)=($x2+1-$x1)*($y2+1-$y1))
      $check = 0
   ELSE
      $check = 1
   END_IF
END_SUB


//$ms = $_ms

GETSCREEN($x1,$y1, $x2,$y2)

//первая проверка на всей области
check_white($y1,$y2)
IF($check = 0)
   print("Все чернО")
ELSE
   
   //создаем массив всех горизонтальных линий
   undefine($arr_y)
   FOR($a=$y1,$a<$y2)
      arrpush($arr_y,$a)
   END_CYC
   
   
   WHILE(($y2-$y1)>0)  //пока не останется одна линия
     
      //с каждым проходом цикла, делим пополам и смотрим где есть светлый
      $y1 =$arr_y[0]
      $y2 =$arr_y[int((arrsize($arr_y)-1)/2)]
      $y1_rem = $y1
      $y2_rem = $y2
      check_white($y1,$y2)
     
      IF($check = 0)
         $y1 =$arr_y[int((arrsize($arr_y)-1)/2)]
         $y2 =$arr_y[arrsize($arr_y)-1]
         $y1_rem = $y1
         $y2_rem = $y2
         check_white($y1,$y2)
      END_IF
     
     
      undefine($arr_y)
     
      FOR($a=$y1,$a<$y2)  //массив тоже пополам
         arrpush($arr_y,$a)
      END_CYC
     
   END_CYC
   
   $check = 0      //небольшая подгоночка для точности
   check_white($y1,$y2)
   WHILE($check = 0)
      inc($y1)
      inc($y2)
      check_white($y1,$y2)
   END_CYC
   
   
   // print("Светлый в координате Y - ",$y1)
   FOR($a=$x1,$a<$x2)
      IF(pxl($a,$y1) > 0)
         $x = $a
         $y = $y1
      END_IF
   END_CYC
   
   
   /////////////////////////////////////////////////////////
   //готовый результат
   
   print("нужный не черный пиксель в координате - ",$x,"x",$y)
   
   
   /////////////////////////////////////////////////////////////
   LCLICK($x,$y)  // КЛИК ПО НАЙДЕнНому!!!!!
   ///////////////////////////////////////////////////////////////
   
END_IF
Я попробовал снова и он начал кликать, но почему-то иногда он не попадает по пикселю и кликает рядом с ним. Бывает еще что делает двойной клик типа нажал (попал) и потом еще раз туда же, возможно это из-за слишком большой скорости?

Jack

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Помогите написать скрипт.
« Reply #9 on: March 21, 2019, 04:23:03 PM »
Как сделать задержку чтобы он не кликал мимо?
« Last Edit: March 21, 2019, 04:48:09 PM by Jack »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Помогите написать скрипт.
« Reply #10 on: March 22, 2019, 10:24:35 PM »
Сам код выполняется итак не слишком быстро, но если нужно еще медленнее, то можешь задержку добавить, в последнюю строку к примеру, в конце кода всего. Wait(1) - задержка на 1 секунду, waitms(500) - задержка на 500 миллисекунд. Цифры естественно подбирай сам.

По поводу "но почему-то иногда он не попадает по пикселю и кликает рядом с ним" - естественно, он кликает в верхний левый найденный пиксель. Добавь небольшие поправки (сдвиги) вправо,  вниз, ну или сам там смотри куда косит. 

Так как скрина я еще не видел, то и больше ничего посоветовать не могу.

И хоть малость малую уделяй чтению справки, говорят помогает. Хотя чтобы наладить твои недоработки по не попаданиям, хватит базового курса математики.