一方向の直線運動…複数(異なるサイズの円の列)
大きさの異なる複数の円が、水平に列をなして、一定速度で運動します。 同一の円の列と同じ動きですが、個々の円の大きさが異なるところが違います。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]); } }