我是Phaser的新手,我一直在写一个多层次的益智游戏。
在层次结构上,状态是这样的 - 菜单 -> 级别 1 ->级别 2 -> 等。
现在假设我正在玩第 1 级,在关卡完成后或在中间按后退键时,我希望能够返回菜单状态,如果我想继续玩,我希望能够从那里导航回前进级别。
最初,我认为this.state.start( 'anyLevel')
可以将我带到任何状态,并且该状态将像启动以来第一次运行时一样正常运行。但事实证明,回到已经被解雇过一次的州是困难的。我需要的是能够返回到以前的状态,并且该状态的行为应该与启动后首次运行时一样。 我在某处读到我需要在开始一个新状态之前通过shutDown()
清理状态,我做到了:
shutdown: function() {
this.game.world.removeAll();
}
在开始每个新级别之前,但它仍然没有帮助。我也尝试使用:
this.state.start( 'anyLevel', true, false);
但事实证明毫无用处。调试器不显示错误,这意味着程序在语法上是正确的,但我没有正确掌握机制。
提前谢谢。
首先,在制作基于关卡的游戏时,我不建议将每个关卡置于单独的状态,请参阅此处和此处的答案。
除此之外,我一直只是使用像您发布的那样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 垃圾收集器会处理这个问题。