2014-10-12 21 views
3

我使用libgdx開始了一個項目,並且我的GameState菜單和Play有一個GameStateManager。GameStateManager LibGDX

如果我運行該項目,它會顯示菜單,然後我可以點擊一個按鈕來打開Play GameState。 問題是,當我結束了遊戲,它應該再次顯示菜單狀態,但我得到一個黑屏。我測試了render()方法是否開始(使用System.out ...),並且Menu中的render()方法正在啓動。

我不確定爲什麼當我「重新打開」菜單狀態時我會看到黑屏。也許它不工作,因爲我在Play中使用Box2D,但我不知道。

這裏是一些代碼:

這是在玩這應該打開菜單,如果球員是在最後的方法:

public void playerEnded() { 

    gsm.setState(GameStateManager.MENU); 

} 

也許你能告訴我,如果我有結束的Box2D東西左右。 我希望有人能幫助我,如果你想要更多的代碼 - 沒問題。

+0

您使用'每個'GameState' Screen'實現? – EpicPandaForce 2014-10-12 09:49:36

+0

不,我應該這樣做嗎? – ClashOfClansPhil 2014-10-12 12:10:27

回答

2

您的自定義GameStateManager應該繼承這個類:

http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/Game.html

要改變你應該使用Game.setScreen(屏幕屏幕)屏幕

每個不同的屏幕應該是屏幕的實現。

所以它在我的libGDX項目中的工作方式是GameScreen擴展了Screen,MenuScreen擴展了Screen。這樣我就可以改變什麼畫面。

這一切都可以追溯到接口和多態,所以如果你沒有得到這些概念,只要給它一個快速的谷歌,你會知道你需要做什麼。

1

有機會,你在你的GameStateManager定義

Stack<GameState> gameStates 

來管理您的GameStates。

如果是這樣,你可以做一些閱讀使用堆棧。無論如何,這裏有什麼可以解決你的問題: 我假設你在你的GamestateManager中有以下結構;

public void setState(int state){ 
    popState(); 
    pushState(state); 
} 
public void pushState(int state){ 
    gameStates.push(getState(state)); 
} 
public void popState(){ 
    GameState g = gameStates.pop(); 
    g.dispose(); 
} 

private GameState getState(int state){ 
    if(state == MENU) return new Menu(this); 
    if(state == PLAY) return new Play(this); 
    return null; 
} 

當您在Menu-GameState中單擊開始按鈕時,您將需要啓動Play-GameState。 現在,而不是使用setState方法,它刪除頂部狀態(彈出),然後推動新的狀態。嘗試僅使用pushState方法。這會將您的新的Play-GameState放在GameState-Stack的Menu-GameState之上。

當您完成遊戲時,您可以彈出您的Play-GameState,並且Menu-GameState應該重新出現。但是這一次它不會實例化一個新對象,而是重新使用您在開始遊戲時使用的對象。

// in the Menu-GameState: 
public void startPlay() { 
    gsm.pushState(GameStateManager.PLAY); 
} 

// in the Play-GameState: 
public void playerEnded() { 
    gsm.popState(); 
} 

這不會影響遊戲性能,你會使且僅是在堆棧頂部的遊戲狀態,這樣的更新您的遊戲:

public void update(float dt) { 
    gameStates.peek().update(dt); 
} 

public void render() { 
    gameStates.peek().render(); 
} 

Peek方法採用的遊戲狀態從堆棧的頂部,但留在那裏。

唯一的缺點是Menu-Gamestate會在播放狀態期間保留在內存中。另外,如果此方法有效,您仍然可以按照自己的方式執行此操作,但您應該檢查Menu-GameState實例化的方式,並在實例化兩次時確定問題。

0

我在遊戲中實現了一個類似的StageManager。如果您在遊戲中使用視口/攝像頭,那麼當您返回到菜單狀態時,視口可能仍會設置爲遊戲狀態的視口。

對於我的應用程序,我有我的國家有類每當狀態變成活躍狀態這將被稱爲激活()方法:

public void activate(){ 
    stage.getViewport().update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
}