【问题标题】:How can i fix the libgdx camera bug with high x - positions?如何修复具有高 x 位置的 libgdx 相机错误?
【发布时间】:2013-06-25 16:27:37
【问题描述】:

我尝试过制作像 Jetpack Joyride 这样的游戏,其中角色会一直移动直到你死去。

相机跟随角色,一切都很好,直到相机(和角色)的 x 位置达到大约 5000。

我测试让世界上的一切都从 x 位置 5.000.000 开始。

一切都开始变得很奇怪,精灵改变了它们的大小和位置 o.O.

然后我创建了一个仅呈现 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();
    }

【问题讨论】:

    标签: java camera libgdx


    【解决方案1】:

    您可能会遇到较大的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。

    如果您真的想了解floatdouble 中发生的事情,What Every Computer Scientist Should Know About Floating-Point Arithmetic 是一个很好的参考。

    回到您的具体问题。我很惊讶您会在 500 万的 x 偏移处看到大问题(我希望您在大约 800 万的偏移处看到小问题),但无论如何您迟早肯定会遇到问题。

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

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

    【讨论】:

    • 感谢您的准确回答。在我的角色达到 1000 或更多的 x 位置后,我通过“重置”世界上的每一个对象来解决你所说的问题。我只是将每个对象的每个 x 坐标减去 1000,你看不到任何口吃。我希望你是这么说的,因为英语不是我的母语,所以我有一点困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2019-06-03
    • 2015-12-21
    • 1970-01-01
    • 2017-03-30
    相关资源
    最近更新 更多