Author Topic: Как ожидать несколько картинок на экране и запоминать их координаты?  (Read 2021 times)

0 Members and 1 Guest are viewing this topic.

anette25

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Пожалуйста, помогите!  Как ожидать несколько картинок на экране и запоминать их координаты?
Дело в том, что картинки появляются и исчезают довольно быстро и их много разных (скажем 20), если я сохраню локально все 20, как их одновременно отслеживать на экране с сохранением их координат?

Пока пробую как-то так, на примере 2-х картинок, не получается. С одной картинкой получалось, но была проблема что при быстром ее появлении программа ее не видела. Надо чтобы картинка отображалась на экране секунды 3-4, чтобы программа ее считала - для меня это слишком много.
Вторая проблема что при считывании двух картинок вообще не работает скрипт, по крайней мере так как я пытаюсь.
А мне надо чтобы одновременно считывалось 20 и более картинок, с сохранением их координат. Возможно ли это?
Выход из цикла WHILE должен быть после того как обнаружены все картинки (я их вручную поочередно открываю).

Code: (clickermann) [Select]
$check = 0
$check2 = 0

WHILE(($check < 0)  & ($check2 < 0))

   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
      $check = 1
      print("Картинка 1 найдена в координатах: ", $_return1, ,":", $_return2)
      $pic1=$_return1
      $pic2=$_return2
   ELSE
      WAITMS(50)
   END_IF
   
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file2.bmp", -1, 100)
      $check2 = 1
      print("Картинка 2 найдена в координатах: ", $_return1, ,":", $_return2)
      $pic3=$_return1
      $pic4=$_return2
   ELSE
      WAITMS(50)
   END_IF
   
END_CYC

WAITMS(3000)
LCLICK($pic1, $pic2)
print("Картинка 1 нажата в координатах: ", $pic1, ,":", $pic2)

WAITMS(3000)
LCLICK($pic3, $pic4)
print("Картинка 2 нажата в координатах: ", $pic3, ,":", $pic4)
« Last Edit: November 23, 2017, 10:36:08 AM by anette25 »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Картинка должна находиться менее чем за секунду. Для этого картинка должна быть предельно маленькой, кроме того нужно ограничить зону поиска, ты много тратишь времени на поиск картинки там где её быть не может.

Code: (clickermann) [Select]
$check1 = 0
$check2 = 0
WHILE(($check1 = 0)|($check2 = 0))
   GETSCREEN
   IF($check1 = 0)
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
         $check1 = 1
         print("Картинка 1 найдена в координатах: ", $_return1, ,":", $_return2)
         $pic1=$_return1
         $pic2=$_return2
      END_IF
   END_IF
   
   IF($check2 = 0)
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file2.bmp", -1, 100)
         $check2 = 1
         print("Картинка 2 найдена в координатах: ", $_return1, ,":", $_return2)
         $pic3=$_return1
         $pic4=$_return2
      END_IF
   END_IF
   
   // и тд.
   
   WAITMS(50)
END_CYC

WAITMS(3000)
LCLICK($pic1, $pic2)
print("Картинка 1 нажата в координатах: ", $pic1, ,":", $pic2)

WAITMS(3000)
LCLICK($pic3, $pic4)
print("Картинка 2 нажата в координатах: ", $pic3, ,":", $pic4)

HALT

Это можно написать более оптимально, но нужно знать как ты будешь дальше использовать эти координаты.
Делается это через цикл а собранные координаты помещаются в массив.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
попробовал, с помощью циклов. писал на скорую руку, нужно тестить, возможны ошибки.

Code: (clickermann) [Select]
//картинки должны иметь вид file0.bmp file1.bmp file2.bmp ....


//область поиска, ввести свою
$x1 = 100
$y1 = 100
$x2 = 200
$y2 = 200


FOR($a=0,$a<20)         //массив номеров картинок  , 20 - количество картинок
   ARRPUSH ($arr_pic, $a)
   ARRPUSH ($arr_pic, 0) //флаг, найдена картинка или нет
END_CY

FOR($a=0,$a<ARRSIZE($arr_pic))    //пустой массив координат
   ARRPUSH ($arr_coor, 0)
END_CYC

//////////////////////////////////////

$n_pic = ARRSIZE($arr_pic)/2
WHILE($n_pic > 0)  //пока не найдем все картинки
   
   GETSCREEN($x1,$y1,$x2,$y2)
   FOR($a=0,$a<ARRSIZE($arr_pic),2)  //перебираем поочереди не найденные картинки
     
      IF($arr_pic[$a+1] = 0)     //если эта картинка еще не нашлась.
     
         IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT("file",$arr_pic[$a], ".bmp"), -1, 100)
           
            print("Картинка ",STRCONCAT("file",$arr_pic[$a], ".bmp")," найдена в координатах: ", $_return1, ,":", $_return2)
           
            $arr_coor[$arr_pic[$a]] = $_return1    //пишем в массив координаты
            $arr_coor[$arr_pic[$a]+1] = $_return2
           
            $arr_pic[$a+1] = 1   //флаг, картинка найдена
            inc($n_pic,-1)
           
         ELSE
            WAITMS(50)
         END_IF
         
      END_IF
     
   END_CYC
     
END_CYC

//////////////////////////////////////


FOR($a=0,$a<ARRSIZE($arr_coor),2)   //клики по найденному.

   WAITMS(3000)
   LCLICK($arr_coor[$a], $arr_coor[$a+1])
   print("Картинка " ,$a/2 ," нажата в координатах: ", $arr_coor[$a] ,":", $arr_coor[$a+1])   
   
END_CYC
« Last Edit: November 23, 2017, 12:25:26 PM by dramster »

anette25

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
dramster, Oraven, Спасибо большое!!!  Я попробую так!

anette25

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Я пробую так, код ниже, половина картинок находит, половину не видит (может в картинках дело?), и те что находит, находит с некоторой задержкой 1-2 сек, что долго. Ломаю голову почему так.

Code: (clickermann) [Select]
$x[0] = 0
$y[0] = 0
$x2[0] = 0
$y2[0] = 0
$h=100

For($i=0, $i<8)         //сюда записываю координаты 2-х картинок, сначала они равны нулю
   $x[$i] = 0
   $y[$i] = 0
   $x2[$i] = 0
   $y2[$i] = 0
End_cyc

$k1=200   //координаты области в которой ищем
$k2=200
$k3=800
$k4=800

$n1[0]="jelt1.bmp"        //названия картинок
$n2[0]="jelt2.bmp"
$n1[1]="kor-kor1.bmp"
$n2[1]="kor-kor2.bmp"
$n1[2]="kor-kras1.bmp"
$n2[2]="kor-kras2.bmp"
$n1[3]="kor-zel1.bmp"
$n2[3]="kor-zel2.bmp"
$n1[4]="kras1.bmp"
$n2[4]="kras2.bmp"
$n1[5]="oran1.bmp"
$n2[5]="oran2.bmp"
$n1[6]="sv-jelt1.bmp"
$n2[6]="sv-jelt2.bmp"
$n1[7]="zel1.bmp"
$n2[7]="zel2.bmp"




WHILE(($x[0] = 0)|($x[1] = 0)|($x[2] = 0)|($x[3] = 0)|($x[4] = 0)|($x[5] = 0)|($x[6] = 0)|($x[7] = 0)|($x2[0] = 0)|($x2[1] = 0)|($x2[2] = 0)|($x2[3] = 0)|($x2[4] = 0)|($x2[5] = 0)|($x2[6] = 0)|($x2[7] = 0) )
   
   GETSCREEN($k1,$k2,$k3,$k4)
   
   FOR($a=0,$a<8)
     
      IF($x[$a] = 0)
         IF_PICTURE_IN ($k1,$k2,$k3,$k4, $n1[$a], -1, $h)
            $x[$a] = 1
            print("Картинка ",$n1[$a]," найдена в координатах: ", $_return1, ,":", $_return2)
            $x[$a]=$_return1
            $y[$a]=$_return2
         END_IF
      END_IF
     
      IF($x2[$a] = 0)
         IF_PICTURE_IN ($k1,$k2,$k3,$k4, $n2[$a], -1, $h)
            $x2[$a] = 1
            print("Картинка ",$n2[$a]," найдена в координатах: ", $_return1, ,":", $_return2)
            $x2[$a]=$_return1
            $y2[$a]=$_return2
         END_IF
      END_IF
     
   END_CYC
   
   
   
   // и тд.
   
  // WAITMS(50)
END_CYC


//открытие картинок
WAITMS(5000)


For($i=0, $i<8)
   LCLICK($x[$i], $y[$i])
   print("Картинка 1 нажата в координатах: ", $x[$i], ,":", $y[$i])
   WAITMS(500)
   LCLICK($x2[$i], $y2[$i])
   print("Картинка 2 нажата в координатах: ", $x2[$i], ,":", $y2[$i])
   WAITMS(500)
End_cyc


HALT

anette25

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Всё сделала, довольно быстро находится, проблема сейчас в том, что не всегда картинка находится, хотя я ищу маленький ее кусочек, всего 2 пикселя - видимо цветовая гамма каким-то образом чуть меняется. Хотя 90% картинок находится. Подскажите как достичь 100% результата?  Может есть какие-то хитрости?