我正在练习一些简单的2D游戏编程,并提出了一种理论,即在动画期间(图像位置的实际变化最好用浮点数计算)。我有一种感觉,如果用图像移动图像,动画将不会那么平滑。
在Java中,似乎无法使用浮点数绘制图像以使图像具有位置。但显然当你最初声明 x 和 y 时,你可以将它们声明为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如何处理这个演员?
答案 0 :(得分:4)
Java截断小数。例如:
(int) 2.34 == 2
(int) 2.90 == 2
无法在浮动位置绘制的原因很简单,就是没有半像素等:)
答案 1 :(得分:4)
显示器上的像素是离散的并且数量有限;因此显示坐标需要是整数 - 浮点数没有意义,因为你在物理上没有像素。 (341.4, 234,7)
。
也就是说,整数只应在最终绘图阶段使用。计算对象移动,速度等时,需要使用浮点数。整数将导致数量惊人的精度问题。请考虑以下代码段:
a = 1;
x = (a / 2) * 2;
如果a
和x
是浮点数,x
最终将具有预期的1
数。如果它们是整数,您将获得0
。
基线:使用浮点类型进行物理计算,并在绘图时转换为int
。这将允许您以所需的精度执行物理计算。
编辑:
就从FP编号到整数的转换而言,虽然FP编号具有更大的范围,但是在规范化到绘图区域大小之后由物理计算产生的值通常不会溢出int
类型。
也就是说,Java在转换为整数类型时会截断浮点数,这会产生伪像(例如,最右边像素列没有像素的动画,因为例如639.9
被转换为{{1}而不是639
)。您可能希望查看Math.round()
或Java提供的一些其他舍入方法,以获得更合理的结果。
答案 2 :(得分:2)
Java通过删除小数将浮动转换为int。但我不认为在浮点数中使用x和y坐标是有意义的。屏幕上有像素,不能以小于一个像素的形式显示。例如,您无法绘制像素.5px x .5px
,因为在屏幕上它只是1px x 1px
像素。我不是电脑游戏程序员,但我用Java编写了一个动画引擎,它非常流畅。如果你愿意,我可以分享这个。
请注意,您应该使用整数绘制,但使用双精度进行所有计算。对于旋转或任何依赖于数学公式的东西应该用十进制来完成。
答案 3 :(得分:1)
x和y需要加倍的原因是因为它们需要以数学方式计算,例如:
x += (delta * dx) / 1000;
在绘制像素之前,您希望避免溢出和精度损失。