システムカスタマイズについてダラダラやるよーその3

システムカスタマイズについてダラダラやるよーその2 - 永字八法の続き。
NScripterのシステムカスタマイズについて、1から話をしてみようと思う。その第3回目。

入力による処理の分岐

bexec命令はプレイヤーからの入力待ちをするが、入力があればとにかく次に処理を回してしまう。
なので、どんな入力があるかを調べる必要があり、正しくない入力であればまたbexecに処理を戻す必要がある。
そこで*text_lbの構造を三つに分ける。

  1. 画面を作る。
  2. 入力待ちをする。
  3. 入力内容を判別、分岐。正しくない入力の時は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

うん、これでなんとかなった。
注意すべき点は、進ませる機能を持つキーを増やした場合、それに対応するループも増やさないと行けないことだ。
と、ここで天の声が聞こえてきた。
「既読ストップ問題に対処せよ」
次回はこれを扱うことにします。