波紋がランダムに広がる
閾値により、スイッチがオンオフするプログラム例です。水面上に雨粒が落ちるように、同心円が描かれます。マウスのx座標が、閾値(今の場合画面幅の二分の一)を超えたら、スイッチが入ります。プログラミングの基本知識の「クラスの拡張」セクションにあるサンプルClassHamon3に、スイッチオンオフの機能をつけたものになります。インタラクションのプログラムの「マウスの位置による変化」セクションの波紋が広がる位置で使っているAHamonクラスを拡張したAColorHamonクラスを使います。このクラスは、サンプルClassHamon3で説明したものです。線の色のため、色情報を保持する変数value1, value2, value3を追加しています。デフォルトの 色モード設定では、この3つの値はそれぞれ赤、緑、青(RGB)を意味し、それにより設定されるで線を描きます。
【AColorHamonクラスの変数】
float value1; // デフォルトの色モードでは赤
float value2; // デフォルトの色モードでは緑
float value3; // デフォルトの色モードでは青
AColorHamonオブジェクトを複数格納するための配列hamonを用意し、そこにN個(ここでは50)のAColorHamonオブジェクトを入れています。波紋の最大値は100~200の間でランダムに決めています。また、色は青要素を70~200の間でランダムに指定していますが、10個に1個の割合で色を赤にしました。
AColorHamon[] hamon;
hamon = new AColorHamon[N];
for(int i=0; i<N; i++){
if(i % 10 == 0) { // 10個に1個の割合で色を赤にする
hamon[i] = new AColorHamon(random(100,200), 200, 0, 0);
}else { //それ以外は、青系でランダムに
hamon[i] = new AColorHamon(random(100,200), 0, 0, random(70,200));
}
}
そして、draw()が呼出される度に、配列Hamonの中のインデックスがhの波紋を調べます。マウスの位置が閾値(level)以上で、波紋が動いていない時に、ランダムな位置に波紋の中心を置き、波紋の広がりを開始します。hを1ずつ増やし、次のdraw()の実行では、順番に次の波紋を調べます。
if(mouseX >= level && !hamon[h].move){ //マウスの位置が閾値以上で動いていないとき
hamon[h].prepare(random(width), random(height)); //新しい位置で、波紋を開始
h = (h+1)%N; //この2行は、 (h+1)%hamon.length; と書いても同じ
}
描画は、全AHamonオブジェクトに対して行うので、for文の中でdisplay()メソッドを呼出します。
for(int i=0; i<N; i++){
hamon[i].display();
}
【リスト Hamon2】
AColorHamon[] hamon;
float level; // 閾値
int h; //いくつめの波紋か
int N=50; //リストの数(円の数)
int wide=150;
void setup() {
size(wide, wide);
level=width/2.0;
frameRate(30);
hamon = new AColorHamon[N];
for(int i=0; i<N; i++){
if(i % 10 == 0) { // 10個に1個の割合で色を赤にする
hamon[i] = new AColorHamon(random(100,200), 200, 0, 0);
}else { //それ以外は、青系でランダムに
hamon[i] = new AColorHamon(random(100,200), 0, 0, random(70,200));
}
}
PFont f = createFont("Arial", 14); //文字を描くためのフォントの準備
textFont(f);
textAlign(CENTER, CENTER); //描く文字列の中央の座標を指定
}
void draw() {
strokeWeight(0); //背景画面の四角には線を付けない
fill(255, 75); //色は白、透明度を指定
rect(0, 0, width, height); //背景を四角で塗りつぶす
if(mouseX >= level && !hamon[h].move){ //マウスの位置が閾値以上で動いていないとき
hamon[h].prepare(random(width), random(height)); //新しい位置で、波紋を開始
h = (h+1)%N; //この行は、 (h+1)%hamon.length; と書いても同じ
}
for(int i=0; i<N; i++){
hamon[i].display();
}
fill(0);//画面下部に、黒で、off | onの文字を描く
text("off", width/4.0, height-10);
text("|", width/2.0, height-10);
text("on", 3*width/4.0, height-10);
}