- ベストアンサー
対象MCを変数で指定
Flash CS3(AS 2.0)で作成しています。 _rootにscというインスタンス名のMCを設置、 その中にp1~p4というインスタンス名のMCを配置しています。 p1~p4を参照する際に変数を使用したいのですがうまくいきません。 _root.sc.p1 だと _level0.sc.p1 が返ってきますが、 insname = "sc.p1" _root[insname] とすると undefined が返ってきます。 きちんと値を取得するにはどのように記述するのが正しいのでしょうか。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
インスタンスを操作する際に使うインスタンスの指定を、”参照”といいます。 ActionScript では、eval 関数か [ ] 演算子を使って文字列を参照に変換し、文字列からインスタンスを指定することができます。 ( eval 関数は Flash Player 6 からは制限が付いたため、eval 関数を使う方法は旧式です) [ ] 演算子で変換する時は、1階層分の文字列につき1組の [ ] を用意します。 例えば、_root にあるムービークリップ” sc ”の子” p1 ”を文字列を使って指定するには _root[ "sc" ][ "p1" ] このように、1つのムービークリップの階層を表す文字列を1組の [ ] でくくります。 ピリオド( ” . ” )で区切って複数の階層を指定すると、[ ] 演算子では正常に参照に変換されません。 あえて変数を使うならば、 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) base = "sc"; child = "p1"; trace( _root[ base ][ child ] ); このような形でしょうか。 **************************** sc を変数で指定する必要がなければ、sc までを最初から参照の形式にして、子の p1 ~ p4 だけを [ ] 演算子で参照に変換する書き方もあります。 例えば、 for( i = 1 ; i <= 4 ; i++ ) { trace( _root.sc[ "p" + i ] ); } このように書くと、「出力」パネルに _level0.sc.p1 _level0.sc.p2 _level0.sc.p3 _level0.sc.p4 と出力されます。 ----------------------------------------------------------- 参照という考え方はムービークリップのインスタンスに限らず、ボタン・テキストフィールドなどのインスタンスのほか、ActionScript でいうところのオブジェクトや変数、関数にもあります。 従って、[ ] 演算子で文字列を参照に変換する方法は変数や関数を指定する時にも通用します。 この件については別の質問で回答しましたので、よろしければご参照ください。 #2の後半で説明しております。 ・createTextFieldを使う際にインスタンス名を動的に変える方法について http://okwave.jp/qa3174769.html
お礼
丁重な回答をありがとうございます。 試したところ、思うとおりに動いてくれました。 とても助かりました。