« ◆illustratorでバネや絡んだ紐を描く | トップページ | ▼湿った空気は「どの位」軽いか »

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でインスタンスをキーとして値に参照しています。

|

« ◆illustratorでバネや絡んだ紐を描く | トップページ | ▼湿った空気は「どの位」軽いか »

トラックバック


この記事へのトラックバック一覧です: Flash/AS3で辞書、起動引数:

« ◆illustratorでバネや絡んだ紐を描く | トップページ | ▼湿った空気は「どの位」軽いか »