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()
は、指定された間隔で非同期に繰り返しタスクを実行するために使用されます。 Internal Timer
オブジェクトが使用されている場合、 uint
型の戻り値は内部IDで、 clearInterval()
呼び出して繰り返しにアクセスしたり停止したりすることができます。 setTimeout()
とclearTimeout()
も同様に機能しますが、指定された関数への呼び出しは1回だけ行われます。両方の関数に追加の引数を与えることができます。これらは、関数に順番に渡されます。引数の数と型はコンパイル時にはチェックされませんので、引数の奇妙な組み合わせ、またはそれらを必要とする関数を指定すると "Error#1063:Argument count mismatch"というエラーが発生します。
repeatCount
プロパティには0または1、不定リピートには0、1に対しては1を使用して、 setInterval
とsetTimeout
両方のアクティビティを通常の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();
}
}
}
この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
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow