システムカスタマイズについてダラダラやるよーその3
システムカスタマイズについてダラダラやるよーその2 - 永字八法の続き。
NScripterのシステムカスタマイズについて、1から話をしてみようと思う。その第3回目。
入力による処理の分岐
bexec命令はプレイヤーからの入力待ちをするが、入力があればとにかく次に処理を回してしまう。
なので、どんな入力があるかを調べる必要があり、正しくない入力であればまたbexecに処理を戻す必要がある。
そこで*text_lbの構造を三つに分ける。
- 画面を作る。
- 入力待ちをする。
- 入力内容を判別、分岐。正しくない入力の時は2に戻す。
そこで、*text_lbの部分だけを取り出すとこうなる。
*text_lb *text_lb_init_loop bclear *text_lb_loop bexec $bexec,%bexec ; マウスの左クリックかホイールダウン、キーボードのスペースキーかエンターキーかコントロールキーで次へ。 if $bexec="LCLICK" goto *text_lb_end if $bexec="WHEELDOWN" goto *text_lb_end if $bexec="SPACE" goto *text_lb_end if $bexec="RETURN" goto *text_lb_end if $bexec="CTRL" goto *text_lb_end ; それ以外の入力であれば、ループする goto *text_lb_loop ; クリック待ちの終了処理。 *text_lb_end texec return
これで、実行してみると、おお、確かに決めたキーでしか進まなくなっている。
ただ、これだと該当のキーを押しっぱなしでも進んでしまうことが判明。
うーん、それじゃあ、bclearに入る前に、進めるキーが押されていないことを確認してから進むとしようか。
そこで、それを修正した版。
*text_lb ; 進む機能を持つキーが押されていないことをチェックする。 *text_lb_keydown_check checkkey %bexec,"LCLICK" :if %bexec=1 goto *text_lb_keydown_check checkkey %bexec,"WHEELDOWN":if %bexec=1 goto *text_lb_keydown_check checkkey %bexec,"SPACE" :if %bexec=1 goto *text_lb_keydown_check checkkey %bexec,"RETURN" :if %bexec=1 goto *text_lb_keydown_check ; CTRLは除く。CTRL押しっぱなしで進むのは、最近のエンジンではよくある仕様だから。 *text_lb_init_loop bclear *text_lb_loop bexec $bexec,%bexec ; マウスの左クリックかホイールダウン、キーボードのスペースキーかエンターキーかコントロールキーで次へ。 if $bexec=="LCLICK" goto *text_lb_end if $bexec=="WHEELDOWN" goto *text_lb_end if $bexec=="SPACE" goto *text_lb_end if $bexec=="RETURN" goto *text_lb_end if $bexec=="CTRL" goto *text_lb_end ; それ以外の入力であれば、ループする goto *text_lb_loop ; クリック待ちの終了処理。 *text_lb_end texec return
うん、これでなんとかなった。
注意すべき点は、進ませる機能を持つキーを増やした場合、それに対応するループも増やさないと行けないことだ。
と、ここで天の声が聞こえてきた。
「既読ストップ問題に対処せよ」
次回はこれを扱うことにします。