我试图做一个像Jetpack Joyride这样的游戏,角色一直在移动,直到你死去。
相机跟随角色,一切都很好,直到相机(和角色)的x位置达到约5000.
我测试过让世界上的所有东西都从5.000.000的x位置开始。
一切都开始看起来很奇怪,精灵改变了他们的大小和位置o.O。
然后我创建了一个简单的屏幕,只显示2个矩形,当我使用“低”x位置时,一切看起来都很好,但是当我开始使用相机的“高”x位置时,矩形会改变它们的形状。 / p>
请尝试并告诉我如何解决此问题。
public ArsenalScreen(AwesomeRun game)
{
this.game = game;
renderer = new ShapeRenderer();
batch = new SpriteBatch();
camera = new OrthographicCamera();
camera.setToOrtho(false, 20, 20);
camera.viewportWidth = 30;
camera.viewportHeight = 20;
camera.position.x = 3;
// camera.position.x = 300000000;
camera.update(true);
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0.5f,0.5f,0.5f,1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
renderer.setProjectionMatrix(camera.combined);
renderer.begin(ShapeType.Rectangle);
renderer.identity();
renderer.rect(camera.position.x, camera.position.y, camera.viewportWidth/4, camera.viewportHeight/4);
renderer.rect(camera.position.x-camera.viewportWidth/2+0.5f, camera.position.y-camera.viewportHeight/2, camera.viewportWidth, camera.viewportHeight);
renderer.end();
}
答案 0 :(得分:2)
您可能遇到大x
值的浮点精度问题。 Libgdx使用Java的float
,这是一个32位的浮点值。如果您正在使用OpenGL 2.0,那么GLSL着色器也会对浮点值进行一定程度的约束(甚至可以依赖于特定的硬件)。此外,在将值转换为屏幕坐标(通过相机矩阵)时对值进行的任何转换都可能降低您可用的精度。
有关32位浮点中可用浮点精度的一些背景知识,请参阅What range of numbers can be represented in a 16-, 32- and 64-bit IEEE-754 systems?上的答案,其中说明:
如果您真的想了解如果您想要+/- 0.5(或2 ^ -1)的精度,则该数字的最大大小为2 ^ 23。大于此值且浮点数之间的距离大于0.5。
float
或double
中发生的情况,What Every Computer Scientist Should Know About Floating-Point Arithmetic是一个很好的参考。
回到您的具体问题。我很惊讶你看到x偏移量为500万的大问题(我希望你能看到大约800万的偏差时出现小问题),但无论如何你迟早会遇到问题。
您无法使用double
解决此问题,因为您使用的许多API只接受float
。
我认为解决这个问题的方法是每隔一段时间“重置”浮点X坐标(例如,当一个关卡的一部分完成时)。因此,不是仅使用浮点x
来跟踪位置,而是在该段中使用整数segment
数字加上浮点x
(例如介于0和10000之间)。但是,您必须在段之间的过渡处理一些边界情况。