落下…ひとつ(横へ打出し)
ひとつの円が、水平に打出され、落下します。下方向の加速度を受けて落下する点、壁に当たったとき運動が減衰する点は、速度が変化する部分以外は、ひとつ(落下)【リスト FallVertical】と同じです。 水平方向の初速度があるので、x、y両方の方向で速度が変化します。
下の壁に当たったかの判定は、次のようになっています。
if(y>height-1-r){//下の壁にあたった
y = height-1-r; //下の壁の上に置く
........
}
なぜ-1しているかというと、円が下の壁(床)を転がる時、めり込んで見えるのを防ぐための調整です。画面の一番下の座標はheight-1であるからです。
【リスト FallVertical】では、円の下部が壁より下にきたかの判定を、if(y>height-r)としていましたが、この例は床面上にとどまることなくバウンドするので、見た目に差が出ないため、簡略に書いていました。
クリックで停止⇔再開
【リスト FallHorizon】
float r = 5; // 円の半径
float g = 2; //加速度
float friction=0.92; //減衰
float x, y; // 位置
float dy, dx=3; // 移動速度
void setup() {
size(150, 150); //描画するための画面
fill(0);
}
void draw() {
background(255); //画面背景を白でクリア
ballFall();
ellipse(x, y, 2*r, 2*r);
}
void ballFall(){
dy = dy + g;
y = y+dy; //y座標を動かす
x = x+dx; //x座標を動かす
if (y>height-1-r){//下の壁にあたった
y = height-1-r; //下の壁の上に置く
dy = -dy * friction; //方向反転、減衰
if(abs(dy)<=g/2 && abs(dx)<=g/2) { //ほぼ止まった
dy=0; y=0; x=0; dx=3;
}
}else if(y<r){//上の壁にあたった
y = r;
dy = -dy * friction; //方向反転、減衰
}
if(x&glt;width-r){ //右の壁にあたった
x = width-r;
dx = -dx * friction; //方向反転、減衰
}else if(x<r){ //左の壁にあたった
x = r;
dx = -dx * friction; //方向反転、減衰
}
}