■時間制限
「btnwait」と「btnwait2」命令では、「どれかのボタンをクリックする」「どのボタンでもないところをクリックする」「右クリックをする」という三つのどれかをやらない限り、スクリプトは次に進むことはありません。
しかし、
「btntime」命令を使うことにより、それら三つ以外にも「一定の時間を過ぎたら次へ進む」という動作を増やすことができます。
これにより、プレイヤーに選択肢を選ばせる際に時間制限を強いることができますし、少し特殊ですが「ボタン待ちの時に並列処理を行う」ということもできるようになります。
なお、btntime命令は「ボタン」「スプライトボタン」「複合ボタン」のどのボタン定義の方法でも利用することができます。
■スクリプト
では、スクリプトを見てみましょう。
lsp 0,":a/2,0,3;spbotan_01.jpg",255,155
lsp 1,":a/2,0,3;spbotan_02.jpg",255,215
lsp 2,":a/2,0,3;spbotan_03.jpg",255,275
print 1
spbtn 0,1
spbtn 1,2
spbtn 2,3
mov %1,3000
*loop
btntime %1
btnwait %0
getbtntimer %2
sub %1,%2
if %0 == 0 goto *loop
if %0 == -1 goto *loop
if %0 == 1 bg #FF8833,1
if %0 == 2 bg #33FF88,1
if %0 == 3 bg #8833FF,1
if %0 == -2 btndef "":lsp 3,":s#FFFFFF時間切れです",242,350:print 1
|
このスクリプトは、前々回の「スプライトボタン」のスクリプトを時間制限付きにしたものです。三つのボタンがあり、ボタンを押すと背景の色が変わります。
ボタンを押さなかった場合は、三秒経過すると画面下部に「時間切れです」という文字列スプライトが表示されます。
■制限時間の設定
制限時間の設定は、「btntime」命令で行います。
btntimeに続けて、ミリ秒で制限時間を指定します。
btntimeを書いてから次に通った「btnwait」「btnwait2」に、その時間が適用されることになります。
このスクリプトでは、「btnwait」のすぐ前にbtntimeを書いています。
そして、制限時間を数字変数1番を用いて指定しています。数字変数1番への代入は「*loop」ラベルの前で行っています(mov %1,3000)。
このようにわざわざ変数で指定するには理由があります。
まず、このスクリプトは「どのボタンでもないところをクリックした時」と「右クリックをした時」には先に進ませることはありません。
それらの場合は「*loop」ラベルに戻ってもう一度「btnwait」を通っています。
もう一度btnwaitを通るということは、もう前回の「btntime」の制限時間の設定は破棄されたことになりますので、時間制限の無いボタン待ちになってしまいます。
なので、「*loop」ラベルと「btnwait」の間でbtntime命令を書いています。
しかし、それだけでは「どのボタンでもないところをクリックした時」と「右クリックをした時」には制限時間が最初からに戻ってしまって、いつまでたっても時間切れにはなりません。
そこで、
「getbtntimer」という命令をうまく使います。
この命令は、
「ボタン待ちが始まってから経過した時間」を指定した変数に代入してくれるという命令です。
この命令をbtnwaitの次に書いておけば、「どのボタンでもないところをクリックした時」と「右クリックした時」に何ミリ秒経過していたかわかるわけです。
そして、こうして得られた経過時間を制限時間に設定した時間から引きます。
(sub %1,%2)
正確に言えば、「前回のボタン待ちの制限時間」から引いています。
そうすると、何度「*loop」ラベルに戻って制限時間の設定をやり直したとしても、経過した時間をその都度引きながら制限時間の設定をやり直しているので、結局最初に設定した「3000ミリ秒」という時間を過ぎたら時間切れになるのです。
時間切れになった場合は、ボタン待ちの変数には「-2」が代入されます。
※usewheel命令を使用している時は、「-5」が代入されます
■メモリ上の画像とボタン定義
時間切れでスクリプトが次に進んだ場合は、ボタン用の画像とボタン定義は消去されることはありません。
なので、(次に利用する必要が無いのならば)時間切れになった場合の処理には「btndef ""」を書きます。