2011-11-02 224 views
6

我正在练习一些简单的2D游戏编程,并提出了一个理论,在动画过程中(图像位置的实际变化最好用浮点数计算)。我有一种感觉,如果你用整数移动图像,动画就不会那么平滑。将双精度(或浮点数)转换为整数会发生什么?

在Java中,似乎你不能用浮点数来绘制图像来给图像定位。但显然当你最初声明你的xy的时候,你可以声明它们为Double或Float,而当涉及到实际绘制图像时,你必须将它们投射到整数。就像我找到HERE

/** 
* 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); 
} 

我的问题是关于Java如何处理转换? 如果代码在最后一刻投出这些双打,为什么他们首先是双打? Java是否隐藏小数点后的数字?

我知道在C和C++小数点后的数字被截断,你只能看到它之前的数字。 Java如何处理这种转换?

+2

它只是丢弃小数点,与C,C++一样。 http://www.fluffycat.com/Java/Cas​​ting/ – dmcnelis

+0

您应该尽可能多地进行双倍的计算,并且当您最终将其传递给接受int的方法时,您可以执行Math.round()。 – Stephan

回答

4

显示器上的像素是离散的并且数量有限;因此显示坐标需要是整数 - 浮点数是没有意义的,因为你在物理上没有像素。 (341.4, 234,7)

也就是说,整数应该只用于最后的绘图阶段。当你计算物体移动,速度等时,你需要使用浮点数。整数将导致惊人数量的精度问题。请看下面的代码片段:

a = 1; 
x = (a/2) * 2; 

如果ax是浮点数,x最终将有1预期数量。如果它们是整数,则会得到0

基线:使用浮点类型进行物理计算,并在绘图时将其转换为int。这将使您能够按照所需的精度执行物理计算。

编辑:

至于从FP数目为整数转换而言,而FP数目有较大的范围,归一化到绘图区大小通常不应溢出后通过您的物理计算产生的值int类型。

这就是说,爪哇转换为整数类型,它可以创建工件时(例如,与在最右边的像素列中没有像素的动画,由于例如639.9被转换为639而非640)截断该浮点数。您可能想看看Math.round()或Java提供的一些其他舍入方法,以获得更合理的结果。

2

Java通过删除小数将float转换为int。但我不认为浮点数中的x和y坐标是有意义的。屏幕上的像素不能以小于一个像素的形式呈现。例如,您不能绘制像素.5px x .5px,因为在屏幕上它将只是1px x 1px像素。我不是电脑游戏程序员,但我已经用Java编写了一个动画引擎,并且非常流畅。如果你愿意,我可以分享。

请注意,您应该使用整数绘制,但使用双打进行所有计算。对于旋转或依赖于数学公式的任何事情,都应该用十进制来完成。

+1

由于各种原因,浮动是有用的 - 其中,“sin' /'cos'(几乎是一个体面轮换的必要条件)实际上需要它们,许多矩阵运算符可以从数字取小数值的能力中受益。你把它们变成整数,你最终失去了很大的灵活性(除非你想编写你自己的整数trig函数等)。所以很多人会将他们保持为双打或浮动状态,直到他们绝对必须投注。 – cHao

+0

这是真的。我不是故意以整数进行计算。在我的应用程序中,我仍然使用整数进行所有计算,并使用整数绘制。我会更新以反映这个笔记。 –

+0

@AmirRaminfar我可以看看吗? – mastrgamr

3

Java截断小数。例如:

(int) 2.34 == 2 
(int) 2.90 == 2 

原因不能够得出在浮动位置很简单,没有半像素等:)

+0

我明白了。感谢您的输入,这是有道理的 – mastrgamr

1

原因x和y需要被双打是当他们需要以数学方式计算,例如:

x += (delta * dx)/1000; 

想要避免溢出和精度损失,直到绘制像素为止。

+0

所以我猜在双投之前,它的计算是尽可能接近最接近准确的整数? (如果这是有道理的O_o) – mastrgamr

相关问题