弹跳球问题

时间:2013-10-20 08:09:25

标签: c++ directx physics game-physics

我目前正致力于2D Bouncing球物理,可以上下弹跳球。物理行为很好但最后速度保持+3然后0不停,即使球已经停止弹跳。我该如何修改代码来解决这个问题?

以下视频展示了它的工作原理。 注意:Bandicam无法记录-3到0之间的速度转换。因此,当球停止弹跳时,它只显示-3。 https://www.youtube.com/watch?v=SEH5V6FBbYA&feature=youtu.be

以下是生成的报告:https://www.dropbox.com/s/4dkt0sgmrgw8pqi/report.txt

    ballPos         = D3DXVECTOR2( 50, 100 );
    velocity        = 0;
    acceleration    = 3.0f;
    isBallUp        = false;

void GameClass::Update()
{
    // v = u + at
    velocity += acceleration;

    // update ball position
    ballPos.y += velocity;

    // If the ball touches the ground
    if ( ballPos.y >= 590 )
    {
        // Bounce the ball
        ballPos.y = 590;
        velocity *= -1;
    }

    // Graphics Rendering
    m_Graphics.BeginFrame();
    ComposeFrame();
    m_Graphics.EndFrame();
}

2 个答案:

答案 0 :(得分:0)

只有当球没有躺在地上时加速:

if(ballPos.y < 590)
    velocity += accelaration;

顺便说一句,如果发现碰撞,则不应将球位置设置为590。相反,将时间转回到球撞到地面的时刻,反转速度并快进你退回的时间。

if ( ballPos.y >= 590 )
{
    auto time = (ballPos.y - 590) / velocity;
    //turn back the time
    ballPos.y = 590;
    //ball hits the ground
    velocity *= -1;
    //fast forward the time
    ballPos.y += velocity * time;
}

答案 1 :(得分:0)

当球停止弹跳时,放置一个isBounce标志使速度为零。

 void GameClass::Update()
{
    if ( isBounce )
    {
        // v = u + at
        velocity += acceleration;

        // update ball position
        ballPos.y += velocity;
    }
    else
    {
        velocity = 0;
    }

    // If the ball touches the ground
    if ( ballPos.y >= 590 )
    {
        if ( isBounce )
        {
            // Bounce the ball
            ballPos.y = 590;
           velocity *= -1;
        }


        if ( velocity == 0 )
        {
            isBounce = false;
        }
}