LibGDX游戏暂停状态:动画闪烁/错误

时间:2017-09-06 16:57:54

标签: java android libgdx state pause

我正在尝试为以下游戏实施暂停选项。通过按后退按钮我的游戏应该转到updatePause()方法。但它反复渲染最新的2-3帧。让它看起来像是闪烁的"。

试图阻止这种情况,我已经添加(在评论中)非连续渲染,这防止了闪烁。但后来我面临的问题是不止一次按下后退按钮会渲染另一帧。 (其中一个闪烁的帧)。这是我的代码结构:

public class GameScreen implements Screen {
    private static final int GAME_RUNNING = 0;
    private static final int GAME_PAUSED = 1;
    private static final int GAME_OVER = 2;
    private static final int GAME_LEVEL_END = 3;
    private int gameState;

    private GdxGame game;

    //create()
    public GameScreen(final GdxGame game) {
        //create all the stuff
    }

    @Override
    public void render(float deltaTime) {
        switch (gameState) {
            case GAME_RUNNING:
                updateRunning(deltaTime);
                break;
            case GAME_PAUSED:
                updatePause(deltaTime);
                break;
            case GAME_OVER:
                updateGameOver();
                break;
        }
    }

    public void updateRunning(float deltaTime) {
        //draw section
        if (gameState == GAME_RUNNING) {
            game.batch.begin();
            //Draw some stuff
            game.batch.end();

            //move section
            handleInput();
        }
    }

    public void updatePause(float deltaTime) {
        //Gdx.graphics.setContinuousRendering(false);
        //resume
        if (Gdx.input.isTouched()) {
            gameState = GAME_RUNNING;
            //Gdx.graphics.setContinuousRendering(true);
            return;
        }
    }

    private void handleInput() {
        //catch back button
        Gdx.input.setCatchBackKey(true);
        if (Gdx.input.isKeyJustPressed(Input.Keys.BACK)) {
            gameState = GAME_PAUSED;
            return;
        }
    }
}

任何防止闪烁的提示?

4 个答案:

答案 0 :(得分:3)

render()方法应该在屏幕上绘制内容。如果没有,那么后台缓冲区的内容将是未定义的(因此可能包含前一帧)并且你得到这个闪烁。

禁用连续渲染听起来像是一种很好的方法。或者,即使游戏暂停,也要继续绘图。

答案 1 :(得分:1)

正如托马斯在答案中指出的那样。它应该绘制每一帧。

我还没有看到你在屏幕上画任何东西,所以backbuffer可能只包含垃圾信息。解决此问题的一种方法是始终清除render()顶部的屏幕。这意味着当您立即切换到另一个游戏状态时,它将确保屏幕清晰,并且没有您所经历的闪烁结果。

public void render(float deltaTime) {
    // clear screen
    Gdx.gl.glClearColor(0f, 0f, 0f, 1.0f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    ...
}

答案 2 :(得分:0)

屏幕上的所有对象或只有使用动画的对象是否会发生噼啪声?

答案 3 :(得分:0)

正如托马斯所说:继续绘画是解决问题的一种方法。所以我绘制了最新的帧并禁用了连续渲染。结果是没有任何错误并让CPU休息。

相关问题