我目前正致力于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();
}
答案 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;
}
}