onEnterFrame で定期的にメッセージを取得する EventDispatcher。まぁ、extends MovieClip で onEnterFrame でゴニョゴニョ書いてもいいんですけど、せっかくなのでこんな感じにしてみました。
import mx.events.EventDispatcher;/** * onEnterFrame のイベントを発生させる * */class com.layer13.FrameRefreshMessanger extends EventDispatcher { public static var ON_ENTER_FRAME_EVENT:String = "onEnterFrame"; // onEnterFrame の String private static var messanger:FrameRefreshMessanger = new FrameRefreshMessanger(); // singleton用 private var mc:MovieClip; // onEnterFrame を生成するMovieClip private static var MESSANGER_MC_NAME:String = "__framerefreshmessanger_mc__"; //生成するMovieClipの名前 /** * コンストラクタ * */ private function FrameRefreshMessanger() { super(); this.createMovieClip(); } /** * インスタンスを返す * */ public static function getInstance():FrameRefreshMessanger { return messanger; } /** * メッセージを送信する * */ private function sendMsg():Void { var o:Object = new Object(); o.type = ON_ENTER_FRAME_EVENT; o.target = this; this.dispatchEvent( o ); } /** * onEnterFrame を受け取る MC を作る */ public function createMovieClip():Void { if(_root.__framerefreshmessanger_mc__ == undefined) { this.mc = _root.createEmptyMovieClip(MESSANGER_MC_NAME, _root.getNextHighestDepth()); }else { this.mc = _root[MESSANGER_MC_NAME]; } this.mc.owner = this; this.mc.onEnterFrame = function() { this.owner.sendMsg(); } } }
通常はこんな感じで使っています。ムービークリップではないクラスで、ローディングのチェックする時や、再生位置の更新のメッセージを送る時に使っています。
function testFunction() { trace("hogehoge")}import com.layer13.FrameRefreshMessanger;var msg:FrameRefreshMessanger = FrameRefreshMessanger.getInstance();msg.addEventListener(FrameRefreshMessanger.ON_ENTER_FRAME_EVENT, testFunction);
通常のプレビューは問題無いのですが、ストリーミング表示をすると、なぜかメッセージが送信されなくなってしまいました。なーーんでかと思ったら、ストリーミング表示を開始したときに、FrameRefreshMessanger は消えないのに MovieClip は消えてしまう。かつ、FrameRefreshMessanger のクラスが初期化されない。 からのようです。しーかたがないので、 createMovieClip メソッドを public にして、1フレーム目で叩くようにしたら解消しました。
ちゃんとオブジェクトも2度目に再生するときには消してほし〜(涙
絶対、もっといい方法あるよな〜とか書いてて思った。