一秒ごとにイベント発行するクラスを作ろうと思ったらEventDispatcherを使うところでつまずいた。
import mx.transitions.OnEnterFrameBeacon;
import mx.events.EventDispatcher;
class TimeBeacon
{
private var time:Date;
private var nowTime:Number;
private var prevTime:Number;
function TimeBeacon()
{
OnEnterFrameBeacon.init();
EventDispatcher.initialize(this);
}
function start()
{
time = new Date();
nowTime = prevTime = time.getTime();
this.dispatchEvent( { type:”onCountStart”, target:this } );
_global.MovieClip.addListener(this);
}
function stop()
{
nowTime = null;
prevTime = null;
_global.MovieClip.removeListener(this);
}
function onEnterFrame()
{
time = new Date();
nowTime = time.getTime();
if (nowTime – prevTime >= 1000)
{
this.dispatchEvent( { type:”onOneSecond”, target:this } );
prevTime = nowTime;
}
}
}
これで毎秒onOneSecondが発行される予定だったんだけど、「’dispatchEvent’ という名前のメソッドはありません。」って怒られる。現象としてはインスタンスにdispathEventが実装されてないって事だからEventDispatcherにインスタンスの参照が渡されてないんだと思ったけどtraceしたらそうでもないみたい。なんじゃこら。
で、趣向を変えてEventDispatcherを継承してみたらすんなりイベントが発行されるようになった。
import mx.transitions.OnEnterFrameBeacon;
class TimeBeacon extends mx.events.EventDispatcher
{
private var time:Date;
private var nowTime:Number;
private var prevTime:Number;
function TimeBeacon()
{
OnEnterFrameBeacon.init();
}
function start()
{
time = new Date();
nowTime = prevTime = time.getTime();
this.dispatchEvent( { type:”onCountStart”, target:this } );
_global.MovieClip.addListener(this);
}
function stop()
{
nowTime = null;
prevTime = null;
_global.MovieClip.removeListener(this);
}
function onEnterFrame()
{
time = new Date();
nowTime = time.getTime();
if (nowTime – prevTime >= 1000)
{
this.dispatchEvent( { type:”onOneSecond”, target:this } );
prevTime = nowTime;
}
}
}
でもinitializeコメントアウトしても動作してるのを見るとなんか正攻法じゃない気がする。
助けてエロい人。