- ベストアンサー
動的生成のムービークリップにインスタンス名でアクセスできない
- FLASHCS3(ActionScript3.0)でアルバムを作っています。最大で5枚の外部画像を読み込み、それを配置させるスクリプトを書いています。
- ただ、枚数によってそれぞれ配置させるする場所が異なります。1枚の時の1枚目の座標と、2枚の時の1枚目の座標は異なります。インスタンス名でアクセスする際に、2枚目の時にエラーが出る問題が発生しています。
- 解決方法の詳細については誰か教えていただけると助かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「先に mc0 が作成される」 という先入観が問題ではないかと思います。 先に num=1 に対応する画像が ロード(COMPLETE) されたらどうなるでしょう? 先に num=1 に対応する画像がロードされると 先に mc1 が作成されますよね。 この時点で mc0 はありません。 この状態で getChildByName("mc0").x = 165;//■■■■1枚目の配置を変える が実行されると mc0 は存在しないため TypeError: Error #1009: null のオブジェクト参照のプロパティ またはメソッドにアクセスすることはできません。 というエラーが出て以降のスクリプトも実行されなくなります。 ※ご質問のスクリプトのままでも 状況によっては無事動作することもありましたよ。 『必ず「num=0 に対応する画像」のロード後に 「num=1 に対応する画像」のロードされるようにする』場合 まず「num=0 に対応する画像」をロードして その COMPLETE 後に 「num=1 に対応する画像」をロードする必要があると思います。 動作の意味が不明な部分もあるので どうすべきかはわかりませんが 例えば次のようにするとか。 ------------ //関数 loadJPEG の定義 function loadJPEG(n:int):void{ //Loaderインスタンスを作成 var loader_obj:Loader = new Loader(); //■■■■イベントリスナーでnumを渡す loader_obj.contentLoaderInfo.addEventListener(Event.COMPLETE,loadComp(n)); //URLRequestインスタンスを作成 var req:URLRequest = new URLRequest("img" + n + ".jpg"); //外部画像をロード loader_obj.load(req); } //関数 loadJPEG の実行 loadJPEG(0); //■■■■イベントリスナー関数 function loadComp(num:int):Function{ return function(event:Event):void{ var loader:Loader = event.target.loader; this["mc" + num] = new MovieClip(); addChild(this["mc" + num]); this["mc" + num].addChild(loader); //■■■■1枚目の時 if ( num == 0 ){ this["mc" + 0].x = 295; this["mc" + 0].y = 30; //関数 loadJPEG の実行 loadJPEG(1); } //■■■■2枚目の時 if ( num == 1 ){ this["mc" + 0].x = 165;//■■■■1枚目の配置を変える this["mc" + 1].x = 425; this["mc" + 1].y = 30; } //■終わり } } ------------ ※↑FlashのFLAなどと同じフォルダに 「img0.jpg」と「img1.jpg」を置いた場合です。 ※このように逐一座標を動かすのではなく 全ての画像をロードし終わった後に それらの座標を決めても良いと思います。 (そうすればもっと簡素になるかも) ※その他 「MovieClipインスタンスとインスタンス名」 http://f-site.org/articles/2008/04/19014939.html 「ドット演算子と配列アクセス演算子」 http://www.fumiononaka.com/TechNotes/Flash/FN0507001.html
その他の回答 (2)
- H240S18B73
- ベストアンサー率65% (190/288)
失礼、枚数は読み込んでみないとわからないってことでしたね じゃあやっぱり画像が全て読み込み終わったのを待ってから 処理をするという形にするのがベストかと思います 複数画像の読み込みを管理するクラスとか 作っておくといろいろ便利かと思いますよ
補足
H240S18B73さん連絡有り難うございます。 やはり1枚目が読み込み終わらないうちに、2枚目が先走ってしまうと考えると なんとなく理屈は合いますね。 多分 ■全ての画像の読み込みとMC生成が終わったあとに座標調整をするようにする にするとうまくいきそうな感じがします。 その方向でやってみます。 また書き込みします。
- H240S18B73
- ベストアンサー率65% (190/288)
それは多分1枚目より2枚目が先に読み込み完了してて mc0がまだ存在してないのにそれにアクセスしようとしちゃってるから なんじゃないでしょうか ■全ての画像の読み込みとMC生成が終わったあとに 座標調整をするようにする ■読み込まれる画像の枚数に応じて それぞれのMCが生成された時にあるべき座標に 各自自分で移動するようにしておく とかでしょうかね 画像の大きさがわからないと配置を決めれない場合は 前者ということになるでしょうが この場合は後者でもいいんじゃないでしょうか
お礼
BlurFiltanさん コードまで書いていただいて 大変参考になりました。 しかも今後のFLASH作りにも活かせると思います。 ありがとうございました