振動運動リストに戻る    印刷する

落下…ひとつ(横へ打出し)

ひとつの円が、水平に打出され、落下します。
下方向の加速度を受けて落下する点、壁に当たったとき運動が減衰する点は、速度が変化する部分以外は、ひとつ(落下)【リスト FallVertical】と同じです。 水平方向の初速度があるので、x、y両方の方向で速度が変化します。
下の壁に当たったかの判定は、次のようになっています。
 if(y>height-1-r){//下の壁にあたった
    y = height-1-r; //下の壁の上に置く
    ........
 }
なぜ-1しているかというと、円が下の壁(床)を転がる時、めり込んで見えるのを防ぐための調整です。画面の一番下の座標はheight-1であるからです。 【リスト FallVertical】では、円の下部が壁より下にきたかの判定を、if(y>height-r)としていましたが、この例は床面上にとどまることなくバウンドするので、見た目に差が出ないため、簡略に書いていました。

Your browser does not support the canvas tag.

クリックで停止⇔再開
【リスト 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;  //方向反転、減衰
    }
}

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