我尝试制作一款像 Jetpack Joyride 这样的游戏,其中角色会一直移动直到死亡。
相机跟随角色,一切正常,直到相机(和角色)的 x 位置达到大约 5000。
我测试过让世界上的一切都从 x 位置 5.000.000 开始。
一切开始看起来都很奇怪, Sprite 改变了它们的大小和位置。
然后,我创建了一个简单的屏幕,仅渲染 2 个矩形,当我使用“低”x 位置时,一切看起来都很好,但当我开始为相机使用“高”x 位置时,矩形会改变其形式。
请尝试一下并告诉我如何解决这个问题。
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();
}
最佳答案
您可能会在较大的 x
值时遇到浮点精度问题。 Libgdx 使用 Java 的 float
,它是一个 32 位浮点值。如果您使用 OpenGL 2.0,GLSL 着色器也会对浮点值进行一定的限制(甚至可能取决于特定的硬件)。此外,在将值转换为屏幕坐标(通过相机矩阵)时对值进行的任何转换都可能会降低可用的精度。
有关 32 位 float 中可用的浮点精度的一些背景信息,请参阅 What range of numbers can be represented in a 16-, 32- and 64-bit IEEE-754 systems? 上的答案,其中表示:
If you want an accuracy of +/-0.5 (or 2^-1), the maximum size that the number can be is 2^23. Any larger than this and the distance between floating point numbers is greater than 0.5.
What Every Computer Scientist Should Know About Floating-Point Arithmetic如果您确实想了解 float
或 double
中发生的情况,这是一个很好的引用。
回到您的具体问题。我很惊讶你在 x 偏移量为 500 万处看到了大问题(我希望你在偏移量为 800 万左右时看到小问题),但无论如何你迟早都会遇到问题。
您无法使用 double
解决此问题,因为您使用的许多 API 只接受 float
。
我认为解决这个问题的方法是每隔一段时间(例如,当关卡的一部分完成时)向下“重置”浮点 X 坐标。因此,不要只使用浮点x
来跟踪位置,而是使用整数segment
数字加上该段内的浮点x
(例如0到0之间) 10000 左右)。不过,您必须在段之间的过渡处处理一些边界情况。
关于java - 如何修复高 x 位置的 libgdx 相机错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302666/