有機會,你在你的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實例化的方式,並在實例化兩次時確定問題。
來源
2015-06-01 20:55:20
RDO
您使用'每個'GameState' Screen'實現? – EpicPandaForce 2014-10-12 09:49:36
不,我應該這樣做嗎? – ClashOfClansPhil 2014-10-12 12:10:27