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

Листинг 24.3. Децентрализованное управление анимацией

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

public class TextTo300 extends TextField { public function TextTo300 ( ) { }

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

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

}

} else { stop( );

}

}

public function start ( ):void { // Начинаем воспроизведение анимации addEventLi stener(Event. ENTER_FRAME. moveTextRi ght);

}

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

removeEventLi stener(Event. ENTER_FRAME, moveTextRi ght);

}

}

}

Следующий код демонстрирует основной класс SWF-файла, в котором применяется класс TextTo300 из листинга 24.3:

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

public class TextAnimation extends Sprite { private var t:TextTo300;

public function TextAnimation ( ) { // Создаем экземпляр класса TextTo300 t = new TextTo300( ); t. text = «Hello»;

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

// Запускаем анимацию t. startC );

}

}

}

Влияние скорости кадров на анимации, создаваемые с помощью события Event. ENTER_FRAME. Поскольку событие Event. ENTER_FRAME синхронизируется со скоростью кадров, для более высокой скорости функции-приемники события Event. ENTER_FRAME будут вызываться чаще по сравнению с более низкой скоростью. Таким образом, если мы перемещаем объект по экрану, используя функцию-приемник события Event. ENTER_FRAME, увеличение скорости кадров может предвещать увеличение скорости анимации.

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

Например, при программировании перемещения объекта t в предыдущем разделе мы неявно задавали его скорость относительно скорости кадров. Наш код говорит: «При прохождении каждого кадра перемещаем объект t на 10 пикселов вправо»:

ball_mc._x += 10:

Следовательно, скорость объекта t зависит от скорости кадров. Если скорость кадров равна 12 кадрам в секунду, то скорость перемещения объекта t составит 120 пикселов в секунду. Если скорость кадров равна 30 кадрам в секунду, скорость перемещения объекта t составит 300 пикселов в секунду!

При создании анимаций на базе сценариев вы можете поддаться искушению рассчитать расстояние перемещения элемента с учетом назначенной скорости кадров. Например, если назначенная скорость кадров составляет 20 кадров в секунду и мы хотим, чтобы элемент перемещался со скоростью 100 пикселов в секунду, естественно предположить, что скорость объекта должна составлять 5 пикселов за один кадр (5 пикселов х 20 кадров в секунду = 100 пикселов в секунду).

Однако у этого подхода есть два существенных недостатка.

? Всякий раз, изменяя назначенную скорость кадров, мы должны модифицировать весь код, который вычисляет скорость с учетом данной скорости кадров.

? Как было сказано в гл. 23, среда выполнения Flash не всегда достигает назначенной скорости кадров. Если компьютер слишком медленный, чтобы отображать кадры со скоростью, соответствующей назначенной, анимация будет замедляться. Это замедление может варьироваться даже в зависимости от загрузки системы; если запущены другие программы или если среда Flash выполняет некую задачу с интенсивной загрузкой процессора, то скорость кадров может упасть на короткий промежуток времени, после чего будет восстановлен нормальный темп.

В некоторых случаях анимация, воспроизводимая со слегка различающимися скоростями, может считаться допустимой. Но когда визуальная точность имеет не последнее значение или когда мы создаем, скажем, игру с активными действиями, гораздо более подходящим вариантом является определение расстояния для перемещения объекта с учетом прошедшего времени, а не в зависимости от назначенной скорости кадров. Дополнительную информацию можно найти далее, в разд. «Анимация, основанная на скорости».

Создание анимации с использованием события TimerEventJIMER

В предыдущем разделе рассказывалось о том, каким образом использовать событие Event. ENTER FRAME для создания анимаций, которые синхронизируются со скоростью кадров среды выполнения Flash. В этом разделе мы познакомимся с тем, как синхронизировать анимации с произвольным промежутком времени, задаваемым с помощью класса flash. utils. Timer.

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

Класс Т ime г — это универсальный служебный класс, предназначенный для выполнения кода через указанный промежуток времени. Каждый объект Timer осуществляет диспетчеризацию событий TimerEvent. TIMER с частотой, устанавливаемой программистом. Функции, которые желают выполняться с данной частотой, регистрируются в объекте Timer для событий TimerEvent. TIMER.

«г *

Класс Timer не гарантирует частоту, с которой выполняются его функции-приемники. Если система или среда выполнения Flash оказалась занята в тот момент, когда объект Timer запланировал выполнить свои функции-приемники, выполнение функций будет отложено. Информацию о том, как избежать подобных задержек в анимации, можно найти в разд. «Анимация, основанная на скорости».

Для использования класса Timer необходимо выполнить следующую общую последовательность действий.

1. Создать новый объект Т ime г:

var timer:Timer = new Timer( );

2. Установить частоту (в миллисекундах), с которой должны генерироваться события TimerEvent. TIMER. Например, следующий код устанавливает частоту, равную 100 мс (за одну секунду осуществляется диспетчеризация десяти событий TimerEvent. TIMER):

timer. del ay = 100;

3. Установить общее количество генерируемых событий TimerEvent. TIMER. Например, следующий код говорит таймеру сгенерировать всего пять событий TimerEvent. TIMER:

timer. repeatCount = 5;

Значение 0 сбрасывает ограничение (генерировать события TimerEvent. TIMER постоянно или до тех пор, пока не скажут остановиться):

timer. repeatCount = 0: // Бесконечные события TimerEvent. TIMER

4. Создать одну или несколько функций, которые будут периодически вызываться в ответ на события TimerEvent. TIMER объекта Timer. Функции, регистрируемые для событий TimerEvent. TIMER, должны определять единственный параметр с типом данных TimerEvent.

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

Function timerListener (e:TimerEvent):void { // Этот код будет выполняться при возникновении события TimerEvent. TIMER

5. Зарегистрировать функцию, созданную на шаге 4, в объекте Timer для событий TimerEvent. TIMER:

timer. addEventLi stenerdimerEvent. TIMER, timerListener);

6. Использовать метод экземпляра start ( ) класса Timer, чтобы запустить таймер. Как только таймер будет запущен, он начнет генерировать события TimerEvent. TIMER в соответствии со значениями, указанными для переменных delay и repeatCount:

timer. start( );

В качестве альтернативы шагам 2 и 3 из приведенного списка установить значения переменных delay и repeatCount можно через параметры конструктора класса Timer, как показано в следующем коде:

var timer:Timer = new TimerdOO, 5); // Переменной delay присваиваем

// значение 100, а переменной // repeatCount — значение 5

Следующий код демонстрирует применение предыдущих шагов в простой реальной ситуации: отображение слова «GO!» после трехсекундной задержки. Обратите внимание, что вторым аргументом функции-конструктора класса Timer является значение 1. Это значит, что произойдет диспетчеризация только одного события TimerEvent. TIMER. Подобный код может быть использован в начале теста с ограниченным временем выполнения или гоночной игры.

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

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

public class Race extends Sprite { private var startMsg:TextField;

public function Race ( ) { // Выполнить приемники события TimerEvent. TIMER один раз спустя // 3 секунды

var timer:Timer = new TimerOOOO, 1);

timer. addEventListenerdimerEvent. TIMER, timerListener);

timer. start( );

startMsg = new TextField( );

startMsg. autoSize = TextFieldAutoSize. LEFT;

startMsg. text = «Get Ready!»;

addChild(startMsg);

}

private function timerListener (e:TimerEvent):void { startMsg. text = «GO!»;

}

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

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

Public class TextAnimation extends Sprite { private var t:TextField; private var timenTimer;

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

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

}

}

Далее внутри конструктора класса TextAnimation мы создаем объект Timer, который будет генерировать события TimerEvent. TIMER каждые 50 мс (то есть 20 раз в секунду). После создания объекта Timer мы вызываем его метод start ( ), после чего этот объект начинает генерировать события TimerEvent. TIMER.

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

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

timer = new Timer(50, 0); timer. start( );

}

Затем мы создаем нашу функцию-приемник moveTextRight ( ), которая перемещает объект TextField t вправо на 10 пикселов до тех пор, пока он не достигнет координаты 300 по оси X. На этот раз функция moveTextRight ( ) принимает события TimerEvent. TIMER, а не Event. ENTER_FRAME, поэтому она определяет единственный обязательный параметр, типом данных которого является TimerEvent.

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

Public function moveTextRight (e:TimerEvent):void { }

Как и раньше, мы хотим остановить анимацию, когда объект t достигнет координаты 300 по оси X. Для этого мы вызываем метод stop ( ) объекта Timer, который прекращает генерацию событий TimerEvent. TIMER:

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

t. x = 300;

}

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

}

}

Чтобы обновить экран сразу после выхода из функции moveTextRight ( ), мы используем метод экземпляра updateAf terEvent ( ) класса TimerEvent (метод updateAf terEvent ( ) был подробно рассмотрен в гл. 23).

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



Полезные ссылки
Случайные записи
  • 05.03.2011">Руководство по actionscript. часть 5, стр. 012
  • 19.02.2012">Кто же такой верстальщик?
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 106
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.122
  • 14.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.81
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.89
  • 21.08.2011">Притягательная красная планета
  • 05.11.2011">Как сделать кнопку для сайта
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 141
  • 11.03.2012">Судья обязал Google и Motorola Mobility предоставить Apple данные об Android
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.121
  • 05.03.2011">Руководство по actionscript. часть 5, стр. 007
  • 28.02.2011">Руководство по actionscript. часть 6, стр. 002
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.16
  • 28.04.2012">В Google Maps была добавлена функция 3D-фототуров
Опрос

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

View Results

Loading ... Loading ...