元からあるsetIntervalは処理落ちしたりすると指定した時間どうりに実行してくれないので、正確に時間を計測する必要のある時計のようなアプリを作るのには使えない。
という事で作った。極限まで正確に時間を計るTimeBeaconクラス。
コンストラクタで指定した時間ごとに”onTimeCount”イベントを発行してくれる。
import mx.transitions.OnEnterFrameBeacon;
class TimeBeacon
{
private var time:Date;
private var interval:Number;
private var nowTime:Number;
private var prevTime:Number;
public var broadcastMessage:Function;
public var addListener:Function;
public var removeListener:Function;
/**
* コンストラクタ
* @param intervalTime イベントを発行する間隔をミリ秒単位で指定する。
*/
function TimeBeacon(intervalTime:Number)
{
interval = intervalTime;
OnEnterFrameBeacon.init();
AsBroadcaster.initialize(this);
}
/**
* カウントスタート
*/
public function start()
{
time = new Date();
nowTime = time.getTime();
prevTime = time.getTime();
broadcastMessage(“onCountStart”);
_global.MovieClip.addListener(this);
}
/**
* カウントストップ
*/
public function stop()
{
nowTime = null;
prevTime = null;
broadcastMessage(“onCountStop”);
_global.MovieClip.removeListener(this);
}
/**
* onEnterFrameイベント受信メソッド
*/
private function onEnterFrame()
{
time = new Date();
nowTime = time.getTime();
var duration:Number = nowTime – prevTime;
if (duration >= interval)
{
broadcastMessage(“onTimeCount”);
prevTime = nowTime;
}
}
private function toString()
{
return “TimeBeacon”;
}
}
使い方はイベントを発行したい間隔を引数にしてコンストラクタを呼び出す。
var TB:TimeBeacon = new TimeBeacon(1000);
次にイベントリスナーをaddListenerで渡す。
var countListener:Object = new Object;
obj.onTimeCount=function(){
trace(“onTimeCount”);
}
TB.addListener(countListener);
で、start()メソッドでイベントの発行が始まる。
TB.start();
stop()で停止する事もできる。
removeListenerも実装済み。
始めてイベントの発行を実装したクラスを作った。
今までコールバック関数の参照を引数経由でお預かりって手段を選んでたけど、それだとそのコールバック関数に引数を渡すのが大変なので困ってた。イベント経由でコールバックできればこんな事も考えなくてすみそうでたいそう助かる。
でもまだAsBroadcasterとEventDispatcherの違いが分かってないから要勉強。