- ベストアンサー
Flash初心者です。3つのflaファイルを
Flash初心者です。マニュアル通りサイトでロードしやすいように、Flashのファイルを3つつくりました。これらを繋げたいのですが、どのようにしたらよいのでしょうか? 調べてみる"loadMovie"といったアクションスクリプトを使用し、ダミーで作ったファイルに3つを読み込むようですが、良く理解が出来ません。 アクションスクリプトも、イマイチよくわかりません。 OSはOSX10.6です。ソフトはFLASH CS3です。 初心者でもわかるように説明していただける方がいましたら、是非ともお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> "loadMovie"といったアクションスクリプトを使用し、 > ダミーで作ったファイルに3つを読み込むようですが、 loadMovie は ActionScript 1.0(2.0でも使えるが3.0では使えない)メソッドですよ。 すでに作成された3つの Flash ムービー(SWFファイル) の ActionScript のバージョン設定はどうなっているのでしょうか? ここで言う ActionScript のバージョン設定 とは, 作成された Flash ムービーの中に ActionScript を使っているとか使っていないという話とは別です。 ここで言う ActionScript のバージョン設定 とは, 「パブリッシュ設定」パネルで「Flash」タブを選択したときに 「スクリプト」の欄が ActionScript 1.0 になっているのか 2.0 になっているのか 3.0 になっているのかという設定の話です。 すでに作成された3つの Flash ムービー(SWFファイル) が 例えば Flash Player 10,ActionScript 3.0 で作成されたものであれば 3つを読み込む親SWFの設定も Flash Player 10,ActionScript 3.0 にするべきです。 またそうしたならば loadMovie は使えなくなるということになります。 良くわかりませんので ここでは ActionScript 2.0 の場合と ActionScript 3.0 の場合について回答します。 両者の場合ともファイル構造を次のようにしていたとします。 任意のフォルダ ├親SWFを貼り付けるHTML ├親SWF(3つのSWFをロードする) └files(フォルダ) ├aaa.swf ├bbb.swf └ccc.swf ◎ ActionScript 2.0 の場合 親SWFを作成するFlashドキュメントファイル(FLAファイル)の フレーム1 に書く(コピペする)スクリプト例 ---------------------------------------- //配列「swf_arr」を作成 var swf_arr:Array = new Array(); // //swf_arrの要素にロードするSWFを登録 swf_arr.push("files/aaa.swf"); swf_arr.push("files/bbb.swf"); swf_arr.push("files/ccc.swf"); // //連続ループ再生 する(true) しない(false) を設定 var loop:Boolean = true; // //---以上が変更する設定------ // //カウンタを用意 var cnt:Number = 0; // //空のムービークリップ「ld」を深度0に作成 this.createEmptyMovieClip("ld", 0); // //MovieClipLoaderインスタンス「mcl」を作成 var mcl:MovieClipLoader = new MovieClipLoader(); // //ロードしたSWFの先頭フレームのアクションが //実行されるときに実行するメソッドを定義 this.onLoadInit = function(mc:MovieClip):Void { // //ロードターゲットである「ld」に対して //毎フレーム時間実行するメソッドを定義 mc.onEnterFrame = function():Void { //もしロードしたSWFが最終フレームになれば if (this._currentframe == this._totalframes) { //もしカウンタが配列の要素数-1未満であれば if (cnt<swf_arr.length-1) { //カウンタに1を加算 cnt++; //次のSWFをロード mcl.loadClip(swf_arr[cnt], ld); //カウンタが配列の要素数-1に達していれば } else { //連続ループ再生するの場合 if (loop) { //カウンタを0に戻す cnt = 0; //次のSWFをロード mcl.loadClip(swf_arr[cnt], ld); //連続ループ再生しないの場合 } else { this.stop(); } } delete mc.onEnterFrame; } }; }; // //このタイムラインを「mcl」のリスナーとして登録 mcl.addListener(this); // //ムービークリップ「ld」をターゲットにして最初のSWFをロード mcl.loadClip(swf_arr[cnt], ld); ---------------------------------------- ◎ ActionScript 3.0 の場合 同じく 親SWFを作成するFlashドキュメントファイル(FLAファイル)の フレーム1 に書く(コピペする)スクリプト例 -------------------------------------------- //配列「swf_arr」を作成 var swf_arr:Array = new Array(); //swf_arrの要素にロードするSWFを登録 swf_arr.push("files/aaa.swf"); swf_arr.push("files/bbb.swf"); swf_arr.push("files/ccc.swf"); //連続ループ再生 する(true) しない(false) を設定 var loop:Boolean = true; //---以上が変更する設定--------- //カウンタを用意 var cnt:int = 0; //Loaderインスタンス「ld」を作成 var ld:Loader = new Loader(); //rootに「ld」を配置 addChild(ld); //最初のSWFをURLRequest「req」に設定 var req:URLRequest = new URLRequest(swf_arr[cnt]); //「ld」に最初のSWFをロード ld.load(req); //「ld」のcontentLoaderInfoにリスナーを登録 //(最初のフレームがロードされたときに ,onInitを実行) ld.contentLoaderInfo.addEventListener(Event.INIT, onInit); //関数 onInit を定義 function onInit(evt:Event):void { //「ld」にリスナーを登録 //(毎フレームごとに ,watchSWFを実行) ld.addEventListener(Event.ENTER_FRAME, watchSWF); } //関数 watchSWF を定義 function watchSWF(evt:Event):void { //変数「mc」にロードしたSWFのタイムラインを代入 var mc:MovieClip = MovieClip(evt.target.content); //もしロードしたSWFが最終フレームになれば if (mc.currentFrame == mc.totalFrames) { //もしカウンタが配列の要素数-1未満であれば if (cnt < swf_arr.length - 1) { //カウンタに1を加算 cnt++; //次のSWFを「req」に設定 req.url = swf_arr[cnt]; //次のSWFをロード ld.load(req); //カウンタが配列の要素数-1に達していれば } else { //連続ループ再生するの場合 if (loop) { //カウンタを0に戻す cnt = 0; //最初のSWFを「req」に設定 req.url = swf_arr[cnt]; //最初のSWFをロード ld.load(req); //連続ループ再生しないの場合 } else { mc.stop(); } } //「ld」のリスナーを削除 ld.removeEventListener(Event.ENTER_FRAME, watchSWF); } } --------------------------------------------
その他の回答 (1)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#1です。 > flash.display::AVM1Movie@1ed6a101 を > flash.display.MovieClip に変換できません。 その 「AVM1」 というのは 「ActionScript 2.0 以下動作エンジン」のことです。 http://www.google.co.jp/search?sourceid=navclient&hl=ja&q=AVM1+AVM2 やはり ActionScript 3.0 と 2.0 の混在が原因のようですが。。。 > aaa.swfとccc.swfには下記で購入したフィルタを使用しています。 > これが原因なのでしょうか? ~略~ > bbb.swfは、フィルタを使わずに、最初から自分で作成したfli > ファイルから書きだしたものです。 原因を特定したいのでしょう? なぜそんな複雑な状況で原因を見つけようとするのでしょうか? それも他人には検証できない条件を提示して。。。 単に 10フレーム くらいの 四角が左から右にモーショントゥイーンで動くような3つのSWFでも作成して それを aaa.swf bbb.swf ccc.swf と命名して実験すれば 少なくとも何かがわかるはずですが。 自分自身でするべき当たり前のことをせずにして,何も解決することはありませんよ。
お礼
早速のご教授をありがとうございます。 おっしゃるとおり、簡単なswfを作成して、検証してみます。 兎にも角にも、ActionScriptを見ただけでめまいがするくらいですが、一生懸命頑張ってみます。 励ましていただいてありがとうございます。 また何かありましたら、宜しくお願い致します。
補足
BlurFiltanさん、こんにちは。 簡単なswfを3つつくって検証しました。スクリプトが綺麗に動いて、3つのswfがつながりました! sample1.swf-->sample2.swf-->sample3.swfへトランジションもスムース綺麗につながりました。 ご指導いただきまして、本当にありがとうございます。 書き出すときに、ActionScriptの設定が2.0と3.0を混在していたのが原因でした。 オリジナル版も書き出すときに、ActionScriptのバージョンを確認しながら、(3.0)で書きだしたところ、3つがつながりました! ただ、original.swf1-->original.swf2-->original.swf3と移り変わるときに、少しもたついた感じになり、一瞬画像が消えてからまた次のswfに移行していきます。またすべてのswfの背景色がなくなっていました。これはスクリプトに依存するのでしょうか? お時間があるときにご教授いただければ助かります。 よろしくお願い致します。
お礼
ありがとうございます! 論理的、かつフォルダ構造など理解し易く説明をしていただきまして、とても感謝しております。 ActionScript のバージョンは3.0で作成しました。 早速、スクリプトがどのように動くか、親SWFにサンプルをコピペして試してみました。(スクリプトは難しく、ざっと目を通し、どのように動くのかを試すため、ブラックボックスとして作成しました。もちろんファイル名、フォルダ名は入れ替えています。) 親SWFを書き出し、htmlをパブリッシュして、SWFを開いて確認しましたところ、下記のようなメッセージがでます。 「TypeError: Error #1034: 強制型変換に失敗しました。flash.display::AVM1Movie@1ed6a101 を flash.display.MovieClip に変換できません。」メッセージがループしたように出力されます。 aaa.swfとccc.swfには下記で購入したフィルタを使用しています。これが原因なのでしょうか?もしくは私のスクリプトの書いた場所がおましいのでしょうか? http://www.flash-filter.net/tile-transition-effect.phtml bbb.swfは、フィルタを使わずに、最初から自分で作成したfliファイルから書きだしたものです。 また親SWFのドキュメントサイズはaaa.swf, bbb.swf, ccc.swfと同じ大きさで作っています。 こちらが原因なのでしょうか? お時間があるときに、ご教授いただけましたら幸甚です。 どうぞよろしくお願いします。