0

我目前正在研究上下弹跳球的 2D 弹跳球物理。物理行为很好,但最后速度保持 +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();
}
4

2 回答 2

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;
}
于 2013-10-21T13:10:44.197 回答
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;
        }
}
于 2013-10-21T14:19:09.627 回答