重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

初めまして。
当方初心者なので、よくわからないので、質問させていただきます。
外部にswfとしてフレームラベルの複数ついたものがあって、
それをmc(mcs_mc)で読み込みし、スクリプトで一定時間毎に
mcに読み込んだ外部swfのフレームラベル(chapter1~chapter10)を移動させたいのですが、うまく動いてくれません。
どの用にしたらよいでしょう?よろしくお願いします。


onClipEvent(load){
this._lockroot = true;
}

onClipEvent(enterFrame){
setInterval( function(){ mcs_mc.gotoAndPlay("chapter2"); }, 1000);
}

A 回答 (1件)

enterFrame イベントは、ムービークリップ(ここでは mcs_mc )がステージに存在している間、常に発生しています。


このイベントを利用して setInterval 関数を実行すると、タイマーが複数登録されてしまいます。
タイマーの作成は1回だけでいいので、フレームアクション(タイムラインに設定するアクション)で充分です。
また、読み込むムービーが長かったり容量が大きい場合は特に、読み込みが終了してからタイマーを設定した方が安全です。


まず、読み込みが済んだかどうかの判定ですが。
loadMovie で読み込む場合は、ムービーが読み込まれるムービークリップにロード済みの容量と総容量が保存されます。これらの情報は getBytesLoaded と getBytesTotal メソッドを使って取得できますので、ロード完了率を算出できます。
メインのタイムラインでも、mcs_mc での読み込みの進捗状況は把握できます。完了率をパーセントで出し、100 %になっていたら読み込みが終了したと判断できます。

このあたりは、ムービーの Now Loading 画面の作り方とよく似ています。
ただ、ロード済み・トータルの容量やフレーム数を取得する対象が、_root (ムービー自身)からムービークリップ mcs_mc に変わっただけのことです。
Now Loading 画面については、紙面の都合上、今回は割愛させていただきます。初心者向けの解説サイトや解説書でもしばしば取り上げられていますし、このサイトでも何度か質問に出ていますので、詳しい原理・作り方などはそちらをご参考になさってください。


ムービーの読み込みが終了した時に、タイマーを作成します。
タイマーは次のように考えます。
フレームラベルを chapter +通し番号( 1 ~ 10 )で付けていらっしゃるとのことですので、これを利用します。
チャプターの番号だけを、変数で管理します。
番号だけなら単なる数値なので、算術演算も可能です。この変数をカウントアップしながら、その値を元に該当するフレームに移動する関数を1つ作り、setInterval ではこの関数を登録します。


ムービーの流れをまとめてみますと。

 フレーム1:外部ムービーの読み込みと初期設定(関数の定義など)
 フレーム2:読み込み終了を待つフレーム。スクリプトは設定しない。
 フレーム3:読み込み終了判定と、タイマーの作成。普段はこのフレームを表示する。

スクリプトは、大体、次のようになります。
このスクリプトはフレームに設定してください。
(↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)


 ・フレーム1

  //現在再生中のチャプター番号を保持(1~10)
  chapter_no = 1;

  //一定時間ごとにチャプターを変更する関数
  function Chapter_jump()
  {
   //チャプター番号を変更
   //10まで再生したら1に戻る
   chapter_no++;
   if( chapter_no > 10 )
   {
    chapter_no = 1;
   }

   //次のチャプターを再生
   mcs_mc.gotoAndPlay( "chapter" + chapter_no );
  }


  //外部ムービーの読み込み
  mcs_mc.loadMovie( "***.swf" );


 ・フレーム3

  //読み込み完了率を算出
  loaded = Math.floor( mcs_mc.getBytesLoaded() / mcs_mc.getBytesTotal() * 100 );

  //ムービーの読み込み終了を待つ
  if( loaded < 100 )
  {
   gotoAndPlay( 2 );
  }
  else
  {
   //タイマーの作成(一定間隔ごとにチャプター移動関数を呼び出す)
   timerID = setInterval( Chapter_jump , 1000 );

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


フレームアクションは、再生ヘッドがフレームに移動してきた、その時1度しか実行されません。
再生ヘッドをセットし直せばフレームアクションを何度も実行できるのですが、Flash の仕様上、再生ヘッドは全く同じフレームに続けてセットすることはできないようになっています。
フレームアクションで変数の値を監視するような場合は、一旦別のフレームに移動し、改めてスクリプトを設定したフレームに戻ってくる方法があります。
フレーム間をループすることで、フレームアクションが何度も実行されます。どこか別の処理で変数の値が書き換えられるのを待ってから、次の処理に進みたい時に便利です。
今回は、フレーム2と3の間をループしながらフレーム3のアクションを何度も実行させ、読み込み終了まで待機できるようにしています。

上記のスクリプトでは、タイマーでチャプター 10 まで再生された後は再びチャプター1に戻る、無限ループ再生になります。
チャプター 10 でムービーを停止するには、読み込むムービーの最後に stop(); を入れ、Chapter_jump 関数内の if( chapter_no > 10 ) { ・・・ } の部分を、次のように変更してください。

 if( chapter_no >= 10 )
 {
  //タイマーを削除
  clearInterval( timerID );
 }

タイマーを削除するには、clearInterval 関数を使います。
setInterval 関数を実行した時に、内部で使われているタイマーの管理番号(タイマー ID )が返ってきます。
この ID は、clearInterval で削除するタイマーを指定する時に必要になります。
上記のスクリプトでは timerID という変数にこの ID を保存しています。
タイマーを削除すると登録した関数は呼び出されなくなるので、チャプターの移動も行われません。


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

丁寧な解説、ありがとうございます。
無事動きました。

お礼日時:2005/04/21 01:02

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