- ベストアンサー
AS3 getChildByNameに変数を利用する
- AS3のgetChildByNameメソッドを変数で利用する方法について教えてください。
- ステージに配置された複数のインスタンスを一括でy=300に移動する方法を教えてください。
- エラーが発生しているコードの修正方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
元から全体的に無茶な感じがしますが.../(-_-)ヽ。 というか, 「getChildByNameに変数を利用する」意味などあるのだろうか? という気がします。 まず, getChildByName(NAME) に入れるNAMEは "インスタンス名" ですよ。 そもそも「MovieClipインスタンス」とはステージ上に存在するインスタンスです。 (「シンボル と インスタンス」 でいう意味のインスタンスです。) また「MovieClipのインスタンス名」とはステージ上に存在するときのインスタンスの名前です。 だからまず _mc[n] をステージ上に配置した上で, そのインスタンスにインスタンス名を付けなければなりません。 それで書き直すと次のようになります。 ---------------------------- var num:int = 2; var _mc:Array = []; var _mcName:Array = []; for(var i=0; i < num; i++){ _mc.push("test_mc"+i); _mcName.push("test_mc"+i); } for(var n=0; n < num; n++){ _mc[n] = new MovieClip; addChild(_mc[n]); _mc[n].name = _mcName[n]; _mc[n].addEventListener(Event.ENTER_FRAME, setY(n)); } function setY(myNum:int):Function{ return function():void{ MovieClip(getChildByName(_mcName[myNum])).y = 300; } } ---------------------------- しかしどうみても回りくどすぎます。 なんでわざわざインスタンス名を付けてそれを取得せねばならないんですか? 意味がわかりません。 ActionScript 3.0 では,そもそもインスタンス名など使う必要性は 0 に近いんです。 ※手動でステージ上に配置するインスタンスの場合 インスタンス名を付けておくと, オーサリングが自動的にそのインスタンスを参照する 同名の変数を用意してくれます。 ActionScript 3.0 では一般的に その変数に対して何かを命令します。 したがってActionScript上では結局 インスタンス名自体に特に意味はないということです。 というわけで, インスタンス名など使わず,これで良いのではないでしょうか↓。 ---------------------------- var num:int = 2; var _mc:Array = []; for (var i=0; i < num; i++) { _mc.push ("test_mc"+i); } for (var n=0; n < num; n++) { _mc[n] = new MovieClip; //addChild (_mc[n]);//←あってもなくても実行上問題ない _mc[n].addEventListener (Event.ENTER_FRAME, setY(n)); } function setY(myNum:int):Function{ return function():void{ _mc[myNum].y = 300; } } ---------------------------- あと, Event.ENTER_FRAM で y を 300 にし続ける意味もさっぱりわかりませんが, これは1つの例(実際はあり得ないけど単なる架空のサンプル例)という意味としてそのままにしています。 「F-site [AS3] MovieClipインスタンスとインスタンス名」 http://f-site.org/articles/2008/04/19014939.html
お礼
ご回答ありがとうございます。 1個目に記述いただいたの方問題なく動作いたしましたありがとうございます。 ただ、最後に記述いただいた、 var num:int = 2; var _mc:Array = []; for (var i=0; i < num; i++) { _mc.push ("test_mc"+i); } for (var n=0; n < num; n++) { _mc[n] = new MovieClip; //addChild (_mc[n]);//←あってもなくても実行上問題ない _mc[n].addEventListener (Event.ENTER_FRAME, setY(n)); } function setY(myNum:int):Function{ return function():void{ _mc[myNum].y = 300; } } は動きませんでした。 エラーこそないのですが。。。 (そちらでは動いていますでしょうか・・・) 私も初めは、普通に_mc.yという感じでやってたのですが、 うんともすんともいかず、インスタンス名で指定するやり方を 知りそれで試したところうまくいったもので・・・ もしお時間なりましたら、 再度ご確認いただけますと幸いです!!
補足
すいません。 スレから少しづれてしまったので、 いったん締めます! また、別スレでご質問させていただきます。 ありがとうございました。