変数ってこんなに便利!!な気がする

改めて中級編です。
またよろしくお願いいたします。

最初に変数ってなんでしょうか?
中学1年で取り敢えずは習ったものです。
覚えてらっしゃいますか?

まずはx=3
x=x+1すると……
x=4になる訳ですね?

このxとかyが変数です。
「x」とか「y」が嫌いな人は、別に「チョコレート」と「体重増加量」でもなんでもいいです。

まあ別に体重はどうでも良いとして、この変数というものは最初に「$」が付きます。
コマンドは「!」、ラベルは「#」、変数は「$」というわけです。
スクリプトで表すと次の様な形になります。

サンプル
$x=3
$x+1
!stop


0行目:変数xは3とイコール
1行目:変数xに足す1

という形になっています。
変数に対して計算や設定(=の事)を行った場合は最初の変数(この場合は変数x)に値が代入されます。

計算は4算、剰余、sin、cos、tan、sq_rootが使用可能です。

計算結果を表示する場合は次のサンプルの様にして下さい。

サンプル
$x=3
$x+1
$x
!stop


計算も設定(=の事)もせず、単に変数名をスクリプトに書けば値が表示されます。

変数を扱う上で重要な注意点があります。
変数を計算やコマンドに使用する前には必ず設定(=の使用)を行ってください。
設定を怠った場合の動作は保証しません。



エンドレス……

エンドレスとは終わらないことです。
スクリプトの最後(終わるところ)には必ず「!stop」を書くように繰り返してきましたが、終わらないスクリプトなら必要ありません。

サンプル
!repeat
!pause 10
てすと
test
テスト
!loop


実行するとわかりますが、下の方まで延々と文字が表示されました。
スクリプトに書いているのは3行だけなのですが、なぜでしょうか?

秘密は「!repeat」と「!loop」にあります。
この二つは間に書かれたスクリプトを延々と行うのです。

もちろん回数指定も可能です。

サンプル
!repeat 3
!pause 10
てすと
test
テスト
!loop
!stop


合計で9行が表示されました。
ただこの場合はスクリプトが終わるので「!stop」が入っています。

繰り返した回数は変数「$cnt」に代入されます。
この変数は最初に設定の必要がありません。
ただし、自分で設定する事もできません
こういう変数をシステム変数と呼びます。

では回数を表示させてみましょう。

サンプル
!repeat
!pause 10
$cnt
!loop
!stop


今度は変数を文字の代わりに表示してみました。
数字が増えていってるのがわかるかと思います。

ところでなぜ「pause」が必要なのでしょうか?
別に増えていく様子を見せる為だけではありません。

実は無制限に繰り返すスクリプトの場合、フリーズに近い状態になってしまうからです。
一応「!linewait」というコマンドで一定の制限はかけているのですが、初期状態では100行のスクリプト毎に0.001秒だけウエイトを実行するという形になっています。
ですから必要ではない限り、長時間繰り返しを行うスクリプトではウエイトを入れないといけないのです。



変数で手抜き

コマンドが沢山ある時に毎回設定するのは面倒です。
そんな時に役に立つのが変数を利用した設定です。

サンプル
!picset1 s1.jpg
!picon1
!picset3 c1.gif
!picon3
!repeat
!pause 10
!picpos3 $cnt,0
*
!loop


サンプルでは徐々にキャラクタが右へ動いて行きます。
今回は単純にx座標が0の状態から右へ移動していくだけなので、システム変数を使用しました。

もう少し早く動かすならこうなります。

サンプル
!picset1 s1.jpg
!picon1
!picset3 c1.gif
!picon3
$v1=0
!repeat
!pause 10
$v1+2
!picpos3 $v1,0
*
!loop


設定時点の変数$v1は0でしたが、繰り返しを行うごとに2が足されていきます。
システム変数$cntの場合は1ずつしか足されないので、単純に移動速度が2倍になった筈です。

変数はどのコマンドにも使用できます。

サンプル
!picset1 s1.jpg
!picon1
!picset3 c1.gif
!picon3
$v1=0
!repeat
!pause 10
*
!color $v1,$cnt,255
!pos 20,20
文字の色を変えてみました。
!loop


こういう使い方も可能です。
他に例を挙げるなら「!picset$cnt c1.gif」といった使い方もありでしょう。



考えさせてみよう

明日が晴れなら買い物に行こう。
これは人間なら誰でも簡単に考えれる事なのですが、スクリプトではいちいち設定してから、判断をさせなければなりません。
ゲーム的に言えばこのアイテムは手持ちがゼロだから、クリックされても使用できない様にしないと……といった具合です。

サンプル
$v1=晴れ
!if $v1=晴れ
出かけよう
!endif
!stop


別に変数名は何でも良いのですが、variable=変数って事で私はvを多用します。

上のサンプルでは0行目で$v1を晴れに設定し、次の行でもし(if)変数$v1が晴れと=なら!endifまでを実行となっています。

少しややこしいですが、「!if $v1!晴れ」と1行目で設定した場合は、もし(if)変数$v1が晴れと同じでないなら!endifまでを実行となります。

キャラが移動していくサンプルを流用してIFを作ってみると……

サンプル
!picset1 s1.jpg
!picon1
!picset3 c1.gif
!picon3
$v1=-300
!repeat
!pause 10
$v1+2
!if $v1>640
$v1=-300
!endif
!picpos3 $v1,0
*
!loop


こうすれば延々と移動を繰り返しますね。
これらを条件判断と呼びます。



エンドレス再び!!

エンドレスな繰り返しは既にやりましたが、もしこうしたい場合はどうするのでしょうか?

これは動かないサンプル
!repeat
!pause 2
!repeat 2
$cnt
!loop
!loop


意味が分からなければ別に良いのですが、リピートは重複して使えません。(ネストは1)
ではどうしても必要な時は?
怠け者のラベル氏を使いましょう。

サンプル
#top
!pause 2
!repeat 2
$cnt
!loop
!goto #top


今回の新しいコマンドは「!goto」です。
名前の通り、指定したラベル、またはスクリプトの行数へジャンプ(実行行を変更)します。



ぐるぐる鏡だったり

画像処理にもう少し踏み込んでみましょう。

サンプル
!picset1 s1.jpg
!picon1
!picset10 c1.gif
!picon10
$v1=0
$v2=0
$v3=0
!repeat
!pause 2
$v1=$mousey
$v2=$mousey
$v1/48
$v1*100
$v2/30
$v2*100
!piczoom10 $v1,$v2
!pical10 $mousex
$v3=$cnt
$v3*36
!picrotate10 $v3
!if $key=lclick
!piclr10 1
!else
!piclr10 0
!endif
*
!loop


「!pical」でシステム変数「$mousex」を利用して透過率変更
「!piczoom」でシステム変数「$mousey」を利用して拡大率を変更
「!picrotate」でシステム変数「$cnt」を利用して回転
「!piclr」でシステム変数「$key」を利用して左右反転

以上の作業を行っています。

簡単だった方には問題ないですが分からなくても無問題です。
どうせすぐ覚えることですから、ムキになって覚える必要すら無いです。

今回重要なのは、「!else」のコマンドとシステム変数「$key」ですね。
辞書で調べてみましょう。



名前を入れてみよう

よくプレーヤーに名前を入力させて、とか生年月日を入れさせたり……
変数でやる事はもう既にご存じでしょう。

サンプル
$name=アル子
名前の入力
!input $name,10
$name
!stop


ってもう辞書使いこなしてる筈ですから、今更講座でやる必要もありませんでしたね。

おわり。



ランダムって○ンダム?

またもや、内容とタイトルは関係ありません。

簡単に言えばランダムとは乱数(でたらめな数字)の事です。

サンプル
$v1=0
!rnd $v1,300
$v1+100
$v1
!stop


短いですね。
変数$v1にはでたらめな数値(0-299までのどれか)が代入されて、そこに100足している訳ですから、変数$v1の値は(100-399)のどれかになる訳です。

ゲームのサイコロとか敵との遭遇率とか通常これを使用して作ります。



ファイルと階層の変更

まず普通のゲームのスクリプトだと1枚のasdf(アルコ・スクリプト・データ・ファイル)では当然足りない訳です。
そんな時に活躍するのが!file命令です。
さりげなく「!goto」の機能も持たせてあるので、意外と便利かも知れません。

そしてディレクトリ(階層)の変更ですが、「!cd」コマンドを使います。

さすがに講座も最後なので、辞書を引きつつ、他人のスクリプトで研究して下さいませ。
長々とお付き合い有難う御座いました。

それでは皆さんのゲームがプレイできる日を楽しみにしつつ、失礼させて頂きます。
eL