16 変数はこんなに便利?

中級編を始めます
変数?また聞いた事もない様な単語使って・・・わけわかんないよ!!

気持ちは分かります
しかし、中学校で皆さん、勉強したはずですよ?

問題が「X+Y」で
X=30だとして
Y=11だとすると
答えは?

当然、30+11の答えは41ですよね?

別にバカにしている訳ではないのです
ちょっと思い出していただきたかっただけで・・・

つまり、何かを代入する入れ物
この場合は「X」と「Y」が変数と呼ばれる物なのです



数学ではX=1とすれば、Xの内容は「1」ですよね?
Aresでもほとんど同じです

Aresでは変数の前に「$」をつけると
「コレは変数だ・・・」とAresが判断してくれます

早速、変数を設定してみますか・・・

$x=30
$y=11
!stop


はい、コレで終わりです

それぞれ「30」と「11」に設定されました
簡単ですよね?

ついでに言うと変数とかラベルとかの名前は何でもいいです
漢字でも、アルファベットでも、数字でも、分かり易いものを使ってください


でも、「X」と「Y」の値を見る事が出来ません
幾ら中に入っていても、入っている事を表示できなければ
全く意味がありません

では、変数を表示してみましょう

$x=7
$y=32
$x
$y
!stop


これで表示されましたね?

最初に言ったように、変数の最初は「$」を付けます
変数を表示したかったら、変数の名前を書いてやれば
直ぐに実行されます

え?「文字は変数に入れれないの?」ですか?
当然大丈夫です

次は文字を代入して見ましょう

$x=http://softfruit.hp.infoseek.co.jp/
Aresのサポートは
$x
で行っています
!stop


画面に表示されたのは・・・

Aresのサポートは
http://softfruit.hp.infoseek.co.jp/
で行っています

でしたね?



しかし・・・イマイチですよね?
文字の途中に表示できないと、なんか違和感を覚えます

心配しないで下さい
出来るからこそ、言ってみたのです

文章の途中に変数を表示させます

$name=Ares
!mes
このツール、
$name
はADV作成ツールです
!endmes
!stop


どうでしょうか?
コレですっきり、文章を書く事が出来ます

変数や命令を含んだ文章を1行で表示させたい場合は
「!mes」から「!endmes」までの間に書けばOKです
命令や条件判断とすら組み合わせる事ができます
変数の便利さが分かってきました?

ADVで入力した名前が、文章に表示されるのは
こんな感じで変数を表示させているからです
じゃあ、次の事をやりましょう


17 変数をプレーヤーに入力させてみよう

この前の所で、プレイヤーが名前を入力する・・・と言いましたが
Aresでも可能です

「!inputbox」の説明をしましょう

名前を入力した後、クリックしてください
決定ボタンはCTRLです
!inputbox $name,6
!mes
$name
さんですね?
!endmes
初めまして
!stop


この例を見ると「!inputbox」の命令では、
「name」と言う名前の変数に
全角で「6」文字分だけ、入力できる様にしてあります
半角の場合は、12文字入力できることになります


ただこのコマンドには秘密があってそれを使えば・・・
2秒以内に名前を入力してください
決定ボタンはCTRLです
!inputbox $name,6,2
!mes
$name
さんですね?
!endmes
初めまして
!stop


と言う具合に時間制限を追加できます^^
この場合の時間制限は2秒です
もしコレを最初の例のように省略した場合は無限に待ち続けます
巧く使えばタイピングゲーム等にも応用できそうですね?


18 計算しよう

プログラムでの計算は、どうしても変数を使うことになります
少しでも計算をするなら、覚えておかないといけない内容です

数学では
Y=3+4
とすればYは7になりますが

Aresでは少し違います
行を増やす代わりに入力する文字数を少なくして
より簡単に分かりやすく作成する為です


最初は足し算をしてみましょう

$v1=3
$v1+4
$v1
!stop


画面に表示されるのは「7」です
一体、どういう事になっているか?を説明すると

最初に「$v1」を「3」に設定します
次に「$v1」の内容、つまり「3」に「4」を足しているわけです
答えは「$v1」の中に入ります
従って「$v1」を表示すると、内容が「7」になっています





次は変数同士の足し算です

$v1=18
$v2=5
$v1+$v2
$v1
$v2
!stop


この様に計算の答えは、必ず前にある方の変数に入力されます
計算をしても、2つ目にある変数の内容は変化しません

計算後の変数は、
「$v1」の内容が「23」で、「$v2」の内容が「5」です



ちょっと待ってください
最初の内容が変化すると言う事は、1回しか計算が出来ない事になります
それでは、余りにも不便です


実は変数のコピーなんかも出来るのですよ

$v1=4
$v2=$v1
$v2
!stop


変数の設定に似てますよね?
と言うか、ほとんどそのままです

変数「$v2」は「$v1」と同じにしろって事です
コレは変数の処理で、非常に重要です
コレを忘れてしまうと・・・

毎回自分で書いて、設定しないといけなくなります





じゃあ、他の計算を教えましょうか?

引き算や掛け算、割り算なども同じように出来ます

$v1=8
$v2=2
$v1

$v2
があります

$answer=$v1
$answer+$v2
!mes
足した場合は
$answer
です
!endmes
$answer=$v1
$answer-$v2
!mes
引いた場合は
$answer
です
!endmes

$answer=$v1
$answer*$v2
!mes
掛けた場合は
$answer
です

$answer=$v1
$answer/$v2
!mes
割った場合は
$answer
です
!endmes
!stop


これで、4つの計算方法がわかったと思います
無理すれば、計算機くらいだったら出来そうですね?



しかし、足し算だけはちょっと特別なんです

実は文字も計算できます

名前を5文字以内で入力してください
!inputbox name,5
あなたの「だよ」を表現する
文章の語尾につける口癖を
照れずに?入力してください^^
!inputbox kuse,10
$v1=ユーザー「
$v1+$name
$v1+」の口癖は「
$v1+$kuse
$v1+」
$v1
らしいです・・・
!stop


ちょっと復習が混じりましたね
まあ文字も足せるって事を覚えておけば、意外なところで役に立つと思います
当然、「1+あ」なんて計算も出来ます
答えは「1あ」です


19 変数で設定しよう!!

そうです!!これが物凄く便利!!!
「!color」とか「!txtpos」、「!chrpos」等のコマンドを覚えていますか?

全てのコマンドには、変数が使用できるのです!!

早速、設定してみましょう

#top
$red+1
$green+2
$blue+3
!color $red,$green,$blue
!txtpos 270,230
テストです
!goto #top


どうですか?
どんどん色が変わっていきますよね?

もちろん場所を変えることも可能です

!etxt 550
#はじめ
$x+4
$y+3
$red+1
$green+2
$blue+3
!color $red,$green,$blue
!txtpos $x,$y

!goto #はじめ


上手く行きましたね
最初に「!etxt」を入れているのは
単純な理由です

Aresでは自動改ページが付いています
「○」というのは文字です
一定以上、下に文字が表示されそうになると
改ページになってしまいます

画面の縦は480で、文字の大きさは23だから
二つを足した、ちょっと多めの所で
改ページをするように、設定し直したのです

試しに「!etxt」を削除して、実行してみるとよく分かります

変数設定の奥の手?

Aresの変数は他のツールと少し違います
変数には文字も数字も入れれるし当然計算も出来ますが・・・
いったい何が違うのか?
実はコマンドや画像を変数の中に入れて実行できます
しかもその中に入れるコマンドにも変数が使用できたりします^^;
!fsize 23
$txt=!txtpos $x,0
#top
$txt
$num+1
$num
$x+23
!goto #top

コマンドを入れた変数を実行すれば内容がコマンドとして扱われます
繰り返し設定しないといけない場合には、非常に使える方法です
これで条件判断などを覚えれば縦書きの表示の設定も出来るでしょうね^^

この使用法には幾つかの制限があります

* 複数行に渡るコマンド(!sel等)には使用できません
* ジャンプ系(!goto、!gosub等)の命令には使用できません
* 省略系簡易コマンド(t,r,www等)の命令にも使用できません

これらコマンド以外には全て問題なく使えますが、使いすぎると見難くなります


20 ランダムな変数って?

ランダム?乱数?聞いた事ないなー
2つとも同じ意味で、1つは英語で「random」と書きます

乱数とは、「でたらめな数字」とでも言いましょうか?
一体何が出てくるのか・・・それはコンピューター次第です


使い道はとりあえず後回しにして、ランダムな変数を設定します

#top
!rnd $適当な数字,30
$適当な数字
@
!goto #top


変数「$適当な数字」に1から30までの
でたらめな数字を代入しています
1の出る確率は、30分の1ですね

もし、乱数を10〜30の間で発生させたいなら

#top
!rnd $適当な数字,21
$適当な数字+9
$適当な数字
@
!goto #top


で、OKですね


使い方次第でいろいろな事が出来ます
例えばRPGの敵の出現率や
サイコロの目の出る数などにも使えます



変数の設定と組み合わせれば

#top
!rnd $x,660
!rnd $y,500
$x-20
$y-20
!txtpos $x,$y
!rnd $r,255
!rnd $g,255
!rnd $b,255
!color $r,$g,$b
Ares
!goto #top


こんなことも出来ます
散々繰り返してきたので、コレくらいは分かりますね?


21 条件判断を使ってみよう

条件文ってご存知ですか?

「もし、明日晴れたら遊びに行こう」

とかの「もし」を使った文章です
英語で言う「if」ですね

Aresでも、「もし変数が○○だったら、」という、判断が出来ます

じゃあ、条件判断のサンプルを作ってみましょう

#top
!rnd $v1,10
クリックしてください
m
!mes
変数は
$v1
でした
!endmes

!if $v1=1,#atari
もし変数が1だったら当りです
!goto #top
#atari

あたりです!!!
!stop


「!if $v1=1,#atari」の文章は

もし変数「$v1」が、「1」であったなら
ラベル「#atari」にジャンプしろ

と言う事です
同じでない場合はその下の方にある
「!goto #top」で「#top」のラベルに戻されます

RPGで使われる敵との遭遇などは
このテクニックが使われています

そうそう、変数と数字や文字を使う場合は
必ず変数を最初に書いて下さい


では、ちょっとコレを見てください

#top
!rnd $v1,10
クリックしてください
m
変数は$v1$でした
!if $v1!1,#hazurei

あたりです!!!
!stop
#hazure

もし変数が1だったら当りです
!goto #top


どんなスクリプトかと思えば、全く同じです・・・
すいません

でも、よく見てください
プログラムの形式が全く違います
「!if $v1!1,#hazurei」とは

もし変数「$v1」が、「1」と同じでないなら
ラベル「#hazure」にジャンプしろ

と言う事です
同じ場合はその下の方にある
「あたりです!!!」が表示され「!stop」になります

内容は全く同じです
アプローチが違うとスクリプト自体も変わってきます
「=」は同じ
「!」は同じでない
という具合に判断しています

この他にも「>」と「<」があります
変数より大きければとか、小さければ・・・という判断に使用できます


「=」と「!」は重要で、文字の判断も可能です

#top
!cls
パスワードを入力してください
!inputbox $pass,4
!if $pass=12345678,#ok
パスワードが間違っています
tt
!goto #top
#ok
正しいパスワードです
!stop


#top
!cls
パスワードを入力してください
!inputbox $pass,4
!if $pass!Ares,#error
正しいパスワードです
!stop
#error
パスワードが間違っています
tt
!goto #top


文字の判断は全角と半角
大文字と小文字の全てをチェックします
2つ目のパスワードは半角の英数で書かないとOKをもらえません

また、1つ目のパスワードも半角でなければ、
100%「間違ってます」と表示されます



大体分かってきましたね?

もちろん条件判断文でも、変数同士を使用できます

#top
$pass=Ares
!cls
パスワードを入力してください
!inputbox $enter,4
!if $enter!$pass,#error
正しいパスワードです
!stop
#error
パスワードが間違っています
tt
!goto #top


ほとんど同じですね
変わったところは、変数を設定している所と
変数同士で条件を判断している事ぐらいです


ちょっと、面白い事をやってみましょう
1回間違える毎に、パスワードが変化していく
スクリプトです

#top
$pass=Ares
!cls
パスワードを入力してください
!inputbox $pass,3
!if $pass!$enter,#error
正しいパスワードです
!stop
#error
$pass+S
パスワードが間違っています
tt
!goto #top


1回目の間違いの後は、パスワードが「AresS」に変化します
2回目の間違いの後は、パスワードが「AresSS」に変化します
2回目以降は「!inputbox」で、「3」と設定されているので(全角3文字、半角で6文字)
幾ら頑張っても、正しいパスワードを打ち込めなくなります



もう一つの条件判断?

基本的な条件判断の使い方は理解できたと思います
ではもっと便利な方法を紹介しましょう
1〜10の数値をを入力してください
!inputbox $variable,1

$答え=以上

!if $variable<6
$答え=未満
!endif

!mes
答えは6
$答え
です
!endmes
!stop


どうでしょうか?多少、見難いかも知れませんが
「if」の条件に合った場合のみ、「!endif」までの設定に変数が変更されます
つまり$variableが5よりも小さい場合時は「$答え=以下」に
再設定されるわけです


複数の条件判断?

一つの条件しか判断できないのは非常に不便です
慣れてくると幾つかの条件に当てはまる場合の判断が必要になってきます
早速サンプルを見てみましょう
5を入力してください(しなくても良いです)
!inputbox $variable,1
もう一度5を入力してください(しなくても良いです)
!inputbox $variable2,1
$答え=5が入力されていません

!if $variable=5
!if $variable2=5
$答え=両方とも正しく入力されています
!endif

$答え
!stop


この様に2つの「!if」を並べれば複数の条件判断に対応できます
なお「!endif」は最後に一つだけ入れれば問題ありません
その上、100の条件ですら100行の「!if」を使用すれば可能です



どの条件にも当てはまらない条件?

もし、どの条件にも当てはまらなかったらどうしますか?
「!if」では予め決めた条件でしか判断できません
そんな時は「!else」のコマンドを使いましょう^^
#top
!cls
パスワードを入力してください(しなくても良いです)
パスは1234です
!inputbox $pass,1

!if $pass!1234
$output=0
!else
$output=1
!endif

!if $oputput=0,#top
パスを確認しました
!stop


最後の方に懐かしい条件判断も出てきていますが
注目するのはその上です
「!else」の意味は「!if」に当てはまらない場合はという判断です
このコマンドは必ず「!if」と組み合わせて使ってください
「if」を使わずに使用しても意味がありません


22 クリッカブルマップを作ってみよう

自分で作ったボタンを押せる様にしたい!!
マップの場所をクリックすると移動するようにしたい!!
そのような要望を満たす為に作られたコマンドです


このコマンドは、画面上で設定した場所を押すと、特定の場所にジャンプできます
コレを使って様々な応用が、出来るようになります

ではクリッカブルマップを作成してみましょう
#top
t
t
!cls
!msel 2
0,0,320,480,#左
320,0,640,480,#右
!stop
#左
画面の左側がクリックされました
!goto #top
#右
画面の右側がクリックされました
!goto #top

このサンプルでは、「!msel」というコマンドが、新しく出てきています
これがクリッカブルマップのコマンドです

最初に「2」で選択肢の数は2個と設定します
この辺は「!sel」のコマンドと全く同じです
つまり、選択肢の数は2個だと、設定しているわけです

その下に1個目の選択肢「0,0,320,480,#左」があります

選択範囲の左上は画面の「0,0」の位置から開始して
右下の「320,480」のところまでを、選択肢として認識しろ
もしクリックされたら、「#左」にジャンプしろ
という事です

2つ目の設定も同様で
選択範囲の左上は画面の「320,0」の位置から開始して
右下の「640,480」のところまでを、選択肢として認識しろ
もしクリックされたら、「#右」にジャンプしろ
となっています

この場合は、画面の全ての範囲が選択肢になっているので簡単です

1箇所の場合や、画面全部を指定しない場合でも大差はありません

#top
!msel 1
300,220,340,260,#ok
!stop
#ok
真ん中がクリックされました
!stop


選択を指定した場所は1箇所なので
それ以外の場所が押された場合は自動的に「!stop」になって、クリックを待ちます

残念ながらこの方法は、「!msel」の機能を最大限発揮しているとは言えません
「!msel」の特徴は、「!sel」とは違い

コマンドの後は、その下にあるコマンドを実行していく事にあります

つまり、全てのコマンドの上位に位置するのが「!msel」なのです
本来「!stop」を行った場合は、音楽以外のプログラムが停止します
それでも「!msel」を設定しておけば
指定したラベルに、ジャンプする事が可能なのです

それを応用するとこんなことも出来ます

640X480ピクセルの
test1.jpg
test2.jpg
test3.jpg
を用意してください
#top
!msel 2
0,0,640,480,#pic
300,220,340,260,#ok
#pic
test1.jpg
*
tt
test2.jpg
*
tt
test3.jpg
*
tt
!goto #pic
#ok
終了します
tt
!end

このサンプルでは、画面の真ん中でクリックすると終了します
それまでは「test1〜3.jpg」を1秒おきに表示していきます

選択肢は1つだけですが、2個に設定されています
これは真ん中以外の場所を押した場合は「#pic」に戻り
真ん中をクリックした場合は、「#ok」にジャンプします

もう一つ似たようなスクリプトを載せておきます
#top
!text 60
!cls
!msel 2
0,0,640,480,#top
30,30,75,53,#end
ボタン
いま、ボタンの文字を押すと終了されます
それ以外の場所を押すと最初に戻ります
tt
!mseloff
しかし、もうむりです
何故かというと「!msel」を解除しましたから
!stop
#end
!end

この様に「!msel」のコマンドは、それ以降のスクリプトを読み続ける事が出来ます
解除は見て分かるように「!mseloff」ですよ


23 無理やりセーブ&ロード

オートセーブ機能をつけて、ユーザーのプレイデータを記録したい
何回起動したか記録したい
何回クリアしたのか、判断したい


これらは「!save」等の機能で実現できます

!sel 2
セーブ,#save
ロード,#load
#save
文字を入力してください
!inputbox $v1,10
!save $v1
!mes
入力内容は「
$v1
」です
!endmes
データをセーブしました
クリックすると終了します
m
!end
#load
!load $v1
データをロードしました
!mes
変数「v1」の値は

$v1
」です
!endmes
!stop

この方法でセーブ出来る数は無限です
しかしロードは500個が限界です
それはAresの変数が500個までしか対応していない為です

これを巧く応用すれば、変数の使用制限を越えて変数を使用できますし
配列変数に似たものを作って使用しているユーザーもいます

もしも存在しないファイルをロードした場合は「空っぽ」として
変数に代入されます
コレを使えばファイルがあるか無いかの判断も可能です(詳しくは番外編の「IF」で)


24 より大規模に高速化を図るには?

ココまで来れば、かなりの内容が作れると思いますが
問題はファイルが大きくなる事による、処理速度の低下です

コレはPCによって違いますが、発表するなら高速に作動する方が
プレーヤーもストレスが溜まらず、快適にプレイできます

ココでは幾つかの、高速化に関するテクニックと共に
大容量を可能にするコマンドを説明しましょう

Aresの読み込める1ファイルの大きさの限界は250Kbです
コレは25万文字以上に匹敵する、文字量ですが・・・
25万文字分の距離をジャンプするとします

わたしのPCではジャンプするのに0.4秒掛かりました
コレが毎回繰り返されると、プレイヤーはストレスを感じます

コレでは遅すぎます

このような場合は、ファイルを分けてスクリプトを組みます

とりあえずエディタで「test.ares」
と言う名前のファイルを作成した後
その中に「#1」という名のラベルを
作成してください
そして、そこに何でも良いですから
文字を書いて下さい
最後にこのサンプルを実行すると・・・
m
!change test.ares,#1

これで「test.ares」のラベル「#1」に移動できます
実は50Kbを超えるようなファイルのジャンプよりも
「!change」命令による、ファイルの変更の方が最近のPCでは高速なのです

それに、「!change test.ares,#1」の代わりに
「!change test.ares」の様に使うことも出来ます

ラベルを指定しない場合は、ファイルの最初から読み込まれます





もう一つ、高速に作動させるコツは・・・

プログラムを短くする事です
はじめに作ったプログラムと言う物は、滅茶苦茶に無駄が多いものです
どんなにプログラムを作る事に慣れていても、必ずそうなってしまいます

これは次から次へと、アイディアを付け足して行くのが一番大きな理由です
この無駄を省くには、最初からよく計画を作る事が大切ですが・・・
計画なんて大抵は当てになりません(笑)

従って何かを作るときは、完成させてから
無駄を省いた能率的なものに作り直す作業が欠かせません
ついでにバグ取りと平行して行うと良いでしょう(バグ=ミス)

実際、昔からのユーザーである○○○氏の作品なども
作った後に私が指摘したら、半分以下のサイズになりました





さてとココまでは考えれば、誰でも分かってしまう様な方法ですが
もう一つ、処理速度を上げる方法があります
ラベルや変数の名前などに「日本語」を使わないことです

単純なスクリプトなら大差はありませんが
大きくなればなるほど、複雑になるほど「日本語」を使用すると遅くなります

表示する文字などは仕方ないですが、変数やラベルなどの名前は
半角のアルファベットや数字で書いてしまったほうが、絶対に能率的です

最後にもう一つ、変数にコマンドを入れると多少遅くなりますから^^


25 見た目をすっきり!!

高速化などの為に「!change」を多用すると
画像ファイルだけでも、量があるのに
全体的にごちゃごちゃして、非常に見た目が悪いですよね?

下手をすると何処にEXE(実行ファイル)があるのかさえ、分からなくなってしまいます
コレではユーザーのやる気を、始める前から無くさせてしまいます

この問題を解消するには、「!cd」のコマンドを使うと良いでしょう
まず、Aresのあるフォルダで
新しいフォルダをを作成して
「テスト」と名前を付けて下さい

フォルダー「テスト」の中に「test.ares」を作成して
画像を設定して適当な文字を書き込んでください

次に「test1.jpg」を「テスト」フォルダーに
コピペしたら早速「!cd」を使用します

!cd テスト
!change test.ares
!stop

この様に一つのフォルダに、全てをまとめてしまって
そこに全ての画像や音楽ファイル、スクリプトファイルなどを
入れてしまえば、「Ares.exe」のある最初のフォルダにあるのは
「Ares.exe」と「start.ares」の2つだけになり、見た目も非常に良くなります

もし「Ares.exe」のあるフォルダに戻りたいのであれば
「!cd」の時にフォルダを設定しなければ、「Ares.exe」のあるフォルダに戻ります
そのときのコマンドは「!cd」だけです
スペースとかは入れないで下さいね

ゲーム自体を「?章」とかに分けて管理するのも、一つの手かもしれませんね
管理の仕方により、ユーザーの印象がかなり違いますので
単純な物以外は、必ず「!cd」を使用するようにしたほうが
良いとは思いますが・・・

忘れないで下さいね?
中級篇終わりです!!