2

我试着做一个像 Jetpack Joyride 这样的游戏,角色会一直移动直到你死去。

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

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

一切开始看起来很奇怪,精灵改变了它们的大小和位置oO

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

1 回答 1

2

x您可能会遇到较大值的浮点精度问题。Libgdx 使用 Java 的float,它是一个 32 位浮点值。如果您使用的是 OpenGL 2.0,GLSL 着色器也会很好地限制浮点值(它甚至可能取决于特定的硬件)。此外,在将值转换为屏幕坐标时(通过您的相机矩阵)对这些值进行的任何转换都可能会降低您可用的精度。

有关 32 位浮点数中可用的浮点精度的一些背景知识,请参阅在 16 位、32 位和 64 位 IEEE-754 系统中可以表示的数字范围是多少?,其中说:

如果您希望精度为 +/-0.5(或 2^-1),则该数字的最大大小为 2^23。任何大于此的浮点数之间的距离大于 0.5。

如果您真的想了解afloatdouble.

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

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

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

于 2013-06-25T19:20:30.383 回答