■サブルーチンとは
サブルーチンをするには
「gosub」という命令を使いますが、これは「goto」命令と同じく指定したラベルに飛ばす命令です。
しかし、「gosub」でラベルに飛ばした場合は、
「return」命令を使うことでその「gosub」を書いたところまで再び戻ってくることができます。
この、「飛ばし元のところに戻ってこれる」というのが重要で、こうすることによりラベルと「return」に囲まれた部分をを一つの処理の塊と見なすことができるようになります。
そして例えば、「スプライト○番と○番を非表示にして、○番を表示して、変数に数値を代入して、背景を変えて……」という処理が何度もスクリプト中で出てきた場合、それをまとめて書いておいて必要になったらgosubで呼び出すことにより、スクリプトを書くのを楽にすることができます。
■スクリプト
では、実際にスクリプトを見てみましょう。
gosub *set_kaiwa
gosub *set_botan_01
print 1
btnwait %0
......
*set_kaiwa
vsp 5,0
vsp 6,0
vsp 7,1
return
*set_botan_01
btndef "botan.jpg"
btn 1,10,10,50,50,0,0
btn 2,10,70,50,50,50,0
btn 3,10,130,50,50,100,0
return
|
「......」の部分は、単に続きを省略しているだけで、意味はありません。
このスクリプトは、まず「*set_kaiwa」ラベルに飛び、「vsp」命令の処理が終わったら再び上まで戻ってきて、そして次に「*set_botan_01」のラベルに飛ばし、ボタン定義を行い、また戻って来ています。
このように、何度もありそうな処理をまとめておくことができます。
■サブルーチンの注意点
gosubでサブルーチンを行った場合、必ずreturnで戻してください。
gosubで飛ばしたところからそのまま始めたり、gotoで違うところに飛んで始めたりすると、「スタック」と呼ばれるものを消費していってしまいます。gosubで飛ばされると、NScripterは飛ばしたことを覚えていなければならないからです。
スタックは有限ですので、使い終わった画像を消去するように、スタックも戻してあげましょう。returnで元の場所に戻ることがスタックを戻すことになります。
そして何より、そういう書き方をしているとスクリプトが読みにくくなってしまって、結局書くのが楽ではなくなってしまいます。
これは特に重要なことなので、肝に銘じておいてください。
■サブルーチンからさらにサブルーチン
サブルーチンで飛んだラベルから、さらにサブルーチンで別のラベルに飛ぶことができます。
上でも言っているようにサブルーチンから別のところに飛ばしたり始めたりすることはいけないことですが、サブルーチンの場合は別です。
なぜなら、returnは一つ前の飛ばし元に戻ってくれるため、二回飛んだら二回returnで戻れば元のところにもどってこれるからです。
このようにサブルーチンしていくことをプログラミングでは「ネスト化する」などと言ったりします。
きちんとgosubとreturnを一対一に対応させていれば、複数回ネスト化しても元に戻ってこれるはずなので問題ありません。ただし、やはり「スタック」は有限なのでネスト化する回数には限界があります。
マニュアルには明記されていませんが、1000回ぐらいネスト化できるようです。
(そんなにたくさんやることは恐らく無いと思いますが)
ネスト化のスクリプトを見てみましょう。
gosub *set_boutou
......
*set_boutou
gosub *set_kaiwa
gosub *set_window
return
*set_kaiwa
vsp 5,0
vsp 6,0
vsp 7,1
return
*set_window
setwindow 8,16,23,16,26,26,0,2,20,1,1,#999999,0,0,639,479
return
|
スクリプトの流れを追って行けば、必ず元の場所に戻れるはずです。
このスクリプトでは、「*set_kaiwa」と「*set_window」の二つの処理は独立しているため、単体で他のところから呼び出して利用することができます。