yoshiweb.NET

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

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

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

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

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

FrameInterval.asimport 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+" 回");
};
投稿日 : 2006年01月30日 - yoshiweb - カテゴリ: ActionScript

コメント

投稿者 : xqiplzusnu

Muchas gracias. ?Como puedo iniciar sesion?
2023年12月01日 04時27分23秒