2008年3月アーカイブ

AS3の EventDispatcher クラスをAS2でも使えるようにと思って作ったクラスです。

EventDispatcher クラス
Event クラス

サンプル用 fla ファイル
demo.fla
demo2.fla

willTriggerメソッドが、どうやって実装するか悩んだ(willTriggerの挙動自体いまいち把握してない)のでとりあえずほったらかしてます。

あと、mx.events.EventDispatcherを継承してますが、中身はまったく別物です。
ムービークリップに適応した場合、イベント通知がルートからたどっていくようになってます。(微妙ですが)

で、AS3的に「addEventListener("enterFrame", handler )」とかやりたいところですが、
元々AS2のMovieClipにそんな機能は実装されてないので、前のエントリーで書いた EventMediator クラスを使います。

こんな感じです。
import flash.events.EventDispatcher;
import flash.events.Event;

import com.seyself.events.EnterFrameBeacon;
import com.seyself.events.EventMediator;

EventDispatcher.initialize( MovieClip.prototype );

var madiator:EventMediator = new EventMediator( new EnterFrameBeacon() );

madiator.addEventListener( "enterFrame" , null );
madiator.member = [mc];   // ステージ上に配置してあるムービークリップ

mc.addEventListener( "enterFrame" , enterFrameHandler );
function enterFrameHandler( event:Event ):Void
{
    trace(event.target);// _level0.mc
}

EnterFrameBeaconクラスは、単純にenterFrameイベントを通知し続けるクラスです。
メンバーに対してイベント通知を促すクラスです。
ソースファイル

例えば Shapeオブジェクトにマウスイベントくっつけたり、
Timerオブジェクトに enterFrame イベントくっつけたりするのに使います。

まず通知元オブジェクトを登録した EventMediator オブジェクトを作成します。
作成した EventMediator オブジェクトに通知メンバーを登録します。
通知元オブジェクトがイベントを通知(dispatchEvent の実行)すると、
メンバーの各オブジェクトも同じイベントを通知するようになります。

import flash.events.Event;
import flash.net.URLLoader;
import flash.utils.Timer;
import flash.display.Sprite;

import com.seyself.events.EventMediator;

var madiator:EventMediator = new EventMediator( new Sprite() );
var urlLoader:URLLoader = new URLLoader();
var timer:Timer = new Timer(1);

madiator.addEventListener( "enterFrame" , null );
madiator.member = [urlLoader,timer];

urlLoader.addEventListener( "enterFrame" , enterFrameHandler );
timer.addEventListener( "enterFrame" , enterFrameHandler );
function enterFrameHandler( event:Event ):void
{
    trace(event.target);
    event.target.removeEventListener( "enterFrame" , arguments.callee );
    //madiator.removeEventListener( "enterFrame", enterFrameHandler );
}
上記のコードの場合、出力結果は以下のようになります。
[object URLLoader]
[object Timer]

TimerクラスやURLLoaderクラスは、もともとenterFrameイベントを持っていませんが
登録しておくと、これらのオブジェクトがenterFrameイベントを通知するようになります。

一応 fla ファイルも置いときます。
demo.fla
demo2.fla
AS3向けのフレームワーク「Progression」がなんだか便利みたいなので、自分も慣れておこうと思った。

とにかく手探りなので、まずは Wiki のチュートリアルを、と思ったら、チュートリアルもまだほとんど準備中だった。
なもんで、とりあえずリファレンスとソースを行き来しながら作ってみた。

作ってみたやつ

一応ソースファイルも一式アップしときます。
恥ずかしいソースファイルのダウンロード

まず組み立て方がよくわからなくて困った。たったこれだけのコンテンツなのに、クラスファイルが錯綜してます。

何気に、右クリックの「新規ウィンドウで開く」がすごいと思った。
Event系のクラスの toString の実装が直接文字列を返すようになってるのは何でなんだろう。

あと、イベントの順番のメモ
sceneStateChange → load → init
goto → unload → sceneStateChange
AS3を使っててAS2に戻ると、何かと不便に感じることが多いです。
AS3とAS2に互換性が無いのが、今、一番厄介に感じます。
いずれ完全にAS3に移行したときのことを考えて、少しAS2にAS3らしさを取り入れたほうがいいのかな?なんて思ったりもしますが、それが正しいのか間違ってるのかはよくわかりません。
ただAS3からAS2にクラスを逆移植することがあるのですが、Eventクラスとか、デフォルトのクラスでよく使うものはAS2にもほしい。
誰か作ってないかなあ。と思う今日この頃。
あと、個人的にProxyクラスがAS2にもほしいけど実装の仕方がわからない。

flash.utils.Dictionary
import flash.utils.Dictionary;

var dic:Dictionary = new Dictionary();
var a = {};
var b = {};
var c = {};

dic.add( a , 1 );
dic.add( b , 2 );
dic.add( c , b );

trace("length : "+dic.length);// output 3
trace("object a : "+dic.value(a));// output 1
trace("object b : "+dic.value(dic.value(c)));// output 2
dic.del(c);
trace("length : "+dic.length);// output 2
trace("has a : "+dic.has(a));// output true
trace("has b : "+dic.has(b));// output true
trace("has c : "+dic.has(c));// output false
せっかくなので忘れないうちにメモ。

テンプレートで変数を使うには<strong>MTSetVar</strong>, <strong>MTSetVarBlock</strong>, <strong>MTSetVarTemplate</strong>などが使える。
変数の設定
<MTSetVar name="変数名" value="値">
<MTSetVarBlock name="変数名">値</MTSetVarBlock>

変数の参照
$変数名


<MTSetVarBlock name="categoryName"><$MTCategoryLabel$></MTSetVarBlock>
<MTEntries category="$categoryName">
・・・
</MTEntries>
ブログのテンプレートを構築しなおしました。
過去のエントリーのURLが変わっています。
一応以前のHTMLファイルを残していますが、過去のページに記載されているリンクが
正しく動作していない可能性があります。
その場合はお手数ですがメインページから再度アクセスしなおしてください。
Box2Dを使った習作。


数値の入力は画面をドラッグ。