Author Topic: Определение центральных координат в области  (Read 2416 times)

0 Members and 1 Guest are viewing this topic.

krot12348

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Всем привет, появился вопрос и по моему его никто не обсуждал.
GETSCREEN
      IF_PIXEL_IN(0,0,$_xmax,$_ymax,7030057)
         LDOWN ($_return1, $_return2)
         WAITMS(RND(80,160))
         LUP($_return1, $_return2)
         WAITMS(RND(80,140))
         goto(go)
Короче в чём суть дела, цвет мы находим, но находим на всём экране,(везде где он есть)
У нас есть перс который стоит в центре карты (экрана ) и собирает лут. но собирает его как попало.
Если на экране скажем 10 ящиков лута, то он собирает тот ,который находится в верхнем левом углу,
вот он зараза и летит туда, хотя и в центре есть.
Я пробовал несколько таких блоков кода с координатами от центра, всё получается. но увеличивается
время поиска и нагрузка на проц.
Может есть вариант попроще, подскажите уважаемые форумчане, хотяб мыслю подкиньте,
Как сделать чтоб лут собирался от центра экрана.
« Last Edit: May 05, 2015, 10:23:29 AM by Oraven »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Определение координат пикселей
« Reply #1 on: May 04, 2015, 07:13:40 PM »
Вот скрипт, вычисляет ближайшую от центра координату.

Code: (clickermann) [Select]
GETSCREEN
SCANPXL($ARR_SCAN, 0,0, $_xmax,$_ymax, 7030057)

$dist = 10000
$Xcentr = INT($_xmax/2)
$ycentr = INT($_ymax/2)
WHILE (ARRSIZE($ARR_SCAN) > 0)
   $Y = ARRPOP($ARR_SCAN)
   $X = ARRPOP($ARR_SCAN)
   IF(DIST($Xcentr, $ycentr, $X, $Y) < $dist)
      $dist = DIST($Xcentr, $ycentr, $X, $Y)
      $X_centr = $X
      $Y_centr = $Y
   END_IF
END_CYC
UNDEFINE($ARR_SCAN)

IF($dist ! 10000)
   LDOWN($X_centr,$Y_centr) // клик
   WAITMS(RND(80,160))
   LUP($X_centr,$Y_centr)
   WAITMS(RND(80,140))
END_IF

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Определение координат пикселей
« Reply #2 on: May 04, 2015, 07:21:09 PM »
ну и я какраз коечто настряпал, принцип тотже
Code: (clickermann) [Select]
$x=0
$y=0
$cent_x=int($_xmax/2)
$cent_y=int($_ymax/2)
GETSCREEN
SCANPXL($arr,0,0,$_xmax,$_ymax,7030057)
FOR($a=0,$a<ARRSIZE($arr),2)
   IF(DIST($arr[$a],$arr[$a+1],$cent_x,$cent_y)<DIST($x,$y,$cent_x,$cent_y))
      $x=$arr[$a]
      $y=$arr[$a+1]
   END_IF
END_CYC
UNDEFINE($arr)

IF(($x+$y)>0)
   LDOWN ($x, $y)
   WAITMS(RND(80,160))
   LUP($x, $y)
   WAITMS(RND(80,140))
END_IF

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Определение координат пикселей
« Reply #3 on: May 04, 2015, 10:08:01 PM »
Я не так давно делал по заданию, только там ещё и радиус ограничен и изометрия (по вертикали 0,75)

Ну типа этого
Code: (clickermann) [Select]
$mob = "Моб" // пример имён картинок Моб1_1
$mob_n = 2 // количество мобов
$count = 10 // число действий
$log = 1 // вывод лога 1- да, 0- нет
$mobcorX = 0 // коррекция X найденного моба
$mobcorY = 0 // коррекция Y найденного моба


LOGCLEAR
// ищем себя
GETSCREEN
COLORMODE(7)
IF_PICTURE_IN (0,0,$_xmax,$_ymax, "str.bmp", 65280, 90)
   $ggX = $_return1 +3 //+ 4
   $ggY = $_return2 //+ 64
   $vX1 = $ggX - 350
   $vY1 = $ggY - 200
   $vX2 = $ggX + 350
   $vY2 = $ggY + 200
   IF($vX1 < 0)
      $vX1 = 0
   END_IF
   IF($vY1 < 0)
      $vX1 = 0
   END_IF
   IF($vX2 > $_xmax)
      $vX2 = $_xmax
   END_IF
   IF($vY2 > $_ymax)
      $vX2 = $_ymax
   END_IF
   IF($log = 1)
      LOGWRITE ("Нашли себя ", $ggX, " / ", $ggY)
   END_IF
ELSE
   LOGWRITE ("НЕ нашли себя! СТОП")
   HALT
END_IF


GETSCREEN($vX1,$vY1,$vX2,$vY2)
COLORMODE(6,$vX1,$vY1,$vX2,$vY2)
$len = 0
FOR($n=1, $n < $mob_n+1)
   FOR($i=1, $i < 7)
      SCANPICTURE($arr, $vX1,$vY1,$vX2,$vY2, STRCONCAT($mob, $n, "_", $i, ".bmp"), -1, 90)
      //IF($log = 1)
      //LOGWRITE ("Ищем ", STRCONCAT($mob, $n, "_", $i, ".bmp"))
      //END_IF
      IF($len ! ARRSIZE($arr))
         IF($log = 1)
            LOGWRITE ("Найдено ", STRCONCAT($mob, $n, "_", $i, ".bmp  ", (ARRSIZE($arr)-$len)/2, " шт."))
         END_IF
         $len = ARRSIZE($arr)
      END_IF
   END_CYC
END_CYC


FOR($i=0, $i < (ARRSIZE($arr)/2))
   $mobX = $arr[$i*2] + $mobcorX
   $mobY = $arr[$i*2+1] + $mobcorY
   $mobYiz = INT(($mobY - $ggY)*1.75 + $ggY)
   $dist[$i] = DIST($ggX,$ggY,$mobX,$mobYiz)
   LOGWRITE("dist[", $i, "] = ", $dist[$i])
END_CYC


$num = 0
LOGWRITE(" ")
WHILE(($num*2 < ARRSIZE($arr)) & ($num < $count))
   $min = $dist[$num]
   $ind = $num
   
   FOR($i=($num+1), $i < ARRSIZE($dist))
      IF($dist[$i] < $min)
         $min = $dist[$i]
         $ind = $i
      END_IF
   END_CYC
   
   LOGWRITE($num, " минимум: ", $min, "  [", $ind, "]")
   
   // меняем мистами минимальную дистанцию и текущую
   $dtemp = $dist[$ind]
   $dist[$ind] = $dist[$num]
   $dist[$num] = $dtemp
   
   // меняем мистами коры с мин. дистанцией и текущие
   $X =  $arr[$ind*2]
   $Y =  $arr[$ind*2+1]
   
   $arr[$ind*2] = $arr[$num*2]
   $arr[$ind*2+1] = $arr[$num*2+1]
   $arr[$num*2] = $X
   $arr[$num*2+1] = $Y
   
   IF($log = 1)
      LOGWRITE($X, " / ", $Y)
      MOVE($X, $Y)
      //WAITMS(900)
   END_IF
   //LCLICK($X, $Y) // Клик
   LDOWN($X, $Y)
   WAITMS(70)
   LUP($X, $Y)
   WAITMS(100)
   
   INC($num)
END_CYC

KEYPRESS(#a)
KEYPRESS(#r)

UNDEFINE($arr)
UNDEFINE($dist)
HALT


krot12348

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Ребят, большое спасибо за вашу помощь , скрипты работают на ура.
Скрипт от dramster вроде постабильней.