C++gamedev:将float截断为int
C++ gamedev: truncating float to int
我正在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
您应该将位置值存储为float
s,即使它们最终被用作屏幕定位的int
s。这样,你就不会失去仓位的非整数部分。在绘图时,只需在末尾转换为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
- 没有从阵列<float>到阵列<int>的可行转换
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 如何将 qml 的文本转换为 float 和 int
- 有没有比static_cast更优雅的从int到float的演员阵容<float>?
- 如何在函数中将字符串和分数存储为(Int 或 float)
- 谷歌测试编译错误 Os X:函数式转换从"int"到"internal::FloatingEq2Matcher"的模糊转换<float>
- 如何使用 std:from_chars 在 C++17 中从字符串转换为 int/float
- 如何修复 E2015 "ambiguity between pow(double,double) and pow(float,int)"
- C++优化从 int 到 float 的数组转换
- 如何在 c++ 中将数据从文件读取到 int/float 值
- 错误:二进制'operator*' 'int [1]'和'float'类型的操作数无效
- 功能使用INT和Float类型作为C 中的参数过载
- 内部字符串/字符如何在 int 和 float 中存储
- 无法将'int*'转换为参数'1'的'float*'
- 将 python list 作为 'float*' 或 'int*' 传递给 C/C++
- 在C++/Visual Studio中,通过给定数据格式(doubles、float、int、1位bools)的UDP发
- 当float转换为int时,此代码中是如何/为什么进行缩小的
- C++ 将字符串转换为 16 位无符号/有符号的 int/float
- C++:int*/float*到char*,为什么使用repret_cast会得到不同的结果
- 如何在等待用户输入int, float或其他类型时拒绝输入char/string