Руководство по actionscript. часть 4, стр. 143

Public function moveTextRight (e:TimerEvent):void { if (t. x <= 300) { t.x += 10; if (t.x > 300) { t. x = 300;

}

// Обновляем экран после выхода из этой функции e. updateAfterEvent( );

} else { // Останавливаем таймер, // когда объект TextField достигнет // своего места назначения timer. stop( );

}

}

Наконец, мы регистрируем функцию moveTextRight ( ) в объекте Timer для событий TimerEvent. TIMER. Мы выполняем регистрацию этой функции непосредственно перед запуском таймера в конструкторе класса TextAnimation, как показано в следующем коде:

public function TextAnimation ( ) { // Создаем объект TextField t = new TextField( ); t. text = «Hello»;

t. autoSize = TextFieldAutoSize. LEFT; addChild(t);

timer = new Timer(50, 0);

timer. addEventListener(TimerEvent. TIMER, moveTextRight);

timer. start( );

}

В листинге 24.4 представлен законченный код для версии класса TextAnimation, реализованной с использованием объекта Timer.

Руководство по actionscript. часть 4, стр. 144

Листинг 24.4. Анимация объекта TextField по горизонтали до координаты 300 по оси X, версия с таймером

package { import flash. display.*;

import flash. events.*; import flash. utils.*; import flash. text.*;

public class TextAnimation extends Sprite { private var t:TextField; private var timer. Timer;

public function TextAnimation ( ) { // Создаем объект TextField t = new TextField( ); t. text = «Hello»;

f. autoSize = TextFieldAutoSize. LEFT; addChild(t);

timer = new Timer(50, 0);

timer. addEventListener(TimerEvent. TIMER, moveTextRight); timer. start( );

}

public function moveTextRight (e:TimerEvent):void { if (t. x <= 300) { t.x += 10; if (t.x > 300) { t. x = 300;

}

e. updateAfterEvent( ); // Обновляем экран после выхода

// из этой функции

} else {

// Останавливаем таймер, когда объект TextField достигнет // своего места назначения timer. stop( );

}

Приведем еще одно сравнение между анимацией на основе объекта Timer и анимацией на основе события Event. ENTER FRAME — в листинге 24.5 представлена аналогичная версия класса TextTo300, реализованная с использованием объекта Timer (класс TextTo300 был приведен ранее в листинге 24.3).

Руководство по actionscript. часть 4, стр. 145

Листинг 24.5. Класс ТехгТоЗОО, версия с таймером

package { import flash. display.*; import flash. events.*; import flash. utils.*; import flash. text.*;

public class TextTo300 extends TextField { private var timer:Timer;

public function TextTo300 ( ) { timer = new Timer(50, 0);

timer. addEventListener(TimerEvent. TIMER, moveTextRight);

}

public function moveTextRight (e:Event):void { if (x <= 300) { x += 10;

if (t. x > 300) { t. x = 300;

}

} else { stop( );

}

}

public function start ( ):void { // Начинаем воспроизведение анимации timer. start( );

}

public function stop ( ):void { // Останавливаем анимацию timer. stop( );

}

}

‘}

В листинге 24.6 показан еще один пример анимации, созданной с использованием объекта Timer. Это версия мигающего текста, реализованная на языке ActionScript 3.0.

Руководство по actionscript. часть 4, стр. 146

Листинг 24.6. Мигающий текст

package { import flash. display. TextField; import flash. util. Timer; import flash. events.*;

public class BlinkText extends TextField { private var timer-.Timer;

public function BlinkText (delay:Number = 1000) { timer = new Timer(delay, 0);

timer. addEventListener(TimerEvent. TIMER, timerListener); timer. start( );

}

private function timerListener (e:TimerEvent):void { // Скрываем данный объект, если в настоящее время он отображается // на экране; или отображаем данный объект, если в настоящее время // он скрыт, visible = Ivisible;

e. updateAfterEventC );

}

public function setDelay (newDelay:Number):void { timer. del ay = newDelay;

}

public function startBlink ( ):void { timer. start( );

}

public function stopBlink ( ):void { visible = true; timer. stop( );

}

}

}

Влияние скорости кадров на таймеры. Хотя на первый взгляд может показаться, что класс Timer предоставляет абсолютно независимый способ для выполнения некоторой функции через определенный интервал времени, он, как бы удивительно это ни звучало, все равно зависит от скорости кадров среды выполнения Flash. Событие TimerEvent. TIMER может возникать не чаще десяти раз для каждой проверки запланированного обновления экрана (то есть в десять раз чаще скорости кадров). Например, если скорость кадров равна 1 кадру в секунду, событие TimerEvent. TIMER может возникать в лучшем случае каждые 100 мс, даже когда для параметра delay объекта Timer указано меньшее значение. Для скорости, равной 10 кадрам в секунду, событие TimerEvent. TIMER может возникать 100 раз в секунду (каждые 10 мс). Для скорости, равной 100 кадрам в секунду, событие TimerEvent. TIMER может возникать 1000 раз в секунду (каждую 1 мс).

Руководство по actionscript. часть 4, стр. 147

Когда установленная частота возникновения события TimerEvent. TIMER больше скорости кадров, функция будет выполняться на этапе следующего запланированного обновления экрана после истечения интервала времени. Чтобы запросить обновление экрана до следующего запланированного обновления, используйте метод экземпляра updateAf terEvent ( ) класса TimerEvent, рассмотренный в гл. 23.

Выбор между классом Timer и событием Event. ENTERFRAME

Как мы уже знаем, и класс Timer, и событие Event. ENTER FRAME могут применяться для создания анимации. Так что же из них больше подходит для ваших целей? Ниже перечислены основные факторы, влияющие на выбор.

Скорость кадров может изменяться. Когда SWF-файл загружается другим приложением, скорость кадров этого приложения может значительно отличаться от

назначенной скорости кадров данного SWF-файла. Это может приводить к слишком быстрому или слишком медленному воспроизведению анимации. Загружаемый SWF-файл может, конечно, установить собственную скорость кадров, однако такое изменение, возможно, окажет нежелательное влияние на воспроизведение в родительском приложении. Определенную независимость от скорости кадров обеспечивает класс Timer (ограничения были рассмотрены в разд. «Создание анимации с использованием события TimerEvent. TIMER»).

Использование множества объектов Timer требует больше памяти. В архитектурах с децентрализованным управлением анимацией использование отдельного объекта Timer для управления анимацией каждого объекта требует больше памяти, чем это необходимо для аналогичной реализации с использованием события Event. ENTER_FRAME.

Использование множества объектов Timer может приводить к избыточному количеству запросов на обновление экрана. В архитектурах с децентрализованным управлением анимацией использование отдельного объекта Timer вместе с методом updateAf terEvent ( ) для управления анимацией каждого объекта ведет к возникновению нескольких независимых запросов на обновление экрана, что может привести к проблемам с производительностью.

Исходя из перечисленных факторов, мы рекомендуем следующее.

? В приложениях, которые должны синхронизировать отображение содержимого, создаваемого программным путем, с отображением кадрового содержимого, создаваемого вручную в среде разработки Flash, используйте событие Event. ENTER_FRAME.

Руководство по 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.

Руководство по actionscript. часть 4, стр. 149

Private function enterFrameListener (e:Event):void {

// Вычисляем время, прошедшее с момента начала

// воспроизведения анимации

var elapsed:Number = getTimer( )-startTime;

// Вычисляем, сколько времени прошло с момента начала воспроизведения // анимации в процентах от ее общей длительности var percentDone:Number = elapsed/duration; // Если анимация еще не завершена… if (percentDone < 1) {

// …обновляем позицию объекта target updatePosition(percentDone); } else {

// …в противном случае помещаем объект target в его конечное // положение и прекращаем получать уведомления о возникновении // событий Event. ENTER_FRAME updatePosition(l);

target. removeEventLi stener(Event. ENTER_FRAME, enterFrameLi stener);

}

}

// Устанавливает позицию объекта target, выраженную в процентах // от расстояния между начальной и конечной точками анимации private function updatePosition (percentDone.-Number):void {

target. x = startX + deltaX*percentDone;

target. у = startY + deltaY*percentDone;

Класс SlidingText, представленный далее в листинге 24.8, демонстрирует применение класса Animator. Каждый объект SlidingText — это текстовое поле, которое может быть перемещено в указанную позицию с использованием анимационных возможностей.

Руководство по actionscript. часть 4, стр. 150

I Платформа разработки Flex включает текстовые компоненты, которые могут быть аними-м$ 4 т рованы и стилизованы с помощью множества настраиваемых эффектов. Дополнительную ttft информацию можно получить в описании компонентов mx. controls. Text и mx. controls.

TextArea справочника по платформе разработки Flex 2 корпорации Adobe.

Листинг 24.8. Класс, представляющий перемещающийся текст

package { import flash. text.*;

public class SlidingText extends TextField { private var animator:Animator;

public function SlidingText (toX:Number, toY:Number, duration:Number) { animator = new Animator(this); slideTo(toX, toY, duration);

}

public function slideTo (toX:Number, toY:Number, duration:Number):void { animator. animateTo(toX, toY, duration);

}

}

}

Класс AnimationLibDemo, представленный в листинге 24.9, демонстрирует, как использовать классы Animator и SlidingText. Он создает круг, который перемещается в текущую позицию указателя мыши, когда пользователь щелкает кнопкой мыши в области отображения среды выполнения Flash. Этот класс также перемещает текст «Не11о» в позицию (300; 0) и закрепляет его там.

Руководство по actionscript. часть 4, стр. 151

Листинг 24.9. Демонстрация использования класса Animator

package { import flash. display.*; import flash. events.*; import flash. text.*;

// Демонстрирует использование класса Animator public class AnimationLibDemo extends Sprite { private var circleAnimator:Animator;

public function AnimationLibDemo ( ) { // Создаем сообщение, которое с использованием анимационных // возможностей перемещается в позицию (300. 0) // за одну секунду (1000 мс)

var welcome:SlidingText = new SlidingText(300. 0. 1000); welcome. text = «Welcome!»;

welcome. autoSize = TextFieldAutoSize. LEFT; addChild(welcome);

// Создаем круг для анимации

var circle:Shape = new Shape( );

ci rcle. graphi cs.1i neSty1e(10, 0×666666);

ci rcle. graphi cs. begi nFi11 (0×999999);

circle. graphics. drawCircle(0, 0, 25);

addChild(circle);

// Создаем объект Animator для анимации объекта circle circleAnimator = new Animator(circle);

// Регистрируем приемник для событий мыши

stage. addEventLi stener(MouseEvent. M0USE_D0WN, mouseDownLi stener);

// Когда пользователь щелкает кнопкой мыши на сцене, перемещаем

// объект circle в точку, где произошел щелчок.

Руководство по actionscript. часть 4, стр. 152

Private function. mouseDownListener (e:MouseEvent):void {

// Преобразуем точку из системы координат экземпляра класса Stage

// в систему координат данного экземпляра класса

var mousePt:Point = globalToLocal (new PointCe. stageX, e. stageY));

circleAnimator. animateTodnousePt. x, mousePt. y, 500);

}

**4

При создании элементов управления пользовательского интерфейса с эффектами анимации рассмотрите возможность расширения класса mx. core. UIComponent платформы Э?.’ разработки Flex вместо разработки собственной библиотеки, реализующей анимационные возможности. В классе UlComponent предусмотрен расширенный набор инструментов для добавления эффектов к собственным элементам управления пользовательского интерфейса.

Анимация, основанная на скорости

В среде Flash невозможно гарантировать определенный временной интервал, через который будет выполняться проверка запланированных обновлений экрана или будут возникать события TimerEvent. TIMER. Событие Event. ENTER_FRAME обычно возникает позднее запланированного времени, которое определяется назначенной скоростью кадров, а события TimerEvent. TIMER — позднее времени, определяемого переменной delay объекта Timer.



Полезные ссылки
Случайные записи
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 081
  • 11.04.2014">Натуральный камень и методы его обработки
  • 09.03.2011">Руководство по actionscript. часть 4, стр. 047
  • 15.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.46
  • 04.08.2010">Современное выравнивание макета
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.113
  • 26.02.2011">Руководство по actionscript. часть 6, стр. 054
  • 06.07.2011">Новая серия ультрапортативных ноутбуков Acer
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.117
  • 23.02.2011">Руководство по actionscript. часть 7, стр. 019
  • 17.08.2010">Страничка со списком услуг
  • 19.03.2011">Руководство по actionscript. часть 2, стр. 087
  • 02.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.100
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.116
  • 09.03.2011">Руководство по actionscript. часть 4, стр. 057
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...