Author Topic: Область COLORMODE выходящая за экран  (Read 3982 times)

0 Members and 1 Guest are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Область COLORMODE выходящая за экран
« on: April 21, 2015, 02:37:03 PM »
Обнаружился один баг, или недочёт.

Вопросом, как будут работать функции поиска, если заданная область будет выходить за пределы экрана я интересовался давно. Тогда же провёл эксперименты и выяснил, что никакого негативного влияния это не оказывает на функцию IF_PICTURE_IN и ей подобные.
Это было нужно, когда мы ищем различные картинки, отталкиваясь от уже существующих. Например герой передвигается по экрану и на определённом расстоянии от него нужно искать предметы/мобов.
Ситуация довольно распространённая. И каждый раз проверять не вышла ли область за экран и не нужно ли её корректировать не очень улыбалась. К счастью это и не понадобилось, всё работало по умолчанию нормально.

Правда, это ещё было на версии, наверно, 4.5, когда не было области ни у GETSCREEN ни у COLORMODE.
Недавно столкнулся с ситуацией где долго не мог найти проблему, оказывается если область COLORMODE выходит за экран (по крайней мере в отрицательную сторону) цветокоррекция не срабатывает совсем.
Понятное дело что можно её проверить и скорректить парой доп. условий, но это такое фи.

Вот тест демонстрирующий проблему.
Code: (clickermann) [Select]
GETSCREEN
COLORMODE(7)
SCREENSHOT

GETSCREEN(-100,0, 100,250)
COLORMODE(7)
SCREENSHOT

GETSCREEN(-100,0, 100,250)
COLORMODE(7, -100,0, 100,250)
SCREENSHOT

HALT

Столкнулся и решал в таком месте
Code: (clickermann) [Select]
GETSCREEN
COLORMODE(7)
IF_PICTURE_IN (0,0,$_xmax,$_ymax, "hero.bmp", 65280, 90)
   $vX1 = $_return1 - 350
   $vY1 = $_return2 - 200 + 64
   $vX2 = $_return1 + 350
   $vY2 = $_return2 + 200 + 64
   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
END_IF

// ну и дальше шла куча поисков типа
GETSCREEN($vX1,$vY1,$vX2,$vY2)
COLORMODE(6,$vX1,$vY1,$vX2,$vY2)
SCANPICTURE($arr, $vX1,$vY1,$vX2,$vY2, STRCONCAT($mob, $n, "_", $i, ".bmp"), -1, 90)
...
...

Но часто такие последовательности идут потоком и каждый раз вставлять проверки... код засоряется. Тем более, что GETSCREEN-у и другим на это плевать.