C ++增量问题

时间:2011-09-19 03:57:15

标签: c++ auto-increment

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

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 ); }
}
  

maxspeed = 300且accel = 2(此外,speedx从0开始)

现在没有任何问题,直到我在等式中加入恒定的减速/摩擦。基本上,我有1的恒定减速度,从每帧的速度中减去。如果角色没有移动就是这样,他们就会逐渐停止。

问题在于:如果由于减速而speedx = 299,我的if语句仍为真,并且它继续添加accel,这会使速度达到301,超过最大速度。

对于这个问题会有什么好的解决方案,这将允许我有任何加速和减速值而不会使if语句绊倒?

5 个答案:

答案 0 :(得分:5)

要反转和巩固quasiverse的答案,您可以使用:

speedx = min(maxspeed, speedx + accel);

这将使用非常简单的代码添加或限制。

目前大多数建议的优势在于它只执行一次添加,或执行单次比较。

答案 1 :(得分:2)

将其更改为:

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

在这种情况下,如果加速度导致速度超过最大值,则只需将速度设置为最大值。否则就会正常加速。

或者,你可以这样做:

speedx = min(speedx + accel, maxspeed);

答案 2 :(得分:1)

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

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 ); }
}

答案 3 :(得分:1)

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

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

选项2:在您不需要时防止虚假添加。

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

当你在maxspeed时,前者将浪费一个额外的东西。当你低于maxspeed-accel时,后者会浪费比较。哪个更好取决于哪种情况更有可能。

答案 4 :(得分:0)

简单地夹住speedx似乎可以正常工作:

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