|
クイックタイムは他にもいろいろあるのですが、凝りだすとキリがなくなるので、今回は部品としての説明ができる程度にしておきます。010.rev では、クイックタイムファイル再生のトータルの時間と、スタートしてからどれくらいの時間経過なのかを測定して、それをプログレスバーに表示します。クイックタイムでは、コントローラーがプログレスバーとほとんど同じ役割を果たしますが、コントロールを使用しない場合なども想定できますし、 Revolution で時間経過を見ながら他のことをさせる方法の説明でもあります。

ムービーは 009.rev と同じフラッシュファイルが、ふたつ再生されます。今回は同じムービーが自動でループするのでなく、ひとつが終わったらビジュアルエフェクトで、次の別なムービーがスタートします。ひとつのムービーが終わるのを知るには、まずトータルの時間と、現在どれくらいの時間が再生されているかを、知らなくてはいけませんから、トータルの時間を測定する duration で、
put the duration of player 1
ムービーapple.swf が再生されている時、またはストップしている時にメッセージボックスに上のスクリプトをタイプして、リターンをすると 4200 が返されます。まあだいたいの予測は付くかもしれませんが、いったいどんな単位でこんな数字が出てくるのか、はっきりした基準が欲しいところです。
put the timeScale of player 1
これで 600 が返されます。つまり 1秒間に 600 回の反復を基準として、プレイヤー は startTime、endTime、duration、currentTime を決めていますから、duration が 4200 でしたら600 で割った値が、トータルの秒数となります。答えは 7秒です。
こんな風に書くと、プロパティ timeScale は他の値にセットできそうですが、600 以外にはセットできません。
次に問題は、時間経過を測定する方法ですが、Revolution では send message to me in time という使い方をすることが多いです。具体的には、
global runningTimeID
on runningTime
send runningTime to me in 100 milliseconds
put the result into runningTimeID
put the currenttime of player 1 / 600 into fld "tCurrent"
必要な部分だけで、あとは省略しています。
ここでは経過時間をフィールドに表示するため、秒に換算しています。
end runningTime
中止させる時は
cancel runningTimeID
つまりこの場合でしたら、自分自身(ハンドラー runningTime)を100 ミリセコンドで反復させるという方法です。send message to me in time の直後に、 the result で反復のID を得る事ができますから、グローバルで取得しておいてハンドラーから抜ける条件になったら、その ID で反復をキャンセルさせることができます。これは中止させる ID の説明のために、参考までに言っているので、この 010.rev では the pendingMessages で ID を得る、もう一つ別な方法で send message in time をキャンセルさせて、ループから抜ける方法を採ります。後ほど ムービーストップで説明します。
他の XTalk で考えると、下のように idle を使うのが通常ですが、
on idle
put the currenttime of player 1 / 600 into fld "tCurrent"
end idle
他の作業を同時進行で行うような場合、 idle より負担が少ない send in time を、Revolution では使います。詳しくは、オンライン Transcript 辞書にある send またはidle を見てください。
上記の runningTime ハンドラーで、 100 ミリセコンド( 1秒の 10分の1)毎にプレイヤーの the currenTime を得る事ができるようになったので、それをプログレスバーに反映させる方法を見てみましょう。(ここで扱っているサンプルは非常に短いアニメーションですから、プログレスバーの動きが滑らかになるよう100 ミリセコンドとしていますが、必要に応じて 500 milliseconds や他の値にできます。数字が少なくなる方が反復回数が増えて細かな処理ができますが、負担も大きくなります)
on runningTime
send runningTime to me in 100 milliseconds
set the thumbPos of sb 1 to the currenttime of player 1
必要な部分だけで、あとは省略しています。
end runningTime
上記のスクリプトで10 分の1秒ごとに プレイヤーの the currentTime が取得されて、スクロールバーの Current Value (thumbPositon) にセットされます(ユーザーに見せるためではないので、秒数には換算していません)。 End Value はプレイヤーの the duration をあらかじめ取得してセットしておきます。Start Value はこの場合 0 です。(下図参照)

010.rev では、send message to me in time が繰り返される 100 ミリセコンドの誤差を見て、 End Value と Current Value が等しくなった時に、別なムービーをビジュアルエフェクトを伴ってスタートさせます。
後から書いた runningTime では、send message to me in time の後で ID を取得していません。と言うのは pendingMessages というファンクションで、send を使ったまだ実行されない一連のメッセージリストを得る事ができるので、そちらをムービーをストップさせる時に使っています。

メッセージボックスを開けると、ブラウンの封筒のアイコンがあります。実はこれをクリックすると Pending Messages が見れるようになっています。まず最初のアイテムが上記で言っているメッセージ ID (図では 608)、次が実行されるスケジュールのミリセコンド (the milliseconds) の表示、メッセージ名(ハンドラー runningTime)、メッセージが送られるオブジェクト(ボタン startMovie)のロングID の順で表示されます。
pendingMessages を使った、ボタン ストップムービーのスクリプト:
on mouseUp
repeat for each line tLine in the pendingMessages
if "runningTime" is among the items of the pendingMessages then
cancel (item 1 of the pendingMessages) -- runningTimeID
end if
end repeat
stop player 1
end mouseUp
the pendingMessages は、時々操作のタイミングによって複数行現れることもあるので、リピートで行数回キャンセルをしています。上で言った、the result で ID を取得して単独のID をキャンセルさせるよりも、トラブルがありません。
キャンセルが終わったらプレイヤーをストップします。
|