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