Flash/AS3で辞書、起動引数
メモです
FlashのActionScript3で辞書(的)インスタンスを扱う方法を述べます。
またHTMLからswfに起動引数を渡す、そしてAS3で受け取る方法を述べます。
=== Objectクラスは文字列をキーとする辞書である
Objectクラスは複数のフィールドを持つことができます。
そしてそのフィールドには名前をつけることが可能で、
さらにその名前を文字列で指定してフィールドの値にアクセスできます。
そのため、
Objectはフィールド名をキーとしてもつ
辞書として使用できるのです。
実際のアプリ ♪パッヘルベルのカノン切り貼り演奏機のコードの一部を以下に示します。
var smplStr_2:String="A,CZ,cDZ,ZE,ZeE,oZKk,KLM,KlM,ZEeBb,ZEeBb,O";
var samples:Object={
btn_smpl_1:{text:"This is a pen.",select:1},
btn_smpl_2:{text:smplStr_2,select:0},
btn_smpl_a:{text:"ABCDEFGHIJKLMN",select:2},
btn_smpl_b:{text:"ABEFKN",select:2}
}
function btn_smpl_clicked(e:MouseEvent){
var sample:Object = samples[e.target.name];// ※
ti_prgrm.text = sample.text;
cbox_1.selectedIndex = sample.select;
}
btn_smpl_1.addEventListener(MouseEvent.MOUSE_DOWN,btn_smpl_clicked);
btn_smpl_2.addEventListener(MouseEvent.MOUSE_DOWN,btn_smpl_clicked);
btn_smpl_a.addEventListener(MouseEvent.MOUSE_DOWN,btn_smpl_clicked);
btn_smpl_b.addEventListener(MouseEvent.MOUSE_DOWN,btn_smpl_clicked);
Objectの値の書き方は {フィールド名:値,....} です。samplesは"btn_smpl_1"~"btn_smpl_b"のフィールドを持ちます。
それぞれのフィールドはさらに構造化された値を持っています。
※の所で辞書的なアクセスをしています。ボタンイベントのtarget.nameに ボタンの名前が入っています。
ボタンが押された時、ボタンの名前で辞書検索をします。
この例では初期値を持つ辞書に[ ]オペレータでアクセスしていますが、
[ ]オペレータであらたなデータを投入することもできます。
例えば、次のような形で新たなフィールドと値のセットを追加可能です。
samples["btn_2001"]={text:"Hello HAL. Do you read me?",select:1};
for in を使えば、キー文字列を順に得ることができます。
もちろんそのキー文字列を使って値にアクセス可能です。
for( var key:String in samples ){
var value:Object = samples[key];
trace("key="+key+" val.text="+value.text);
}
//--
結果
key=btn_smpl_a val.text=ABCDEFGHIJKLMN
key=btn_smpl_b val.text=ABEFKN
key=btn_smpl_1 val.text=This is a pen.
key=btn_smpl_2 val.text=A,CZ,cDZ,ZE,ZeE,oZKk,KLM,KlM,ZEeBb,ZEeBb,O
=== HTMLからの起動引数は辞書(Object)で受ける
HTMLでswfを起動する場合、FlashVarsで引数を与えることができます。
複数の値の場合は&でつなぎます
<embed src="canon_player.swf" quality=high FlashVars="comment=lasting&option2=none" width="480" height="213" type="application/x-shockwave-flash" />FlashVarsの値はActionScript3では特別なObjectインスタンス loaderInfo.parametersでString値を 入れた辞書の形でアクセスできます。
if( loaderInfo.parameters["comment"]=="lasting" ){
k_alpha_dec=0.0;
}
この例では"comment=lasting"が指定されれば変数に0を
セットしています。"comment"がセットされていな場合、
アクセス結果はnullとなりますが、==演算は偽になるだけで
エラーは発生しません。ただし、普通はnullチェックが必要です。
Objectですのでfor inでキーの並びを得、値にアクセスすることもできます、
var params:Object = loaderInfo.parameters;
for(var key:String in params){
trace(key+":::"+params[key]); // key:::value
if( key=="comment" && params[key]=="lasting" ){
k_alpha_dec=0.0;
}
}
=== インスタンスをキーとする辞書はDictionaryで
Objectを用いた辞書ではキーは文字列でなければなりませんが、 Dictionaryクラスを用いればインスタンスをキーとした 辞書アクセスができます。var A:Sound = new Sound(new URLRequest(u+"A.mp3"));
var B:Sound = new Sound(new URLRequest(u+"B.mp3"));
// ...
A.addEventListener(Event.COMPLETE,load_prgrs);
B.addEventListener(Event.COMPLETE,load_prgrs);
// ...
var load_map_dict:Dictionary= new Dictionary();
load_map_dict[A]={left:A_L,right:A_R}; // ※2
load_map_dict[B]={left:B_L,right:B_R};
load_map_dict[C]={left:C_L,right:C_R};
// ...
load_map_dict[Q]={left:Q_L,right:Q_R};
//
function load_prgrs(e:Event){
var lamps:Object = load_map_dict[e.target]; // ※3
lamps.left.visible = false;
lamps.right.visible= false;
}
※2でインスタンスをキーとして値を入れています。残念ながらDictionaryにはObjectのように静的に値を与えることは できないので、このように動作記述で与えています。
※3でインスタンスをキーとして値に参照しています。
| 固定リンク

