2008年3月アーカイブ
AS3の EventDispatcher クラスをAS2でも使えるようにと思って作ったクラスです。
EventDispatcher クラス
Event クラス
サンプル用 fla ファイル
demo.fla
demo2.fla
willTriggerメソッドが、どうやって実装するか悩んだ(willTriggerの挙動自体いまいち把握してない)のでとりあえずほったらかしてます。
あと、mx.events.EventDispatcherを継承してますが、中身はまったく別物です。
ムービークリップに適応した場合、イベント通知がルートからたどっていくようになってます。(微妙ですが)
で、AS3的に「addEventListener("enterFrame", handler )」とかやりたいところですが、
元々AS2のMovieClipにそんな機能は実装されてないので、前のエントリーで書いた EventMediator クラスを使います。
こんな感じです。
EnterFrameBeaconクラスは、単純にenterFrameイベントを通知し続けるクラスです。
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 の実行)すると、
メンバーの各オブジェクトも同じイベントを通知するようになります。
TimerクラスやURLLoaderクラスは、もともとenterFrameイベントを持っていませんが
登録しておくと、これらのオブジェクトがenterFrameイベントを通知するようになります。
一応 fla ファイルも置いときます。
demo.fla
demo2.fla
ソースファイル
例えば 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 の実装が直接文字列を返すようになってるのは何でなんだろう。
あと、イベントの順番のメモ
とにかく手探りなので、まずは 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
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>などが使える。
変数の設定
変数の参照
例
テンプレートで変数を使うには<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ファイルを残していますが、過去のページに記載されているリンクが
正しく動作していない可能性があります。
その場合はお手数ですがメインページから再度アクセスしなおしてください。
過去のエントリーのURLが変わっています。
一応以前のHTMLファイルを残していますが、過去のページに記載されているリンクが
正しく動作していない可能性があります。
その場合はお手数ですがメインページから再度アクセスしなおしてください。
[as3][習作] Box2Dを使った四則演算電卓
Box2Dを使った習作。
数値の入力は画面をドラッグ。
数値の入力は画面をドラッグ。
