2015-07-02 109 views
0

我有一個問題,我認爲它與屏幕渲染及其生命週期有關。 基本上我有兩個屏幕(菜單和遊戲)。在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; 
    } 
} 

回答

1

這基本上是正確的。從render方法中調用setScreen的屏幕將自己調用hide,然後將繼續執行其render方法中的其餘代碼。因此,在嘗試繪製它之前,你正在殺死你的sprite批處理。

因此,請勿在hide方法中調用dispose。實際上,屏幕可能自己調用​​dispose的做法可能是不好的做法。您可以爲擁有它的Game類保留該類。例如,你可以做你的遊戲類是這樣的:

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

順便說一句,你應該把SpriteBatch在你的遊戲子類,並讓所有的不同的屏幕共享。無緣無故分配和釋放是一個相當大的對象。

+0

完美,謝謝。還有一個問題。看着我的兩個屏幕(主菜單和遊戲)。在他們之間切換,生活或處置它們時,最佳做法是什麼。如果我不處理它們,我應該在menuScreen中處理GameScreen的SpriteBatch嗎? – JakaK

+0

SpriteBatch應該只在遊戲完全關閉時放置(在您的Game類的'dispose'方法中),因爲您在每個屏幕上都需要它。釋放它並分配一個新的是浪費時間。對於整個屏幕來說,沒有最佳做法,因爲它取決於遊戲。我正在做一個非常簡單的遊戲,我可以隨時輕鬆地將整個遊戲保存在內存中,所以我從不處理屏幕。但是如果你的記憶力增加,你可能需要。菜單屏幕可能不會使用太多,所以除了從一個階段切換到另一個階段時,可能總是保持屏幕。 – Tenfour04