loadMovieで呼び出したswfの不具合

このQ&Aのポイント
  • Flash初心者の質問です。loadMovieで呼び出したswfファイルが正常動作しない問題が発生しています。
  • 呼び出したswfファイルは、タイムライン上に並べた画像の360度回転や拡大縮小をスライダーでコントロールするものです。
  • swfファイル単独では正常に動作するのですが、loadMovieで呼び出すとスクリプトがクリアされてしまい、全く動作しない状況です。
回答を見る
  • ベストアンサー

loadMovieで呼び出したswfの不具合

Flash初心者です。 環境は、OSはWindowsXPで、FlashのヴァージョンはCS3です。 loadMovieで呼び出したswfファイルが正常動作しません。 表示枠用に四角形の枠を書き、 ムービークリップシンボルに変換、 シンボル名は「load.mc」 インスタンス名も同じく「load.mc」とし、 タイムラインの1フレーム目に this.load_mc.loadMovie("●●●.swf"); と記述し、プレビューしたところ 呼び出したswfファイルが正常に動作しませんでした。 また、 on(press){ this.load_mc.loadMovie("●●●.swf"); } と記述したボタンでも結果は同様でした。 呼び出したswfファイルは、 いくつかの任意の角度から撮影した物体の画像をタイムライン上に並べ 画像の360度回転、拡大縮小をスライダーでコントロールするというもので 因みに、これはMdNムックの 「プロが教えるFlashアイデア工房」の127ページに掲載されていたものの流用です。 尚、掲載されていたサンプルのswfファイルを 試しに同様にloadMovieで呼び出してみたところ結果は同じでした。 swfファイル単独では正常に動作するのですが loadMovieで呼び出すと、 記述されたスクリプトがクリアされてしまうのか全く動作しません。 何が問題なのか全くわからず途方に暮れています。 どなたかご教授ください。 以下は、 呼び出すswfファイルに記述されたスクリプトです。 _________________________ ※画像のムービークリップに記述したスクリプト ↓↓↓ this.onLoad = function() { rtK = 0.3;//ズームスピード minSC = 30//縮小時の最小値; maxSC = 180//拡大時の最大値; //回転初期設定 frK = 0.3;//回転スピード maxFr = _totalframes;//最大フレーム数の設定 }; this.onEnterFrame = function() { //////画像サイズ////// tarSC = _root.sliderZ.zmSlider()*(maxSC-minSC)/100+minSC;//0で最小、100で最大になるよう変換 vSC = (tarSC-_xscale)*rtK;//目標の値に近づく this._xscale += vSC;//表示 this._yscale += vSC;//表示 //////画像回転位置////// tarFr = _root.sliderR.rtSlider()*maxFr/100;//0で最小、100で最大になるよう変換 vFr = (tarFr-curFr)*frK;//目標の値に近づく curFr += vFr; tmpFr = Math.floor(curFr); tmpFr %= maxFr; if (tmpFr<0) tmpFr += maxFr;//負の値の場合 gotoAndStop(tmpFr+1);//表示 }; this.onLoad(); ※回転用スライダーのムービークリップに記述したスクリプト ↓↓↓ this.onLoad = function() { //回転初期設定 range = 234;//スライダーのドラッグ範囲 minX = 92;//スライダーのX座標の最小値 maxX = minX+range;//スライダーのX座標の最大値 curX = _x; btPress = false;//ドラッグ中か否か } function rtSlider(){ if (btPress) curX = _parent._xmouse;//スライダーのドラッグ curX = Math.min(curX, maxX);//ドラッグ範囲 curX = Math.max(curX, minX);//ドラッグ範囲 _x = curX;//移動 // //画像の回転 rtVal = (curX-minX)*100/range;//0から100の値に変換 return(rtVal); } this.onPress = function() { btPress = true; }; this.onRelease = this.onReleaseOutside=function () { btPress = false; }; this.onLoad();

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.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 を使った相対表現で表わす、といった方法もあります。

hatapon_flash
質問者

お礼

ご回答いただきありがとうございます。 早速、 スクリプトを変更してみたところ 問題なく正常に動作しました! どうもありがとうございましたm(_ _)m this や _parent を使った相対表現も 後で試してみます。 * * * * * 実は、 お答えをいただく間に 自力で何とかしようと試行錯誤の末、 別な形ではありますが、一応の納得できる形には 出来上がったのですが。。。 とりあえず出来たのはいいのですが どうしてそうなるのか?が 全く理解できずに 頭がモヤモヤしていました。 *画像の回転縮小のムービークリップ部分と *コントロール部分を分割し *コントロール部分を呼び出す側に、 *画像の回転縮小部分を呼び出される側に *配置したところ何とかなってしまいました。 * * * * * 今回は、 丁寧に解説いただきありがとうございました。 かみくだいたわかりやすい表現で スムーズに頭に入ってきました。 感謝いたします。

関連するQ&A

  • loadMovieで特定のフレームを表示したい

    お世話になっております。 loadMovieで別のswfを読み込むことができますが、読み込んだファイルの特定のフレームを表示させたいのです。 たとえば、a.swfにb.swfをloadMovieします。 a.swfには3個のボタンがあり、それぞれがb.swfの1フレーム、10フレーム、20フレームに対応します。 ひとつのボタンに、 on (release) { this.loadMovie("b.swf"); this.gotoAndStop(10); } としても表示されないのはなんとなく理解できますので、 a.swfにムービークリップ(インスタンス名load_mc)を作り、その中にロードするようにし、さらにa.swfの5フレーム目にload_mcの10フレーム目を表示するように書きました。 ボタンに on (release) { this.load_mc.loadMovie("b.swf"); this.gotoAndStop(5); } 5フレーム目に this.load_mc.gotoAndStop(10); やはり、うまくいきません。 私の考え方が悪いのでしょうか? どうすればいいですか? どなたかよろしくお願いします。m(__)m WinのFLASH8使用です。

    • ベストアンサー
    • Flash
  • 外部swfのラベル移動

    FLASH MX2004で作成しています。 main.swf上のload_mcのレベル0に、外部swfのA.swfを読み込んでいます。 #main上のフレーム this.load_mc.loadMovie("A.swf", 0); A.swfが終わると同時に、main.swf上のload_mcのレベル1に、外部swfのB.swfを読み込みます。 #A.swfの最終フレーム stop(); _root.load_mc.loadMovie("B.swf", 1); ここまではできています。 その後、B.swf内のcontentsというMC内のラベルをlabel2に移動させたいのです。 #A.swfの最終フレーム stop(); _root.load_mc.loadMovie("B.swf", 1); _root.load_mc.contents.loadMovie("label2"); これができません。 _root.load_mc.contents.loadMovie("label2"); _root.contents.loadMovie("label2"); _root.load_mc.loadMovie("label2"); load_mc.contents.loadMovie("label2"); contents.loadMovie("label2"); なども試してみましたが、うまくいきません。 わたしの頭ではこれが限界です。 ぜひともお力お貸しください!

  • txtをloadしているswfをloadMovie

    いつも適切なご回答感謝しております。txtをloadしているswf1をswf2にloadMovieしています。個別のswf1はうまくいっていて更に一度めはswf1をloadMovieしているswf2がしっかりtxtを読み込んでいます。しかし、loadMovieしているswf2内で別のコンテンツに一度行ってそこに戻るとswf1のtxtの読込みがうまくいかずダイナミックテキストの文字がそのまま出力されてしまいます。何か良い方法はございますか? 【swf1】 stop(); //率の取得 // 読み込んだ個数カウンタの初期値を設定 var count = 0; // LoadVars インスタンスの作成 myLV = new LoadVars(); // 1つのファイルがロードされたとき myLV.onLoad = function(Success) { // 読み込みに成功したら if (Success) { // 個数カウンタの値に1を加算 _root.count++; // もし個数カウンタが3になれば if (_root.count == 3) { //ユーザ定義関数 showData を実行 showData(); } } } // myLV に外部データのロード myLV.load("a"+"_"+month+"."+"txt"); myLV.load("b"+"_"+month+"."+"txt"); myLV.load("c"+"_"+month+"."+"txt"); // ユーザ定義関数 showData() の定義 function showData() { // 配列 ritu の作成 var ritu = new Array(); ritu[0] = myLV.aa.split(","); ritu[1] = myLV.bb.split(","); ritu[2] = myLV.cc.split(","); // テキストの表示 aa.text = ritu[0][day-1]; bb.text = ritu[1][day-1]; cc.text = ritu[2][day-1]; } 【swf2】swf1のloadはOK、一度目のswf1のテキスト読込みはOKだが別のコンテンツへ行って戻るとテキストだけが読み込まれてない loadMovie("swf1.swf",**mc);

    • ベストアンサー
    • Flash
  • swf連続再生・2通り作ったのですが...

    すいません、以前swfの連続再生のことで質問させてもらったのですがお礼をさせてもらったあと、2通りのスクリプトで作ってみたのですが、うまくうごかないのです。 何が間違っているのか検討もつかずここに質問させてもらいます。 まずファイル構成は メインのseries.swfを埋め込んでいるhtml └flash_series(フォルダ名) ├series.swf(メインswf:読み込むswf)   ├first.swf (この順で再生↓、以下のswfの最終キーフレームにstop();を記述しています。)   ├second.swf   ├third.swf   ├fourth.swf └fifth.swf で、series.swfのステージに置いた空ムービークリップ「series_mc」にfirst.swf~fifth.swfを読み込み、swfの最終フレームにきたら次のswfを再生という感じで、以下のように組みました。 空ムービークリップ「series_mc」に記述しました。 ---------------------------------------------------------------- onClipEvent (load) { fileArr = new Array(); fileArr[0] = "flash_series/first.swf"; fileArr[1] = "flash_series/second.swf"; fileArr[2] = "flash_series/third.swf"; fileArr[3] = "flash_series/fourth.swf"; fileArr[4] = "flash_series/fifth.swf"; cnt = 0; series_mc.loadMovie(fileArr[cnt]); } onClipEvent (enterFrame) { if (series_mc._totalframes>=2 && series_mc._currentframe == series_mc._totalframes) { if (cnt<fileArr.length-1) { // cntに1を加算 cnt++; } else { cnt = 0; } series_mc.loadMovie(fileArr[cnt]); } } ---------------------------------------------------------------- です。もう一つは連番タイプで メインのseries.swfを埋め込んでいるhtml └flash_series(フォルダ名) ├series.swf(メインswf:読み込むswf)   ├no001.swf (この順で再生↓、以下のswfの最終キーフレームにstop();を記述しています。)   ├no002.swf   ├no003.swf   ├no004.swf └no005.swf で、これもseries.swfのステージに置いた空ムービークリップ「series_mc」にno001.swf~no004.swfを読み込み、swfの最終フレームにきたら次のswfを再生という感じで、以下のように組みました。 空ムービークリップ「series_mc」に記述しました。 ---------------------------------------------------------------- var num_swf = 5; //SWFファイルの個数 var load_file = new Array(); for (i = 0; i < num_swf; i++) { if (i < 10) { load_file[i] = "flash_series/no00" + i + ".swf"; } else if (i < 100) { load_file[i] = "flash_series/no0" + i + ".swf"; } } var i = 0; this.series_mc.loadMovie (load_file[i]); this.series_mc.onEnterFrame = function() { if(2 <= series_mc._totalframes && series_mc._currentframe <= series_mc._totalframes){ if(i<num_swf){ this.series_mc.loadMovie (load_file[++i]); } } } ---------------------------------------------------------------- と組んだのですが両方とも一つも読み込まれません、何が悪いんでしょうか?ご協力お願いします。

    • ベストアンサー
    • Flash
  • loadMovieをしたmcにリンクがはれない

    as2で作成しています初心者です。 mc.onRelease = function() {  geturl("http://hoge.co.jp"); } こういう記述をかいていました。 これは問題なく行きました。 mcは外部画像にしたかったので、 mc.loadMovie("./img/hoge.png"); mc.onRelease = function() {  geturl("http://hoge.co.jp"); } のようにするとリンクがきかなくなってしまいました。 画像はちゃんと読みこまれています。 これは何がいけないのでしょうか・・・ ご教授お願いいたします。

    • ベストアンサー
    • Flash
  • loadMovieとonEnterFrameについて

    はじめまして FLASH8を使用しています。 ActionScript初心者です。よろしくお願いします。 単体のswfだと機能するのですが、loadMovie後機能しなくなってしまいます。 読み込ませる側のアクションは ▽ボタンシンボルに on (press) { _root.moveMenu_1 = -138; menu_name.text = "キッズメニュー"; menu_text.text = kidsData; } ▽フレームアクション loadVariables("kidsmenu.txt", this); loadVariables("menmenu.txt", this); loadVariables("ladymenu.txt", this); loadVariables("seniormenu.txt", this); moveMenu_1 = -296; this.onEnterFrame = function() { img_y._x += ((0-moveMenu_1)-img_y._x)*0.1; }; MCのインスタンス名は「img_y」です。 他にボタンが3つほどあります。 swf単体だと機能します。 loadMovie後text・外部テキストは読み込むのですが、スクロールしなくなってしまいます。 これを3_1.swfとしました。 読み込む側のアクションは ▽ボタンシンボルに on (press) { _root.moveMenu = 2100; } 他に4つほどボタンがあります。 ▽フレームアクション scroll_flag = 0; moveMenu = 0; this.onEnterFrame = function() { if (scroll_flag == -1) { if (back_img._x<0) { moveMenu -= 20; } else { moveMenu = 0; } } if (scroll_flag == 1) { if (back_img._width+back_img._x>700) { moveMenu += 20; } else { moveMenu = 2800; } } back_img._x += ((0-moveMenu)-back_img._x)*0.1; }; back_img.c_1.loadTarget.loadMovie("1_1.swf"); back_img.c_2.loadTarget.loadMovie("2.swf"); back_img.c_3.loadTarget.loadMovie("3_1.swf"); back_img.c_4.loadTarget.loadMovie("4.swf"); back_img.c_5.loadTarget.loadMovie("5.swf"); スクロールするMCを「back_img」としました。 他に読み込んだものは機能したんですが 3_1だけうまく機能しません。 長々と失礼しました。

    • ベストアンサー
    • Flash
  • 外部swfの読込について

    1枚のFlashに二つの外部swfを読み込む方法を教えて下さい。 今参考書を見ながらやってみたのですが外部ファイルが読み込まれていないようで 書き出したswfファイルには何も表示されません。 試した方法ですが・・・ 外部swfファイル読込用ムービークリップを作成、 オブジェクトアクションを挿入 --------------------------------- onClipEvent (load) { function Load (file) {  this.loadMovie (file);   } } --------------------------------- フレームを作成し下記アクション挿入 --------------------------------- contents_mc.Load("about.swf") --------------------------------- 使用ソフトはFlash5です。 どうぞ宜しくお願いします。

    • ベストアンサー
    • Flash
  • ボタンを押した時、外部swfを読み込み

    ムービークリップ内のボタン(写真のサムネイル)を押した時、外部.swf(写真やコメントを書いたswf)を読み込もうとしております。 _rootに空のムービークリップを配置し、インスタンス名を load_mcと指定。 _rootに配置したムービークリップの中に配置してあるボタンに on (release) { this._parent.load_mc.loadMovie("comment.swf"); } と書きました。しかしボタンを押してもcomment.swfが表示されません。 解決方法をお教えください。よろしくお願いいたします。

  • 外部SWFを読み込むと子SWFの一部分しか表示されません!

    パソコンはwindows XPでFlashCS3を使っている初心者です。 現在、下記のような方法で外部SWFを読み込もうとしているのですが、 読み込み自体は成功するものの、読み込まれたSWFファイルが 最大サイズまで拡大されており、キチンと表示されません。 --外部SWFの読み込み方法-- 1 親SWFの_rootに、「Load_mc」というインスタンス名で、   横350px×縦200pxのサイズのムービークリップを作ります 2 親SWFのフレームのスプリクトに _root.Load_mc.loadMovie("movie1.swf"); と入力します 3 新たに「movie1.swf」という子SWFファイルを作成し、   ドキュメントのサイズを横350px×縦200pxに設定。   10フレームごとに3枚、横350px×縦200pxのjpeg画像を設定します 4 それぞれのファイルを改めてパブリッシュ。   するとなぜか親SWFで子SWFは読み込まれ、ムービーも正常に動いているものの、 子SWFがウインドウサイズを最大まで引き延ばしたかのような画質で表示され、   且つ、「Load_mc」の大きさで表示できる左上の一部分しか表示されません --------- いろんなサイトを見て回ったのですが、同じようなトラブルがなかなか見つからず、 パソコンの環境か、パブリッシュ時の設定のせいじゃないかと調べたのですがわかりません。 大変申し訳ないのですが、わかるかたがいらっしゃいましたらご教授願えないでしょうか?

    • ベストアンサー
    • Flash
  • loadMovieのswf読み込み時の一瞬

    制作環境  windows vista flash CS3 Professional ------------------------- flash初心者です。 loadMovieで外部swfを読み込む前に一瞬_rootの画像が表示されてしまうことで困っています。 作業としては、 top.swfにメニューをつけ、リンクを貼って loadMovieでswfを切り替えています。 以下3つは読み込む外部ファイルです。 ・about.swf ・catalog.swf ・service.swf top.swfに配置したメニューボタン(about、catalog、service)に下記の記述をし、 ■aboutボタン on (release) { _root.moviearea.loadMovie("about.swf"); } ■catalogボタン on (release) { _root.moviearea.loadMovie("catalog.swf"); } ■serviceボタン on (release) { _root.moviearea.loadMovie("service.swf"); } ボタンを押すと_rootにそれぞれちゃんと読み込まれるまではいきました。ですがその際、例えばabout.swfが読み込まれた後に他のボタンを押して別のswfファイルを読み込む一瞬、_rootに配置してある画像がちらっと表示されてしまいます。 色々調べて外部swfファイルの背景の問題かもしれないと思い、ドキュメントサイズと同じサイズの背景色で塗りつぶしたムービークリップを配置するなどしてみましたが、やはり一瞬ですが_rootの画像が見えてしまいました。 外部ファイルから外部ファイルへスムーズに切り替えができるようにするにはどのようにしたらよいのでしょうか。 どなたかお力をお貸しくださいませんか? よろしくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう