dポイントプレゼントキャンペーン実施中!

Flash MX 2004 Proを使用しています。(OSはXPです。)
複数の外部swfファイルをつなげて(1つのswfファイルを最後まで見終わったら次をロードするというような形で)表示していきたくて、調べてみたらMovieClipLoaderというのを使うとうまくいくようだったので使ってみたいのですが、ヘルプを見ても全く使い方がわからない状態です。

外部swfファイルの読み込み場所として、rootにムービークリップを1つ用意しました。

外部ファイルをロードし始めるタイミングは、タイムライン145、195、245のレイヤーに配置してあるムービークリップ内にあるムービークリップのon(release)イベントが発生したときです。それぞれのタイムラインで、最初に呼び出す外部ファイルは異なります。
<外部ファイルの読み込み順>
1st.swf→2nd.swf→3rd.swf
配列かなにかにファイル名を格納して次の要素があればその名前のファイルを読むという形にしたいです。

<各タイムラインでon(release)イベントが発生した時に最初に読込む外部ファイル>
タイムライン145:1st.swf(このファイルの再生が終わったら2nd.swfを読込んで1st.swfと差し替える)
タイムライン195:2nd.swf(このファイルの再生が終わったら3rd.swfを読込んで2nd.swfと差し替える)
タイムライン245.swf:3rd.swf(このファイルの再生が終わってもなにも読込まない)

各ファイル読み込み時にそれぞれLoadingの表示もしたいです。

私はJavaをかじったことがある程度で、Flashはまったくのド素人です。どこで宣言されたかわからない変数や、無名関数なんかに踊らされて、他の方の質問を読ませていただいてもちんぷんかんぷんでした。
稚拙な表現で質問内容を書き綴ってしまいましたが、ご不明な点があれば補足しますので、よろしくおねがいします。

A 回答 (1件)

おそらくですが、「再生」ボタンがクリックされるごとに、1st.swf から 3rd.swf を順に読み込んで再生していきたいとのことではないでしょうか?


ムービーを読み込むフレームを変えているのも、読み込んだムービーの再生終了を待つためではないかと思います。
「再生」ボタンがクリックされた時に読み込みを実行するものとして、ムービーの再生中は「再生」ボタンをクリックできなくし、再生終了時に再び「再生」ボタンをクリックできるように戻しておく、というのはいかがでしょう。
release イベントを使って読み込みを実行するのであれば、ムービークリップでクリックを検出しない間は release イベントが発生しないため、読み込みも実行されません。フレームを使ってムービーの再生終了を待つ必要はなく、実は1フレームだけでも作れてしまいます。


仮に、ムービーを読み込む側を Loader.swf 、読み込むムービーを 1st.swf ・ 2nd.swf ・ 3rd.swf とします。
Loader.swf には、ステージ( _root )に、ムービーを読み込むためのムービークリップ”load_area”と、「再生」ボタンであるムービークリップ”play_btn”があるとします。

MovieClipLoader を使ってロード済みバイト数と読み込む総バイト数の取得は可能ですが、読み込む対象が JPEG 画像ではなく swf ファイルの場合は、読み込みの済んだフレームから順次再生されるので、完了率が 100 %になる前に再生が始まってしまいます。
ですから、MovieClipLoader で完了率を出そうとせずに、読み込む swf ファイルの方にロード画面を作っておいた方が簡単だと思います。
Now Loading の作り方は以前別の質問で紹介しましたので、よろしければご参照ください。(回答の後半部分がロード画面の作り方になっています)
ネットの解説サイトでも、作り方を説明しているところはたくさんあるようです。

 ・ボタンを押してもすぐ戻ってしまう・・・。
  http://okweb.jp/kotaeru.php3?q=1165503


Loader.swf の方では、1st.swf ~ 3rd.swf の再生が終わったかどうかは分かりません。
終了を検出する方法はいろいろ考えられますが、今回は、再生終了時に必要なことは、「再生」ボタン(ムービークリップ: play_btn )を再びクリックできるようにする処理だけです。
プログラム的には少々汚くなりますけど(^^;)、それぞれのムービーの中から直接 play_btn の属性を操作してクリックを可能にする、という方法はいかがでしょう。
各ムービーで、再生終了時に何らかのフラグを立てて、play_btn ではこのフラグを監視してクリックの可・不可を決める、といった方法もあります。

Flash には階層という考え方があります。
自分以外の階層にあるインスタンスや変数・関数を参照したい場合は、目的のものを持っている階層までの指定(ターゲットパス)が必要です。
1st.swf ~ 3rd.swf は、Loader.swf が持っている”load_area”というムービークリップに読み込まれますので、Loader.swf の中では、これらのムービーは load_area というムービークリップとして扱われます。
Loader.swf にあるムービークリップ play_btn は、load_area から見ますと、自分の親の別の子にあたります。
よって、load_area から play_btn のプロパティ等を参照するには、親を指す表現である _parent を使って、

 _parent.play_btn.*** = ・・・;

で参照できます。

ムービークリップでクリックを検出可能にするかどうかは、enabled というプロパティを操作します。true でクリック可能、false にするとクリックが検出されなくなります。
play_btn の enabled プロパティの操作は、最初はデフォルトである true 、読み込みを開始した時に false 、そして、読み込んだムービーの再生が終了した時は true に戻しておく、といった流れになります。
次のようなスクリプトを、1st.swf と 2nd.swf の最後のフレームに、それぞれ記述してください。3rd.swf は最後のムービーですから、「再生」ボタンはクリックできないままでも構わないと思います。
(以下のスクリプトの各行頭に、全角のスペースが入っています。コピーして利用する際はご注意ください)

 //「再生」ボタンを押せるようにする
 _parent.play_btn.enabled = true;

 //タイムラインはここで止める
 stop();


Flash では、ムービー自身もムービークリップとして扱います。
普段は _root と言えばムービー自身であり、ステージにあるボタンやムービークリップ、メインのタイムラインにターゲットパスを付けずに記述した変数・関数などは、全て _root.*** = ・・・で参照できます。
例えば 1st.swf で _root の表現を使っている場合、1st.swf 単体では 1st.swf 自身を指します。
しかし今回の場合は、1st.swf は Loader.swf の中の load_area に読み込まれるため、この時点で、1st.swf の中で使われていた _root は、Loader.swf を指すように変わってしまいます。
こんなことにならないように、Flash Player 7 からは、_lockroot というプロパティが登場しました。
_lockroot はムービークリップが持っているプロパティの1つです。
Loader.swf のタイムラインで

 load_area._lockroot = true;

というアクションを実行しますと、load_area に読み込まれる swf ファイル内で使われている _root は、引き続きそのムービー自身を指すようになります。

先述の play_btn の話で、_root ではなく _parent を使う理由も、_root が指す対象の問題にあります。
load_area と play_btn は、ともに Loader.swf のステージにあります。
1st.swf ~ 3rd.swf が load_area に読み込まれた時は、

 _root.play_btn = ・・・;

このようにしても、play_btn を操作することが可能です。
しかし、_lockroot を適用しますと、この _root は 1st.swf ~ 3rd.swf 自身を指すため、Loader.swf 内の play_btn を正しく指定できなくなります。

---------------------

あとは、play_btn がクリックされた時にムービーを読み込む処理を入れれば完成です。
読み込むファイル名を配列変数に入れ、再生するムービーの番号を変数で管理すると、

 ファイル名の配列[ 再生するムービーの番号 ]

このような形で、配列に入っているムービーの名前を参照しながら、順に再生していくことができます。

Loader.swf のフレーム1で、初期設定として、必要な変数の用意と、先述の _lockroot の設定を行います。


 //読み込むムービーの_rootの参照先を保護
 load_area._lockroot = true;
 //ムービーの表示領域を、最初は非表示にする
 load_area._visible = false;

 //ファイル名のリストと、ファイルの総数・再生中のファイル番号の管理変数
 file_tbl = new Array( "1st" , "2nd" , "3rd" );
 file_max = file_tbl.length;
 file_no = 0;

 //MovieClipLoaderオブジェクトを生成
 load_obj = new MovieClipLoader();


ムービーの読み込みは、MovieClipLoader を使う場合は loadClip というメソッドを使います。
読み込みは「再生」ボタンが押された時ですので、play_btn に、オブジェクトアクション(インスタンスに設定するアクション)として設定します。
スクリプトにしますと、play_btn に設定するスクリプトは、大体、次のようになります。


 //クリックされた時の処理
 on(release)
 {
  with( _root )
  {
   //読み込むファイルが残っている場合のみ、読み込みの処理
   if( file_no < file_max )
   {
    //読み込みを実行
    load_obj.loadClip( file_tbl[ file_no ] + ".swf" , load_area );

    //次に読み込むファイル番号を更新
    file_no++;
    if( file_no >= file_max )
    {
     file_no = file_max;
    }

    //このムービークリップをクリックできなくする
    this.enabled = false;
   }
  }
 }
 

ActionScript では、操作したいインスタンスや変数がどこにあるのかを細かく指定しなければなりません。
今回は、ファイル名を管理する配列などは、まとめて _root 階層に定義してありますので、play_btn からこれらを参照するには、_root.・・・というように、_root までのターゲットパスが必要です。
操作する変数などの数が多いと、いちいちターゲットパスを書くのは面倒です。 with というアクションは、この手間を省くためのものです。


読み込みだけなら、loadMovie というアクションでも可能です。
MovieClipLoader では、loadMovie よりもロードの進捗状況を細かく把握できます。完了率の取得も可能ですが、先述の通り、読み込むものが swf ファイルの場合はロードが終わらなくても再生が始まるという仕組みのために、MovieClipLoader で完了率を出すのはオススメしません。
今回は、無理に MovieClipLoader を使う必要はないかと思います。

強いて MovieClipLoader を使う利点を挙げるなら、エラーが発生した時の処理ができることでしょうか。
ActionScript では、何かが起きた時、イベントが発生して知らせてくれます。
MovieClipLoader で読み込みを実行すると、エラーが発生した場合に onLoadError というイベントが発生します。この時に実行する処理を関数として予め定義しておきますと、エラーが起きた時にその関数が自動で呼び出されます。
この時に呼ばれる関数は、第1引数にエラーが起きたムービークリップ、第2引数にエラーの種類を表す文字列が渡されます。
次のような要領で利用します。


 load_obj.onLoadError = function( target:MovieClip , errorCode:String )
 {
  //エラーの種類を判別
  switch (errorCode)
  {
   case 'URLNotFound':
    /*ここに、ファイルがなかった時の処理を書く*/
    break;

   case 'LoadNeverCompleted':
    /*ここに、不測の理由でロードが失敗した時の処理を書く*/
    break;
  }
 };


ここでは割愛しますが、MovieClipLoader では、リスナーオブジェクトという別のオブジェクトを登録して、そちらでイベントが起きた時の処理を定義することもできます。(ヘルプのサンプルは、このスタイルになっています)


長くなってすみませんでした。
不明な点がありましたら、補足してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!