Недавно наступл на грабли при разработке приложения в 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) и храните актуальные значения в них.