一方向の直線運動…複数(異なるサイズの円の列)
大きさの異なる複数の円が、水平に列をなして、一定速度で運動します。 同一の円の列と同じ動きですが、個々の円の大きさが異なるところが違います。x座標だけでなく、10個の円の大きさも配列に入れておき、円を描画する時に使います。
for(int i=1; i<x.length; i++){
d[i] = d[i-1] + 2 ; //円の直径の初期化、2ずつ増加
x[i] = x[i-1] - (d[i]+d[i-1])/2.0 -5; //円のx座標の初期化
}
x,dともに、要素の数が10のfloat型の配列で、xにはx座標を、dには直径を入れます。先頭の円の大きさd[0]はゼロ、次の円d[1]は2というように、直径は2ピクセルずつ大きくします。x座標は、円の間隔が5ピクセルになるように初期化します。(d[i]+d[i-1])/2.0は、隣り合う円の中心の距離(半径の和)です。
円の中心が等間隔でないので、円が右壁に入ったらの処理は、同一の円の列の場合と異なり、少し工夫が要ります。最初の円の位置を右壁内部に決めて、その後ろの円は、円の間隔が5ピクセルになるように順番に置きます。
if(x[i]>=width+d[i]/2) { //右に消えたら、左から現れる
if(i==0) x[i] = -d[i]/2 -50; //最初の円だけ特別扱い。50は前の列との間隔
else x[i]= x[i-1] - (d[i]+d[i-1])/2.0 - 5; //後は同じ間隔で現れる
}
クリックで停止⇔再開
【リスト StraightM3】
float s = 2; // 移動速度
float x[] = new float[10]; // 位置(x座標)
float d[] = new float[10]; // 円の直径
void setup() {
size(150, 150);
fill(0);
d[0]=2; //先頭の直径は2
for(int i=1; i<x.length; i++){
d[i]= d[i-1] + 2 ; //円の直径の初期化
x[i]= x[i-1] - (d[i]+d[i-1])/2.0 -5; //円のx座標の初期化
}
}
void draw() {
background(255); //画面背景を白でクリア
for(int i=0; i<x.length; i++){
x[i] = x[i]+s;
if(x[i]>=width+d[i]/2) { //右に消えたら、左から現れる
if(i==0) x[i] = -d[i]/2 -50; //最初の円の位置、左壁内部
else x[i]= x[i-1] - (d[i]+d[i-1])/2.0 - 5; //後は同じ間隔で現れる
}
ellipse(x[i], height/2.0, d[i],d[i]);
}
}