3. ActionScriptのシンタックス/3.6 制御構造
3.6 制御構造
条件分岐
条件分岐や繰り返し処理など、複数行で1つのまとまった処理を行う構造をもったスクリプトがあります。スクリプトは基本的には上の行から順に実行されますが、条件に応じて実行する処理を選択することができます。
■if
if文は指定の条件が満たされた時だけに実行したいスクリプトを{}で囲んだブロックにします。条件式は、結果がtrue(正しい)かfalse(間違い)のどちらかの値になる式です。
「もし~ならばAを実行」
if (条件式) {
// 条件式の結果がtrueのときに実行したいスクリプトA
}
図3-6-1 ifの流れ。
次のif文では、変数aの値が10以上ならばaの値を2で割ります。
if (a>=10) {
a = a/2 ;
}
if文を入れ子にすることもできます。次のif文では、変数bの値が10~20のときにラベル"q3"のフレームに移動します。
if (b >= 10) {
if (b<=20) {
this.gotoAndPlay("q3");
}
}
このスクリプトは論理演算を使って次のように書くこともできます。
if ((b >= 10) && (b <= 20)) {
this.gotoAndPlay("q3");
}
■else
elseを使えば、if文の条件が満たされたとき、満たされないときのそれぞれのケースで実行したいスクリプトを指定できます。
「もし~ならばAを実行、でなければBを実行」
if (条件式){
// 条件式の結果がtrueのときに実行したいスクリプトA
} else {
// 条件式の結果がfalseのときに実行したいスクリプトB
}
図3-6-2 if~elseの流れ。
次のif文では、変数aの値が正ならばインスタンスのx座標に1を加算します(インスタンスは右へ移動)。正でないならば、つまり、0か負ならばx座標から1を引きます(インスタンスは左へ移動)。
if (a>0) {
this._x += 1;
} else {
this._x -= 1;
}
■else if
else ifは、if文の条件1が満たされないときには、別の条件2を満たしていないかどうかを重ねて評価したいときに使います。else ifのブロックを連結していけば条件を連続して評価していくことができます。先頭から条件式を評価し、途中で条件を満たす式に出会ったならば残りのelse ifは評価せずにifステートメントを抜けます。
なお、最後をelseブロックにすればどの条件も満たさなかったときに実行するスクリプトを設定できます。最後までelse ifならば、どの条件も満たさなければ何も実行しないままifステートメントを終了します。
「もし~ならばAを実行。でなければもし~ならばBを実行。でなければ・・・・」
if (条件式1){
// 条件式1の結果がtrueのときに実行したいスクリプトA
} else if(条件式2){
// 条件式2の結果がtrueのときに実行したいスクリプトB
} else if(条件式3){
// 条件式3の結果がtrueのときに実行したいスクリプトC
・・・
} else {
// すべての条件が満たされないときに実行するスクリプトZ
}
図3-6-3 if~else ifの流れ。
次のif文は、インスタンスのx座標がマイナスならば200にセットし、x座標が200以上ならば0にセットします。
if (this._x < 0){
this._x = 200; // 水平座標がマイナスならば200に移動
} else if (this._x > 200){
this._x = 0; // 水平座標が200より右ならば0に移動
}
note:
条件演算子?:でもif~else ifと同じように条件によって処理する式を切り分けることができます。(?:→p.??)
■switch
swith文は値に応じてスクリプトを分岐したい場合に便利な構造になっています。次の式の部分には変数やプロパティの参照式などが入ります。式の値が値1ならば、スクリプト1を実行し、値2ならばスクリプト2を実行します。用意した値1~nではない値の場合にはdefaultの初期値スクリプトを実行します。
「式の値に応じたスクリプトを実行。該当する値がなければdefaultを実行」
switch(式){
case 値1:
処理1;
break;
case 値2:
処理2;
break;
case 値3:
処理3;
break;
...
case 値n:
処理n;
break;
default:
初期値スクリプト;
}
図3-6-4 switchの流れ。
次のスクリプトでは、aの値が10ならばフレームq1へ移動、20ならフレームq2へ移動、それ以外の値ならばフレームq3へ移動します。
switch (a) {
case 10 :
this.gotoAndPlay("q1");
break;
case 20 :
this.gotoAndPlay("q2");
break;
default :
this.gotoAndPlay("q3");
}
用意したケースに当てはまらない場合にはdefaultで指定したステートメントを実行しますが、defaultの設定はなくても構いません。defaultを省略すると、用意したケースに当てはまらない場合には何も実行せずにswithブロックを抜けて次のステートメントへと移行します。
図3-6-5 switchの流れ。defaultを設定しない場合。
ところで、各caseの最後でbreakを実行しないと、そのまま次のcaseの処理が続きます。このとき、値のチェックは行われずに処理部分だけが無条件で実行される点に注意が必要です。これをうまく利用すれば論理和の処理を行うことができます。たとえば、次のswitchでは変数aの値が5、7、9のいずれからならばアタリになります。
例:
var a = 7; //アタリ
switch (a) {
case 5 :
case 7 :
case 9 :
trace("アタリ:5、7、9のどれかでした");
break;
default :
trace("はずれです");
}
途中のbreak後の処理がどうなっているのかを確認するには、次のスクリプトをテストしてください。変数aの値が5のときは、「5です」、「5または7です」の2つが出力されます。
例:
var a = 5;
switch (a) {
case 5 :
trace("5です");
case 7 :
trace("5または7です");
break;
case 9 :
trace("9です");
break;
default :
trace("はずれです");
}
図3-6-6 breakを実行しない場合には、続くケースの処理が無条件で実行されます。
また、caseで指定する値を式で書くことで複雑な条件設定も可能になります。次の場合は式の値がtrueになるケースが実行されます。つまり、変数aの値が7の場合は「5以上10未満」と出力されます。
例:
a = 7;
switch (true) {
case (a<5) :
trace("5未満");
break;
case (a>=5 && a<=10) :
trace("5以上10未満");
break;
case (a>10) :
trace("10以上");
break;
}
繰り返し(ループ)
同じ処理を繰り返し実行したい時にはforやwhileを使うと便利です。ただし、繰り返し処理をしている間はほかの処理が行われないので、座標を一定距離ずつ動かすといった処理には向いてません。そのような処理はMovieClip.onEnterFrameイベントハンドラやsetInterval()関数を利用します。(setInterval()→p.??)
note:
配列やオブジェクトを走査するfor~inについては配列で説明しています。(for~in→p.??)
ループ処理を15秒以上続けるとエラーになります。
■for
for文は、まず初期化を行い、次に条件式を評価します。条件式の結果がfalseならばそこでfor文を終了し、trueならば{}のブロックを実行します。{}のブロックを実行したならば更新処理を行い、再び条件式を評価します。条件式がfalseになるまでこれを繰り返します。
簡単に言えば、後述のwhileと同じく「条件がtrueの間は繰り返す」になります。
for (初期化; 条件式; 更新処理){
// 繰り返すスクリプト
}
書式からするとさまざまな用途で利用できる構文ですが、一般的には次のようにカウンタを使った繰り返しの処理に利用します。
「カウンタが指定の値になるまで繰り返す」
for (カウンタ=初期値; カウンタの評価式; カウントアップまたはカウントダウン){
// 繰り返すスクリプト
}
具体的には次のようなスクリプトを書きます。これを実行するとカウンタの変数iが10になるまでブロックを繰り返し実行します。これをプレビューすると10回の繰り返し中のiとiの2倍の値が出力ウインドウに表示されます。
for (var i=1; i<=10; i++){
var a = i*2;
trace([i,a]);
}
出力結果:
1,2
2,4
3,6
4,8
5,10
6,12
7,14
8,16
9,18
10,20
この繰り返しを図で表すと次のようになります。
図3-6-7 forステートメントを利用した繰り返しの処理。
■while
条件式が満たされている間(trueのとき)はスクリプトを繰り返し実行したい場合にはwhileを使います。最初から条件が満たされていないときには、while内のスクリプトは1回も実行されません。条件式の値が常にtrueだと無限ループに陥ってしまうので条件設定には注意が必要です。
「条件を満たす間は繰り返す」
while (条件式){
// 繰り返すスクリプト
}
note:
意図的に無限ループを作り、ある条件を満たしたならばbreakで抜けるという手法もあります。
■do~while
do~whileはwhile文と似ていますが、条件式を判断する前に最初に1回スクリプトを実行します。後はwhile文と同じです。
「条件を満たす間は繰り返す」
do {
// 繰り返すスクリプト
} while (条件式);
■contine
for、while、do~while、for~inの中で使います。contineを実行すると、繰り返し中のスクリプトの残りをスキップして次の繰り返しに移行します。
■break
for、while、do~while、for~inの中で使います。breakを実行すると、繰り返し中のスクリプトの残りを中断して、実行中のfor、while、do~while、for~inの文を終了し、以下に続くスクリプトへと進みます。なお、breakはswitch文でも使います。