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

时间:2013-06-25 16:27:38

标签: java camera libgdx

我试图做一个像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();
    }

1 个答案:

答案 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。

如果您真的想了解floatdouble中发生的情况,

What Every Computer Scientist Should Know About Floating-Point Arithmetic是一个很好的参考。

回到您的具体问题。我很惊讶你看到x偏移量为500万的大问题(我希望你能看到大约800万的偏差时出现小问题),但无论如何你迟早会遇到问题。

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

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