Processingでの「ループ」には主に2つのタイプがあります。一つは「forループ」、もう一つは「whileループ」です。また、Processingの「draw()」関数も一種のループと考えることができます。ここでは、これらのループの基本的な使い方について説明します。
目次
1. forループ
「forループ」は、指定した回数だけコードブロックを繰り返し実行します。以下は基本的な書き方です。
for (初期化; 条件; 更新) {
// 繰り返し実行するコード
}
例えば、横に10個の矩形を描画するコードは以下のようになります。
void setup() {
size(200, 200);
}
void draw() {
background(255);
for (int i = 0; i < 10; i++) {
rect(i * 20, 50, 20, 20);
}
}
2. whileループ
「whileループ」は、指定した条件が真である限りコードブロックを繰り返し実行します。
while (条件) {
// 繰り返し実行するコード
}
以下は、「whileループ」を使用して10個の矩形を描画する例です。
void setup() {
size(200, 200);
}
void draw() {
background(255);
int i = 0;
while (i < 10) {
rect(i * 20, 50, 20, 20);
i++;
}
}
※ whileループではi++のように更新する箇所を記載忘れた場合に「無限ループ」となってしまうので注意してください
3. draw()関数
Processingのdraw()
関数は、デフォルトでフレームレートに従って繰り返し実行されます。これも一種のループと見なすことができます。draw()
関数内で描画処理を行うことで、アニメーションやインタラクティブなビジュアルを作成できます。
void setup() {
size(200, 200);
}
void draw() {
background(255);
ellipse(mouseX, mouseY, 20, 20);
}
※Processingでビジュアル表現などで画面を更新していくプログラムを作ることが多いため、デフォルトでフレームごとに繰り返し実行する関数であるdraw()が定義されています。
上記のコードは、マウスカーソルの位置に円を描画する例です。マウスを動かすと、draw()
関数が繰り返し実行され、カーソルの位置に合わせて円が描画されます。
これらのループ構造を理解し、適切に利用することで、様々なパターンの描画やアニメーションを実現できます。
Processingで配列の要素に対してループを回す際は、通常「forループ」を使用します。以下、基本的な方法と例を紹介します。
4. 配列を利用したループ
基本形
配列の要素にアクセスするためには、インデックスを使用します。インデックスは0から始まりますので、配列の長さがn
の場合、有効なインデックスは0
からn-1
までです。
基本的な配列の要素に対するループの書き方は以下の通りです:
for (int i = 0; i < 配列の長さ; i++) {
// 配列[i] で i 番目の要素にアクセスできる
}
例えば、整数の配列があり、その各要素を矩形の幅として描画するコードは、以下のようになります。
int[] widths = {20, 40, 60, 80, 100};
void setup() {
size(200, 200);
}
void draw() {
background(255);
int x = 0;
for (int i = 0; i < widths.length; i++) {
rect(x, 50, widths[i], 20);
x += widths[i]; // 次の矩形のX座標を計算
}
}
このコードでは、widths
配列の各要素を順に取り出し、その値を矩形の幅として使用しています。
拡張版
Java(そしてProcessing)には、配列の要素を簡潔に取り出すための「拡張forループ」または「for-eachループ」があります。
for (型 変数名 : 配列) {
// 変数名 で配列の各要素にアクセスできる
}
※基本形でも拡張版でもどちらを利用しても結果は同じです
上記の例を拡張forループを使って書き換えると、以下のようになります。
int[] widths = {20, 40, 60, 80, 100};
void setup() {
size(200, 200);
}
void draw() {
background(255);
int x = 0;
for (int width : widths) {
rect(x, 50, width, 20);
x += width; // 次の矩形のX座標を計算
}
}
これにより、コードが少しシンプルになります。ただし、この方法では要素のインデックスに直接アクセスすることはできません。インデックスが必要な場合は、通常のforループを使用する必要があります。
これらの方法を活用し、配列の要素に対して効率的に操作を行いましょう。
5. for と whileはどう使い分けるか
for
ループ
- 明確な回数の繰り返し:
for
ループは、ループが実行される回数が明確な場合、またはコレクションのすべての要素に対して操作を行う場合に適しています。 - カウンター変数の利用: カウンター変数を使用して、繰り返しのインデックスを追跡する場合に便利です。
javaCopy code// 10回繰り返す例
for (int i = 0; i < 10; i++) {
// コード
}
while
ループ
- 不明確な回数の繰り返し:
while
ループは、繰り返しの回数が不明確で、特定の条件が真である限り繰り返し実行する必要がある場合に適しています。 - 状態の評価:
while
ループは、ある状態が変化するまでループを続ける必要がある場合に便利です。
(例) for or whileの使い分け
- 配列やリストの各要素に対する操作:
for
ループ - ユーザーからの入力を待つ:
while
ループ - ファイルの各行を読み取る:
for
ループ またはwhile
ループ(具体的な状況に依存)
結論
- 繰り返し回数が事前に分かっている、またはコレクションの要素に対してイテレートする場合は、
for
ループを使用します。 - 条件に基づいて繰り返す必要があり、繰り返しの回数が動的である、または事前には分からない場合は、
while
ループを使用します。
6. 演習
- 異なる大きさの円を描画する
for
ループを作成してください。 while
ループを使用して、マウスの位置にランダムな大きさの円を描画してください。for
ループのネストを使用して、チェッカーボードパターンを描画してください。