株式会社antsのホームページへようこそ。

ActionScriptでのちょっと面白い関数呼び出し

0
Posted in Lab. By antsinc

関数の参照って面白いですよね、というコネタ。イベントのハンドラをランダムにする、みたいなことをやる場合に使えるテクニックかもしれません。

まずソースコードを見ていただきましょう。

ソースコード(全体)

stop();
/* dummy functions */
function rnd0(){
  statusArea.text = "[rnd0]mouseover.\n" + statusArea.text;
}
function rnd1(){
  statusArea.text = "[rnd1]mouseover.\n" + statusArea.text;
}
function rnd2(){
  statusArea.text = "[rnd2]mouseover.\n" + statusArea.text;
}
function rnd3(){
  statusArea.text = "[rnd3]mouseover.\n" + statusArea.text;
}
function rnd4(){
  statusArea.text = "[rnd4]mouseover.\n" + statusArea.text;
}
function rnd5(){
  statusArea.text = "[rnd5]mouseover.\n" + statusArea.text;
}
function rnd6(){
  statusArea.text = "[rnd6]mouseover.\n" + statusArea.text;
}
function rnd7(){
  statusArea.text = "[rnd7]mouseover.\n" + statusArea.text;
}
function rnd8(){
  statusArea.text = "[rnd8]mouseover.\n" + statusArea.text;
}
function rnd9(){
  statusArea.text = "[rnd9]mouseover.\n" + statusArea.text;
}
/* store rnd functions into Array */
var rndFuncs1:Array = new Array();
rndFuncs1.push(rnd0);
rndFuncs1.push(rnd1);
rndFuncs1.push(rnd2);
rndFuncs1.push(rnd3);
rndFuncs1.push(rnd4);
rndFuncs1.push(rnd5);
rndFuncs1.push(rnd6);
rndFuncs1.push(rnd7);
rndFuncs1.push(rnd8);
rndFuncs1.push(rnd9);
/* store rnd functions into Object */
var rndFuncs2:Object = new Object();
rndFuncs2['id0'] = rnd0;
rndFuncs2['id1'] = rnd1;
rndFuncs2['id2'] = rnd2;
rndFuncs2['id3'] = rnd3;
rndFuncs2['id4'] = rnd4;
rndFuncs2['id5'] = rnd5;
rndFuncs2['id6'] = rnd6;
rndFuncs2['id7'] = rnd7;
rndFuncs2['id8'] = rnd8;
rndFuncs2['id9'] = rnd9;
/* attach button action */
rnd1_btn.onRollOver = function(){
  var rnd:Number = new Number();
  var date:Date = new Date();
  rnd =
    Number(String(date.getTime()).charAt(String(date.getTime()).length-1));
  rndFuncs1[rnd]();
};
rnd2_btn.onRollOver = function(){
  var funcId:String = new String();
  var date:Date = new Date();
  funcId =
    "id"+String(date.getTime()).charAt(String(date.getTime()).length-1);
  rndFuncs2[funcId]();
};

やっていることは単純です。配列インスタンスとオブジェクトインスタンスを作成し、関数の参照を放り込みます。次に、ButtonコンポーネントのインスタンスのonRollOverイベントのハンドラ内で0~9の数字を乱数風に発生させ、配列インスタンスから添え字を使って関数を呼び出す、あるいはオブジェクトインスタンスから連想配列添え字を使って関数を呼び出す、というものです。

例えば、ステージ上にマウスオーバーした際にランダムにキャラクターを表示させる(しかもキャラクター自体の表示ロジックは共通ではない)、といった場合に使えるテクニックかもしれません。

■関数呼び出し実験FLAファイル&SWFファイル
funcRef.zip