yoshiweb.NET-blog



HOME > blog > 任意の間隔でイベントを発生するクラス
« 自作クラス公開・共有環境に関して | Flash Media Server で HTMLチャット »

任意の間隔でイベントを発生するクラス

※2006/11/30 - setInterval()と使い方が違うので下のクラスは無視してください。後日作成した 修正版 をおすすめします。

Flash OOP 勉強会の影響で、今後いろいろな人が自作クラスなんかを公開してくれればいいな〜。と期待しつつちょっとクラスを書いてみた。

FrameInterval クラス
簡単にいうと setInterval() のフレーム版(?)

30フレームごとに関数を実行したいのに、setInterval() だとフレームと同期をとれなくてイヤンな感じを解消するかもしれないもの。
仕組みはクラスの中で onEnterFrame を実行して、指定したフレームになったらイベントを発生してるだけ。
setInterval() と違って、2回だけ実行という使い方も出来るようにしてみた。

FrameInterval.as
import mx.events.EventDispatcher;
import mx.transitions.OnEnterFrameBeacon;
/**
* FrameInterval
* 任意の間隔でイベントを発生
*
* @author yoshiweb
* @version 0.20060130
*/
class net.yoshiweb.FrameInterval {
    private var CLASS_NAME = "[FrameInterval]";
    private var _mc:MovieClip;
    private var _enterFrame:Object;
    //
    public var addEventListener:Function;
    public var removeEventListener:Function;
    private var dispatchEvent:Function;
    /*
    * コンストラクタ
    */
    function FrameInterval() {
        EventDispatcher.initialize(this);
        OnEnterFrameBeacon.init();
        _enterFrame = new Object();
    }
    /*
    * 繰り返し実行
    * @param delay イベントを発生する間隔(0以上の整数)
    * @param max 繰り返す回数(任意)
    */
    public function setInterval(delay:Number, max):Void {
        if (delay>=0) {
            delay = Math.floor(delay);
            max = Math.floor(max);
            _countDown(delay, max);
        }
    }
    /*
    * 1回だけ実行
    * @param delay イベントを発生する間隔
    */
    public function setTimeout(delay:Number):Void {
        setInterval(delay, 1);
    }
    /*
    * 停止
    */
    public function clearInterval():Void {
        MovieClip.removeListener(_enterFrame);
    }
    private function _countDown(delay:Number, max):Void {
        var count:Number = delay;
        var time:Number = 0;
        var self = this;
        _enterFrame.onEnterFrame = function() {
            count--;
            time;
            self.dispatchEvent({type:"onCountDown", count:count, time:time});
            if (count<=0) {
                time++;
                self.dispatchEvent({type:"onFunction", count:count, time:time});
                count = delay;
                if (max>0 && time>=max) {
                    MovieClip.removeListener(this);
                }
            }
        };
        MovieClip.addListener(_enterFrame);
    }
    private function toString():String {
        return CLASS_NAME;
    }
}


【使い方】
30フレーム毎にムービークリップ「mc」のx座標を10pxずつ2回だけ加算したい場合は。
import net.yoshiweb.FrameInterval;
var _iv = new FrameInterval();// クラス定義
var _ls = new Object();// リスナー定義
_ls.onFunction = function(ev) {
    mc._x += 10;
};
_iv.addEventListener("onFunction", _ls); //リスナー登録
_iv.setInterval(30,2);

setInterval のような使い方ができるようにした方がいいのかもしれないけど、イベントを使った方が簡単そうだったのでこんなモノになりました。

onFunction イベントが発生するまでの時間(フレーム数)を調べたいときは
_ls.onCountDown = function(ev) {
    trace("あと "+ev.count+" フレーム");
};

何回、実行されたか調べたいときは
_ls.onFunction = function(ev) {
    trace("実行回数 "+ev.time+" 回");
};
投稿者 yoshiweb - ActionScript - 2006/01/30 - 13:05:32 - Permalink
このエントリーをはてなブックマークに追加

Comments

コメントしてください

コメントを書く

※ スパム対策のためコメント内の URL は全角で書いてください。あとで半角に変換します。