• 締切済み

外部SWFファイルの中のMCのgotoAndPlayによるタイムライン制御にすて

Flash8&WinXPでの環境でオーサリングしております。 質問なのですが、 _root.mc1_1_mc.mc1_2_mcに外部SWFファイル v2.swfをloadMovieします。 _root.mc1_1_mcのフレームアクションに function gotoF(){ パス+gotoAndPlay("goto_nextF1"); } _global.goto_cnt=0; _root.mc2_1_mcのフレームアクションに if(_global.goto_cnt=='1'){ this._parent.gotoF(); } v2.swfの中のMC,v2_mc1_mc.v2_mc2_mcのフレームアクションに if(_global.goto_cnt==0){ this.gotoAndPlay("goto_nextF2"); } _global.goto_cnt2=1; とします。 上記どちらとも、何かトリガーを作っても 外部swf v2.swfのフレームラベル"goto_nextF1",フレームラベル"goto_nextF2"に フレームを移動させることができません。 _global.goto_cntも参照されていないようです。 function gotoF(){ パス+gotoAndPlay("goto_nextF1"); } のパスかスクリプトが間違っているのでしょうか? また、 if(_global.goto_cnt==0){ this.gotoAndPlay("goto_nextF2"); } では、traceしてデバッグしても _global.goto_cntを参照していません。 この逆、v2_mc1_mc.v2_mc2_mcのフレームアクション の_global.goto_cnt2=1; を_root.mc1_1_mc.mc1_2_mcのフレームアクションで if(_global.goto_cnt2==1){ trace("ok"); } としてトリガーを作り確認しても、 これもまた参照されません。 大変無知でいささか恐縮ですが、 どなたかご教授頂けませんでしょうか。 どうぞ宜しくお願い致します。

  • Flash
  • 回答数1
  • ありがとう数4

みんなの回答

noname#35109
noname#35109
回答No.1

状況を再現するだけで,大変ですね。 まず図で状況を作ってみました。 (WindowsXP だということで,壊れ方は少ないと思いますが, Mac などでは図がグチャグチャに表示されるかもしれません。) ///////////////////////////////////////////////////////////////////////////// --- メイン --- _root ┬ mc1_1_mc ─ mc1_2_mc     │     └ mc2_1_mc --- v2.swf --- _root ─ v2_mc1_mc ─ v2_mc2_mc  : (フレームラベル"goto_nextF1"&"goto_nextF2") --- 合体 (スクリプトなども記入)---    function gotoF(){                  if(_global.goto_cnt==0){    パス+gotoAndPlay("goto_nextF1");      this.gotoAndPlay("goto_nextF2");    }                             }    _global.goto_cnt=0;                 _global.goto_cnt2=1;         ↓                         ↓ _root ┬ mc1_1_mc ─ mc1_2_mc ─ v2_mc1_mc ─ v2_mc2_mc     │            :     └ mc2_1_mc   (フレームラベル"goto_nextF1"&"goto_nextF2")         ↑    if(_global.goto_cnt=='1'){    this._parent.gotoF();    } 問題点 「フレームラベル"goto_nextF1",フレームラベル"goto_nextF2"に      フレームを移動させることができません。」 ///////////////////////////////////////////////////////////////////////////// こんな感じで合っているでしょうか? 一番気になったのはフレームラベルの場所です。 説明によると「v2.swf」の _root に goto_nextF1 と goto_nextF2 というフレームラベルがあるのですよね。 ※ 以下の回答ですが,   時間的経過を全て無視した,理想的な状態での回答です。 まず,トリガーではなく,定数で分岐のない場合の実験ですが, 「v2.swf」の _root にも,「v2_mc1_mc」の中にも,「 v2_mc2_mc」にも, 合計3箇所に ----------------------------- on (release) { trace(_global.goto_cnt); } ----------------------------- と書いたボタンを用意し,「v2.swf」をパブリッシュ。 次にメインムービーのタイムライン1に,「v2.swf」をロードするスクリプトと ----------------------------- _global.goto_cnt== 1; ----------------------------- を書いておいて,ムービープレビューし, その3つのボタンをクリックすると,ちゃんと 1 がトレースされました。 また,変数goto_cnt はグローバルな変数なのですから, 「v2.swf」の3つのボタンに ----------------------------- on (release) { trace(goto_cnt); } ----------------------------- と書いても,ちゃんと 1 がトレースされます。 だから,メインムービーで設定したグローバルな変数goto_cnt は, ロードされた SWF 内にもグローバルで認識されるということです。 上のは単なる変数の実験です。 メインムービーのタイムライン1の _global.goto_cnt== 1; は以降の話では消しておきます。 ========================================== 次に実際の件… まず,メインムービーからですが。 「mc1_1_mc」に次のスクリプトを書いているのですよね。 --(ア)------------------------- function gotoF(){ _root.mc1_1_mc.mc1_2_mc.gotoAndPlay("goto_nextF1"); } _global.goto_cnt=0; ----------------------------- >> パス+gotoAndPlay("goto_nextF1"); >> } >> のパスかスクリプトが間違っているのでしょうか? と書かれましても,パスが書いていないので間違っているかどうか判断できません。 「v2.swf」 の _root に goto_nextF1 と goto_nextF2 というフレームラベルが存在するのだとしたら,パスは(ア)で書いたようになります。 また,変数をグローバルにするのでしたら,関数もグローバルにして, --(イ)------------------------- _global.gotoF = function(){ _root.mc1_1_mc.mc1_2_mc.gotoAndPlay("goto_nextF1"); } _global.goto_cnt=0; ----------------------------- とすることもできます。 「_global」 http://fumiononaka.com/TechNotes/Flash/FN0205003.html 以上のことを前提に 書かれている「mc2_1_mc」のスクリプト ----------------------------- if(_global.goto_cnt=='1'){ this._parent.gotoF(); } ----------------------------- に関してですが,これだと, goto_cnt の値が 1 のとき, this._parent.gotoF(); を実行するということになりますよ。 つまり, 「mc2_1_mc」の _parent = メインムービーの _root です。 gotoF() を定義したのは _root ではなく, _root の 「mc1_1_mc」 で定義したわけですから,相対パスの場合 --(ウ)------------------------- if (_global.goto_cnt == 1) { _parent.mc1_1_mc.gotoF(); } ----------------------------- とするべきだと思います。 mc1_1_mc. が必要です。 また上記(イ)のようにグローバル関数にした場合は,パスは不要となり, --(エ)------------------------- if (_global.goto_cnt == 1) { gotoF(); } ----------------------------- でOKになります。 見た限りでは, _global.goto_cnt = 1; とはどこにも定義してないので,どっちにしても gotoF(); は実行されることはありませんが, もしどこかで _global.goto_cnt = 1; とした場合は (ウ) や (エ) で gotoF(); は実行されます。 ========================================== 次に「v2.swf」です。 何度も聞きますけど, 「v2.swf」の _root に goto_nextF1 と goto_nextF2 というフレームラベルがあるのですよね。 それだと, 「v2.swf」の中のMC, v2_mc1_mc.v2_mc2_mc のフレームアクションに ----------------------------- if(_global.goto_cnt==0){ this.gotoAndPlay("goto_nextF2"); } ----------------------------- と書いては変でしょう。 「v2_mc1_mc」内の「v2_mc2_mc」に, 「v2_mc2_mc」内の フレームラベル goto_nextF2 に goto しろ。と書いているいうことです。 「v2_mc2_mc」から見た「v2.swf」の _root は, this ではなく,親の親(つまり爺(婆)さん)です。 だから,「v2.swf」の中のMC, v2_mc1_mc.v2_mc2_mc のフレームアクションは ----------------------------- if (_global.goto_cnt == 0) { _parent._parent.gotoAndPlay("goto_nextF2"); } ----------------------------- にしなければならないと思います。 冒頭に, 「時間的経過を全て無視した,理想的な状態での回答です。」 と書きましたが,時間的経過を無視しても大変ですね。 さらに時間的な問題も絡むかもしれません。 上の回答は時間的経過を無視した,すべてオブジェクトが出そろった状態での話です。 たとえば,「v2.swf」 がロードされる前に, _root.mc1_1_mc.mc1_2_mc.gotoAndPlay("goto_nextF1"); なんか実行しても,何も起こりません。 オブジェクトがあって,その上でそのオブジェクトに向けてスクリプトを実行する場合の話です。 パスも変ですが,時間的なものも変かもしれません。 私が回答したものではありませんが, http://oshiete1.goo.ne.jp/kotaeru.php3?q=1915003  ↑教えて!goo  ↓OKWave (同じです) http://okwave.jp/kotaeru.php3?q=1915003 の#1の方の回答も参考になるかもしれません。 ロードに限らず,存在しないオブジェクトに命令しても何も起こりません。 Flash でまず注意すべきポイントは,ターゲットパス(パス)ですが, 次に注意しないとならないポイントは,時間的問題です。 1つのムービー内での時間的関係もありますが,ロードする場合は,ネット環境などのロード時間も考慮しないとうまく行かない場合が多々あります。

sato777
質問者

お礼

大変お手数をおかけしましたが、なんとか推測ですが 原因が見えてきました。 まず、私はMySqlやPHPなども組み込んで実際は 作業しているのですが、loadVars Objectを生成して、 onLoadにてfunctionを呼び出させると、一切の_parentを認識しなくなるようです。これは専門書にも小さく記載されていました。 それがすべてのスクリプトに影響を与えていた様でした。 また、グローバルfunctionも同様に、外部SWFとの連動に関しては _rootにfunctionスクリプトがあり、外部SWFのフレームアクションに命令を出すとしても、やはり_parentが認識されなくなる場合があるようです。 よって、すべて絶対パスで表記すると解決されましたが、ターゲットパスに相対と絶対の種類がある理由が 少し見えた気がしております。 また、_global変数に関しては、ただ単に 時間的問題でした。 これまた、深度が10,000,000を超えている私の開発環境において 複雑に外部SWFを読み込んでいるため 深度とともに奥が深い世界だなと痛感しております。 この度は丁寧で分かり易いご教授、どうも有難う御座いました。

sato777
質問者

補足

大変分かりやすい解説付でのお返事、有難う御座います。 また、自分の説明不足を反省しております。 お許し下さいませ。 まず、パスについては、説明をはしょりましたが Flash8⇒'ターゲットパス挿入'による絶対的なものをあらわしています。(私はボタンは一切使用していません。) また、Loadingに関しても解説を書き損じていましたが Loadされた後でのトリガーとして処理しております。 そして、質問内容なのですが、 実際のオーサリング内容はとても膨大で とても書ききれない量のため、基本的構造での 質問に代用させて頂きました。 ご指摘頂いた内容で、時間的内容が一番あやしいと 現時点で判断致しました。 どこがあやしいかと申しますと、 _global変数でトリガーによる参照が出来ていないからです。 (*_rootのタイムラインの最初に_global変数を記載した場合では、 正常にどちらからも参照できています。) _global変数の記載されたフレームアクションは 2フレームで、3フレーム目のgotoAndPlay(1)でループしているフレームに属します。 現在、代用処理として_rootの フレームアクションに _global.gotoF = function(){ _root.mc1_1_mc.mc1_2_mc.gotoAndPlay("goto_nextF1"); } ともうひとつ、 function gotoF(){ _root.mc1_1_mc.mc1_2_mc.gotoAndPlay("goto_nextF1"); } とし、 _root.mc1_1_mcのフレームアクションに _global.gotoF(); this._parent.gotoF(); と交互に片方ずつコメント化して、有効にさせて まったく同じ条件下で動作検証しましたが、 _global.gotoF();の方だけ正常に動作しませんでした。 動作している方を現在使用していますが どうしても動作しない_global変数や_global関数の原因を突き止めたいのです。 あらゆる手段で考えられる理由を模索しておりますが、現時点でまったくお手上げの状況です。 タイムラインの時間的要素も 時間軸の流れや、表で表した場合の時間の流れは 頭で理解しているものの、深い場所のMC内フレームにおいて タイムラインの途中でのフレームアクションに記載したGrobal Variableの宣言や 数値の代入を記載したフレームアクションが 他のMCのフレームアクションで どのような参照のされ方をするのか その根本的仕組みが 自分自身まったくわかっていないと痛感致しました。 質問の仕方もどの様に表現すればいいのか 困惑しておりますが、何かアドヴァイスが頂けましたら どんな事でも結構ですので宜しくお願い致します。

関連するQ&A

  • MCのgotoAndPlay制御について

    今現在すごく初歩的なものを作っています。 まず、MCですが、1~10フレームは歩く動作、11~20フレームは座る動作 と言ったフレームで動作を表現したものです。 このMC内で1~10フレームを繰り返すようにgotoAndPlay(1)と10フレーム目に書きました。 そして、このMCに onClipEvent (load) { // スピードの初期値 spd = 5; } onClipEvent (enterFrame) { // spd ずつ右へ移動 this._x += spd; if(this._x>100){ spd = 0; this.gotoAndPlay(11); } } といったように A地点~B地点は歩いている動作をさせながら5ずつ移動させ、100まで来たら停止させ、 そのB地点では座る動作(MCの11フレーム目から)をスタートさせるようにしました。 しかし、実際はMCの11フレーム目で固まった状態です onClipEvent (enterFrame)なので当たり前なのは分かっているのですが、 他に方法が分かりません。 何かなるべく完結な方法はありますでしょうか?

    • ベストアンサー
    • Flash
  • MC内から_rootへのgotoAndPlay

    初めての投稿です。 宜しくお願い致しますm(__)m FlashCS3、AS2.0を利用です。 _rootで15個位のレイヤーに分け格レイヤーにMCを置き、その中でオブジェクトの制御を行うにホームページのトップ画面を作りました。 ASを1フレーム目に記述するとバグが発生する可能性があると聞いたので、 _rootのみASは2フレーム目に記述したので、ホームページのトップとしては_rootの2フレームしか使っていません。 _rootに swfの読み込み。 stop(); var loader = new MovieClipLoader (); loader.loadClip("Window_scroll.swf", _root.Window_Pic_MC); レイヤーの1つにmp3を読み込み、再生停止の制御を行うMC。 があります。 _rootにMC(1)があり、その中のMC(2)をボタンとして利用していて、 on (rollOver) { this._parent.swapDepths(95); this._parent.gotoAndPlay("n1"); } on (rollOut, releaseOutside) { this._parent.swapDepths(-1); this._parent.gotoAndPlay("n2"); } on (release) { _root.gotoAndPlay("m"); } とMC(2)に直接打ち込んでいます。 "m"が_rootの3フレームから10フレームまでで、 on (release)されるとMC(2)自体が小さくなるように モーショントゥーンで作っています。 そこで質問なのですが、 読み込んだswfの上に別レイヤーでWindowの枠があり、 MC(2)がon (release)時にswfの映像が消えて、 枠が大きくなる様にしたいのですが動いてくれません。 しかも swfも消えなく、小さくなったMC(1)を再度クリックすると 音が再度読み込まれ2重になって流れます。。。 この時微妙に枠が大きくなったり、アルファをかけてあるMC等の色が 濃くなったりするので、全てが2重になっているのかもしれません。 これはバグなのか。。。 長々とスミマセン!! 質問が多くなってしまったので、 _rootのMC(1)の中にあるMC(2)をon (release)した時、_rootにある枠が 大きくなる方法を教えて下さい。 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • 外部swfのフレームを指定して読み込み

    あるムービークリップ(mc1とします)に外部swf(001.swfとします) を読み込むことはできるのですが、 mc1に001.swfを読み込み、001.swfの50フレーム目から再生ということは可能でしょうか。 いろいろと調べたのですが、どうしてもうまくいきませんでした。 ボタンを作りボタンを押したら読み込み50フレーム目から再生という指示を書いたのですが、、、 on (press) { _root.mc1.loadMovie("top.swf"); _root.mc1.gotoAndPlay(50); } 1フレーム目から再生されてしまいます。

  • 特定のmcのフレームにきたときメインタイムライン制御

    AS初心者です。 今、メインタイムラインに配置したmc"main_mc"内のmc”mc1”の、 特定のフレームに来たとき メインタイムラインのフレーム移動をする、というスクリプトを書きたいのですが うまい行かずに困っています。 mc"mC1"のフレームアクションに _root.gotoAndPlay(20); と書きましたが、うまくいきません。 なんででんしょうか。。 もしお分かりのかたがいたらお教えいただけると幸いです 初歩的質問ですみません。。。 mac macbook os 10.4.11 flash cs4を使用しています。

  • 外部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"); なども試してみましたが、うまくいきません。 わたしの頭ではこれが限界です。 ぜひともお力お貸しください!

  • トゥーインで動くMCへ、外部swfをloadMovie

    どなたか教えて下さい。 【例】 stage(W=400XH=200)の大きさの元swf上に、W=200,H=100の大きさのMC(インスタンス名は"aa_mc")を、右端から左端へ、モーショントゥーインを使って移動します。 単純に5フレーム使って移動して、5フレーム目で左端にきて「stop」します。 そのaa_mcの下に、ボタンがあり、そのボタンに on (release){ _root.aa_mc.loadMovie("gaibu.swf"); //gaibu.swfは同じフォルダ内にあるaa_mcと同じ大きさのswf } で、読み込ませたいんですが、aa_mc自体が動いている瞬間に一瞬だけ表示されてすぐに消えてしまいます。 厳密に言えば、_rootの1フレーム目くらいで表示され、4フレーム目くらいには消えてしまうんですが、これってどうすれば直るんでしょうか? どなたか教えてください! FRASH MX 2004を使っています。 お願いします。

    • ベストアンサー
    • Flash
  • AS3.0による外部swfの制御

    AS3.0による外部swfの制御 質問させていただきます。 やりたいと事は、メインとなるswfのボタンを押して、 読み込んだ外部swf(stopしている)を再生(play)したいと考えております。 メインのswfはAS3.0、読み込む外部swfはAS2.0になります。 環境はFlash CS3です。 以下がスクリプトになります。 //swf読み込み配置 var loader_obj : Loader = new Loader(); var url : URLRequest = new URLRequest("test.swf"); MovieClip(root).loader_obj.load(url); loader_obj.y = 3 loader_obj.x = 392 stage.addChild(loader_obj); //swfボタン制御 btn.addEventListener(MouseEvent.ROLL_OVER,btn_play); function btn_play(event:MouseEvent):void {MovieClip(root).photo.gotoAndPlay(2);//メインswfのムービーリップも動かす <--ここに外部swfを参照するスクリプトが入ると思うのですが・・・-->gotoAndPlay(2);//外部swfの2フレーム目から再生 } 肝心の所のスクリプトはわかりません・・・ 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • Flash タイムライン上のMCへの移動

    おたずねします。 タイムラインの5フレームにあるムービクリップAを再生後、 タイムラインの2フレームにあるムービクリップBの 特定のフレームへ移動したいのですが、 パスの指定がうまいきません。 2フレームへの移動は _root.gotoAndPlay("2フレームのラベル名")で 移動できますが、そこに配置されたムービークリップの指定は どうすればいいのでしょうか。 _parentやthisを使用した 絶対パスや相対パスを調べましたが、どうもこの指定は 同フレーム上にある場合の指定のようなのかうまくいきませんでした。 それともこのような移動はできないのでしょうか。 教えていただけると大変助かります。 どうぞよろしくお願いいたします。

  • flashで、レベルの違うボタンから外部swfファイルの読み込み

    flash初心者のkiyuです。 メインのflashサイトに外部swfファイルを読み込みたいのですが、上手くいきません。 1.mcはrootにおいてあります。 2.ボタンは2つあり、1つはおなじrootの同じステージ内。そして、2つ目のボタンは違うレベルにあります。 3.同じrootにあるボタンは読み込み可能。でも、違うレベルにあるボタンは読み込み不可。 コードは、 on(release){ _root.gotoAndPlay("フレーム名"); _root.mcのインスタンス名.loadMovie("外部ファイル名.swf"); } です。 いろいろ思考錯誤をくりかえしたのですが、どうにも上手くいきません。。。 よろしくお願いします。

  • loadMovieで外部swfの読込みについて

    現在、外部swfを連続で再生させるフラッシュを作成中です。 以下の方法で実現しています。 ------------------------------------------------- 親SWFの_rootに,例えば「loadMC」というインスタンス名のムービークリップを作ります。 このMCは小さくて透明のMCか,中に何も入っていない空のMCが良いと思います。 そして,親SWFのフレームのスクリプトに _root.loadMC.loadMovie("movie1.swf"); と書けば,「loadMC」というインスタンス名のムービークリップに「movie1.swf」が読み込まれます。 またはボタンにスクリプトを書いて,ボタンで読み込みをさせても良いです。 そして,「movie1.swf」の最終フレームに, _root.loadMC.loadMovie("movie2.swf"); と書いておきます。これで同じ「loadMC」に「movie2.swf」が読み込まれます。 同じ所に新たなムービーを読み込むと自動的に前のムービーは unload されるので, unloadMovie(); は必要ありません。 「movie2.swf」の最終フレームには _root.loadMC.loadMovie("movie3.swf"); 「movie3.swf」の最終フレームには _root.loadMC.loadMovie("movie4.swf");   …  … ------------------------------------------------- 作成後のプレビュー又はswfをダブルクリックなどで直接表示させると正常に表示されます。 しかし、HTMLに埋め込むと真っ白な状態でまったく表示されません。 調べているのですが原因がわかりません。 どなたかご教授のほど宜しくお願い致します。

    • ベストアンサー
    • Flash

専門家に質問してみよう