C++增量问题
C++ increment issues
假设我有一个控制一些角色移动的方法,如下所示:
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); }
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题