ActionScript 3
Mit Timern arbeiten
Suche…
Countdown-Timer-Beispiel
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);
}
}
}
Dieser CountdownTimer
erweitert den Timer
und wird genauso verwendet, mit der Ausnahme, dass die Zeit heruntergezählt wird.
Verwendungsbeispiel:
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");
}
Das obige Beispiel würde Folgendes ausgeben:
[trace] Time remaining: 4000
[trace] Time remaining: 3000
[trace] Time remaining: 2000
[trace] Time remaining: 1000
[trace] Time remaining: 0
[trace] Timer complete
Intervalle und Timeouts
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()
wird verwendet, um wiederholte Aufgaben asynchron als angegebene Intervalle auszuführen. Interner Timer
- Objekt wird verwendet, der zurückgegebene Wert vom Typ uint
ist seine interne ID, mit dem Sie Zugriff auf und die Wiederholung stoppen durch den Aufruf clearInterval()
. setTimeout()
und clearTimeout()
funktionieren ähnlich, der Aufruf der bereitgestellten Funktion wird jedoch nur einmal ausgeführt. Sie können den beiden gesetzten Funktionen zusätzliche Argumente zur Verfügung stellen. Diese werden der Reihe nach an die Funktion übergeben. Die Anzahl der Argumente und deren Typ werden beim Kompilieren nicht geprüft. Wenn Sie also eine komische Kombination von Argumenten angeben oder eine Funktion, die sie benötigt und keine empfängt, wird der Fehler "Fehler # 1063: Nicht übereinstimmende Argumentanzahl" ausgelöst.
Sie können beide Aktivitäten von setInterval
und setTimeout
mit regulären Timer
Objekten ausführen, indem Sie entweder 0 oder 1 für die repeatCount
Eigenschaft, 0 für unbestimmte Wiederholungen, 1 für eins verwenden.
Zufallstimer-Beispiel
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();
}
}
}
Dieser RandomTimer
erweitert den Timer
und wird genauso verwendet, mit der Ausnahme, dass er in zufälligen Intervallen RandomTimer
wird.
Beispielnutzung, zufällig zwischen 1 und 5 Sekunden versandt:
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();
}
Das obige Beispiel würde Folgendes ausgeben:
[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