- ベストアンサー
2つのswfファイルをつなげている場合の一括ローディング方法
- 外部JPGファイル読み込みのローディング方法がわからない質問について、外部swfファイル読み込みの際のローディング方法をまとめます。
- 2つのswfファイルを全て読み込み、再生時のつながりをスムーズにするために、最初のswfファイルにローディングオブジェクトを置く方法を解説します。
- さらに、2つ目のswfファイルも一括でローディングし、つなげる方法について説明します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ロードの進捗状況は、loadMovie などのダウンロード命令を出した後でなければ取得できません。 例えば、ムービー1の最後で loadMovie でムービー2を読み込む場合でも、ムービー1の最初でロード画面を再生している間は、ムービー2のロードは実行されていません。 そのため、ムービー2の容量や進捗状況を、ムービー1自体の進捗状況と同時に把握することはできないのです。 Flash での読み込みは、loadMovie で読み込み命令を出した後、読み込みが終わるまでそこでスクリプトの実行が止まることはなく、読み込みを裏で進めながら次のスクリプトが並行して実行されます。 つまり、loadMovie を2件続けて実行することで、2つのムービーを同時に読み込むことができます。 2つの読み込みを同時に実行するには、ムービーの受け皿となるムービークリップを2つ用意し、それぞれにムービーを読み込むようにします。 この場合は、2つのロードの進捗状況を把握し、2つ分の容量を合わせた完了率を算出することも可能です。 ただし、2つのムービーが同時にステージに存在することになりますから、ムービー1が再生されている間はムービー2を待機状態にし、ムービー1が終了したらムービー2を再生させるといった、再生するムービーを任意のタイミングで切り替えられる仕組みも必要になります。 ------------------------ ムービー1の中で全て実現しようとすると難しいので、読み込みやムービーの切り替えなど、全体を指揮するムービーを1つ作ってはいかがでしょうか。 例えば、全体の指揮を執るムービーを main.swf 、読み込むムービーを sub1.swf と sub2.swf とします。 main.swf の中にムービークリップを2つ用意し、これにムービーを読み込みます。 このムービークリップを仮に load_area1 と load_area2 とします。 sub1.swf を再生している間、sub2.swf は待機となります。 この2つは main.swf に読み込まれた時点で、main.swf にある load_area1 と load_area2 というムービークリップとして制御できるようになります。 再生するムービーは、ムービークリップの表示・非表示を決める _visible 属性を操作して、簡単に切り替えることができます。 また、再生するフレームに関しては、stop(); や play(); を利用して再生/停止を制御できます。 sub1.swf が終了した後で sub2.swf に切り替えるには、sub1.swf の再生が終了したかどうかを main.swf が検出できるようにしなければなりません。 いろいろな方法がありますが、main.swf に変数を1つ用意し、この値を sub1.swf の最後のフレームで書き換えて終了を知らせる方法が簡単だと思います。 例えば、この変数を end_flg とし、最初は false を入れておくとします。 sub1.swf が main.swf に読み込まれた時は、main.swf のムービークリップ load_area1 として扱われますので、sub1.swf からこの変数を操作するには、main.swf の load_area1 からメインのタイムラインまでのターゲットパスが必要になります。 load_area1 から見ますと、end_flg は親の階層にあります。親の階層を表す相対表現 _parent を使って、 //終了をメインのムービーに知らせる _parent.end_flg = true; で書き換えることができます。 main.swf ではこの変数を監視し、true に変わった時に、sub2.swf (が読み込まれている load_area2 )を再生するようにします。 ところで、Flash には、全データを読み終わらなくとも、読み込みの済んだフレームから順に再生できるという特長があります。 これは loadMovie で読み込む場合でも同じです。 しかし今回の場合は、ムービーの読み込みが全て終わった時点で再生させたいので、この特長がかえってアダになります。 簡単にできる対策としては、ムービーが読み込まれた時点で、ムービーのタイムラインをとりあえず止めておくといった方法があります。 loadMovie を実行すると、ダウンロード演算が行われるたびに data というイベントが発生します。 このイベントを利用して stop(); を実行するか、あるいは、sub1.swf と sub2.swf のフレーム1に stop(); を入れて、最初は止まるようにしておくといいでしょう。 ------------------------ 以上のような方針に従って、main.swf のレイヤー構成を考えますと。 アクション:スクリプト用 ムービー1:ムービークリップ load_area1 を配置 ムービー2:ムービークリップ load_area2 を配置 完了率表示:ロード中に実行するアニメ等を描画 スクリプトは、 フレーム1:初期設定とムービーの読み込み フレーム2:読み込み完了を待つ(スクリプトはなし) フレーム3:ロード完了率の算出と、ロード完了時の処理など フレーム4:ムービー1の再生終了を待つ(スクリプトはなし) フレーム5:ムービー1の終了を待って、ムービー2に切り替える このような流れになるかと思います。 スクリプトにしてみますと、大体、次のようになります。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください) ・フレーム1 //ムービー1の再生終了フラグ //再生終了時true、それ以外はfalse end_flg = false; //それぞれのロード領域にムービーを読み込む load_area1.loadMovie( "sub1.swf" ); load_area2.loadMovie( "sub2.swf" ); ・フレーム3 //完了率の算出 //ムービー1と2の合算で出す loaded = load_area1.getBytesLoaded() + load_area2.getBytesLoaded(); total = load_area1.getBytesTotal() + load_area2.getBytesTotal(); per = Math.floor( loaded / total * 100 ); //プログレスバーの描画 bar._xscale = per; //両方のムービーのロードが終了した場合 if( per == 100 ) { //ムービー1を表示し、再生する load_area1._visible = true; load_area1.play(); } //終わらないうちは終了を待つ else { gotoAndPlay( 2 ); } ・フレーム5 //ムービー1の再生が終了した場合 if( end_flg ) { //ムービー1を非表示・停止し、ムービー2を再生する load_area1._visible = false; load_area1.stop(); load_area2._visible = true; load_area2.play(); //メインのタイムラインはここで止める stop(); } else { //ムービー1の再生終了を待つ gotoAndPlay( 4 ); } 完了率は、ムービー1とムービー2を合わせた完了率が、per という変数にパーセントで入ります。ダイナミックテキストで表示するか、プログレスバーの描画などに利用してください。 ロード中に実行するアニメはフレーム3まで、load_area1 と 2 はフレーム5まで表示するようにします、 先述の通り、loadMovie を実行すると、ダウンロード演算が行われるたびに data というイベントが発生します。 このイベントを利用して、load_area1 と 2 はロードが完了するまで非表示にし、タイムラインを止めておきます。 次のスクリプトを、それぞれに設定してください。 onClipEvent(data) { //最初は非表示にし、タイムラインを止めておく this._visible = false; this.stop(); } あとは必要に応じて、load_area1 と 2 の表示/非表示を切り替えたり、タイムラインを動かしたりするだけです。 どちらのムービーも、読み込まれた後は同じステージに並んだムービークリップ同士になり、スクリプト自体はそれほど難しくはないと思います。 長くなってすみませんでした。 不明な点がありましたら、補足してください。