このページはCOOL ONLINE終了に伴いO-Show様の許可を得て作成したBinary Heavenのミラーサイトです
[TOP] [Profile] [NScripter] [BBS] [Links]
中級編 No.9
ループ
■概要■
何度も同じことを繰り返し処理する場合に便利な、「for〜nextループ」というものがあります。


使用命令:

「for」(更新1011.txt)
「next」(更新1011.txt)
「break」(更新1011.txt)

「msp」(マニュアル 表示・演奏系 E)
■繰り返し処理

同じ処理を繰り返したい場合、その回数分だけ処理内容を書いていたら非常に無駄です。

そこで、「for〜nextループ」を使えば楽に書くことができます。


「繰り返し処理をする場面なんてあるだろうか?」とお思いになるかも知れませんが、プログラミング的なことには必要になる場合がありますし、何よりも演出の面で重要な意味を持ちます。

まず、エフェクトを思い浮かべてみてください。

例えば効果の11番、これは「左からスクロール」なんて書いてありますね。

NScripterで画像を左からスクロールさせたい場合はeffect命令で効果の11番を割り当てればいいわけです。


しかしです。

例えば「斜めに移動させたい」と思った場合はどうなるでしょうか?

効果一覧には用意されていませんから、エフェクトとして使うことはできません。


ここで考えてみてください。画像の移動とはどういうことなのかを。

スプライトの移動には「msp」(マニュアル 表示・演奏系 E)や「amsp」(NScr暫定命令表.txt)を使いますが、これは一度しか移動させることはできません。

命令を実行すると、元の位置から移動先の位置への移動が一回の画面書き換えで行われ、エフェクトのようにだんだんと移動してくれるわけではありません。

エフェクトのように連続した移動を実現させるためには?


そうです、ここで繰り返し処理が必要になります。

「上に1ドット、右に1ドット」というように「msp」命令で指定し「print 1」を実行、これを何度も繰り返せばいいわけです。

例えば30回繰り返せば、「上に30、右に30」行ったところにスプライトが移動してくれます。これは連続して見えるので、エフェクトと同じようになります。


繰り返しの意義を理解していただけたでしょうか。

この他にも、変化の度合いを数値で指定できるものを連続して処理をさせると、ただ命令を使うのとは違った効果を狙うことができます。



■スプライト移動スクリプト

では実際に、「msp」命令と「for〜nextループ」を使ったスプライトの移動をやってみましょう。

まず、スクリプトを見てください。



*define

	game

*start

	lsp 0,":a/2,0,3;spbotan_01.jpg",200,300

	print 1


	click


	for %0=1 to 100

		msp 0,1,-1,-3
		print 1

	next


	click
	end


このスクリプトは、画面をクリックすると表示されていたスプライトが右斜め上に移動しつつ消えるというスクリプトです。


では、順番に見ていきます。

まず最初の「lsp」命令では、「spbotan_01.jpg」という画像を読みこんでいます。

この画像は「中級編 No.4 スプライトボタン」で使われていたものです。

これを使うことに特に意味はありません。画像を用意するのが面倒な方はダウンロード(画像を保存)して使えば楽だと思っただけです。

ちなみに、画像タグでアニメ指定をしているのはセルが2つあるためです。実際にはアニメーションしません。


次の「click」命令(マニュアル 実行制御系 E)は、クリックするまで次に進ませないという命令です。

「@」でも可能ですが、テキストウィンドウやアイコンが表示されてしまうので、何もないならばこちらにした方が良いです。

今後も解説ではよく使うと思うので覚えておいてください。


次の「for」命令からが、繰り返し処理の始まりです。

「for」の次に「%0=1 to 100」と続いていますね。これは、1から100までの100回繰り返し処理を行うことを指定しています。

「%0」のように、数字変数が一つ必要になります。これは、繰り返し処理の回数をカウントするために用意する変数です。

そして、「%0=1」とやっているのは、%0に1を代入しているのと同じ意味になります。1から数えはじめたいのなら、ここには1を代入するのです。

さらに、「to」に続き、何まで数えるか指定します。ここでは100ですね。

このカウント用の変数は、繰り返し処理を一回実行する度に「1」増えます。そして、「to」の後に指定した数字まで達したら繰り返し処理は終了します。

つまり、この繰り返し処理は100回実行されることになります。

何回実行するかを変えるには、それらの数字を調整すればいいわけです。


次の「msp」と「print」が、繰り返し実行される処理内容です。

その下にある「next」は、まだ繰り返す回数が終わってないのなら「for」のところまで戻る、ということを示す命令です。文字通り「次」に行くのです。

つまり、「for」と「next」に囲まれた部分が、繰り返し処理されます。「for〜nextループ」と言われるのはここから来ています。



「msp」で指定している数字を簡単に説明します。

最初の数字はスプライト番号です。0番を指定しています。

次がX、その次がYの移動させる数値です。

Xは「1」、つまり右に1ドットです。Yは「-1」、これは上に1ドットを意味します。

Xは「-1」ならば左に1ドット、とそれぞれ逆方向になるのはわかりますね。


最後の数字は透過度に加算する値です。

実は、NScripterのスプライトや立ち絵には「透過度」と呼ばれる、どのくらい透明かを表す数字が用意されているのです。

この透過度は「0〜255」の範囲があり、0では完全に透明になって全く見えなくなります。

これはスプライトの場合は「lsp」「lsph」で読みこむときにも指定できますが、省略してもかまわないので今までは省略してきました。省略すると255になります。

立ち絵の透過度を変更する命令には「tal」命令(マニュアル 表示・演奏系 E)がありますが、スプライトには無いので「msp」でやることになります。


加算されると、その分透明ではなくなります。透明にするにはマイナスの値を指定します。ここでは「-3」を指定しています。




繰り返しの流れがわかっていただけたでしょうか。実際に上のスクリプトを実行すると、クリックすればスプライトが右斜め上にスーッと移動しながら見えなくなるはずです。



■カウントの増分

今回のような使い方ならばあまり必要はありませんが、繰り返し処理のその他の要素についても見てみましょう。

まず、カウントする数字の増え方を変える「step」というものがあります。

普通は一度繰り返し処理をする度にカウント用の変数は「1」増えますが、「step」で指定するとその値の分だけ増えることになります。



	for %0=1 to 100 step 2

		msp 0,1,-1,-3
		print 1

	next


「step」は「to」で指定した数字の後につけます。普段は省略可能です。

この場合は、カウント用の変数は2づつ増えることになり、50回しか繰り返し処理がされません。



■繰り返しを抜け出す

繰り返し処理中に、その繰り返しを止めて次(「next」の下)に行きたい場合は、「break」命令を使います。



	for %0=1 to 100

		msp 0,1,-1,-3
		print 1

		if %0 == 25 break

	next


ここでは、繰り返し処理をする度に「if」命令で%0と数字を比べ、25になったら繰り返しを終わるという流れになっています。

実際には、このようなやり方は意味がないので、比べる先の数字も変数にするなどのやり方が考えられます。

また「break」は飛び先のラベルも指定できます。


どちらにしろ、今回説明した「スプライトの移動」程度では必要のない流れです。



■スタック

「for〜nextループ」では、サブルーチンと同じく「スタック」を消費しています。

繰り返し処理を終え、nextの下に進むと、スタックが戻ることになります。

つまり、繰り返し中に「goto」などで他の所へ移動してから始めるのは、スタックが消費され、また読みづらいスクリプトになるので推奨されません。

「break」で抜けるのはかまいません。また、繰り返し処理中に「gosub」でサブルーチンをしても、キチンと戻ってこられるならば大丈夫です。

また、「繰り返し処理中に繰り返し処理を行う」「サブルーチン先で繰り返し処理を行う」といったことも可能です。


ただ、現在では次のようなことをするとエラーが起きてしまいます。



	gosub *kurikaesi

	......


*kurikaesi

	for %0=1 to 100

		msp 0,1,-1,-3
		print 1

		if %0 == 25 return

	next

return


このスクリプトでは、サブルーチンで繰り返し処理を行う場合です。

カウントが25に達したら「return」でサブルーチンを終えようと思ったのですが、これではエラーになります。

「return」も「break」もスタックを戻して本来の位置に戻る命令ですが、「return」をしようと思った時、スタックは繰り返し処理のために使われていたので、NScripterが間違えてエラーになってしまうのです。

「break」→「return」の順番にすればエラーは起きません。上のスクリプトならば簡単に修正できますが、もっと複雑なやり方をしていると少し面倒なことになるかもしれません。

ちなみに、この問題は今後のバージョンアップで解決される可能性があります。
■総括■
繰り返しがもたらす演出は重要なテクニックです。

「bar」命令と組み合わせると非常におもしろいことができたりします。
またいつかの機会に説明したいと思います。


次へ   前へ   NScripterのIndexへ