- ベストアンサー
loadMovieで呼び出したswfの不具合
- Flash初心者の質問です。loadMovieで呼び出したswfファイルが正常動作しない問題が発生しています。
- 呼び出したswfファイルは、タイムライン上に並べた画像の360度回転や拡大縮小をスライダーでコントロールするものです。
- swfファイル単独では正常に動作するのですが、loadMovieで呼び出すとスクリプトがクリアされてしまい、全く動作しない状況です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
_root という表現が、いくつかあるようですが。 _root が指す対象が、読み込まれた後に変わってしまうことが原因だと思います。 ActionScript では、関数や変数、ムービークリップなどには全て、持ち主がいると考えます。 スクリプトで指示を出す時は、必ず、誰が持っているものに対して指示を出すのか、その持ち主を指定しなければなりません。 持ち主の指定のことを”ターゲットパス”といいます。 _root はターゲットパスを記述する時の表現の1つで、通常はメインのタイムラインを表します。 例えば _root.sliderZ.zmSlider() は、メインのタイムラインに sliderZ という名前のムービークリップか変数があるかと思いますが、それが持っている zmSlider 関数を呼び出す、との意味です。 swf ファイルを読み込んだ場合、読み込みを行った側にもメインのタイムラインがあり、読み込まれた swf ファイル内で使われている _root は、読み込みを行った側のメインのタイムラインを指すようになります。 そして、読み込まれた側のメインのタイムラインは、ムービークリップ load_mc に読み込んだ時は load_mc のタイムラインに変わります。 読み込まれた時はこのように、_root が指す対象やメインのタイムラインと称していたタイムラインが変化します。 そのため、_root を使ったターゲットパスでは持ち主を正確に指定できなくなり、単体では動くのに読み込むと動かなくなる問題が起こります。 loadMovie を実行する側を FlashPlayer 7 以上でパブリッシュするのであれば、_lockroot というプロパティを使って、読み込まれる swf ファイル内の _root が指しているタイムラインを保護することができます。 読み込むスクリプトを、次のように変更してみてください。 (↓ 各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) //*** //読み込むswfファイルの_rootが指す対象を保護する load_mc._lockroot = true; //ファイルを読み込む load_mc.loadMovie( "●●●.swf" ); //*** 他にも、読み込まれる swf ファイルで、メインのタイムラインを _root ではなく this や _parent を使った相対表現で表わす、といった方法もあります。
お礼
ご回答いただきありがとうございます。 早速、 スクリプトを変更してみたところ 問題なく正常に動作しました! どうもありがとうございましたm(_ _)m this や _parent を使った相対表現も 後で試してみます。 * * * * * 実は、 お答えをいただく間に 自力で何とかしようと試行錯誤の末、 別な形ではありますが、一応の納得できる形には 出来上がったのですが。。。 とりあえず出来たのはいいのですが どうしてそうなるのか?が 全く理解できずに 頭がモヤモヤしていました。 *画像の回転縮小のムービークリップ部分と *コントロール部分を分割し *コントロール部分を呼び出す側に、 *画像の回転縮小部分を呼び出される側に *配置したところ何とかなってしまいました。 * * * * * 今回は、 丁寧に解説いただきありがとうございました。 かみくだいたわかりやすい表現で スムーズに頭に入ってきました。 感謝いたします。