独自クラス内に、ユーザが利用可能なイベントハンドラを定義する
ビルドインクラスの多くは、独自の関数を持っています。
Tweenクラスの関数onMotionChangedなども、その例の一つですね。
ユーザが必要があれば定義可能なその仕組みは重宝すべきものだと思います。
そこで今回、独自クラスを配布する事を前提に簡単な仕組みを作ってみました。
ユーザが関数を任意で利用可能でかつ処理開始後に、それを実行する形です。
以下にiamという独自クラスを制作しての検証を行います。
以下をiam.asという名称で保存して下さい。
/** iam.as */ class iam { public function iam() {} public function late(level:MovieClip, func:Function, seconds:Number):Void { _global.setTimeout(setLate, seconds*1000, level, func, this); } public function setLate():Void { arguments[1].apply(arguments[0], null); if (arguments[2] != undefined) arguments[2].onFinished(); } }
Flash側のルートには以下のように記述します。今回iam.asと、このFlashが同じ階層にあるという仮定で話を進めます。
合わせて、onFinishedという関数をユーザが任意に設定可能な関数とします。
var main = new iam(); main.onFinished = function() { //処理完了後、呼び出される関数です trace("onFinished"); } function run():Void { //遅延させて、実行する関数です trace("run"); } //1秒後に同階層の関数runを実行します main.late(this, run, 1);
上記を実行しますと(独自クラスiam内のlateを実行)、_rootにある関数runを1秒後に処理後、iam内に設定したonFinishedが発行されます。
何はともあれ、計画的な設計が必要です。
呼び出す関数はクラス側で決めておいてあげる必要もありますし、配布側は利用可能な関数をきちんと明示してあげないとユーザが混乱します。
今回の場合、“指定処理の後にイベントを発行する”という目的があります。ここは広義なので、適宜目的を見出せれば問題ありません。