直線の往復運動…同一サイズの円列
複数の円が、水平に一定速度で往復運動します。10個の円の位置(x座標)と速度を配列に入れておきます。まず、setup()関数の前で配列を宣言します。
float x[] = new float[10]; // 位置(x座標) float s[] = new float[10]; // 移動速度位置の初期値は、先頭の円が0で、5ピクセルずつ左に配置します。つまり、左端の隠れた所から順次円が登場するようにします。速度の初期値は3としておきます。
s[0]=3; for(int i=1;i%<x.length;i++){ x[i]= x[i-1] - (d+5); s[i] = 3; }この10個の円に対し、ひとつ(一定速度)と同じように左右の壁に当たったかを単純にfor文の中で判定すると、10個の円が集って動いてしまいます。画面に登場する前、壁の左側から出る前に、左壁に当たったと判定されてしまうためです。それを制御するため、画面上に登場したかどうかを覚えておく配列を使います。
boolean on[] = new boolean[10]; // 登場したかどうかのフラグ初期値はデフォルトのfalse(登場していない)です。
次のようにdraw()関数の中で、登場していない(on[]の値がfalseの)円のx座標の値が0を超えたら、on[]をtrueにします。このプログラムは一旦円が登場したら画面から出ることはないので、on[]の値が一度trueになったらfalseになることはありません。!on[i]の!は否定を表し、真偽値を逆転させます。つまりon[i]がfalseだと、!on[i]はtrueとなるので、!on[i]とifの条件に書くと、「on[i]がfalseの時」という意味になります。
if(!on[i] && x[i] > 0) on[i] = true; //登場した if(x[i]>width-d/2){//円が右の壁より右に来た ..... }else if(on[i] && x[i]<d/2){//登場中の円が左の壁より左に来た ..... }
クリックで停止⇔再開
【リスト RStraightM1】 float d = 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; for(int i=1;i<x.length;i++){ x[i]= x[i-1] - (d+5); s[i] = 3; } } void draw() { background(255); //画面背景を白でクリア for(int i=0;i<x.length;i++){ x[i] = x[i]+s[i]; if(!on[i] && x[i] > 0) on[i] = true; //登場した if(x[i]>width-d/2){//登場中の円が右の壁より右に来た x[i] = width-d/2; s[i] = -s[i]; }else if(on[i] && x[i]<d/2){//登場中の円が左の壁より左に来た x[i] = d/2; s[i] = -s[i]; } ellipse(x[i], height/2, d, d); } }