■変数とは
変数は、よく「入れ物」という表現をされます。
これは、変数が
数字や
文字を入れておいて、いつでも取り出せるということを表しています。
例えば、恋愛要素のあるゲームでは「好感度」という形でよく使われたりします。
キャラクターに対して良い態度をとる(正解の選択肢選ぶ)と、そのキャラクターの好感度の変数の中に入っている数値が増加します。
そして、グッドエンドかバッドエンドになるかという分かれ目の所で、そのキャラクターの好感度の変数の中に入っている数値が一定以上だったらグッドエンド、以下だったらバッドエンドに分岐する、というような感じです。
また、変数を使うことでキャラクターを育成するというゲームも作れます。
この場合は、「力」「素早さ」などのパラメーターを変数にします。
さらに、変数の中に文字を入れておくことで、例えばプレイヤーに主人公の名前を決めさせる、といったこともできるようになります。
■変数の仕様
変数には、上でも説明した通り、数字や文字を入れておくことが出来ます。
数字と文字は別のものなので、数字と文字で別々に変数が用意されています。
それが、
数字変数と
文字変数と呼ばれるものです。
数字変数の中には数字(整数)のみを入れておくことができ、文字変数の中には文字のみをいれておくことができます。
数字を文字として文字変数の中に入れることは可能ですが、文字を数字変数の中に入れることはできません。
数字変数と文字変数は共に、1000個づつ用意されています。
マニュアルには
「数字変数%0〜%999」「文字変数$0〜$999」という形で書かれていますが、「%0」や「$0」というように数字の前に「半角のパーセント」や「半角のドルマーク」を付けたものが変数の書き方です。
「%0」が、数字変数の0番ということです。
数字変数には、マイナスの値を入れることもできます。
また、数字変数の中身には±2147483647まで入ります。
■グローバル変数
変数には、「普通変数」と
「グローバル変数」というものがあります。
簡単に言えば、普通変数はセーブごとに違っているもの、グローバル変数はセーブに関係なく共通なものです。
また恋愛要素のあるゲームを引き合いに出しますが、好感度などは普通変数であるといえます。好感度はセーブごとに違っています。
しかし、どのセーブでも共通でその値が保持されていることが必要な、クリアフラグなどはグローバル変数にしなくてはいけません。セーブ毎に違っていたら、ややこしいことになりますからね。
これは例えば、キャラクターを全員クリアしたらおまけシナリオを出現させる、といったことをさせるために使うことができます。
全員で5人キャラクターいたとして、キャラクターAをクリアしたら「%200」に1を代入、キャラクターBをクリアしたら「%201」に1を代入、…というようにして、%200から%204まで全部1が入っていたら話の冒頭でおまけシナリオへ行く分岐を出現させる、といった感じでしょうか。
この場合、「どのセーブでキャラクターをクリアしても良い」というのがミソです。
グローバル変数は、数字変数なら%200以降、文字変数なら$200以降として用意されています。(199番までが普通変数です。)
ですが、最初からグローバル変数が使えるわけではありません。
「globalon」命令(マニュアル 各種設定系 F)を定義ブロックで記述しなければ、グローバル変数を使っていることにならないからです。グローバル変数を使いたい時は「globalon」を必ず忘れないようにしてください。
■グローバル変数の注意
globalonを使っていない場合の%200〜%999と$200〜$999はどういう存在なのでしょうか。これは、普通変数として使うことが
できません。
試してみればわかりますが、globalonを定義ブロックで記述しないで、%200などのグローバル変数に数値を代入して、セーブをしたとします。そして一旦NScripterを終了してからまた起動して、先ほどのセーブをロードします。
すると、さっきの数値の代入はなかったことになり、中には0が入っています。
普通変数ならば、さっき代入した数値が入っているはずですよね。これは、%200〜%999と$200〜$999の変数がglobalonを使うことを前提としているからです。
違う面から説明してみましょう。
%200に「1」を代入して、セーブします。セーブした
後に%200を1増やして、%200の中身を「2」にします。そして今度はNScripterを終了せずにロードしてみましょう。
もし普通変数ならば、セーブした時点では%200の中身は「1」だったので、ロード直後は%200の中身は「1」でなければいけないはずです。しかし、%200の中身は「2」になっています。
これは、グローバル変数は、NScripter実行中を通してセーブしようがロードしようが値はずっと共通ということのあらわれです。しかし、globalonが記述されていないと、NScripterを終了した時点で値が消されてしまい、0に戻ってしまいます。
ということで、globalonを使わないでグローバル変数を使ってはいけません。
上記の説明が難しいと感じた方は、そのことさえ覚えていれば十分です。
(※以前、ここの解説では「globalonしなければ普通変数として使える」と書いていたのですが、完全に誤りです。大変失礼致しました)
■代入と表示
では、実際に変数に値を代入してみましょう。
「mov」命令(マニュアル 実行制御系 FE)は、変数に値を代入する時に使う命令です。文字変数に代入する場合は、必ず「""」でくくってください。
変数にすでに値が入っていた場合その値は破棄され、新しく指定した値が代入されます。前の値に足していく場合は使うことはできません。
数字変数は最初は「0」が入っていて、文字変数には「""」というように何も文字が入っていない状態です。
変数の中身を実際にテキストとして表示したい場合は、テキストにそのまま「%0」や「$0」を書きます。
数字変数の中に入っている数字は半角の数字ですが、NScripterのテキストには半角文字は使えないので全角の数字で表示されます。
mov %0,-25
数字変数0番の中身は、%0です。@
|
数字変数0番の中身は、−25です。
■足し算
変数に数字や文字を足すことができます。
文字変数の場合はその文字の後ろに連結します。
足し算を行うには
「add」命令(マニュアル 実行制御系 FE)を使用します。
mov %0,25
mov $0,"こんにちは"
add %0,12
add $0,"はじめまして"
25+12=%0@
「$0」@
|
25+12=37
「こんにちははじめまして」
■引き算・掛け算・割り算
足し算と違い、引き算・掛け算・割り算では数字変数のみ使うことが出来ます。
引き算には
「sub」命令(マニュアル 実行制御系 FE)、
掛け算には
「mul」命令(マニュアル 実行制御系 FE)、
割り算には
「div」命令(マニュアル 実行制御系 FE)、
をそれぞれ使用します。
割り算では、答えは小数点以下が切捨てされて必ず整数で出ます。
余りも出ません。
また、0で割るということはできません。
必ずエラーになります。
mov %0,25
sub %0,15
mul %0,2
div %0,5
(25−15)×2÷5=%0@
mov %0,25
sub %0,15
mul %0,2
div %0,8
(25−15)×2÷8=%0@
↑本当は2.5(2あまり4)ですね。@
|
(25−15)×2÷5=4
(25−15)×2÷8=2
↑本当は2.5(2あまり4)ですね。
■余りを求める
割り算をして出た答えの余りを求めることができます。
「mod」命令(マニュアル 実行制御系 FE)を使用します。
mov %0,25
mov %1,25
sub %0,15
sub %1,15
mul %0,2
mul %1,2
div %0,8
mod %1,8
(25−15)×2÷8=%0あまり%1@
|
(25−15)×2÷8=2あまり4
■1だけ増加・1だけ減少
数字変数を1増やす・1減らすことができます。
「inc」命令(マニュアル 実行制御系 FE)で1だけ増える
「dec」命令(マニュアル 実行制御系 FE)で1だけ減る
となります。
もちろん、addやsubを使えば同じことはできるので、特に覚えていなくても大丈夫でしょう。
inc %0
inc %0
dec %0
数字変数0番は%0です。@
|
数字変数0番は1です。
■変数同士の計算
実は、変数同士でも計算を行うことができます。
mov %0,25
mov %1,15
mov %2,2
mov %3,8
sub %0,%1
mul %0,%2
mov %4,%0
div %0,%3
mod %4,%3
(25−15)×2÷8=%0あまり%4@
|
(25−15)×2÷8=2あまり4
上のスクリプトは「余りを求める」の時と全く同じ内容ですが、全て変数を用いて計算を行っています。
このように、マニュアルで「数字」や「文字」と示されている所は、ほとんど変数を指定することができます。
例えば、
「lsp」命令(マニュアル 表示・演奏系 E) でスプライトを表示する際は、スプライト番号や画像ファイル指定、表示位置の指定など全てを変数で指定することが可能です。
mov %0,8
mov %1,100
mov %2,50
mov $0,":l;supuraito.bmp"
lsp %0,$0,%1,%2
print 10
|
わざわざこんな書き方をしなくてもよいと思うかもしれませんが、このように変数を用いるのには利点があります。
上の例で言うと、「スプライトを表示する位置を変えたいな」と思った時、スクリプトの中に同じような命令がたくさん書かれていた場合、全ての命令を書きかえるのは非常に面倒な作業です。
どこか(*start直後など)で「mov」を使って「このスプライトの表示位置」というのを書いておけば、変更を行いたい時にそこを書きかえるだけで済みます。
(だからと言って全てを変数で書く必要はありません。適度にやりましょう)
その他にも、複雑な命令の使い方をするならば数字や文字に変数を使うということは欠かせません。
変数も指定できるということを覚えておいてください。