ムービーを作ってると、ある一定時間静止させて「間」を作りたいということがあるかと思うが、その時にフレームを追加して調整するのは、レイヤーが増えてくると面倒だし、同じ時間止まる場合にきちんとフレーム数をそろえるのがまた面倒。
と言うわけで、今回はActionScriptを使って「間」を作る方法を考えてみたい。
基本的なことだが、forループでまわして、そこで経過時間をチェックするなんて感じのウエイトはできない。
フレームでずっとスクリプトが終了しないと警告を出すような仕組みがあるからだ。
だから、forループなどでFlashから処理を奪ったりせずに、同じフレームで一定時間停止するようにしなければいけない。
そのフレームに入ってきた時にフレームアクションが実行される。
これがくせ者で、そのフレームに、次のようなスクリプトを書いても、実行されるのは一回だけとなる。
しかも、実際は次のフレーム変更タイミングで、現在のフレーム(_currentframe)の次に移動するので、事実上、このスクリプトは無視される格好となる。
this.gotoAndPlay(_currentframe);
だから、同じフレームのフレームアクションを連続して実行したい場合。
一つ前のフレームに飛ばす必要がある。つまり次のようなスクリプトだ。
this.gotoAndPlay(_currentframe-1);
これで、同じフレームに書かれたスクリプトが連続して実行されるようになる。
注意すべきなのは、ループしている間表示されるのは、_currentframeの絵ではなく、_currentframe-1の絵であると言うこと。
これは、フレームアクションが、絵が表示される前に実行されるからだ。
このままでは、ずーっと同じフレームを表示するthis.stop()とほとんど同じになってしまうから、カウンタ変数を用意する。これはクラス変数であれば、そのムービークリップ上(_rootも含む)で値が保持されるのでカウンタとして都合がいい。
ついでに、サブルーチン化して、カウンタを引数として渡すようにする。
function waitFor(n) {
if (waitCounter <= 0 || waitCounter == undefined) {
waitCounter = n;
} else if (--waitCounter <= 0) {
// ↑プリデクリメントなのがミソ
return;
}
this.gotoAndPlay(_currentframe - 1);
}
説明するほどのスクリプトでもないが、一応説明する。
まず、waitCounterというクラス変数が、0以下か未定義である場合、変数に初期値が代入される。
カウンタを減らし、それが0以下にならば、サブルーチンを抜ける。
ここで、サブルーチンを抜けていないならば、一つ前のフレームに移動する。
プリデクリメント(判定前に減らす)がミソなのは、ポストデクリメント(判定後に減らす)だと、この判定には永久にかからず、O以下になるたびに初期値が代入されてしまうからだ。
ホントに説明するほどのもんでもない気がする…
まぁとにかく、このサブルーチンを1フレーム辺りに置いておく。
後は次の呼び出しスクリプトが書かれたフレームの1つ前の絵を表示して、引数で与えたフレーム数停止する。
waitFor(10);//この場合10フレーム
ものすごく標準の機能としてありそうで、車輪の再発明してるんじゃないかと、不安なんだけど…。
フレームレートは2で作ったサンプル。
数値は、待ちフレーム数、いろいろ値を入れて、試してみるべし。
ちなみに、0を入れたら、スクリプトを見れば分かる通り、永久に停止してしまう。
今日はここまで。
2003-09-15