直線の往復運動…サイズの異なる円列
大きさが違う複数の円が、水平に往復運動します。動きの処理は、同一サイズの円列の直線運動と同じですが、2つの点が異なります。ひとつはそれぞれの円の直径を保存する配列を用意し、円を描くときにその値を使う点です。
float d[] = new float[10]; // 円の直径先頭の円のサイズは20ピクセルで、2ピクセルずつ小さくしています。円の中心位置(x座標)は円どうしの間隔が5ピクセルになるよう計算します(中心は2つの円の半径の合計プラス5離れる)。
d[0] = 20; //配列の先頭の値の初期化 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 - 5; //円のx座標の初期化 }2点目は、壁の跳ね返り処理を同一サイズの円列の直線運動と同じにすると、間隔がだんだん乱れていくのでそれを調整します。左側の壁に当たった時、前の円との間隔が5ピクセルになるようにx座標を指定します。右側でもずれは生じていますが、この例では左側の調整だけで十分です。
if(x[i] > width-d[i]/2){ //登場中の円が右の壁より右に来た x[i] = width-d[i]/2; //壁の表面に置く s[i] = -s[i]; }else if(on[i] && x[i]<d[i]/2){ //登場中の円が左の壁より左に来た if(i==0) x[i] = d[i]/2; //先頭は壁の表面に置く else x[i]= x[i-1] - (d[i]+d[i-1])/2 - 5; //円の間隔を5ピクセルにする s[i] = -s[i]; }
クリックで停止⇔再開
【リスト RStraightM3】 float d[] = new float[10]; // 円の直径 float x[] = new float[10]; // 位置(x座標) float s[] = new float[10]; // 移動速度 boolean on[] = new boolean[10]; // 登場したかどうか void setup() { size(150, 150); //描画するための画面 fill(0); s[0]=3; d[0] = 20; //配列の先頭の値の初期化 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 - 5; //円のx座標の初期化 s[i] = 3; //円の移動速度の初期化 } } void draw() { background(255); //画面背景を白でクリア for(int i=0;i<x.length;i++){ x[i] = x[i]+s[i]; //速度分進める if(x[i] > d[0] && !on[i]) on[i] = true; //登場した if(x[i] > width-d[i]/2){ //登場中の円が右の壁より右に来た x[i] = width-d[i]/2; s[i] = -s[i]; }else if(on[i] && x[i]<d[i]/2){ //登場中の円が左の壁より左に来た if(i==0) x[i] = d[i]/2; else x[i]= x[i-1] - (d[i]+d[i-1])/2 - 5; //円の間隔を保って跳ね返る s[i] = -s[i]; } ellipse(x[i], height/2, d[i],d[i]); } }