• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:動的生成のムービークリップにインスタンス名でアクセスできないようです)

動的生成のムービークリップにインスタンス名でアクセスできない

このQ&Aのポイント
  • FLASHCS3(ActionScript3.0)でアルバムを作っています。最大で5枚の外部画像を読み込み、それを配置させるスクリプトを書いています。
  • ただ、枚数によってそれぞれ配置させるする場所が異なります。1枚の時の1枚目の座標と、2枚の時の1枚目の座標は異なります。インスタンス名でアクセスする際に、2枚目の時にエラーが出る問題が発生しています。
  • 解決方法の詳細については誰か教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.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

reimy1
質問者

お礼

BlurFiltanさん コードまで書いていただいて 大変参考になりました。 しかも今後のFLASH作りにも活かせると思います。 ありがとうございました

その他の回答 (2)

回答No.2

失礼、枚数は読み込んでみないとわからないってことでしたね じゃあやっぱり画像が全て読み込み終わったのを待ってから 処理をするという形にするのがベストかと思います 複数画像の読み込みを管理するクラスとか 作っておくといろいろ便利かと思いますよ

reimy1
質問者

補足

H240S18B73さん連絡有り難うございます。 やはり1枚目が読み込み終わらないうちに、2枚目が先走ってしまうと考えると なんとなく理屈は合いますね。 多分 ■全ての画像の読み込みとMC生成が終わったあとに座標調整をするようにする にするとうまくいきそうな感じがします。 その方向でやってみます。 また書き込みします。

回答No.1

それは多分1枚目より2枚目が先に読み込み完了してて mc0がまだ存在してないのにそれにアクセスしようとしちゃってるから なんじゃないでしょうか ■全ての画像の読み込みとMC生成が終わったあとに 座標調整をするようにする ■読み込まれる画像の枚数に応じて それぞれのMCが生成された時にあるべき座標に 各自自分で移動するようにしておく とかでしょうかね 画像の大きさがわからないと配置を決めれない場合は 前者ということになるでしょうが この場合は後者でもいいんじゃないでしょうか

関連するQ&A

専門家に質問してみよう