変数ってこんなに便利!!

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


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


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


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


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


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



0行目:変数xは3と同じ(宣言)
1行目:変数xに足す1(3とxが同じなのでxは4になる)
2:行目:実行停止


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


計算は四則演算(+、-、*、/)、剰余
sin、cos、tan、atan、log、exp、sq_rootが使用可能です。


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


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



変数名をスクリプトに書けば変数内容が表示されます。


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


また一つの変数に2回以上の計算を行いたい場合は
次のようにすると格段に速度が向上します。


サンプル
$a=3
$b=2
_$a,=$b,*100,+$b,-2,/3
$a
!stop



アンダーバーから開始する数式ではコンマで区切る事で
一つの変数に対して複数の処理(四則演算、代入処理)を
行うことができます。


ただしこの計算式で行うのは代入であり
宣言(変数を使う前の設定)では無いので
くどいですが初めて使う変数の場合は事前に
$v1=0のように宣言を行う必要があります。

また、計算記号による優先順位はありません。
左側から順番に計算していきます。
サンプルスクリプトの場合は次の様になります。
$a=$b -> $a*100 -> $a+$b -> $a-2 -> $a/3

老婆心ながら……
通常ゲームではデータ量が以下のようになります。
80%が画像
15%が音
5%がスクリプト(うち変数が7割を占める)


変数嫌いでも頑張ってください^^;



エンドレス……

エンドレスとは終わらないことです。


スクリプトの最後(終わるところ)には
必ず「!stop」を書くように繰り返してきましたが


終わらないスクリプトなら必要ありません。


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



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


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


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


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



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


「!repeat」〜「!loop」を使った繰り返しの回数は
変数「$cnt」に代入されます。


この変数は最初に設定の必要がありません。
ただし、自分で設定する事もできません
こういう変数をシステム変数と呼びます。


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


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



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


ウエイトは上達した後、自分でクリック待ち等の機能を
自作する場合での注意点だと思ってください。



変数で手抜き

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


サンプル
!picset 1,s1.jpg
!picon 1
!picset 3,c1.gif
!picon 3
!repeat 0
!pause 10
!picpos 3,$cnt,0
*
!loop



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


もう少し早く動かすならこうなります。
ちなみにウエイトを減らすという意味ではなく
移動量を増やすという意味です。


サンプル
!picset 1,s1.jpg
!picon 1
!picset 3,c1.gif
!picon 3
$v1=0
!repeat 0
!pause 10
$v1+2
!picpos 3,$v1,0
*
!loop



設定時点の変数$v1は0でしたが
繰り返しを行うごとに2が足されていきます。


システム変数$cnt(回数を記録するシステム変数)の場合
1ずつしか足されないので、結果として移動速度が2倍になります。


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


サンプル
!picset 1,s1.jpg
!picon 1
!picset 3,c1.gif
!picon 3
$v1=0
!repeat 0
!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を作ってみると……


サンプル
!picset 1,s1.jpg
!picon 1
!picset 3,c1.gif
!picon 3
$v1=-300
!repeat 0
!pause 10
$v1+2
!if $v1>640
$v1=-300
!endif
!picpos 3,$v1,0
*
!loop



こうすれば延々と移動を繰り返しますね。
これらの実行の分岐処理を条件判断と呼びます。



エンドレス再び!!

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


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



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


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



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


または最初の動かないサンプルを使うなら
次のような方法もあります。

サンプル
!repeat 0
!pause 2
!repeat1 2
$cnt1
!loop1
!loop




もっと画像処理

画像処理にもう少し踏み込んでみましょう。
ただ実際では次の例のように、訳のわからないスクリプトを組むことは少ないでしょう。


サンプル
!picset 1,s1.jpg
!picon 1
!picset 10,c1.gif
!picon 10
$v1=0
$v2=0
$v3=0
!double 2
!repeat 0
!pause 2
$v1=$mousey
$v2=$mousey
_$v1,/48,*100
_$v2,/30,*100
!piczoom 10,$v1,$v2
!pical 10,$mousex
$v3+0.01
!picrotate 10,$v3
!if $key=lclick
!piclr 10,1
!else
!piclr 10,0
!endif
*
!loop



「!pical」でシステム変数「$mousex」を利用して不透明度変更
「!piczoom」でシステム変数「$mousey」を利用して拡大率を変更
「!picrotate」で変数「$v3」(!doubleで小数2桁まで再設定)を利用して回転
「!piclr」でシステム変数「$key」を利用して左右反転


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


簡単だった方には問題ないですが
分からなくても気にしないでください。


どうせすぐ覚えることですし
必要に迫られますから。


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



名前を入れてみよう

よくプレーヤーに名前を入力させて
とか生年月日を入れさせたり……


変数でやる事はもう既に
想像が付いているかと思います。


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



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


変数「$name」はポチと設定
「!input $name,10」で入力ボックスが開かれるが
変数$nameがポチと初期設定されているので
その文字列をとりあえず表示
入力後、変数$nameの内容を表示
てな流れです。


おわり。



ランダム?

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


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



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


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



ファイルと階層の変更

まず普通のゲームのスクリプトだと
1枚のasdf(アルコ・スクリプト・データ・ファイル)では
当然足りない訳です。


シーン毎、機能毎にスクリプトファイルを変更しないと
大きな物では混乱する可能性が高くなります。


そんな時に活躍するのが!file命令です。
さりげなく「!goto」の機能も持たせてあるので
意外と便利かも知れません。


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


さすがに講座も最後なので、辞書を引きつつ
他人のスクリプトで研究して下さいませ。


別に面倒とか、時間が無いとか、疲れたとか、飽きたとか、腹減ったとか、眠いとか、鼻が痒いとか、お肌に悪いとか、肩が凝ったとか、電話だとか、手抜きとか、シフォンケーキ食いたいとか、禁煙中とか、充電中とか、PC重いとか、正体不明のエラーが発生しましたとか、自力で勉強してくれとか、飲みに呼ばれてるとか、大気圏突入とか、バグ取りとか、キーボード8代目死んだとか、実は時計がずれてたとか、色々ある訳ではないのですが、講座はおしまいです。


長々とお付き合い頂き、有難う御座いました。


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