• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:AS3のコードをシンプルに)

AS3のコードをシンプルに | AS3のコードの重複をまとめる方法について

このQ&Aのポイント
  • flashCS3のAS3のコードをシンプルにする方法や、ボタンの重複部分をまとめる方法について教えてください。
  • AS3のコードをシンプルにするためには、配列を使って重複する部分をまとめることができます。
  • ボタンAをクリックすると、ボタンAは効かなくなり、ボタンBまたはボタンCをクリックするとボタンAが復活するような仕組みを作ることも可能です。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

> もし、お時間があれば、コードの解説もお願いしたいのですが。。。 字数の制限もありますし #1 の 第二案 の方がご質問の元に近いので そちらの方をメインに書きます。   ◎第二案(コメント入り) ------------------------ //各ボタンMCへの参照を配列「btn_arr」に登録 var btn_arr:Array=[btnA_mc,btnB_mc,btnC_mc]; //文字列 A と B と C を配列「lbl_arr」に登録 var lbl_arr:Array=["A","B","C"]; //変数 i を 「0」 ~「配列btn_arrの要素数未満」 まで //1ずつ加算しながらループ for (var i:int = 0; i<btn_arr.length; i++) { //各ボタンMC内の変数nに現在の変数iの値を固定する btn_arr[i].n = i; //各ボタンMCのボタンモードを有効にする btn_arr[i].buttonMode=true; //各ボタンMCクリック時に関数abcClickを実行 btn_arr[i].addEventListener(MouseEvent.CLICK,abcClick); } //関数abcClickの定義 function abcClick(e:MouseEvent):void { //このタイムラインを 配列lbl_arrの //自分自身(クリックしたMC)内に固定した //n要素のラベルに行かせて再生 this.gotoAndPlay(lbl_arr[e.currentTarget.n]); // //変数 i を 「0」 ~「配列btn_arrの要素数未満」 まで //1ずつ加算しながらループ for (var i:int = 0; i<btn_arr.length; i++) { //各ボタンMCクリック時に関数abcClickを実行 btn_arr[i].addEventListener(MouseEvent.CLICK,abcClick); } //ただし自分自身(クリックしたMC)自体をクリックした時に //関数abcClickを実行するのを削除 e.currentTarget.removeEventListener(MouseEvent.CLICK,abcClick); } ------------------------ 最初に出てくる 配列「btn_arr」 の各要素には 3つあるボタンMCの参照を代入しています。 最初の1行をバラバラに書くと次のように書き替えられます。 var btn_arr:Array = new Arry(); btn_arr[0] = btnA_mc; btn_arr[1] = btnB_mc; btn_arr[2] = btnC_mc; これで,要素数(Array.length)が 3 の配列ができます。 ですから下に出てくる for文 は for (var i:int = 0; i<3; i++) のようにループされることになります。 つまり i=0 状態で 1回目ループ i=1 状態で 2回目ループ i=2 状態で 3回目ループ i=3 状態になると 3 未満という条件が成立しないのでループせずに for文 を抜けます。 その for文 内で 各ボタンMC 内の変数 に i の値を代入したり クリック時のイベントリスナーを登録しています。 そんな感じです。 第一案 の方も第二案 とほとんど同じですが, 「クロージャ」というもの(関数)を使っているところが大きく違います。 Google などで 「クロージャ」 を軸に(例「クロージャ+ActionScript」などと) 検索してみてください。

shin0514
質問者

お礼

ご説明ありがとうございます。 難しいですね。。。いまいち、forとarrayの組み合わせがピンときてない感じです。 ここは、大事なところっぽいので、ゆっくり噛み砕きます。 またちょっと質問なのですが。。。 btn_arr[i].addEventListener(MouseEvent.Roll_Over,abcOver); } function abcOver(e:MouseEvent):void{ btn_arr[i].textColor = #FFFFFF; } とか btn_arr[i].alpha = 0; みたいな書き方って出来ないのでしょうか? 何度もすみません。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

  ◎第一案 -------------------------------------------- var btn_arr:Array=[btnA_mc,btnB_mc,btnC_mc]; var lbl_arr:Array=["A","B","C"]; for (var i:int = 0; i<btn_arr.length; i++) { btn_arr[i].buttonMode=true; btn_arr[i].addEventListener(MouseEvent.CLICK,abcClick(i)); } function abcClick(n:int):Function { return function():void { gotoAndPlay(lbl_arr[n]); for (var i:int = 0; i<btn_arr.length; i++) { btn_arr[i].mouseEnabled = true; } btn_arr[n].mouseEnabled= false; }; } -------------------------------------------- ◎第二案 -------------------------------------------- var btn_arr:Array=[btnA_mc,btnB_mc,btnC_mc]; var lbl_arr:Array=["A","B","C"]; for (var i:int = 0; i<btn_arr.length; i++) { btn_arr[i].n = i; btn_arr[i].buttonMode=true; btn_arr[i].addEventListener(MouseEvent.CLICK,abcClick); } function abcClick(e:MouseEvent):void { this.gotoAndPlay(lbl_arr[e.currentTarget.n]); for (var i:int = 0; i<btn_arr.length; i++) { btn_arr[i].addEventListener(MouseEvent.CLICK,abcClick); } e.currentTarget.removeEventListener(MouseEvent.CLICK,abcClick); } -------------------------------------------- こんな感じでしょうかね。

shin0514
質問者

お礼

早速のご回答ありがとうございます。 最高です!見事にコードが短くなりました!! もし、お時間があれば、コードの解説もお願いしたいのですが。。。 ちょっと、理解できない個所があり、詳しく知りたいと思いまして。。。 http://oshiete.goo.ne.jp/qa/6584328.html 上記、URLで質問した方法に、今回のコードを組み込みたいのですが、つまってしまいました。 http://www.ideosfera.com.br/english/ のようなサイトを目指しています。

関連するQ&A

専門家に質問してみよう