我有一個問題,我認爲它與屏幕渲染及其生命週期有關。 基本上我有兩個屏幕(菜單和遊戲)。在GameScreen渲染方法中,我調用World.update,之後渲染。在(GameScreen的)隱藏方法中,我從Redner類處理SpriteBatch。LibGdx屏幕:渲染和生命週期
所以,當我將遊戲切換到菜單(在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;
}
}
完美,謝謝。還有一個問題。看着我的兩個屏幕(主菜單和遊戲)。在他們之間切換,生活或處置它們時,最佳做法是什麼。如果我不處理它們,我應該在menuScreen中處理GameScreen的SpriteBatch嗎? – JakaK
SpriteBatch應該只在遊戲完全關閉時放置(在您的Game類的'dispose'方法中),因爲您在每個屏幕上都需要它。釋放它並分配一個新的是浪費時間。對於整個屏幕來說,沒有最佳做法,因爲它取決於遊戲。我正在做一個非常簡單的遊戲,我可以隨時輕鬆地將整個遊戲保存在內存中,所以我從不處理屏幕。但是如果你的記憶力增加,你可能需要。菜單屏幕可能不會使用太多,所以除了從一個階段切換到另一個階段時,可能總是保持屏幕。 – Tenfour04