Author Topic: Разворот к флагу в игре Sky2Fly  (Read 5212 times)

0 Members and 1 Guest are viewing this topic.

ivanuskov

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Разворот к флагу в игре Sky2Fly
« on: December 02, 2013, 09:20:42 PM »
Пишу мини-бота для игры Sky2Fly. Написав более-менее рабочего бота для убийства мобов решил доработать его, чтобы он, когда  заканчивается боезапас, возвращался в город, ремонтировался, сгружал все на склад и летел обратно к мобам. Реализовать это можно с помощью флагов на карте. Ставишь такой, и направление к нему будет показываться на радаре (мини-карта) и в небе. Попытавшись сделать разворот к нужному флагу, столкнулся с проблемой - флаги динамически меняют свой цвет. Т.е. когда направление корабля и флага совпадают, то он очень яркий; иначе он становится бледнее, вплоть до практически невидимого (см. скрины). Порой случается глюк и флаг может стать бледным, даже если плывешь в его направлении. Все возможные цвета флага учесть очень трудно; цветокоррекция "съедает" флаг. Остается лишь корректировка по мини-карте, которую я не имею понятия, как осуществить, т.к. мини-карта не изменяет своего положения при повороте корабля, а корабль меняет свое положение на мини-карте. Если не очень понятно объяснил - снова смотри скрины.

aden

  • Оплот сообщества
  • ****
  • Posts: 363
    • View Profile
Re: Разворот к флагу в игре Sky2Fly
« Reply #1 on: December 03, 2013, 07:59:37 AM »
конечно костыль дикий но может сработать,

на миникарте больше нет ничего с оттенками красного значит пользуемся этим

цветокоррекция(7)
выискиваем все коды оттенков стрелок
утв_шавигации используем
Code: [Select]
if_pixel_in(x1,y1,x2,y2,rgb,rgb1,rgb2,...,rgbN)
action($_return1,$_return2)
end_if

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Разворот к флагу в игре Sky2Fly
« Reply #2 on: December 03, 2013, 10:41:25 AM »
Люблю такие задачи.

Пока вижу два варианта:
1. На миникарте отслеживать куда повёрнут нос корабля. Нос длинее. Проверяем по окружности на определённом удалении цвет на "зелёность". Высчитываем угол. То же самое по своей окружности для флага. Вычисляем его угол. Сравниваем углы и вычисляем угол на который нужно повернуть.  См. скрин.
Из-за маленького размера центрального значка, точность будет +- лапоть, но может и хватит. В цикле, по мере приближения корректировать.

2. Для основного поля.
Проверяем в цикле пикселы по окружности (центр - корабль, радиус - расстояние до широкой части стрелки). Если преобладает красный канал и разница  двух остальных (BG) не очень большая значит нашли. Разницу возможно придётся подобрать.
Рабочий пример:
Code: (clickermann) [Select]
LOGCLEAR
$d1 = 10 // минимальная разница в каналах (дельта) от красного
$d2 = 20 // максималиная разница 2 других каналов, синий-зелёный

$PI = 3.1415926535
$R = 118 // радиус
$centr_X = 526 // центр X
$centr_Y = 545 // центр Y

FOR ($i, $i<360, 10)
   // коррекция ошибки 4.8
   $COS = COS($i*$PI/180)
   IF($COS < 0-1)
      $COS = 0
   END_IF
   $SIN = SIN($i*$PI/180)
   IF($SIN < 0-1)
      $SIN = 0
   END_IF
   $x=INT($R*$COS+$centr_X)
   $y=INT($R*$SIN+$centr_Y)
   
   // если v4.7
   //$x=INT($R*COS($i*$PI/180)+$centr_X)
   //$y=INT($R*SIN($i*$PI/180)+$centr_Y)
   
   MOVE($x,$y) // для отладки
   WAITMS(200) // для отладки
   
   
   $p = pxl($x,$y)  // берём цвет точки
   IF((COLORR($p) > COLORB($p)+$d) & (COLORR($p) > COLORG($p)+$d1))
      // преобладание красной составляющей
      LOGWRITE ("преобладает красный канал") // для отладки
      LOGWRITE ("R ",COLORR($p)) // для отладки
      LOGWRITE ("G ",COLORG($p)) // для отладки
      LOGWRITE ("B ",COLORB($p)) // для отладки
     
      // долее проверяем, что каналы B и G близки друг другу,
      // для отсекания жёлто-коричнево-сиреневых оттенков
      $raznica_BG = SQRT((COLORB($p) - COLORG($p))*(COLORB($p) - COLORG($p)))
      LOGWRITE ("$raznica_BG  ",$raznica_BG)
      IF($raznica_BG < $d2)
         // оттенок красный!, сохраняем координаты и обрабатываем
         
         LOGWRITE ("оттенок красный, X= ",$x,"  Y= ",$y)
         $Ugol = $i+90
         IF(($Ugol = 360) | ($Ugol > 360))
            $Ugol = $Ugol-360
         END_IF
         LOGWRITE ("направление ",$Ugol," градусов")   // за 0 берём вверх
         
         $i = 400 // выходим из цикла
      END_IF
   END_IF
END_CYC

HALT

Шаг проверки брал 10 градусов. Можно поиграться точность/скорость. Может выгодней проверять чаще по мере движения и корректировать, чем 1 раз точно в начале.

Исхожу из предположения, что центр области поиска фиксированный (на миникарте точно).

Так же можно ввести дополнительно учёт насыщенности красного, проверяя величину красного канала и отсекая стрелки бледнее заданного уровня. Возможностей много.
« Last Edit: December 03, 2013, 10:53:19 AM by Vint »


ivanuskov

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Разворот к флагу в игре Sky2Fly
« Reply #3 on: December 03, 2013, 04:47:55 PM »
Огромное спасибо, Vint. Из-за неопытности даже и не думал об анализе цветового канала. Буду работать в этом направлении.
Конечно, на мой нубский взгляд вычислять угол между кораблем и стрелкой - лишняя трата времени, ведь можно сделать небольшой поворот и проверить цвет пикселя перед кораблем на преобладание необходимого канала. А то потом же придется еще и разворот на необходимый угол делать, а учитывая разные характеристики кораблей - в том числе и скорость разворота - сделать это будет опять-таки затруднительно.
Занятие на весь вечер есть)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Разворот к флагу в игре Sky2Fly
« Reply #4 on: December 03, 2013, 05:29:33 PM »
Тебе видней. Игру не знаю. Но угол нужен, чтоб хотя бы знать в какую сторону крутить.