Руководство по actionscript. часть 4, стр. 148
? В приложениях, где должно минимизироваться влияние колебаний скорости кадров среды Flash, применяйте один объект Timer для управления всеми анимациями и создавайте анимации, основанные на скорости (дополнительную информацию можно найти в разд. «Анимация, основанная на скорости»).
? Когда колебания скорости кадров среды выполнения Flash считаются приемлемыми, используйте событие Event. ENTER FRAME (поскольку код для анимации, создаваемой с помощью события Event. ENTER FRAME, в основном проще его эквивалента, реализуемого с помощью объекта Timer).
? Избегайте использования независимых объектов Timer для анимации отдельных отображаемых объектов. Там, где это возможно, используйте один объект Timer для управления всеми анимациями. С другой стороны, если вы хотите обновлять различные объекты через различные интервалы времени, подходящим решением могут оказаться независимые объекты Timer.
Обобщенный класс Animator
Во многих приложениях, которые были представлены в этой главе, код для создания графического объекта и код, занимающийся анимацией этого объекта, объединялись в одном классе. Для реальных приложений разумнее выносить код, создающий анимацию, во внешние классы и повторно применять его в других классах.
Простой класс Animator, представленный в листинге 24.7, демонстрирует один из возможных путей абстрагировать реализацию возможностей для создания анимации от анимируемых объектов. Каждый экземпляр класса Animator может перемещать указанный объект DisplayOb j ect в заданную позицию за определенный промежуток времени. Стоит отметить, что в листинге 24.7 основное внимание уделяется структуре класса, который используется для вынесения кода, управляющего анимацией. В связи с этим класс Animator не реализует сложные анимационные возможности. Их можно реализовать в классе mx. effects. Tween платформы разработки Flex и классах fl. trans it ions. Tween и fl. motion. Animator среды разработки Flash CS3.
Ниже представлен листинг класса Animator. Понять код помогут комментарии.
Листинг 24.7. Обобщенный вспомогательный класс для создания анимации
package { import flash. display.*; import flash. events.*; import flash. utils.*;
// Очень простой класс для создания анимации, который демонстрирует, как // отделить реализацию анимационных возможностей от анимируемого объекта public class Animator extends EventDispatcher {
// Ссылается на анимируемый объект
private var target:DisplayObject;
// Всякий раз, когда начинается воспроизведение анимации, мы записываем
// время начала в переменную startTime
private var startTime:Number;
// Длительность анимации, в миллисекундах
private var duration-.Number;
// Всякий раз, когда начинается воспроизведение анимации, мы сохраняем // начальную позицию объекта target в переменных startX и startY private var startX:Number; private var startY:Number;
// Всякий раз, когда начинается воспроизведение анимации, мы сохраняем // разницу между начальной и конечной позициями в переменных deltaX // и deltaY
private var deltaX:Number; private var deltaY:Number;
// Функция-конструктор принимает ссылку на анимируемый объект public function Animator (target:Di splayObject) { this. target = target;
}
// Начинает воспроизведение анимации, которая заключается в перемещении // объекта target из его текущей позиции в новую позицию с координатами // (toX, toY) за ‘duration’ миллисекунд public function animateTo (toX:Number, toY:Number,
duration:Number):void {
// Запоминаем, где находился объект target в момент начала // воспроизведения данной анимации startX = target. х; startY = target. у;
// Вычисляем разницу между начальной и конечной позициями
// объекта target
deltaX = toX — target. x;
deltaY = toY — target. у;
startTime = getTimer( );
// Запоминаем длительность данной анимации this. duration = duration;
// Начинаем получать уведомления о возникновении событий // Event. ENTER_FRAME. Всякий раз, когда происходит // запланированное обновление экрана, мы будем // обновлять позицию объекта target
target. addEventLi stener(Event. ENTER_FRAME, enterFrameLi stener);
}
// Обрабатывает события Event. ENTER_FRAME.