ひよっこ blog

ゲーム制作について、作ったものや思ったことをつらつら書いていく予定

スクリプトは上から下へ byティラノ

プログラムでもスクリプトでも、
基本的には上から下に書いたとおりに実行されていきます。

って言うのはわかっていても、なぜか予想通りの結果にならない!
そんな時には自分が書いた記述を振り返ってみましょう。

ティラノスクリプトの記述で例を出しますが、
Javascriptととかでも一緒な気がします。

if文で書いてみよう

ifは評価が正しければ実行して、そのまま次へ行く。
なので、なんにも考えずに使っていると、思わぬ挙動になるときがあります。

下の例だと、実行する度に、1だよ、2だよ、……と、順番にでます。

[eval exp="f.flag = 1"]

[if exp="f.flag == 4"]
[cm]
4だよ[l][r]
[cm]
[eval exp="f.flag = 0"]
[endif]

[if exp="f.flag == 3"]
[cm]
3だよ[l][r]
[cm]
[eval exp="f.flag = 4"]

[if exp="f.flag == 2"]
[cm]
2だよ[l][r]
[cm]
[eval exp="f.flag = 3"]

[if exp="f.flag == 1"]
[cm]
1だよ[l][r]
[cm]
[eval exp="f.flag = 2"]

ちなみに、[if exp="f.flag == 4"]が一番上になっていますが、この順番じゃないとうまくいきません。
私は[if exp="f.flag == 1"]から並べて、一回の実行で全部の文字が出てしまう、
悲しいミスをしました。下の例みたいな感じです。

一回の実行で1だよ、2だよが連続して表示されます。

[eval exp="f.flag = 1"]

[if exp="f.flag == 1"]
[cm]
1だよ[l][r]
[cm]
[eval exp="f.flag = 2"]
[endif]

;既にf.flagは2なので、下も表示されてしまう。
[if exp="f.flag == 2"]
[cm]
2だよ[l][r]
[cm]
[eval exp="f.flag = 3"]

elseを使えば、順番を考えなくても似たような結果が得られます。

elseで書くとこうなる!

elseは上から評価して、最初に正しかった物だけ実行する。
下の例だと、実行する度に、1だよ、2だよ、……と、順番にでます。

[eval exp="f.flag = 1"]

[if exp="f.flag == 1"]
[cm]
1だよ[l][r]
[cm]
[eval exp="f.flag = 2"]

[elsif exp="f.flag == 2"]
[cm]
2だよ[l][r]
[cm]
[eval exp="f.flag = 3"]

[elsif exp="f.flag == 3"]
[cm]
3だよ[l][r]
[cm]
[eval exp="f.flag = 4"]

[elsif exp="f.flag == 4"]
[cm]
4だよ[l][r]
[cm]
[eval exp="f.flag = 0"]

[else]
[cm]
0になったよ![l][r]
[cm]
[endif]

ちなみに、
下の例だと、1だよ、2だよの後は、2だよが実行され続けます。

[eval exp="f.flag = 1"]

[if exp="f.flag == 1"]
[cm]
1だよ[l][r]
[cm]
[eval exp="f.flag = 2"]

[elsif exp="f.flag == 2"]
[cm]
2だよ[l][r]
[cm]
[eval exp="f.flag = 2"]

[elsif exp="f.flag == 2"]
[cm]
2だけど、永遠にここへはこないよ![l][r]
だからf.flagは3になることがないよ![l][r]
[cm]
[eval exp="f.flag = 3"]

[else]
[cm]
ここにもこないよ![l][r]
[cm]
[endif]

話は変わるがswitch文

まだティラノスクリプトでは使ったことないですが、
ちょこっと調べたのでついでに記載。

switch文は、評価対象(下の例だとflag)を先に書いて、
正しいcaseに飛んで、breakでswitch文を抜ける。

つまり、breakの記述がないと、alert("1だよ")、alert("2だよ")
alert("1でも2でもないよ");と全部出るちゃいます。

[iscript]
var flag = 1;
switch ( flag ) {
case 1 :
alert("1だよ");
break;

case 2 :
alert("2だよ");
break;

default :
alert("1でも2でもないよ");
break;}
[endscript]


■結局何が言いたい?
if文だけでも、elseを混ぜても同じ結果にはできます。

挙動が想定通りにならない場合は、たぶんちょっと複雑なことをしてるはずなので、
上から追って行って、どこでおかしくなっているか絞ることと、
どんな動きをする物を使ってるのか正しく理解するとよいですね。

動けばいいか。となんとなく使っていると、
後で苦しむのは自分なのである……