java - 如何修复高 x 位置的 libgdx 相机错误?

标签 java camera libgdx

我尝试制作一款像 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如果您确实想了解 floatdouble 中发生的情况,这是一个很好的引用。

回到您的具体问题。我很惊讶你在 x 偏移量为 500 万处看到了大问题(我希望你在偏移量为 800 万左右时看到小问题),但无论如何你迟早都会遇到问题。

您无法使用 double 解决此问题,因为您使用的许多 API 只接受 float

我认为解决这个问题的方法是每隔一段时间(例如,当关卡的一部分完成时)向下“重置”浮点 X 坐标。因此,不要只使用浮点x来跟踪位置,而是使用整数segment数字加上该段内的浮点x(例如0到0之间) 10000 左右)。不过,您必须在段之间的过渡处处理一些边界情况。

关于java - 如何修复高 x 位置的 libgdx 相机错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302666/

相关文章:

java - 客户端 session

java - libgdx (Ashley Framework ECS) - 系统与另一个系统对话的正确方式是什么?

java - 如何在 Libgdx 中调整 Sprite 的大小?

java - 代码编译正常,但 JVM 抛出 NullPointerException

java - 根据java中的字符串条件分割成数组

ios - 在 iphone 模拟器上使用 UIImagePickerController

android - 如何用视频文件替换 Android 相机模拟?

ios - 将 Libgdx 游戏移植到 RoboVM com.badlogic.gdx.graphics.g2d.freetype.FreeType$Face.getSize(Native Method) 时出现 UnsatisfiedLinkError

Java websocket - 立即关闭连接

java - 从 Android 中的视频图像中获取帧