往復運動リストに戻る    印刷する

直線の往復運動…サイズの異なる円列

大きさが違う複数の円が、水平に往復運動します。動きの処理は、同一サイズの円列の直線運動と同じですが、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];
 }

Your browser does not support the canvas tag.

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

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