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

はじめまして^^ ちょっと困ってます^^;
わたしの状況から説明しますと…
それぞれに名前をつけたボタンmcがあり、それをタイムライン上でスクリプト管理しようと思ってますが、その際に…

//ボタンの名前を入れた配列
bs=["b1","b2","b3","b4","b5"];

for( dammy in bs ){
trace(bs[dammy]._alpha);
}

この文で、トレースした場合にアルファ値が返ってきません;;
bs[dammy]でのトレースはちゃんとb1とか入っているのですが… 
わかる方いらっしゃいましたら教えて下さい(゜´Д`゜)

A 回答 (1件)

インスタンス名の配列変数の中身が、参照ではなくただの文字列になっているためです。



各ムービークリップがステージにあり、スクリプトもメインのタイムラインのフレームに書くものとします。
bs の中身を、次のように変更してみてください。

 bs = [ b1 , b2 , b3 , b4 , b5 ];


for in は、オブジェクトに含まれる要素を全て(一部は列挙できないものもありますが)取り出す制御文です。

 for( dammy in bs ){

では、確かに配列変数 bs に含まれる5つの要素全てを列挙できてはいるのですが、ご質問文のスクリプトですと、配列変数 bs の中身は文字列です。
つまり、for in により取り出される値も文字列ということになります。

文字列から実際のインスタンスを指すためには、これを参照というものに変換しなければなりません。
ご質問文のスクリプトのように配列変数に文字列が入っているのなら、for in の中では

 trace( this[ bs[ dammy ] ]._alpha );

というように、for in で取り出した文字列を参照に変換しないと、インスタンスの持っているプロパティを見ることはできません。

文字列を参照に変換するには eval 関数か配列演算子 [ ] を使いますが、eval は少々古い方法で、最近は [ ] を使う方法が推奨されています。

********************

値を " " でくくると文字列になりますが、配列変数に値を入れる際に実在するインスタンス名を " " でくくらずに入れると、配列変数にはインスタンスの参照が入ります。
参照を入れた状態で、for in の中で

 trace( bs[ dammy ] );

としてみてください。
b1 や b2 といった文字列ではなく、_level0.b○○という、インスタンスのターゲットパスが表示されるはずです。
配列変数に参照を入れた場合は for in で取り出したものを変換することなく、直接プロパティを参照することができます。

---------------------------------------------------------------

ちなみに、for in では後ろのものから先に取り出されるという特徴があります。
例えば配列変数に b1 ~ b5 の順に格納されているのなら、最初に取り出されるのは末尾の b5 です。
この順序が影響するような作品ではご注意ください。

配列変数やボタンの名前に通し番号を使う場合は、個数は分かっているのですから、for in ではなく for のループでも可能です。
for in は、いくつあるか分からないものや名前に規則性のないものを列挙したい時に使うと便利です。
    • good
    • 0
この回答へのお礼

DPE様

早速の回答有難う御座います。
なるほどっ!! っと思わず叫んでしまいました^^; とても判りやすく、丁寧、かつ補足まで教えて頂き、本当に感謝です。
有難う御座いました。^^

お礼日時:2006/05/28 12:29

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