• 締切済み

スクリプト外部ムービーの制御

こんにちは。 外部ムービー(.swf)を読み込んでそれをスタートボタン、ストップボタンで制御したいのですが外部ムービーがスクリプトでできているためか制御できません。スクリプトでできた外部ムービーは制御不可能なのでしょうか?もし不可能ならばなんとかほかのアイデアはありませんでしょうか?ただ読み込んだものを止めたり再生したりしたいだけなのですが。。。 どうぞよろしくお願いします。 ちなみに環境WinXP Flash Pro8です。もしCS3ででもできればアイデア下さい。

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

みんなの回答

noname#35109
noname#35109
回答No.2

> スクリプトでできた外部ムービー という意味がいまひとつわかりませんが, モーショントゥイーン や シェイプトゥイーン など, タイムラインを使って動き作っているムービーではなくて, ActionScript などを使って動きを作っているムービーという意味でしょうか? 読み込むムービーの中で使われているActionScript がわかっているのであれば, Flash 8 などというハイバージョンのものでなくても, 少なくとも,変数が持てるようになった,Flash 4 の頃からそういうことは可能です。 loadMovie ができるようになった Flash 3 でも何らかの形をとれば可能だったでしょう。 (読み込まれるムービーが同じバージョンか以下のバージョンであるならばですが。) しかし, 読み込むムービーの中で使われているActionScript がわかっていなければ, 普通は止められないでしょう。 いろんな動かし方がありますし,いろんな場所にスクリプトは存在します。 というか, 本当は loadMovie とはほとんど関係ない話だと思います。 外部にムービーがあっても,それを読み込んだ以上, 内部にムービークリップがあるのと同じです。 どこにあっても, ActionScript で動かした以上,ActionScript で止めなければ普通は止まりません。 スクリプトでできた外部ムービーがいまひとつわかりませんが, その「スクリプトでできた外部ムービー」みたいなサンプルを1つ作成してみました。 新規ドキュメントを作成して, ドキュメントのサイズ(ステージの大きさ)を 横幅300px × 高さ200px に設定してください。 そして,ステージ上には何も用意せず, フレーム1に次のスクリプトをコピペしてみてください。 そして,任意のフォルダに, 「gaibu.fla」というファイル名で,そのドキュメントを保存し, 「gaibu.swf」を同じフォルダにパブリッシュしてください。 「gaibu.fla」フレーム1にコピペするスクリプト↓。 ///////////////////////////////////////////////// // myMC1 の動く速さ spd1 の初期値を指定 spd1 = 2; // myMC2 の動く速さ spd1 の初期値を指定 spd2 = -8; // 背景を黄色に塗る with (this) { beginFill(0xFFFF80); moveTo(0, 0); lineTo(300, 0); lineTo(300, 200); lineTo(0, 200); lineTo(0, 0); endFill(); } for (i=1; i<=2; i++) { // myMC1と2 を作成 this.createEmptyMovieClip("myMC"+i, i); // myMC1 にテキストフィールドを作成 this["myMC"+i].createTextField("myTXT", 0, 0, 0, 0, 0); // テキストフィールドの各プロパティの設定 with (this["myMC"+i].myTXT) { text = " myMC"+i+" "; autoSize = true; border = true; background = true; } } this.myMC1.myTXT.backgroundColor = 0xFFCCCC; this.myMC2.myTXT.backgroundColor = 0x78FEFE; // myMC1 の初期座標 を指定 this.myMC1._x = 100-(this.myMC1._width/2); this.myMC1._y = 0; // myMC2 の初期座標 を指定 this.myMC2._x = 200-(this.myMC2._width/2); this.myMC2._y = 200-this.myMC2._height; // // 1フレーム進時間ごとに毎回実行 this.onEnterFrame = function() { // myMC1 を spd1 の値ずつ y 方向に動かす this.myMC1._y += spd1; // myMC2 を spd2 の値ずつ y 方向に動かす this.myMC2._y += spd2; // 枠の上下にぶつかったときの処理 if (this.myMC1._y>200-this.myMC1._height) { this.myMC1._y = 200-this.myMC1._height; spd1 = -Math.abs(spd1); } else if (this.myMC1._y<0) { spd1 = Math.abs(spd1); } if (this.myMC2._y>200-this.myMC2._height) { this.myMC2._y = 200-this.myMC2._height; spd2 = -Math.abs(spd2); } else if (this.myMC2._y<0) { spd2 = Math.abs(spd2); } }; ///////////////////////////////////////////////// 「gaibu.swf」をパブリッシュして見てみると, 「myMC1」と「myMC2」が,上へ行ったり下へ行ったりを繰り返すムービーができていると思います。 根幹部分を簡単に説明すると, 変数 spd1 と spd2 の値ずつ,this.onEnterFrame によって, 「myMC1」と「myMC2」を上や下に動きます。 理解すべき部分はそれだけです。 それ以外は単にそういう構造全体を用意しただけで,どうでも良いものです。 次に, 横幅550px×高さ400px のドキュメントを作成し, 同じフォルダに,「main.fla」 をという名前で保存し, 次のスクリプトをフレーム1に書いて(コピペして), 「main.swf」 をパブリッシュします。 「main.fla」 の フレーム1 にコピペするスクリプト↓。 ///////////////////////////////////////////////////////////////////////// // gaibu.swf をロードするloadMC を作成 this.createEmptyMovieClip("loadMC", 0); // loadMC の座標を指定 this.loadMC._x = (Stage.width/2)-(300/2); this.loadMC._y = 30; // loadMC に gaibu.swf をロード this.loadMC.loadMovie("gaibu.swf"); // // 色と文字と座標のデータ配列 dat を作成 dat = new Array(); dat[0] = ["myMC1をストップ", 0xFE9696, 1, 60]; dat[1] = ["myMC1をスタート", 0xFE9696, 1, 30]; dat[2] = ["myMC2をストップ", 0x6CEEEE, 2, 60]; dat[3] = ["myMC2をスタート", 0x6CEEEE, 2, 30]; dat[4] = ["2つともストップ1", 0x74FC74, 3, 60]; dat[5] = ["2つともスタート1", 0x74FC74, 3, 30]; dat[6] = ["2つともストップ2", 0xFFFF71, 4, 60]; dat[7] = ["2つともスタート2", 0xFFFF71, 4, 30]; for (i=1; i<=8; i++) { // btnMC1~8 を作成 this.createEmptyMovieClip("btnMC"+i, i); // btnMC1~8 にテキストフィールドを作成 this["btnMC"+i].createTextField("myTXT", 0, 0, 0, 0, 0); // テキストフィールドの各プロパティの設定 with (this["btnMC"+i].myTXT) { text = dat[i-1][0]; autoSize = true; border = true; background = true; backgroundColor = dat[i-1][1]; } // btnMC1~8 の座標 を指定 this["btnMC"+i]._x = (Stage.width*dat[i-1][2]/5)-(this["btnMC"+i]._width/2); this["btnMC"+i]._y = Stage.height-dat[i-1][3]; } // btnMC7 と 8 を20px右へ this.btnMC7._x += 20; this.btnMC8._x += 20; // this.lineStyle(2, 0x555555, 100); this.moveTo(this.btnMC7._x-20, this.btnMC7._y-10); this.lineTo(this.btnMC7._x-20, Stage.height); // // ---★以下が本題です★---------------- // // フラグ である変数 flg1 と 2 を true にしておく flg1 = true; flg2 = true; // // btnMC1 をクリックしたときの動作定義(※1↓) this.btnMC1.onRelease = function() { // flg1 の値が true のとき if (flg1) { // 変数 main_spd1 に ロードした swf の spd1 の値を保存 main_spd1 = loadMC.spd1; // 即 flg1 を false にする flg1 = false; } // ロードした swf の spd1 の値を 0 にする loadMC.spd1 = 0; }; // // btnMC2 をクリックしたときの動作定義(※2↓) this.btnMC2.onRelease = function() { // flg1 の値が false のとき if (!flg1) { // ロードした swf の spd1 の値を保存しておいた値にする loadMC.spd1 = main_spd1; // 即 flg1 を true にする flg1 = true; } }; // // btnMC3 をクリックしたときの動作定義(※3↓) this.btnMC3.onRelease = function() { if (flg2) { main_spd2 = loadMC.spd2; flg2 = false; } loadMC.spd2 = 0; }; // // btnMC4 をクリックしたときの動作定義(※4↓) this.btnMC4.onRelease = function() { if (!flg2) { loadMC.spd2 = main_spd2; flg2 = true; } }; // // btnMC5 をクリックしたときの動作定義(※5↓) this.btnMC5.onRelease = function() { if (flg1) { main_spd1 = loadMC.spd1; flg1 = false; } if (flg2) { main_spd2 = loadMC.spd2; flg2 = false; } loadMC.spd1 = 0; loadMC.spd2 = 0; }; // // btnMC6 をクリックしたときの動作定義(※6↓) this.btnMC6.onRelease = function() { if (!flg1) { loadMC.spd1 = main_spd1; flg1 = true; } if (!flg2) { loadMC.spd2 = main_spd2; flg2 = true; } }; // - - - - - - - flg3 = true; // btnMC7 をクリックしたときの動作定義(※7↓) this.btnMC7.onRelease = function() { if (flg3) { // myfunc に ロードした swf の onEnterFrame を保存 myfunc = loadMC.onEnterFrame; delete loadMC.onEnterFrame; flg3 = false; } }; // btnMC8 をクリックしたときの動作定義(※8↓) this.btnMC8.onRelease = function() { if (!flg3) { // ロードした swf の onEnterFrame に 保存しておいた関数を設定 loadMC.onEnterFrame = myfunc; flg3 = true; } }; ///////////////////////////////////////////////////////////////////////// パブリッシュした「main.swf」を開いてみると,動作確認ができると思います。 「myMC1をストップ」のボタン動作が,上の「※1」に対応しています。 「myMC1をスタート」のボタン動作が,「※2」に対応しています。 「myMC2をストップ」のボタン動作が,「※3」に対応しています。 「myMC2をスタート」のボタン動作が,「※4」に対応しています。 「2つともストップ1」のボタン動作が,「※5」に対応しています。 「2つともスタート1」のボタン動作が,「※6」に対応しています。 ストップさせるとかスタートさせるということはこういうことですよ。 読み込むムービーのスクリプトがわかっているからこそ, 上のように「spd1」と「spd2」という変数を操作してストップさせたりスタートさせることができるのです。 また, ストップだけではなく,スタートまでさせないとならないため, 「spd1」と「spd2」の値を違う場所に保存しておくということも必要になります。 また右の方に,別扱いのボタンが2つありますが, 「2つともストップ2」のボタン動作が,上の「※7」に対応しています。 「2つともスタート2」のボタン動作が,上の「※8」に対応しています。 変数ではなく, ストップさせるとともに関数ごと別の場所に保存しておいて, スタートさせるときは保存しておいた関数を再び読み込んだMC内に定義してやるという方法です。 もし, 読み込んだムービー全体が, そのムービー全体の onEnterFrame で動いている場合に限って, この,「2つともストップ2」ボタンと「2つともスタート2」ボタンが使えるかもしれません。 しかし, そういうもので動いているのかどうかもわかりませんから, 「2つともストップ2」ボタンと「2つともスタート2」ボタンのスクリプトを使ってもおそらくダメでしょう。 > 外部ムービーがスクリプトでできているためか制御できません。 スクリプトでない可能性もありますね。 ムービークリップ内のタイムラインの動きを使っているかもしれません。 今の主流はこれです(というか昔からこれが主流ですが)。 メインムービー(_root)のタイムラインはあまり使いません。 アニメーションするムービークリップをたくさん作って入れ替えるのです。 それの方が作りやすく,面白いことがたくさんできます。 もしこの方法によって動いているものなら, 外部ムービーのムービークリップの構造がわかっていないとストップさせたりスタートさせたりはできません。 また ムービークリップ内のタイムラインの動きを使った場合, ムービークリップにインスタンス名が付いていなければ, ちょっとやそっとでは制御できません。 ActionScript で動かしているものよりも厄介かもしれません。 つまり, 外部ムービーをちゃんと理解して自分で作った人でしたら, ActionScript で動かしても タイムラインの動きを使っても, いくらでもストップさせたりスタートさせたりはできると思いますし,また, スタートさせたりストップさせやすいように最初から考えて作ると思います。 どういう仕組みで動いているのかわからないものは, バージョンの問題ではなく止められません。 何でしたら, HugFlash http://www.paw.hi-ho.ne.jp/milbesos/ などで解析されてみてはいかがでしょうか。 ([Help]HugFlash - おまけモード http://www.paw.hi-ho.ne.jp/milbesos/help/contents/hugflash/shadow.html ) たいていの場合,作るより解析する方が難しいのですが。 あと, ムービークリップ内のタイムラインの動きを使っている場合であれば, 次の URL の ANo.2 の方(ANo.1 や ANo.3 の私ではありませんよ)の回答が参考になるかもしれません。 「ボタンクリック一回ですべてのMC再生停止」 http://oshiete1.goo.ne.jp/qa2169358.html  ↑教えて!goo ↓OKWave (同じです) http://okwave.jp/qa2169358.html

  • hachi_08
  • ベストアンサー率58% (44/75)
回答No.1

こちらの記事が参考になるかもしれません↓↓ http://hfm-kenchan.com/Lesson/log_qa/D0603022.htm

tanamako_0
質問者

お礼

とても詳しい説明ありがとうございます!この回答に感激しました! 他人の作ったモーショントゥイーン や シェイプトゥイーン など,タイムラインを使って動きを作っているムービーではなくて,ActionScriptでできた.swfを自分のファイルに読み込んで、それを普通のモーショントゥイーンムービーを読み込んで止めるチュートリアルを見て制御しようと試みていました。 なんて初心者な私をお許しください。 本当に感謝しております、まずは書いていただいたものを試してみて構造を十分理解した上でもう一度自分のファイルで試してみます。結局自分が読み込む.swfはおっしゃるとうりthis.onEnterFrame によって動かされているようです。 では、またよろしくお願いします!

関連するQ&A

  • 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
  • 外部ムービー(swf)の制御

    こんばんは。 外部ムービーを読み込んだときに その、スタート、ストップを制御 したいのですが、出来るのでしょうか。 できるとしたら、やりかたはどうなりますか。 教えてください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • FLASHで外部ムービークリップのコントロール

    現在学校に通いFLASHの勉強をしています。 ある程度の基本的なスクリプトなら自分で書けるレベルです。 今回、学校での課題作成にあたり 外部のSWFファイルに配置したムービークリップのコントロールというのは出来るのかどうかが分からず投稿しました。 使用ソフトはflashCS3です。 例えば、a.swfにボタンを配置し、 押したらb.swfの「b_mc(ムービークリップ)を再生」とかはアクションスクリプトで制御出来るのでしょうか? また、こういった動作をしたい時のスクリプトの書き方などを回答として頂けると助かります。 よろしくお願いします。

  • 外部ムービー再生終了後、特定のラベルへ飛ぶ

    外部ムービー再生終了後、特定のラベルへ飛ぶ 質問させていただきます。 制作環境はAS2.0 FlashCS3 やりたいことは親swfに外部swfムービーを読み込んで 外部ムービーの再生が終わったら、親swfの特定のラベルに飛ぶ、というものです。 親swfの1フレーム目に書き込んだスクリプトは・・・ this.stop(); this.movie.loadMovie("movie1.swf"); if ( movie._currentframe == movie._totalframes ) { this.gotoAndStop("next"); } しかし、いきなりnextラベルに飛んでしまいます・・・ 宜しくお願い致します。

  • AS3での外部swfの制御

    こんにちは。 Flashのコードについて質問させていただきます。 AS3で外部swfを読み込み、制御したいのですが上手くいきません。 ここでいう外部swfはflashで作ったものではなく、aftereffectsでswfで書き出したものです。 var swf:MovieClip; var loader:Loader = new Loader(); var newSWFRequest:URLRequest = new URLRequest("swfs/" + "test" + ".swf"); loader.load(newSWFRequest); addChild(loader); 上記コードでswfを表示+再生は出来ます。 更に、swfを停止、再再生、逆再生などしたいのですが、可能でしょうか? そもそもこのswfにはタイムラインという概念が存在しないので微妙ですが。。。 swf = new MovieClip(); swf .stop(); とか書き足せば、 TypeError: Error #1034: 強制型変換に失敗しました。flash.display::AVM1Movie@231c04a1 を flash.display.MovieClip に変換できません。 が出ます。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • 外部SWFの制御、プロパティにアクセスについて

    制作環境:Flash CS5、ActionScript3 外部SWFのプロパティ、フレームの制御について悩んでいます。 まず、外部SWFを読み込むSWF:parent.swf、読み込まれるSWF:child.swfがあるとします。 parent.swfはタイムライン1フレームだけで以下を記述しています。 var swfUrlReq:URLRequest=new URLRequest("./child.swf"); var fileLoader:Loader=new Loader(); var mc:MovieClip=new MovieClip(); fileLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeSwf); fileLoader.load(swfUrlReq); function completeSwf(eventObject:Event):void { mc=fileLoader.content as MovieClip; mc.stop(); addChild(mc); trace(mc.word); } child.swfでは総フレーム55くらいで、添付の画像のように左から右に移動して終わるだけのムービーです。1フレーム目にはvar word:String="読めた!!"; 最後の55フレームにはstop();を記述しています。 でいざパブリッシュしてみるとmc.stop();が効かず勝手にムービーが再生され、おまけに以下の「Error #1069: _01_fla.MainTimeline__Preloader__ にプロパティ word が見つからず、デフォルト値もありません。」のエラーでてしまいます。 どうやったらフレームを制御でき、child.swf内部に設定した変数wordを読めるでしょうか?ネットでいろいろ検索引っかかったのですがどれも解決にはなりませんでした、どなたか教えてください、よろしくお願いします。

    • ベストアンサー
    • Flash
  • FLASH 外部ファイル読み込み アクションスクリプト

    FLASH 外部ファイル読み込み アクションスクリプト SWFの上にSWFを読み込む時に、ボタンに on (press) { _level0.pic0.stop(); loadMovieNum ("pattern.swf", 3); } と書きました。 今これは”pattern.swf”を読み込んでいるだけなんですが これをpattern.swfの2フレーム目から読み込ませる ようにしたいのですが、誰か教えていただけないでしょうか? よろしくお願いします。

  • 外部ムービーを読み込んだとき音が鳴らなくて困っています.

    外部のムービーにサウンドオブジェクトを作ってattachしてstartするスクリプトを書いているのですが,そのswfファイルを他のswfファイルからloadMovieしたときに読み込まれたswfファイルの音が出ないのです.助けてください;; 読み込まれるswfのスクリプトをのせておきます. s1_sound = new Sound(); s1_sound.attachSound("midi1.aif"); s1_sound.start(0,999);

    • ベストアンサー
    • Flash
  • ムービークリップ内に空ムービーを置いて外部SWFをロードするやり方

    ムービークリップ(menu1)このムービーはシーン1に設置してあり、動きはクリックすると右から左に引き出す感じのナビゲーションにしてあります。 それがmenu1,menu2,menu3とありそれぞれ再度押すと元の場所にもどります。 ここまでは完成しているのですが、このmenu1,2,3をそれぞれ押して引き出した後にその引き出した画面にコンテンツを外部swfでロードさせたいのですが、まったく表示されず白い画面のままです。 this.stop(); if(this.onFlag == 0){ //↑左にコンテンツをopenさせ元の位置に戻らぬようストップ //↓menu1外部charch読み込みswf_charchは空ムービー swf_charch.loadMovie("charch.swf"); } このスクリプトをムービークリップmenu1のフレームに書き込んでます。 空ムービー(swf_charch)をつくりmenu1に配置して、インスタンス名もswf_charchにしてあります。 もしかして、ムービークリップ内に空ムービーを入れ子にして外部swfの読み込みは不可能なのでしょうか? それともスクリプトの記述がloadMovieではなく別のスクリプトなのでしょうか? 説明が下手で分かりづらいと思いますが、分かる方いらっしゃいましたら宜しくお願いいたします。

  • 外部読み込みムービー上の音楽制御

    ステージにムービークリップを置いて、そこに外部のムービーを読み込んでいます。 その外部のムービー上で音楽が流れており、その音楽のボリュームを変えたいと思っているのですが、どうもうまく行かないのです。 下記はボリュームオン・オフ用のムービークリップに書いたスクリプトです。(music_button) //クリックされた時にオン・オフを切り替える on(press){ music = music * (-1); //サウンドのオンオフを切り替える s1_sound.setvolume(music*100); if (music = 1){s1_sound.start();} else{s1_sound.stop();} } 外部のムービークリップ上の音楽には「BGM」という識別子をつけています。 上記のmusic_buttonの置いてあるメインタイムラインの2フレーム前で _global.s1_sound = new Sound(); s1_sound.attachsound("BGM"); という宣言をしています。 何か音楽を制御するための要素が足りないのでしょうか。あるいは、階層の指定などが間違っているのでしょうかね。。。 何か手がかりをご存知の方よろしくお願いします。

    • ベストアンサー
    • Flash