改めて中級編です。
またよろしくお願いいたします。
最初に変数ってなんでしょうか?
中学1年で取り敢えずは習ったものです。
覚えてらっしゃいますか?
まずはx=3で
xに+1すると……
x=4になる訳ですね?
このxとかが変数です。
「x」が嫌いな人は、別に「チョコレート」と「体重増加量」でもなんでもいいです。
別に体重はどうでも良いとして、この変数というものは最初に「$」が付きます。
コマンドは「!」、ラベルは「#」、変数は「$」というわけです。
先ほどの計算をスクリプトで表すと次の様な形になります。
サンプル
0行目:変数xは3と同じ(宣言)
1行目:変数xに足す1(3とxが同じなのでxは4になる)
2:行目:実行停止
という形になっています。
変数に対して計算や設定(=の事)を行った場合は
最初の変数(この場合は変数x)に値が代入されます。
計算は四則演算(+、-、*、/)、剰余
sin、cos、tan、atan、log、exp、sq_rootが使用可能です。
計算結果を表示する場合は次のサンプルの様にして下さい。
サンプル
変数名をスクリプトに書けば変数内容が表示されます。
変数を扱う上で重要な注意点があります。
変数を計算やコマンドに使用する前には
必ず宣言(単体による=の使用)を行ってください。
宣言(設定)を怠った場合の動作は保証しません。
また一つの変数に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代目死んだとか、実は時計がずれてたとか、色々ある訳ではないのですが、講座はおしまいです。
長々とお付き合い頂き、有難う御座いました。
それでは皆さんのゲームがプレイできる日を楽しみにしつつ、失礼させて頂きます。
|