我正在练习一些简单的2D游戏编程,并提出了一种理论,即在动画期间(图像位置的实际变化最好用浮点数计算).我有一种感觉,如果用图像移动图像,动画将不会那么平滑.
在Java中,似乎无法使用浮点数绘制图像以为图像提供位置.但显然当你最初声明你的x和y时,你可以将它们声明为Double或Float,当涉及到实际绘制图像时,你必须将它们转换为int.就像我在这里找到的:
/**
* Draw this entity to the graphics context provided
*
* @param g The graphics context on which to draw
*/
public void draw(Graphics g) {
sprite.draw(g,(int) x,(int) y);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是Java如何处理转换?如果代码在最后一刻投出这些双打,为什么首先将它们作为双打?Java会隐藏小数点后的数字吗?
我知道在C和C++中,小数点后的数字会被截断,你只看到它之前的数字.Java如何处理这个转换?
显示器上的像素是离散的且数量有限;因此显示坐标必须是整数 - 浮点数没有意义,因为您在物理上没有像素,例如(341.4, 234,7)
。
也就是说,整数应该只在最后的绘图阶段使用。当您计算对象移动、速度等时,您需要使用浮点数。整数会导致数量惊人的精度问题。考虑以下片段:
a = 1;
x = (a / 2) * 2;
Run Code Online (Sandbox Code Playgroud)
如果a
和x
是浮点数,x
则最终将具有1
. 如果它们是整数,您将得到0
.
基线:使用浮点类型进行物理计算并int
在绘图时转换为。这将使您能够以所需的精度执行物理计算。
编辑:
就从 FP 数到整数的转换而言,虽然 FP 数具有更大的范围,但在归一化到绘图区域大小后由物理计算产生的值通常不应溢出int
类型。
也就是说,Java 在转换为整数类型时会截断浮点数,这会产生伪影(例如,最右边的像素列没有像素的动画,因为例如639.9
被转换为639
而非640
)。您可能想查看Math.round()
或查看Java 提供的其他一些舍入方法以获得更合理的结果。