【问题标题】:How to end a state in Phaser as well as navigate back to a previous state如何结束 Phaser 中的状态以及导航回之前的状态
【发布时间】:2017-06-21 18:15:19
【问题描述】:

我是 Phaser 的新手,我一直在写一个多层次的益智游戏。

按层次结构,状态是这样的 - 菜单 -> 级别 1 -> 级别 2 -> 等等。

现在假设我正在玩关卡 1 并且在关卡完成后或在中间按下返回键时我希望能够返回菜单状态并从那里我希望能够导航回到前进关卡如果我想继续玩。

最初我认为this.state.start( 'anyLevel') 可以带我进入任何状态,并且该状态会像启动后第一次运行时一样正常运行。但事实证明,要回到曾经被解雇过的州是很困难的。我需要的是能够回到以前的状态,并且该状态应该像启动后第一次运行时一样。 我在某处读到需要在开始新状态之前通过shutDown() 清理状态,然后我做到了:

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

在开始每个新关卡之前,它仍然没有帮助。我也尝试过使用:

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

但证明没用。调试器没有显示错误,这意味着程序在语法上是正确的,但我没有正确掌握机制。

提前致谢。

【问题讨论】:

    标签: javascript phaser-framework


    【解决方案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 垃圾收集器会处理这个问题。

    【讨论】:

    • 感谢多关卡游戏的建议。但是在进入新状态的同时结束 Phaser 中的旧状态的正确方法是什么?我是否必须手动销毁 shutdown() 中的所有内容?
    • Interphase 1 有一个状态管理器指南,它涵盖了shutdown 状态。在那里他指出 Phaser 将负责大部分自己的清理工作。此外,“如果您的游戏依赖于外部 API,那么您可能希望关闭任何打开的连接。如果您创建的任何自定义游戏对象具有更复杂的设置,那么您也应该在此处销毁它们,以停止他们不会流血到下一个状态。” (第 64 页)因此,在大多数情况下,您应该顺其自然。
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多