C++ gamedev:将float截断为int

Gra*_*ero 14 c++ floating-point rounding

我正在用C++制作游戏,这是一个可以在舞台上移动的坦克.坦克有一个角度(漂浮,以度为单位,我假设坦克在他的大炮指向右边时为0º),速度(浮动),并且有一个称为"deltaT"(浮动)的时间常数.

当玩家向前移动坦克时,我使用三角函数和时间函数的位置物理方程(我的意思是X(t),我不知道它是如何用英语说的),以便计算新坦克的坐标.阶段.

这是我的问题:由于从float到int的通道,不考虑最接近零的值.因此,在某些角度,坦克看起来是旋转的,但是朝不同的方向移动.

这是我的代码所做的:

1 - 首先,我通过使用坦克移动的角度来分离其组件X和Y的速度:

    float speedX = this->speed * cos(this->angle);
    float speedY = this->speed * sin(this->angle);
Run Code Online (Sandbox Code Playgroud)

2 - 然后使用我上面提到的等式来获得新的坐标:

    this->x = (int) ceil(this->x + (speedX * deltaT));
    this->y = (int) ceil(this->y - (speedY * deltaT));
Run Code Online (Sandbox Code Playgroud)

问题从第一步开始:在某些角度,cos或sin的值非常接近于零.因此,当我将它乘以速度来获得速度X时,我仍然得到一个非常低的数字,然后当我将它乘以deltaT它仍然太低时,最后当应用ceil时,这个数量完全丢失了.

例如,在94º,deltaT = 1.5,速度= 2,假设X的初始值为400,我们有:

speedX = -0.1395...
this->x = 400 //it must be 399.86..., but stays in 400 due to the ceiling
Run Code Online (Sandbox Code Playgroud)

所以,在我的游戏中,坦克看起来是旋转的,但是直接向前移动.此外,有时它向后移动但向前移动错误,反之亦然.

¿我怎样才能使油箱的方向更准确?提高deltaT的速度或值不是选项,因为它是关于坦克,而不是公式1:P

Obs*_*bot 9

如何使油箱的方向更准确?提高deltaT的速度或值不是选项,因为它是关于坦克,而不是公式1:P

您应该将您的位置值存储为floats,即使它们最终用作int屏幕定位的s.这样,你就不会失去你职位的非整数部分.int当你完成绘图时,只需在结尾处向右转.


Dav*_*rtz 5

float始终保持水箱的位置.或者,只让油箱以45度的增量旋转.决定你的游戏是使用大致的位置和标题还是精确的位置,并始终坚持这个决定.