首页 文章

LibGdx屏幕:渲染和生命周期

提问于
浏览
0

我有一个问题,我认为它与Screen渲染及其生命周期有关 . 基本上我有两个屏幕(菜单和游戏) . 在GameScreen渲染方法中,我调用World.update,然后调用我的渲染 . 在hide方法(GameScreen)中,我从Redner类处理SpriteBatch .

因此,当我将屏幕从Game更改为Menu(在World.update中)时,Java崩溃了 . 据我所知,出售事故正在发生 . 所以我的问题是,当我在渲染周期的中间设置一个新的屏幕时,渲染周期是否还要用旧屏幕完成?意思是,我在渲染完成之前调用batch.dispose,这就是我遇到问题的原因吗?

谢谢你的帮助

public class GameScreen extends AbstractGameScreen {
    private static final String TAG = GameScreen.class.getName();

    private WorldController worldController;
    private WorldRenderer worldRenderer;

    private boolean paused;

    public GameScreen(Game game) {
        super(game);
    }

    @Override
    public void render(float deltaTime) {
        // Do not update game world when paused
        if (!paused) {
            // Update game world by the time that has passed since last render time
            worldController.update(deltaTime);
        }
        // Sets the clear screen color to: Cornflower Blue
        Gdx.gl.glClearColor(0x64 / 255.0f, 0x95 / 255.0f, 0xed / 255.0f, 0xff / 255.0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        // Render game world to screen
        worldRenderer.render();
    }

    @Override
    public void resize(int width, int height) {
        worldRenderer.resize(width, height);
    }

    @Override
    public void show() { // Similar as create method
        worldController = new WorldController(game);
        worldRenderer = new WorldRenderer(worldController);
        Gdx.input.setCatchBackKey(true);
    }

    @Override
    public void hide() { // Similar to dispose method
        worldRenderer.dispose();
        Gdx.input.setCatchBackKey(false);
    }

    @Override
    public void pause() {
        paused = true;
    }

    @Override
    public void resume() {
        super.resume();
        // Only called on Android
        paused = false;
    }
}

1 回答

  • 1

    这基本上是正确的 . 从 render 方法中调用 setScreen 的屏幕将自动调用 hide ,然后将在其 render 方法中继续执行其余代码 . 因此,在尝试使用它进行绘制之前,您正在杀死精灵批处理 .

    所以不要在 hide 方法中调用 dispose . 事实上,屏幕自身调用 dispose 可能是不好的做法 . 您可以为拥有它的Game类保留该值 . 例如,您可以在游戏类中执行以下操作:

    @Override
    public void render() {
        super.render();
        if (getScreen() != gameScreen && gameScreen != null) {
            gameScreen.dispose();
            gameScreen = null;
        }
    }
    

    顺便说一下,你应该将SpriteBatch放在你的Game子类中,让所有不同的屏幕共享它 . 无缘无故地分配和解除分配是一个相当大的目标 .

相关问题