簡単 NScripterの使い方  2010/01/16更新
 ■開発室   ■ダウンロード   ■マニュアル   ■ご意見・ご要望・デバッグ   ■Q&A   ■リンク   ■関連企画 
 □目次  □準備編  □基礎編  □制作編  □グラフィック編  □音楽編

制作編/第5章

■ サブルーチン化 ■
 ゲーム内で頻繁に使用するコマンドや定例の処理、これらパターン化された処理を毎回記述するのは、面倒な上にバグの温床にもなります。

 例えば、ノベル形式とアドベンチャーゲーム形式を切り替えて進行するようなゲームの場合、setwindow 命令を多用し、表示を切り替えていく事になると思います。しかし、後からテキストウィンドウを修正しようと思った時、スクリプト内に埋め込まれた膨大な数のsetwindow 命令を全て修正しなくてはならない、という大変な作業が発生してしまいます。

 そこで、setwindow 命令のようにスクリプト内で頻繁に使用する命令は、サブルーチンという独立した別系統の処理にまとめておき、必要な時にメインスクリプトから呼び出して使用するという形にしておきます。汎用処理をサブルーチン化する事によって、スクリプトがすっきりと見やすい物になるばかりでなく、後から修正が必要になった時も、サブルーチン部分の記述のみを調整すれば良いので、メンテナンスの手間が大幅に軽減されます。


■ サブルーチンの作り方 ■
 まずは、あらかじめサブルーチンとして切り出す部分を決定しておきましょう。
 今回は、スクリプト内のsetwindow 命令をサブルーチンとして独立化させます。

 第1のサブルーチンは、制作編/第3章で取り扱った、タイトル画面の選択肢用setwindowをサブルーチン化します。
 第2のサブルーチンは、実際のゲーム画面で文章を表示するためのノベルタイプのテキストウィンドウ設定を、サブルーチン化します。

 それでは、サブルーチン部分を記述していきましょう。
 実行ブロックを開いてください。


game
*start

*title
lookbackoff
rmode 0

select
"はじめから",*game_start,
"つづきから",*load,
"終   了",*game_end

*game_start
rmode 1
lookbackon

*load
systemcall load
goto *title

*game_end
end

*call_title_window
;タイトル画面選択肢用サブルーチン
setwindow 328,410,5,4,24,24,6,8,0,1,1,#FFFFFF,300,380,500,540
!sd
return

*call_novel_window
;ノベルウィンドウ表示用サブルーチン
setwindow 40,56,30,12,24,24,0,16,15,1,1,#999999,0,0,799,599
!sd
return


 今回追加された赤字部分青字部分が、サブルーチン部分です。
 ラベルでサブルーチン名を設定し、以下に処理内容を記述します。
 サブルーチン末尾のreturnは、そこでサブルーチンを終了し、メインスクリプトに処理を戻すという意味の命令です。サブルーチンの末尾には、必ずこのreturn 命令が必要になります
 なお、制作編/第2章で取り扱ったように、setwindow 命令の直後には、必ず !sd 命令を置き、表示速度の設定を有効化しておいてください。


■ サブルーチンの呼び出し方 ■
 それでは、用意したサブルーチンをメインルーチンから、呼び出すための命令です。


game
*start

*title
lookbackoff
rmode 0

gosub *call_title_window

select
"はじめから",*game_start,
"つづきから",*load,
"終   了",*game_end

*game_start
rmode 1
lookbackon
gosub *call_novel_window

*load
systemcall load
goto *title

*game_end
end

*call_title_window
;タイトル画面選択肢用サブルーチン
setwindow 328,410,5,4,24,24,6,8,0,1,1,#FFFFFF,300,380,500,540
!sd
return

*call_novel_window
;ノベルウィンドウ表示用サブルーチン
setwindow 40,56,30,12,24,24,0,16,15,1,1,#999999,0,0,799,599
!sd
return


 サブルーチンの呼び出しには、「gosub 命令」を使用します。
 gosub 命令に続いて、呼び出しを行うサブルーチンのラベル名を指定してください。
 スクリプトは、このgosub 命令の部分で指定されたサブルーチンへとジャンプし、処理を終えると return 命令で gosub 命令の次の行へと帰って来ます。

 ゲーム内で頻繁に発生する定型処理をサブルーチン化して管理しておく事によって、スクリプトの記述性が大幅に向上します。積極的に利用してみてください。


■ gosub 命令使用時の注意点 ■
 gosub 命令を使うと、サブルーチンの中からさらにサブルーチンを呼び出す事も可能です。
 ただし、gosub 命令とreturn 命令は、必ず1対1で対応していなくてはなりません。

 内部的な話になりますが、gosub命令を1回使用する毎に、CPU内部でスタックと呼ばれる領域が1つ消費されます。このスタック領域には上限があり、また使用したスタックは、最後には必ず返却しなくてはなりません。gosub 命令の場合、スタックの返却に相当するのが return 命令です。

 スタックを大量に消費したままスクリプトを続行すると、NScripterにエラーが発生しゲームの続行が不可能になります。特に、全体がループするようなスクリプトを組んでいる場合は、注意してください。return を行わずにサブルーチンが呼ばれ続けると、スタックエラーが発生する要因となります。

 gosub 命令を使う時は、必ず return 命令を1対1で対応させる。
 これはスクリプトを組む上での鉄則として覚えておいてください。


■ reset 命令 ■
 これまでNScripter本体を終了させる命令として「end 命令」を使用してきました。
 しかし、エンディング画面の後など、必ずしもゲームその物を終了してしまう必要のないケースも多々存在するかと思います。そういった時、ゲームを一旦リセットし、もう1度スクリプトを冒頭の *start ラベルから再実行させるのが、「reset 命令」です。

 使用方法は簡単で、下記のようにゲームをリセットしたい部分に命令を置くだけです。


reset


 このreset 命令を実行すると、変数の内容が全てクリアされ 0 に戻り、スクリプトは、実行ブロック先頭の *start ラベルから再度実行されていきます。
 また、サブルーチン内であっても、スタックの内容も強制的にクリアされるので、return命令などの対応を意識する必要もありません。

 文字通り、NScripterの実行をリセットするための命令です。


制作編/第4章に戻ります 制作編/第6章に進みます(制作中)