2

次の関数をループで実行しています。基本の弾むボールです。私の問題は、バウンスごとにボールの dy が増加することです。毎回同じ高さに跳ね返るようにするにはどうすればよいですか?

function ballUpdate(elapsed)
{
    var timeModifier = elapsed;
    ball.x += (ball.dx*timeModifier);
    ball.y += (ball.dy*timeModifier);
    if(ball.y <= 0)
    {
        ball.dy *= -1;
        ball.y = 0;
    }
    else if(ball.y > 0)
    {
        ball.dy += -.5*timeModifier;
    }
}

function draw()
{
    ball.update();
}

function main(elapsed)
{
    keyinput(elapsed);
    ballUpdate(elapsed);
}

animLoop(main,draw,15);
4

1 に答える 1

1
  1. 最初の明らかなエラーは、速度に経過時間を掛けようとしているということです...うまくいきません。あなたがしなければならないことは、すべての反復で速度 (dx,dy) を (x,y) に追加することです...だから、この経過を忘れてください。

  2. 加速度は常に存在します... if(ball.y > 0)は必要ありません

  3. ボールが限界(床)に触れたときの調整ボール.y = 0のため、反転速度は十分ではありません。実際に限界に達したときのボールの正確な速度を考慮する必要があります。そのためには、ここでポテンシャル エネルギー + kinect エネルギーの概念を使用する必要があります(方程式の詳細を知りたい場合は、Google で検索してください)。


基本的にこれはあなたが望むものです。

function ballUpdate(elapsed)
{   
    var acceleration = -0.5;

    ball.x += ball.dx;
    ball.y += ball.dy;

    if ( ball.y <= 0 )
    {
        ball.dy = Math.sqrt( -2 * acceleration * ( ball.y - ball.dy ) + ball.dy * ball.dy );
        ball.y = 0;
    }

    ball.dy += acceleration;
}

コピーアンドペースト。それはうまくいくはずです。私がここで行ったことは、ボールが限界に達する前の位置エネルギーと、限界に達する前のボールのキネクト エネルギーを合わせて、ボールの総エネルギーを測定することです。その後、この量のエネルギーを完全に kinect エネルギーに変換したので、限界に達したときのボールの速度である新しいスピーディーが得られます。(床など)。

于 2013-05-13T08:21:33.367 に答える