フレームアクションに記述する際の注意
フレームアクションにフレーム移動を行うムービークリップ・メソッドを記述する際には注意が必要です。
下のサンプルムービー1を見てください。5フレームのフレームアクションに ' this.gotoAndPlay ( 1 ) ; ' というスクリプトを記述しています。すると、ご覧のように5フレームの画面が表示されずに、1フレームに移動してしまいます。
これはフレーム内の処理順序に関わる問題です。フレーム内の処理は、最初にフレームアクションが実行され、一番最後に画面の描画が行われます。したがって、フレームアクションにフレーム移動のメソッドを記述すると、画面の描画が行われる前に、指定したフレームに移動してしまうのです。
サンプルムービー1 |
●5フレームのフレームアクション |
|
●ソースファイル: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のオブジェクトアクション |
サンプルムービー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フレームのフレームアクション |
|
●ソースファイル: gotoandplay5.lzh(8.27KB) |
・関連項目
ムービークリップのフレームの移動