« 線で塗り絵sample | メイン | 2.7 条件分岐 »

2.6 繰り返し(ループ)

■繰り返しの処理
同じ処理を繰り返し実行したい時にはforやwhileを使うと便利です。forステートメントにはオブジェクトのプロパティや値を順に取り出すfor..in、for each..inの書式もあります。for..inとfor..each..inについては「2.9 配列とオブジェクトの走査」で説明します(p.??)。
なお、少しずつ座標を移動するといったアニメーションの繰り返し処理を行う場合はforやwhileを使わずに、flash.events.EventクラスのENTER_FRAMEイベントやflash.events.Timerクラスを利用して画面書き換えを繰り返すようにします。

■for
forステートメントは、後述のwhileと同じく「条件がtrueの間は繰り返す」という機構をもったステートメントです。
最初に1回だけ初期化を行い、次に条件式を評価します。条件式の結果がfalseならばそこでforステートメントを終了し、trueならば{}のブロックを実行します。{}のブロックを実行したならば更新処理を行い、再び条件式を評価します。条件式がfalseになるまでこれを繰り返します。

書式:
for (初期化; 条件式; 更新処理){
// 繰り返すスクリプト
}

書式からするとさまざまな用途で利用できる構文ですが、一般的には次のようにカウンタを使った繰り返しの処理に利用します。

「カウンタが指定の値になるまで繰り返す」
for (カウンタ=初期値; カウンタの評価式; カウントアップまたはカウントダウン){
// 繰り返すスクリプト
}

具体的には次のようなスクリプトを書きます。まずは1から10までのカウントアップです。これを実行するとカウンタの変数iが10になるまでブロックを繰り返し実行します。これをプレビューすると10回の繰り返し中のiとiの2倍の値が出力ウインドウに表示されます。

[:sample:] for_countup.fla
例:カウントアップ
for (var i:int=1; i<=10; i++) {
	var a:int = 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

この繰り返しを図で表すと次のようになります。

fig02-06-01 forステートメントを利用した繰り返しの処理。

次の例は10から0までの-2ずつのカウントダウンです。

[:sample:] for_countdown.fla
例:
for (var i:int=10; i>=0; i-=2) {
	trace(i);
}

出力結果:
10
8
6
4
2
0

次の例はforの繰り返し処理を入れ子(ネスティング:nesting)にして2つのカウンターを作り、繰り返し処理の中で縦横7×9合計63個のスプライトを作るフレームアクションです。スプライトの座標もカウンタの値を利用して計算します。

[:sample:] for_nesting.fla
例:
var i:int;
var j:int;
var cx:int;// x座標
var cy:int;// y座標
var r:int=40;// 半径
for (i=0; i<10; i++) {
	cx = i*r*1.5;
	for (j=0; j<8; j++) {
		cy = j*r*1.5;
		var circle:Sprite = new Sprite();
		circle.graphics.beginFill(0xFFCC00);
		circle.graphics.drawCircle(cx, cy, r);
		circle.alpha = 0.5;
		addChild(circle);
	}
}

fig02-06-02 複数個のスプライトを作り等間隔に並べます。

■while
whileは、評価結果がtrueまたはfalseになる条件式が満たされている間(trueのとき)はスクリプトを繰り返し実行します。最初から条件が満たされていないときには、while内のスクリプトは1回も実行されません。条件式の値が常にtrueだと無限ループに陥ってしまうので条件設定には注意が必要です。意図的に無限ループを作り、ある条件を満たしたならばbreakで抜けるという手法もあります。

書式:条件を満たす間は繰り返す
while (条件式){
// 繰り返すスクリプト
}

[:sample:] while.fla

例:
var i:int = 0;
while (i < 5) {
	trace(i);
	i++;
}

出力結果:
0
1
2
3
4


■do..while
do..whileはwhileと基本的に同じですが、条件式を評価する前に最初にスクリプトを実行するという点で違います。

書式:条件を満たす間は繰り返す
do {
// 繰り返すスクリプト
} while (条件式);

[:sample:] do_while.fla

例:
var i:int = 0;
do {
	trace(i);
	i++;
} while (i < 5);

出力結果:
0
1
2
3
4


■continue
for、for..in、for each..in、while、do..whileの中で使います。continueを実行すると、繰り返し中のスクリプトの残りをスキップして次の繰り返しに移行します。
次の例はvListから値を取り出し、それまでの値の合計を書き出しています。このとき、値が数値ではない場合には合計を行わずにif文に続くtrace処理をスキップします。

[:sample:] continue.fla

例:数値ならば加算する
var sum:Number = 0;
var vList:Array = [20, 30, null, 50.8, "test", 60];
for each (var v:* in vList) {
	if (v is Number) {
		sum += v;
	} else {
		continue;
	}
	trace(v, "sum="+sum);
}

出力結果:
20 sum=20
30 sum=50
50.8 sum=100.8
60 sum=160.8

■break
for、for..in、for each..in、while、do..whileの中で使います。breakを実行すると、繰り返し中のスクリプトの残りを中断して繰り返しのステートメントを抜けます。breakはswitchステートメントでも使います。

About

2007年5月25日 08:19に投稿されたエントリーのページです。

ひとつ前の投稿は「線で塗り絵sample」です。

次の投稿は「2.7 条件分岐」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。