C++增量问题

C++ increment issues

本文关键字:问题 C++      更新时间:2023-10-16

假设我有一个控制一些角色移动的方法,如下所示:

void Player::moveRight( Uint32 ticks ) 
{ 
    if( speedx < maxspeed ) { speedx += accel; }
    x += speedx * ( ticks / 1000.f );
    //collision
    if( x > (float)( 800 - width ) ) { x = (float)( 800 - width ); }
}

最大速度=300,加速度=2(同样,速度x从0开始(

现在这并没有错,直到我在方程中加入一个恒定的减速度/摩擦力。基本上,我有一个恒定的减速度1,它是从每帧的速度中减去的。因此,如果角色不动,它们就会逐渐停止。

问题是:如果speedx = 299是因为减速,我的If语句仍然成立,它继续添加accel,使速度达到301,超过最大速度。

对于这个问题,有什么好的解决方案,可以让我得到任何加速度和减速度值,而不会绊倒if语句?

要反转和合并准宇宙的答案,可以使用:

speedx = min(maxspeed, speedx + accel);

这将使用非常琐碎的代码适当地添加或封顶。

与当前大多数建议相比,它的优点是只执行一次加法或执行一次比较。

将其更改为:

if (speedx + accel > maxspeed) { speed = maxspeed; }
else speed += accel;

在这种情况下,如果加速度导致速度超过最大值,它将简单地将速度设置为最大值。否则就是正常加速。

或者,你可以做:

speedx = min(speedx + accel, maxspeed);

最简单的修复方法可能是在调整后削减速度:

void Player::moveRight( Uint32 ticks ) 
{ 
    speedx += accel;
    if( speedx >= maxspeed ) { speedx = maxspeed }
    x += speedx * ( ticks / 1000.f );
    //collision
    if( x > (float)( 800 - width ) ) { x = (float)( 800 - width ); }
}

选项1:在maxspeed处截断speedx。代码紧凑。

speedx += accel;
if (speedx > maxspeed) { speedx = maxspeed; }

选项2:当你不需要时,防止虚假添加。

if (speedx < maxspeed) {
  speedx += accel;
  if (speedx > maxspeed) { speedx = maxspeed; }
}

当你在maxspeed时,前者会浪费一个加法。当你低于maxspeed-accel时,后者浪费了一个比较。哪个更好取决于哪个场景更有可能。

简单地夹紧speedx似乎可以很好地工作:

if ( speedx < maxspeed ) { speedx = min(speedx+accel,maxspeed); }