
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でお願いします。
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」などと) 検索してみてください。
ご説明ありがとうございます。
難しいですね。。。いまいち、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;
みたいな書き方って出来ないのでしょうか?
何度もすみません。
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);
}
--------------------------------------------
こんな感じでしょうかね。
早速のご回答ありがとうございます。
最高です!見事にコードが短くなりました!!
もし、お時間があれば、コードの解説もお願いしたいのですが。。。
ちょっと、理解できない個所があり、詳しく知りたいと思いまして。。。
http://oshiete.goo.ne.jp/qa/6584328.html
上記、URLで質問した方法に、今回のコードを組み込みたいのですが、つまってしまいました。
http://www.ideosfera.com.br/english/
のようなサイトを目指しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
potplayerについて質問です
-
FLASHでゲームを作っていた人は...
-
この曲はなんでしょう?
-
laptop go2からの買い替え、lap...
-
スクリップト
-
私のコンピューター上のファイ...
-
arduino プログラムについて
-
chrome flash
-
FLASHの再生はできないのでしょ...
-
フラッシュゲームアーカイブ2
-
ウェブサイトで Flash が事実上...
-
Flashコンテンツを使ったWebサイト
-
Flash Playerのサポートが終了
-
Form内のselectを連動させるに...
-
Flashをブロックしないで
-
ダウンロードしたデジブックはa...
-
ad or script について
-
Flashplayerの運用について
-
VBAのコンボボックスの年月表示...
-
Adobe Flash Player
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
for文を使ったボタン
-
AS3.0で地面にバウンドするよう...
-
VBAユーザーホームテキストボッ...
-
変数に256文字以上のテキストを...
-
VB6.0で、フォームから、別のフ...
-
四乗根を英語で言うと・・・
-
photoshopで書いた四角の枠の中...
-
python ボタンを押すと複数の関...
-
テキストボックスの中身をリセ...
-
【VB.NET】別Formのボタンが押...
-
マウス自体の移動量の取得
-
VBAで改行の入ったデータの正規...
-
UWSCのBTN関数について。
-
テキストボックスにセルの値を...
-
FLASHで脱出ゲームを作る時の、...
-
テキストエリア内の文字列にリ...
-
VBScriptでMsgBoxのYesNoボック...
-
arduino プログラムについて
-
ZWCAD CUIXとLISPの関係について
-
DataTableの件数を取得したい
おすすめ情報