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で質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryでのレスポンシブが綺麗に動かない 3 2022/06/21 11:08
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript addEventListener()でリスナー関数に名前を付ける構文を教えてください 1 2023/07/01 17:31
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- JavaScript 【Javascript】ボタンクリックで2つのclassに対し、それぞれ別のclassを追加したい 1 2022/07/29 20:52
- その他(プログラミング・Web制作) uwscのCHKING関数の画像の認識がうまくいかない。 1 2022/06/18 20:55
- スピーカー・コンポ・ステレオ MCカートリッジのオススメを教えてください。 お時間割いてくださりありがとうございます。 当方、現在 10 2022/07/04 14:20
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
- BTOパソコン https://www.youtube.com/watch?v=8h8EVXotOwQ&t=14s 2 2022/12/23 02:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像表示をアルファでフェード...
-
複数mcのランダム再生とmc指定...
-
YOASOBI
-
縦のメニューバー作成方法で困...
-
Pythonのtkinterについて
-
プログラミング、アーキテクチ...
-
C# chart controlの透過について
-
XMLでJPEGスライドを作成_表示...
-
背景画像が拡大縮小しつつ、大...
-
テキストフィールドについてのA...
-
Adobe Flash Player 9 のテキ...
-
全てのテキストボックスをセル...
-
画像切り替えのアクションスク...
-
ラッコって?
-
VBAでホームページからコピーし...
-
100点でクリアする簡単なモグラ...
-
ランダムに4桁の数字を表示する...
-
App store のマークってイルミ...
-
シンボル化解除の方法
-
ムービークリップの中のボタン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
for文を使ったボタン
-
actionscript3.0 オブジェクト...
-
AS3.0 ループを利用したムービ...
-
複数mcのランダム再生とmc指定...
-
photoshopで書いた四角の枠の中...
-
VBAで改行の入ったデータの正規...
-
YOASOBI
-
VBScriptでMsgBoxのYesNoボック...
-
プログラミング、アーキテクチ...
-
python ボタンを押すと複数の関...
-
別のアプリケーションのテキス...
-
テキストボックスの中身をリセ...
-
テキストボックスにセルの値を...
-
五芒星は、悪魔崇拝とどういう...
-
else if文の順序を変えることに...
-
RPG(AS400)の本、サイトってあ...
-
変数に256文字以上のテキストを...
-
PYTHONのtkinterについて
-
Pythonのtkinterについて
-
ダブルクリックと2回クリックの...
おすすめ情報