〜六章〜 「変数の使い道」


7月20日追加分

さて、今回は変数の一般的な使い方から、ちょっと応用編まで解説しようと思います。

まず「変数って何ぞや?」という人。
変数とは「中身を自由に入れ替えられる箱」みたいな感じです。

例えば「45」という名の箱に「3」という数を入れる。
別の時に同じ箱に「20」という箱を入れる。
またはその箱にユーザーの好きな数を入れてもらう。

みたいなことができちゃいます。
ちなみに、NScripterでは0番から999番まで、合計1000個の変数が使えます。
nscr.exe Ver 2.33現在、数字変数は0〜710505番、文字変数は0〜353873番まで使用可能のようです。
では、実際に使い方をみてみましょう。

まず始めに、変数の種類についてです。
変数には「通常変数」と「グローバル変数」という概念があります。

「通常変数」は、プレイヤーがセーブを行ったときにセーブファイルに保存されます。
そして、「end」や「reset」命令を使ったときにその値は内部的にクリアされ、
プレイヤーがそのセーブファイルをロードしたときに再び変数値は復活します。
よく、キャラクタの好感度に使用される変数ですね。
これには変数番号0〜199番が割り当てられています。

それに対して「グローバル変数」は、一度値を代入されたらその値を「global.sav」というファイルに保存し、
「end」や「reset」命令を使っても、パソコンを再起動してもクリアされずにその値を保持します。
これはクリアフラグなどによく使われます。
グローバル変数は変数番号200〜999が割り当てられていますが、注意があります。
グローバル変数を使用する時には定義ブロックで「globalon」という命令を実行しておく必要があります。
これをやらないと、200〜999でも通常変数として扱われます。

NScripterでは「数字変数」と「文字変数」と「配列変数」という3種類の変数があります。
が、「配列変数」は扱いが難しいため、今回は見送りとさせていただきます。

そのまんまですが、「数字変数」には数字を入れることができます。
好感度などのパラメータを代入するのはこっちですね。
「数字変数」は変数番号の頭に「%」を付けます。
つまり、「%198」は数字の通常変数、「%777」は数字のグローバル変数といった具合です。

そして、「文字変数」には2byte文字を含む文字列を入れることができます。
主人公の名前などを入力してもらい、代入するのはこっちです。
「文字変数」の頭記号は「$」です。

では恒例の「習うより慣れろ」コーナー、いってみようか!


*define

globalon
;グローバル変数の使用を宣言

game
*start

;%100と%200の中身を表示
数字変数%100の値は%100です。
数字変数%200の値は%200です。@

mov %100,20
mov %200,55
br

mov %100,20
mov %200,55
で、%100と%200にそれぞれ20と55を代入しました。@
br

;再び表示
数字変数%100の値は%100です。
数字変数%200の値は%200です。\

「end」や「reset」を行うと通常変数(今回は%100)の中身はクリアされますが、グローバル変数(%200)の中身はクリアされません。@
br
一旦終了しますので、NScripterを再起動してください。
そして再起動後の変数の値に注目してください。@

end


上図で見るとわかると思いますが、文中に%xxxや$xxxなどの変数があると、その変数の中身を表示することができます。

なお、「nscr.exe」と同じディレクトリにできている「global.sav」というファイルを削除すれば、グローバル変数を丸ごと初期化できます。

変数の値をいじる命令として「add」「sub」「mul」「div」「inc」「dec」などがあります。マニュアルを参照してください。
これらは計算命令なので基本的に数字変数用ですが、「add」だけは文字変数にも使えます。(文字列を連結する)


では、次にユーザーに値を入力してもらい、それを変数に代入する、「inputstr」命令を紹介します。
書式は以下のようになります。

inputstr $xxx,"{説明文}",{最大文字数},{0(制限なし) or 1(2byte文字のみ)}


正確にはもういくつか数値を記述するんですが、省略してもかまわない部分なので省略します。
くわしく知りたい方はマニュアルを参照してください。

説明文の部分にはダイアログボックスに表示される文を記述してください。例えば"あなたの名前を入力してください"など。
最大文字数は入力できる文字数の上限を指定します。注意すべきなのは2byte文字は1つで2文字分として扱われる事です。
3文字以内で名前を入力してもらいたい時などは「3」ではなく「6」と記述してください。
最後の0か1かというのは、「0」を指定すると1byte文字が入っても良し、「1」を指定すると1byte文字が入ってはいけないという制限がかかります。


さて、最後に応用編行ってみましょう!
前に述べたように文字変数には2byte文字だけでなく1byte文字も入れることができます。
実は文字変数は今まで書式例などで出てきた"{文字列}"の部分の代用にもできるのです。
同じ用に数字変数は、{エフェクトにかける時間}など、数関連の部分の代用にできます。
つまり上のinputstr命令などは、

inputstr $1,$100,%20,0

などど記述することもできます。($100と%20に文字列と数値が入っている必要あり)
まあ、実際「inputstr」命令で使うことはまず無いと思いますが。(笑)

どの部分にこの技が使えるかは、実際にいろいろ試してみるといいと思います。
結構意外なところに使えたりして、それが新たな使い道につながるかもしれません。



7月20日追加分

追加として変数による条件分岐について書きます。

例えば、ある変数に入っている数字や文字列によって次に行う処理を変えたいとします。
そんな時を条件分岐といいますが、これを行うには「if」や「notif」、「cmp」といった命令を使います。
では、使い方を見てみましょう。


;{条件}が正しければ{命令}を実行
if {条件} {命令}

;{条件}が正しくなければ{命令}を実行
notif {条件} {命令}

;文字変数同士(片方は任意の文字列でも可)を比べる。
cmp {%数字変数},{$文字変数},{$文字変数}

;一行に複数の命令を書く
{命令} : {命令} : …


{条件}の部分には等号や不等号などを使って条件を指定します。

if $8 == "微分積分"   ($8に"微分積分"という文字列が入っていれば…)
notif %1 <= 12        (%1が12以下でなければ…)
if %55>=200 && %55<300(%55が200以上でかつ、300未満であれば…)

「&&」
は複数の条件を記述する時に使うものです。

if(notif)については、条件が正しい(notifの時は正しくない)場合に続けて書かれている命令を実行し、条件が正しくない(notifの時は正しい)場合はその文を読み飛ばす、といった動作をします。

では例えば、「もし%1の中身が1だったら、クリック待ちした後で終了したい」という時、どうしますか?
基本的には命令は一行に一つしか記述することができません。
しかし↑を満足するには「click」と「end」の二つの命令が必要です。

if %1==1 click
end

↑かといってこのようにしてしまうと%1が1でなくても終了してしまいます。
そんな時どうするか?
実はそんな時に「:」が活躍します。
「:」は複数の命令を一行で書きたい時に用いる記号です。

click : end

は、

click
end

と同じ意味になりますが、通常使うことによるメリットは大してありません。
しかしこれがif文ともなれば話は別、大活躍します。

前述したように、「:」は複数の命令を一行で記述することができるので、

if %1==1 click : end

とすれば「もし%1の中身が1だったら、クリック待ちした後で終了したい」という願いを叶えられますね。
if文を使う時は「:」の実用性を知っておきましょう。


さて、最後になりますが、「cmp」命令についてです。

「cmp」命令は、文字変数と文字変数(もしくは文字変数と任意の文字列)を比べ、その結果を数字変数に代入する命令です。
しかしながらどういった基準で文字列の大小を決めているのかが全く分からないので、漢字とかはあまり比べる意味が無いような気がします。
ただ、数字が入っている場合は中身の数字の大小で決まるようです(全角でも)。
あとは、ある変数に文字列が入っているかいないかを判断するのにも使えます(というか、それが主な使い方なのかも)。

書式は上に書いたようになり、左の文字列が大きければ正の数、右の文字列が大きければ負の数、左右の文字列が同じなら0が{%数字変数}に代入されます。
ここで一つ、ある変数(ここでは$20)に文字列が入っているかいないかを判断するスクリプトを紹介します。

cmp %20,$20,""

if %20>0 puttext "文字列が入っています。"
if %20==0 puttext "文字列が入っていません。"

文字変数はデフォルトでは何も入っていない("")ので、""と比べ、同じなら何も入っていないということになります。

「cmp」命令は単体で使ってもあまり意味がありません。
結果を代入した数字変数をif文に掛ける事によって初めて結果を知る事ができます。

さて、if文を使う事によってだいぶスクリプトらしくなってきました。
if文はほとんどの場面で使用する事ができるので、習得しておいて損は無いでしょう。
これからここの説明もif文を多く取り入れていく予定なので、覚悟しておいてください。(笑

五章へ    七章へ
「NScripter」Top  Top Page