2017-06-21 29 views
1

我是Phaser的新手,我一直在編寫多級益智遊戲。如何在Phaser中結束狀態以及回到之前的狀態

分層次的狀態去是這樣的 - 菜單 - > 1級 - >第2級 - >等

現在假設我玩1級,要麼平後完成或在中間當我按返回鍵我希望能夠回到菜單狀態,並且如果我想繼續玩,我希望能夠回到前進的水平。

最初,我假設this.state.start('anyLevel')可以帶我到任何狀態,並且狀態會像啓動以來第一次運行一樣正常運行。但是,回到已經被解僱一次的國家是困難的。我需要的是能夠回到之前的狀態,並且狀態應該像啓動後第一次運行時那樣運行。 我讀的地方,我需要通過shutDown()開始一個新的狀態之前清理狀態,我所做的:

shutdown: function() { 
    this.game.world.removeAll(); 
    } 

開始每一個新的水平之前,但它仍然沒有幫助。我也試過使用:

this.state.start('anyLevel', true, false); 

但被證明是無用的。調試器不顯示錯誤,這意味着語法上的程序是正確的,但我沒有正確掌握機制。

在此先感謝。

回答

1

首先,當製作基於水平的遊戲時,我不會建議將每個級別置於單獨的狀態,請參閱關於herehere的回答。

除此之外,我一直只用state.start()像你張貼,它工作正常,所以是這樣的:

// from level select state, switch to game state.. 
this.game.state.start('MyGameState'); 

// ..and from game state, switch back to level select state 
this.game.state.start('MySelectState'); 

所以,你得到了什麼錯誤或意外行爲?也許你的問題發生是因爲你在狀態中使用的對象變量沒有「連接」到該狀態?我的意思是,精靈和敵人等變量是在狀態之外創建的,還是像下面代碼中那樣是狀態的一部分?

GameState = function(game) { 
    // reference to main game object 
    this.game = game; 

    // object variables are part of this state 
    this.myplayer; 
    this.myenemies; 
    //..etc. 
}; 

GameState.prototype = { 

    create: function() { 
     this.myplayer = this.game.add.sprite(100, 100, 'mysprites', 'smileydude'); 
     this.myenemies = this.game.add.group(); 
     //..etc. 
    }, 
    update: function() { 
    }, 
    //.. 
    doResetCurrentLevel: function() { 
     this.state.start('MyGameState', true, false); 
    } 
}; 

順便說一下,你可以簡單地通過重新啓動它來重置當前狀態。開始狀態將再次觸發create()函數來清理並刷新精靈和敵人變量。我不完全確定這是如何工作的,但我一直認爲JavaScript垃圾回收器負責處理這個問題。

+0

感謝您對多層次遊戲的建議。但在進入新的狀態時,在Phaser中結束舊狀態的正確方法是什麼?我是否必須手動銷燬shutDown()中的每個和所有內容? – RDN

+0

Interphase 1有一個涵蓋「shutdown」狀態的狀態管理器指南。他指出Phaser將負責其大部分清理工作。此外,「如果你的遊戲依賴於外部API,那麼你可能希望關閉任何打開的連接。如果你創建的任何自定義遊戲對象具有更復雜的設置,那麼你應該在這裏銷燬它們,以停止他們從出血到下一個狀態。「 (第64頁)因此,大多數情況下,你應該沒問題。 –

相關問題