История одной досадной ошибки

Недавно наступл на грабли при разработке приложения в Adobe Flash. Спешу поделиться опытом.

Сделал во флэше алгоритм контроля коллизий объекта с многоугольниками, заданными вершинами в виде массива точек. Т.е. без использования мувиклипов и, соответственно, MovieClip.hitTest(). Все работает прекрасно. Но. С одним “но”:

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

Долго чесал репу, оптимизировал движение, тестировал. По итогу пришел к одному простому выводу: Flash жестко округляет координаты объектов на сцене с точностью до 0.5, т.е., фактически, до половины пикселя.

Следующий пример дает хоршее представление о том, что происходит:

this.createEmptyMovieClip('foo', this.getNextHighestDepth());

for (var i = 0; i < 20; i++) {
    foo._x = i/100;
    trace(( i/100) + ” – ” + foo._x);
}

Вывод:

0 – 0
0.01 – 0
0.02 – 0
0.03 – 0
0.04 – 0
0.05 – 0.05
0.06 – 0.05
0.07 – 0.05
0.08 – 0.05
0.09 – 0.05
0.1 – 0.1
0.11 – 0.1
0.12 – 0.1
0.13 – 0.1
0.14 – 0.1
0.15 – 0.15
0.16 – 0.15
0.17 – 0.15
0.18 – 0.15
0.19 – 0.15Что и следовало доказать – округление.

Решение: в случае, если необходимо иметь точные значения координат объекта, не полагайтесь на свойства объекта – заведите собственные свойства (например, px для _x и py – для _y) и храните актуальные значения в них.