假设我有一个控制某些角色移动的方法,如下所示:
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语句绊倒?
答案 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); }