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

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



Полезные ссылки
Случайные записи
  • 03.03.2011">Руководство по actionscript. часть 5, стр. 063
  • 20.03.2011">Руководство по actionscript. часть 2, стр. 059
  • 09.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.147
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 088
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 116
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 106
  • 15.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.46
  • 14.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.79
  • 22.03.2011">Руководство по actionscript. часть 2, стр. 025
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 071
  • 19.03.2011">Руководство по actionscript. часть 2, стр. 097
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 120
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.16
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.43
  • 17.03.2011">Руководство по actionscript. часть 2, стр. 138
Опрос

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

View Results

Loading ... Loading ...