一方向運動リストに戻る    印刷する

一方向の直線運動…複数(異なるサイズの円の列)

大きさの異なる複数の円が、水平に列をなして、一定速度で運動します。 同一の円の列と同じ動きですが、個々の円の大きさが異なるところが違います。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; //後は同じ間隔で現れる
 }

Your browser does not support the canvas tag.

クリックで停止⇔再開
【リスト 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]);
     }
}

arigat アットマーク acm.org / copyright © info