C++gamedev:将float截断为int

C++ gamedev: truncating float to int

本文关键字:int float C++gamedev      更新时间:2023-10-16

我正在C++中制作一个游戏,其中有一个可以在舞台上移动的坦克。坦克有一个角度(浮动,以度为单位,我假设当他的大炮指向右边时,坦克处于0º(,一个速度(浮动(,并且有一个时间常数称为"0";deltaT";(浮动(。

当玩家向前移动坦克时,我使用三角法和位置随时间变化的物理方程(我的意思是X(t(,我不知道英语怎么说(来计算新坦克在舞台上的坐标。

这就是我的问题:由于从float到int的过程,最接近零的值没有被考虑在内。因此,在特定角度下,坦克看起来是旋转的,但移动方向不同。

这就是我的代码所做的:

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

    float speedX = this->speed * cos(this->angle);
    float speedY = this->speed * sin(this->angle);

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

    this->x = (int) ceil(this->x + (speedX * deltaT));
    this->y = (int) ceil(this->y - (speedY * deltaT));

问题从第一步开始:在某些角度,cos或sin的值非常接近零。所以,当我把它乘以速度来获得,比如说,speedX时,我仍然得到一个非常低的数字,然后当我乘以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

所以,在我的游戏中,坦克看起来是旋转的,但直接向前移动。此外,有时它向后移动得很好,但向前移动得不对,反之亦然。

我该怎么做才能使油箱的方向更准确?提高速度或deltaT的值不是选项,因为这是关于坦克的,而不是公式1。

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

您应该将位置值存储为floats,即使它们最终被用作屏幕定位的ints。这样,你就不会失去仓位的非整数部分。在绘图时,只需在末尾转换为int即可。

始终将储罐的位置保持在float s。或者,只让油箱以45度的增量旋转。决定你的游戏是使用大致的位置和标题,还是使用确切的位置和主题,并始终坚持这个决定。

您的问题不是准确性!浮点运算具有24位精度,即正/负1/16777216。没问题。

这是你的四舍五入模式。ceil四舍五入。

尝试:

int x = this->x + (speedX * deltaT) +.5f;

CCD_ 6产生0<E<1,如上铸造得到-5.lt;E<+。5,其具有一半的绝对误差。

此外,避免使用双重数学。ceil是双重版本,你指的是ceilf。从技术上讲,您的代码强制转换float->double->int。你从中一无所获,但这需要时间。

最后。。。真正的问题:

你的准确性问题实际上是因为你在积累!所以0<E<1.每帧
在60Hz=>0<E<60*秒。因此,在0<E<3600
如果X/Y是像素坐标,那就是整个屏幕!难怪你在挣扎。

不管你怎么转,这总是一个问题。相反,您需要在四舍五入之前存储浮点结果。因此,绝对误差总是0<E<1.或-5.5f<E<5f用于中点舍入。尝试添加一个新的浮点位置-XPos/YPos

this->XPos += speedX * deltaT;
this->YPos += speedY * deltaT;
this->x = static_cast<int>(this->XPos+.5f);
this->y = static_cast<int>(this->YPos+.5f);

你现在应该可以顺利地四处走动了。

附言:英语中的单词是"parameter",https://en.wikipedia.org/wiki/Parametric_equation