AS3S.ORG

ACTIONSCRIPT 3.0 SOURCES

Archive for February, 2008

getter/setterを利用してイベントリスナーを動的に切り替える

AS2では

Mouse.addListener(this);

とすることで、MouseDown時に、this.onMouseDownメソッドが呼ばれるようになります。

function onMouseDown() {
    trace("default");
}
function test() {
    trace("test");
}
Mouse.addListener(this);
this.onMouseDown = test;

などとすることで、addListenerした後でもonMouseDownメソッドを動的に切り替えることができます。

AS3で採用されたイベントモデルでは、addEventLisntener時にイベントリスナーの参照を引数として指定するようになり、また、ほかのモダンな言語と同様、参照渡し(call by reference)ができないため、以下のようなコードではAS2に相当する動的なリスナーの切り替えができません。

function onMouseDown(event:MouseEvent):void {
    trace("default");
}
function test(event:MouseEvent):void {
    trace("test");
}
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
onMouseDown = test; //意味なし

上記の例では、addEventListenerで渡されるのは、その時点でのonMouseDownの値なので、その後にonMouseDownの値を変えても意味がありません。
【参考】AS3では関数の引数はすべて値渡し(call by value)である

そこで、下記のようにgetter/setterメソッドを利用することで同じような動作が実現できます。
この例では、最初のMouseDownと2回目以降のMouseDownで呼ばれるリスナー関数が切り替わります。

Read the rest of this entry »

Written by admin

February 11th, 2008 at 11:10 pm

Posted in misc.

複数の非同期処理の完了を通知するQueueクラス

複数のファイルを読み込む場合など、複数の非同期処理の進行状況とすべてが完了したタイミングをイベントとして受け取ることができるQueueクラスを公開しました。

org.as3s.Queue

サンプルのダウンロードはこちらから。

クラスを公開するというほど大げさなものではありませんが、なるべく標準的なイベントモデルには変更を加えずに、複数イベントの完了を通知することができます。
仕組みはいたって単純で、各イベントを受け取るリスナーを Queue(待ち行列)に追加し、イベントが呼ばれたらQueueから削除しているだけです。
Queueが削除されたタイミングとQueueがなくなったタイミングでイベントが発生し、
queue.length / queue.totalで進行状況を知ることができます。

また、エラー発生時にもリスナーをQueueから削除するようにしておけば、ファイルが一部取得できなかった場合にもQueueの完了イベントを受け取ることができます。

Read the rest of this entry »

Written by admin

February 3rd, 2008 at 5:54 pm

Posted in Queue