電子書籍の厳選無料作品が豊富!

FlashCS3でas3を使っています。

配列についての質問なのですが、

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

var btn_arr:Array=[aboutA_mc,aboutB_mc,aboutC_mc,aboutD_mc];

配列に格納したボタン全てに、同じマウスアクションをつけたい場合など、

for (var i:int = 0; i<btn_arr.length; i++)
{
btn_arr[i].addEventListener(MouseEvent.Roll_Over,abcdOver);
}

function abcdOver(e:MouseEvent):void
{
btn_arr[i].textColor = #FFFFF;

とかで、出来るかなと思ったのですが、上手くいきません。

何か良い方法があれば、ご教授よろしくお願いいたします。

A 回答 (3件)

#1 & #2 です。



> 実際には、
>
> function abcdOver(e:MouseEvent):void
> {
> var c:ColorTransform = new ColorTransform();
> c.color = (0xCCCCCC);
> e.target.transform.colorTransform = c;
> }
>
> にしたかったのですが、これは駄目でした。


駄目とはどういう状態なのでしょうか?
(駄目じゃないとはどういう状態なのでしょうか?)


他のものを除くと
スクリプトは次のようにするということですよね?

--------------------------------
var btn_arr:Array = [aboutA_mc,aboutB_mc,aboutC_mc,aboutD_mc];

for (var i:int = 0; i<btn_arr.length; i++)
{
btn_arr[i].buttonMode = true;
btn_arr[i].addEventListener(MouseEvent.ROLL_OVER,abcdOver);
}

function abcdOver(e:MouseEvent):void
{
var c:ColorTransform = new ColorTransform();
c.color = (0xCCCCCC);
e.target.transform.colorTransform = c;
}
--------------------------------

もっとも
c.color = (0xCCCCCC);
ではなく
c.color = 0xCCCCCC;
だとは思いますが
この場合は ( ) があっても意味は変わりませんからこのままでも良いです。

うまく行っていると思いますが【添付図】↓
 
 
と言いますか,【添付図】の場合は
ただ単に
var c:ColorTransform = new ColorTransform();
c.color = (0xCCCCCC);
aboutB_mc.transform.colorTransform = c;
と書いたときと変わらないということです。
(for文 や 配列 などを使おうが使わまいが同じ結果になる。)=(問題ない。)
「AS3の配列の中にアクセス」の回答画像3
    • good
    • 0
この回答へのお礼

ありがとうございます。
上手くいきました!昨日は何か勘違いしてたのかもしれないです。。。
ここ最近、色々回答していただきありがとうございます!
本当に助かってます。
サイトは8割ほど完成しました。
残るはフォトギャラリーのみです。

お礼日時:2011/03/25 10:04

#1です。



#1の件(スクリプトの意味がわからないの件)とは全く別に

btn_arr[i].textColor = #FFFFF;

これが何らかの形で仮に動作したとします。

これは ボタンMC クリック時に発生するイベントですよね。
ボタンMC クリック時には i という数値は 4 になって止まっているんです。

ココにも書きましたが。
http://oshiete.goo.ne.jp/qa/6607531.html
> for (var i:int = 0; i<3; i++)
>
> のようにループされることになります。
> つまり
> i=0 状態で 1回目ループ
> i=1 状態で 2回目ループ
> i=2 状態で 3回目ループ
> i=3 状態になると 3 未満という条件が成立しないので
> ループせずに for文 を抜けます。

今回の場合は
> for (var i:int = 0; i<3; i++)
 ↓
「 for (var i:int = 0; i<4; i++)」
ですから
「 i=4 状態になると 4 未満という条件が成立しないので
ループせずに for文 を抜けます。」

と書き替えることになりますが。

ですからどのボタンMCをクリックしても

btn_arr[4].textColor = #FFFFF;

が起こるわけです。

それが起こらないようにするために
リスナー関数の引数 「e:MouseEvent」 を使ったり
場合によっては クロージャ を使ったり,MC内に固有の変数を作ってそこに固有の i の値を保存する というようなことをする必要が出てくるのです。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。

転職するため、今月末には後任者にデータを引継ぎするので、コードは分かり易くまとまっているほうが良かったのです。
今のサイトは前任者から引き継いだもので、HTMLでCSSも使わずに作られたもので、訳が分からなかったので、自分で作ったほうが引き継ぎやすいと思いまして。。。
そもそも、本業は3dcgで、flashは初めてなので、かなりきついです。

とりあえずは、

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,abcdClick);
btn_arr[i].addEventListener(MouseEvent.ROLL_OVER,abcdOver);
btn_arr[i].addEventListener(MouseEvent.ROLL_OUT,abcdOut);
}

function abcdClick(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,abcdClick);
}
e.currentTarget.removeEventListener(MouseEvent.CLICK,abcdClick);
}

function abcdOver(e:MouseEvent):void
{
e.target.alpha = 0.8;
}

function abcdOut(e:MouseEvent):void
{
e.target.alpha = 1;
}

のように書けば、上手くいきました。


実際には、

function abcdOver(e:MouseEvent):void
{
var c:ColorTransform = new ColorTransform();
c.color = (0xCCCCCC);
e.target.transform.colorTransform = c;
}

にしたかったのですが、これは駄目でした。

e.target.alpha = 1;
や、
e.target.visible=false;
はOKなのに、colorTransformは駄目なのには、何か条件があるのでしょうか。。。

引数やクロージャはまだ理解できていないので、もうちょっと頑張ってみます。

お礼日時:2011/03/23 13:16

人間が見ても意味がわかりません。


PCならなおさらです。

for文 とか 配列 とか言う前にそれナシでやってみるべきでしょう?
というかそれナシができてから質問すべきでしょう?

for文 とか 配列 とか ナシ状態↓

aboutA_mc.textColor = #FFFFF;

何コレ? です。

スクリプトは別にまとまらなくても良いじゃないですか。
そんなことにこだわっているから何にもできないのではないでしょうか?
    • good
    • 0

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