Как уже ранее отмечалось (пост «Программная анимация в ActionScript»), в языке ActionScript 3.0 появился абсолютно новый класс - класс Timer (далее - просто таймер). И именно возможности класса Timer настоятельно рекомендуется использовать при создании программной анимации на AS 3.0.
В самом простом случае применение класса Timer может выглядеть следующим образом.
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer и в качестве параметра указываем периодичность вызова функции (в миллисекундах)
*/
var timer:Timer = new Timer(100);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
trace("timer");
}
/*
запускаем таймер
*/
timer.start();
или
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(0);
/*
указываем периодичность вызова функции (в миллисекундах)
*/
timer.delay = 100;
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
trace("timer");
}
/*
запускаем таймер
*/
timer.start();
В приведённом выше примере класс Timer используется для периодического (раз в 100 миллисекунд) вызова функции anim. И этот пример довольно сильно напоминает работу с рассмотренным ранее методом setInterval(). Но возможности класса Timer гораздо шире, чем у метода setInterval.
Так, например, мы можем не только указать периодичность вызова пользовательской функции, но и количество этих вызовов...
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer и в качестве параметров указываем:
- периодичность вызова функции (500)
- количество вызовов функции (5)
*/
var timer:Timer = new Timer(500, 5);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
trace("timer");
}
/*
запускаем таймер
*/
timer.start();
или
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(0);
/*
указываем периодичность вызова функции (500)
*/
timer.delay = 500;
/*
указываем количество вызовов функции (5)
*/
timer.repeatCount = 5;
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
trace("timer");
}
/*
запускаем таймер
*/
timer.start();
В приведённом выше примере функция anim вызывается каждые полминуты (500 миллисекунд), но только ПЯТЬ раз. После пятого вызова функции работа таймера прекращается. Кстати, момент прекращения работы таймера можно отследить...
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer и в качестве параметров указываем:
- периодичность вызова функции (500)
- количество вызовов функции (5)
*/
var timer:Timer = new Timer(500, 5);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
ловим момент окончания работы таймера
*/
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onComplete);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
trace("timer");
}
/*
функция, которая будет вызвана в момент завершения работы таймера
*/
function onComplete(event:TimerEvent):void{
trace("The End")
}
/*
запускаем таймер
*/
timer.start();
В примере, приведённом выше, мы отлавливаем момент завершения работы таймера (событие timerComplete) и в этот самый момент запускаем функцию onComplete.
Здесь уже упоминались два свойства класса Timer - это свойства delay и repeatCount. Свойство delay отвечает за интервал между срабатываниями таймера. А свойство repeatCount хранит число запусков, которые должен сделать данный таймер. Значения этих свойств можно и читать, и изменять.
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(0);
/*
указываем периодичность вызова функции (500)
*/
timer.delay = 500;
/*
указываем количество вызовов функции (5)
*/
timer.repeatCount = 5;
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
/*
считываем значение свойства delay
*/
trace("delay = " + timer.delay);
/*
считываем значение свойства repeatCount
*/
trace("repeatCount = " + timer.repeatCount);
}
/*
запускаем таймер
*/
timer.start();
Есть у класса Timer и другие полезные свойства. Чего только стоит currentCount! Свойство currentCount хранит общее число срабатываний таймера. Дело в том, что на практике часто требуется не только периодически вызывать функции, выполняющие какие-то определённые действия, но и точно знать, сколько раз эти функции сработали. В случае с setInterval() это решалось через использование дополнительной переменной...
ActionScript 3.0:
import flash.utils.setInterval;
var count:uint = 0;
function anim(){
count++;
trace("count = " + count)
}
setInterval(anim,100);
Но для таймера надобность в переменной count отпадает. Ведь есть свойство currentCount...
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(1000);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
trace("currentCount = " + timer.currentCount);
}
/*
запускаем таймер
*/
timer.start();
Вы, конечно, можете возразить, что переменную-счётчик count можно в любой момент обнулить...
ActionScript 3.0:
import flash.utils.setInterval;
var count:uint = 0;
function anim(){
count++;
if(count > 10){
count = 0;
}
trace("count = " + count)
}
setInterval(anim,100);
Но и свойство currentCount у таймера тоже можно обнулить. Для этого надо воспользоваться методом reset(). Метод reset() останавливает работу таймера и обнуляет значение у свойства currentCount...
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(1000);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
if(timer.currentCount > 10){
/*
останавливаем работу таймера и сбрасываем значение свойства currentCount
*/
timer.reset();
}
trace("currentCount = " + timer.currentCount);
}
/*
запускаем таймер
*/
timer.start();
или
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(1000);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
if(timer.currentCount > 10){
/*
останавливаем работу таймера и сбрасываем значение свойства currentCount
*/
timer.reset();
/*
снова запускаем таймер
*/
timer.start();
}
trace("currentCount = " + timer.currentCount);
}
/*
запускаем таймер
*/
timer.start();
Кстати, остановить работу таймера можно не только с помощью метода reset(). Есть ещё метод stop(), который останавливает работу таймера, но не обнуляет значения свойства currentCount...
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(1000);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
if(timer.currentCount > 10){
/*
останавливаем работу таймера
*/
timer.stop();
}
trace("currentCount = " + timer.currentCount);
}
/*
запускаем таймер
*/
timer.start();
Хорошо. Теперь мы знаем, как запускать и останавливать работу таймера. А как определить, работает или не работает таймер? Очень просто. Для этого надо обратится к свойству running класса Timer. Если таймер в данный момент запущен, то свойство running вернёт значение true...
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(100);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
}
/*
запускаем таймер
*/
timer.start();
/*
проверяем, запущен ли таймер
*/
trace(timer.running)
А если таймер остановлен (с помощью методов reset(), stop() или мы просто забыли запустить таймер с помощью метода start()), то свойство running вернёт значение false...
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(100);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
}
/*
запускаем таймер
*/
timer.start();
/*
останавливаем таймер
*/
timer.stop();
/*
проверяем, запущен ли таймер
*/
trace(timer.running)
или
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(100);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
}
/*
запускаем таймер
*/
timer.start();
/*
останавливаем таймер
*/
timer.reset();
/*
проверяем, запущен ли таймер
*/
trace(timer.running)
или
ActionScript 3.0:
/*
импорт классов
*/
import flash.utils.Timer;
import flash.events.TimerEvent;
/*
создаём объект Timer
*/
var timer:Timer = new Timer(100);
/*
ловим событие TimerEvent.TIMER и при наступлении события запускаем функцию anim
*/
timer.addEventListener(TimerEvent.TIMER, anim);
/*
функция, периодически запускаемая таймером
*/
function anim(event:TimerEvent):void{
}
/*
проверяем, запущен ли таймер
*/
trace(timer.running)
Во всех трёх приведённых выше примерах мы получим значение FALSE. Обхитрить таймер не получится.
Приведённые выше примеры показывают, что возможности класса Timer гораздо шире, чем у старого-доброго setInterval(). Знаю, к работе с таймером надо ещё привыкнуть. Возможно, с первого взгляда Timer не выглядит удобным и, тем более, компактным. Но со временем вы на собственном опыте признаете превосходство таймера и не захотите возвращаться к "старичку" setInterval-у...
Как-то так :-)