ActionScript 3
Работа с таймерами
Поиск…
Пример таймера обратного отсчета
package {
import flash.events.TimerEvent;
import flash.utils.Timer;
public class CountdownTimer extends Timer {
public var time:Number = 0;
public function CountdownTimer(time:Number = Number.NEGATIVE_INFINITY, delay:Number = 1000) {
super(delay, repeatCount);
if (!isNaN(time))
this.time = time;
repeatCount = Math.ceil(time / delay);
addEventListener(TimerEvent.TIMER, timerHandler);
addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
}
override public function start():void {
super.start();
}
protected function timerHandler(event:TimerEvent):void {
time -= delay;
}
protected function timerCompleteHandler(event:TimerEvent):void {
}
override public function stop():void {
super.stop();
}
public function dispose():void {
removeEventListener(TimerEvent.TIMER, timerHandler);
removeEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
}
}
}
Этот CountdownTimer
расширяет Timer
и используется точно так же, за исключением того, что время отсчитывается.
Пример использования:
var timer:CountdownTimer = new CountdownTimer(5000);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, completeHandler);
timer.start();
function timerHandler(event:TimerEvent):void {
trace("Time remaining: " + event.target.time);
}
function completeHandler(event:TimerEvent):void {
trace("Timer complete");
}
Вышеприведенный пример выводит:
[trace] Time remaining: 4000
[trace] Time remaining: 3000
[trace] Time remaining: 2000
[trace] Time remaining: 1000
[trace] Time remaining: 0
[trace] Timer complete
Интервалы и тайм-ауты
import flash.utils.*;
var intervalId:uint=setInterval(schroedingerCat,1000);
// execute a function once per second and gather interval ID
trace("Cat's been closed in the box.");
function schroedingerCat():void {
if (Math.random()<0.04) {
clearInterval(intervalId); // stop repeating by ID
trace("Cat's dead.");
return;
}
trace("Cat's still alive...");
}
var bombId:uint;
function plantBomb(seconds:Number):uint {
trace("The bomb has been planted, and will blow in "+seconds.toFixed(3)+" seconds!");
var id:uint=setTimeout(boom,seconds*1000); // parameter is in milliseconds
return id;
}
function defuseBomb(id:uint):void {
clearTimeout(id);
trace("Bomb with id",id,"defused!");
}
function boom():void {
trace("BOOM!");
}
setInterval()
используется для выполнения повторных задач асинхронно с заданными интервалами. Внутренний объект Timer
используется, возвращаемое значение типа uint
- это его внутренний идентификатор, с помощью которого вы можете получить доступ и остановить повторение, вызвав clearInterval()
. setTimeout()
и clearTimeout()
работают аналогично, но вызов предоставленной функции выполняется только один раз. Вы можете предоставить дополнительные аргументы для обеих функций набора, они будут переданы функции по порядку. Количество аргументов и их тип не проверяются во время компиляции, поэтому вы должны указать странную комбинацию аргументов или функцию, которая их требует, и не получает ее, при этом возникает ошибка «Ошибка № 1063: несоответствие счетчика аргументов».
Вы можете выполнять обе операции setInterval
и setTimeout
с регулярными объектами Timer
, используя либо 0 или 1 для свойства repeatCount
, либо 0 для неопределенных повторов, 1 для одного.
Пример случайного таймера
package {
import flash.events.TimerEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class RandomTimer extends Timer {
public var minimumDelay:Number;
public var maximumDelay:Number;
private var _count:uint = 0;
private var _repeatCount:int = 0;
public function RandomTimer(min:Number, max:Number, repeatCount:int = 0) {
super(delay, repeatCount);
minimumDelay = min;
maximumDelay = max;
_repeatCount = repeatCount;
}
override public function start():void {
delay = nextDelay();
addEventListener(TimerEvent.TIMER, timerHandler);
super.start();
}
private function nextDelay():Number {
return (minimumDelay + (Math.random() * (maximumDelay - minimumDelay)));
}
override public function stop():void {
removeEventListener(TimerEvent.TIMER, timerHandler);
super.stop();
}
protected function timerHandler(event:TimerEvent):void {
_count++;
if ((_repeatCount > 0) && (_count >= _repeatCount)) {
stop();
dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE));
}
delay = nextDelay();
}
override public function reset():void {
_count = 0;
super.reset();
}
}
}
Этот RandomTimer
расширяет Timer
и используется точно так же, за исключением того, что он отправляет случайные интервалы.
Пример использования, диспетчирование в случайном порядке от 1 до 5 секунд:
var t:int = getTimer();
var timer:RandomTimer = new RandomTimer(1000, 5000);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();
function timerHandler(event:TimerEvent):void {
trace("Time since last dispatch: " + (getTimer() - t));
t = getTimer();
}
Вышеприведенный пример выводит:
[trace] Time since last dispatch: 1374
[trace] Time since last dispatch: 2459
[trace] Time since last dispatch: 3582
[trace] Time since last dispatch: 1335
[trace] Time since last dispatch: 4249