落下…ひとつ(横へ打出し)
ひとつの円が、水平に打出され、落下します。下方向の加速度を受けて落下する点、壁に当たったとき運動が減衰する点は、速度が変化する部分以外は、ひとつ(落下)【リスト 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; //方向反転、減衰 } }