プロが教えるわが家の防犯対策術!

AS3のコードについてご教授お願いします。

下記のようなコードがあるとします。

btnA_mc.addEventListener(MouseEvent.CLICK,aClick);
btnB_mc.addEventListener(MouseEvent.CLICK,bClick);
btnC_mc.addEventListener(MouseEvent.CLICK,cClick);

function aClick(e:MouseEvent):void
{
this.gotoAndPlay("A");
//trace("Aclick");
btnB_mc.addEventListener(MouseEvent.CLICK,bClick);
btnC_mc.addEventListener(MouseEvent.CLICK,cClick);
btnA_mc.removeEventListener(MouseEvent.CLICK,aClick);
}

function bClick(e:MouseEvent):void
{
this.gotoAndPlay("B");
//trace("Bclick");
btnA_mc.addEventListener(MouseEvent.CLICK,aClick);
btnC_mc.addEventListener(MouseEvent.CLICK,cClick);
btnB_mc.removeEventListener(MouseEvent.CLICK,bClick);
}

function cClick(e:MouseEvent):void
{
this.gotoAndPlay("C");
//trace("Cclick");
btnA_mc.addEventListener(MouseEvent.CLICK,aClick);
btnB_mc.addEventListener(MouseEvent.CLICK,bClick);
btnC_mc.removeEventListener(MouseEvent.CLICK,cClick);
}

btnA_mc.buttonMode = true;
btnB_mc.buttonMode = true;
btnC_mc.buttonMode = true;

この中の、
btnA_mc.addEventListener(MouseEvent.CLICK,aClick);
btnB_mc.addEventListener(MouseEvent.CLICK,bClick);
btnC_mc.removeEventListener(MouseEvent.CLICK,cClick);

のような、重複する部分を、配列か何かでまとめたいのですが、いまいち方法が分かりません。
ボタンAをクリックで、ボタンAは効かなくなる。ボタンBorCをクリックでボタンAが復活みたいな感じです。
宜しくお願いします。

flashCS3
ASはver3.0でお願いします。

A 回答 (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」などと) 検索してみてください。
    • good
    • 0
この回答へのお礼

ご説明ありがとうございます。
難しいですね。。。いまいち、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;

みたいな書き方って出来ないのでしょうか?

何度もすみません。

お礼日時:2011/03/22 19:27

 


◎第一案
--------------------------------------------
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);
}
--------------------------------------------



こんな感じでしょうかね。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
最高です!見事にコードが短くなりました!!

もし、お時間があれば、コードの解説もお願いしたいのですが。。。
ちょっと、理解できない個所があり、詳しく知りたいと思いまして。。。

http://oshiete.goo.ne.jp/qa/6584328.html

上記、URLで質問した方法に、今回のコードを組み込みたいのですが、つまってしまいました。

http://www.ideosfera.com.br/english/
のようなサイトを目指しています。

お礼日時:2011/03/21 12:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!