ActionScript 3
Werken met timers
Zoeken…
Countdown timer voorbeeld
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);
}
}
}
Deze CountdownTimer
verlengt de Timer
en wordt exact hetzelfde gebruikt, behalve dat de tijd aftelt.
Voorbeeld gebruik:
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");
}
Bovenstaand voorbeeld zou uitvoeren:
[trace] Time remaining: 4000
[trace] Time remaining: 3000
[trace] Time remaining: 2000
[trace] Time remaining: 1000
[trace] Time remaining: 0
[trace] Timer complete
Intervallen en time-outs
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()
wordt gebruikt om herhaalde taken asynchroon uit te voeren als opgegeven intervallen. Intern Timer
object wordt gebruikt, de geretourneerde waarde van type uint
is de interne ID, waarmee u toegang kunt krijgen tot het herhalen en het stoppen kunt stoppen door clearInterval()
aan te roepen. setTimeout()
en clearTimeout()
werken op dezelfde manier, maar de aanroep van de geleverde functie wordt slechts eenmaal uitgevoerd. U kunt extra argumenten opgeven voor beide ingestelde functies, deze worden in volgorde aan de functie doorgegeven. Het aantal argumenten en hun type wordt niet gecontroleerd tijdens het compileren, dus als u een rare combinatie van argumenten opgeeft, of een functie die ze vereist en er geen ontvangt, wordt een foutmelding "Fout # 1063: mismatch argumenten" opgeworpen.
U kunt beide activiteiten van setInterval
en setTimeout
met reguliere Timer
objecten, door 0 of 1 te gebruiken voor eigenschap repeatCount
, 0 voor onbepaalde herhalingen, 1 voor één.
Voorbeeld van een willekeurige timer
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();
}
}
}
Deze RandomTimer
verlengt de Timer
en wordt exact hetzelfde gebruikt, behalve dat deze met willekeurige intervallen wordt verzonden.
Voorbeeld van gebruik, willekeurig verzonden tussen 1 en 5 seconden:
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();
}
Bovenstaand voorbeeld zou uitvoeren:
[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