Libgdx Box2d多个SpriteBatch和OrthographicCamera

时间:2019-05-04 02:06:26

标签: java android libgdx box2d

我想有两个SpriteBatch对象,一个用于实际的Sprite,一个用于HUD。我不知道如何让一个SpriteBatch相对于屏幕停留,而让另一个SpriteBatch围绕玩家的身体移动。我有一个用于Box2d实体的OrthographicCamera,一个用于精灵。

我认为setProjectionMatrix方法可以解决此问题,但是我可能使用的方法不正确。

In the main file:

public void render () {
        stateManager.getActiveState().update(Gdx.graphics.getDeltaTime());
        spriteBatch.setProjectionMatrix(camera.combined);
        spriteBatch.begin();
        stateManager.getActiveState().render(spriteBatch);
        spriteBatch.end();
        debugRenderer.render(world, b2dCamera.combined);
    }

stateManager.getActiveState().update(Gdx.graphics.getDeltaTime()); calls:

public void update(float dt) {
        this.player.update(dt);
        this.camera.position.set(this.player.getCenter().x * Game.getPpm(), this.player.getCenter().y * Game.getPpm(), 0);
        this.b2dCamera.position.set(this.player.getCenter().x, this.player.getCenter().y, 0);
        this.camera.update();
        this.b2dCamera.update();
        this.joystick.update();
    }

stateManager.getActiveState().render(spriteBatch); calls:

public void render(SpriteBatch spriteBatch) {
        this.playBatch.begin();
        System.out.println(playBatch.getProjectionMatrix());
        System.out.println(spriteBatch.getProjectionMatrix());
        font.draw(spriteBatch, "Hello", 0, 60);
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        this.player.render(playBatch);
        this.joystick.render(spriteBatch);
        this.world.step(Gdx.graphics.getDeltaTime(), 8, 3);
        this.playBatch.end();
    }

这给了我“ hello”,它停留在左下角,一个身体停留在中心并旋转(因为相机居中于身体的中心,并且我的精灵(与身体相关联)移动到向右旋转,同时与身体同步旋转。

我希望子画面不动(要移动到世界上,但相机应像与主体一样在其居中位置)并且与主体完全同步。

当我打印spriteBatch的ProjectionMatrix时,每次迭代都相同,但是playBatch会移动

image

更新 如果我从主文件中注释掉spriteBatch.setProjectionMatrix(camera.combined);,一切都不会改变

这可能不是让游戏具有平视效果的最佳方法,所以请告诉我您是否有更好的选择。谢谢

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我在两个spriteBatch的开始和结束处重叠,这导致发生奇怪的事情。我现在正在呼叫begin ...一个结束,开始...另一个结束。