直線の往復運動…ふたつの円列の衝突
ふたつの円の列が、水平に移動、中央で衝突し、往復運動します。ふたつの円の衝突と同じ動きを、2つの円列に対して行います。2つの列の円の数は同じで、変数nnで設定するようにしています。nnの値を1にすると、ふたつの円の衝突と同じになります。
setup()関数内で、 左の列は左端の左側に(d+kk)の間隔で配置、右の列は右端の右側に同じく(d+kk)の間隔で配置しておきます。ひとつの円列の往復と同様、画面に登場しているかどうかを保存する配列on1[]とon2[]を使い、動き出して画面に現れたらこの値をtrueにしておきます。そして、登場している時(on1[]あるいはon2[]の値がtrueの時)だけ壁に当たったかどうかを判定します。
左右の列を区別するため、左の列は赤い色で描いています。
クリックで停止⇔再開
【リスト RStraightM2】 int nn = 6; // 円の数 float ss = 2; //移動速度 int kk = 2; //間隔の調整 float d = 10; // 円の直径 float x1[] = new float[nn]; // 位置(x座標) float s1[] = new float[nn]; // 移動速度 float x2[] = new float[nn]; // 位置(x座標) float s2[] = new float[nn]; // 移動速度 boolean on1[] = new boolean[nn]; // 登場したかどうか boolean on2[] = new boolean[nn]; // 登場したかどうか void setup() { size(150, 150); //描画するための画面 noStroke(); s1[0]=ss; s2[0]=-ss; x2[0]= width - d/2; for(int i=1;i<x1.length;i++){ x1[i]= x1[i-1] - (d+kk); s1[i] = ss; x2[i]= x2[i-1] + (d+kk); s2[i] = -ss; } } void draw() { background(255); //画面背景を白でクリア for(int i=0;i<x1.length;i++){ x1[i] = x1[i]+s1[i]; x2[i] = x2[i]+s2[i]; if(x1[i] > 0 && !on1[i]) on1[i] = true; if(x2[i] < width && !on2[i]) on2[i] = true; if(x1[i]>x2[i]-d){ //衝突 x1[i] = x2[i]-d; s1[i] = -s1[i]; x2[i] = x1[i]+d; s2[i] = -s2[i]; }else{ if(on1[i] && x1[i]<d/2){ //左の列、左の壁 x1[i] = d/2; s1[i] = -s1[i]; }else if(on2[i] && x2[i]>width-d/2){ //右の列, 右の壁 x2[i] = width-d/2; s2[i] = -s2[i]; } } fill(200,0,0); //左の列は赤 ellipse(x1[i], height/2, d, d); fill(0); //左の列は黒 ellipse(x2[i], height/2, d, d); } }