フレーム移動用メソッド使用時の注意点 [Edit]

フレームアクションに記述する際の注意

フレームアクションにフレーム移動を行うムービークリップ・メソッドを記述する際には注意が必要です。

下のサンプルムービー1を見てください。5フレームのフレームアクションに ' this.gotoAndPlay ( 1 ) ; ' というスクリプトを記述しています。すると、ご覧のように5フレームの画面が表示されずに、1フレームに移動してしまいます。
これはフレーム内の処理順序に関わる問題です。フレーム内の処理は、最初にフレームアクションが実行され、一番最後に画面の描画が行われます。したがって、フレームアクションにフレーム移動のメソッドを記述すると、画面の描画が行われる前に、指定したフレームに移動してしまうのです。


サンプルムービー1
 

5フレームのフレームアクション
  this.gotoAndPlay( 1 );

ソースファイルgotoandplay2.lzh(8.22KB)

というと、フレーム移動のメソッドを記述したフレームに、描画パーツやムービークリップなどを配置しない人が出てくると思います。しかし、そうすると新たな問題が発生することがあります。
下の2つのサンプルムービーを見比べてください。ともに5フレームのフレームアクションに ' this.gotoAndPlay ( 1 ) ; ' というスクリプトを記述しています。さらに、自分のフレーム番号を表示するループ再生用ムービークリップMC1をタイムラインに配置しました。ただし、サンプルムービー2では1~5フレームに配置し、サンプルムービー3では描画されない5フレームには配置していません。
結果はご覧のように、サンプルムービー2では予定どおりMC1がループ再生されますが、サンプルムービー3では1~4フレームのループ再生となり5フレームの画面が表示されません。


サンプルムービー2
 
サンプルムービー3

ソースファイル:gotoandplay3_4.lzh(18.9KB)

この現象は、ムービークリップMC1のオブジェクトアクションに以下のスクリプトを記述すると、把握しやすくなります。MC1がロードされると(インスタンスが作成されると)、出力ウィンドウに 「MC1 Load!」 と表示されます(trace は引数の評価結果を出力ウィンドウに出力するアクションです)。
ソースファイルにスクリプトを記述済みですので、自分でムービーを実行してみてください。
サンプルムービー2のファイル名は「 gotoandplay3.fla 」、サンプルムービー3は「 gotoandplay4.fla 」です。

MC1のオブジェクトアクション
  onClipEvent( load ){
    trace( "MC1 Load!" );
  }

サンプルムービー2は1度だけ、サンプルムービー3は _root のタイムラインが1フレームに戻るたびにメッセージを表示します。これはどういうことでしょうか?
フレーム移動のメソッドを記述したフレームは、画面の描画は行いませんが、フレームの処理は行われ、タイムラインも有効に機能します。サンプルムービー2では5フレームにも MC1 が配置してあるので、1フレームに移動しても、MC1 のタイムラインは途切れることなく、同じインスタンス内でのループ処理が行われます。
ところが、サンプルムービー3では5フレームに MC1 が配置してありませんので、MC1 のタイムラインは途切れ、インスタンスがムービー上から削除されてしまいます。そして、1フレームに移動すると再びMC1がタイムライン上に配置してあるので、新しいインスタンスが生成されます。 _root のタイムラインが1フレームに戻るたびにメッセージが表示されるのは、このように毎回新しいインスタンスの作成/削除が繰り返されているためなのです。

これらの注意点は、フレーム移動を行う4つのムービークリップ・メソッド MovieClip.prevFrame、MovieClip.nextFrame、MovieClip.gotoAndPlay、MovieClip.gotoAndStop、すべてに当てはまります。十分に気をつけておきましょう。


同一フレームのループ再生はできない

もうひとつの問題は、MovieClip.gotoAndPlay を使用した現在のフレーム( _currentframe )のループ再生です。

Directorユーザーは、フレームアクションを繰り返し実行しようとLingoの ' go the frame ' と同じ感覚で、' this.gotoAndPlay ( _currentframe ) ' と記述したい願望があると思います。
ところがFlashでは、MovieClip.gotoAndPlay を使用した同一フレームのループ再生はできません。
記述しても下のサンプルムービー4のように無視されて、次のフレームに移動してしまいます。
Flash ではフレームのループ再生をするには、2フレームが必要です。2つのフレームに同じスクリプトを記述し、後ろのフレームのフレームアクションに this.gotoAndPlay ( _currentframe - 1) ; という記述を追加することによって、Directorの ' go the frame ' と同じ処理を実現することができます。


サンプルムービー4
 

3フレームのフレームアクション
  this.gotoAndPlay( _currentframe );

ソースファイルgotoandplay5.lzh(8.27KB)


・関連項目
ムービークリップのフレームの移動

その他の記事