Phaser3场景过渡

时间:2018-11-10 12:17:06

标签: phaser-framework game-development

我是phaser3的新手,在开始一个疯狂的项目之前,我想知道我应该如何开始,在场景之间切换。我看到有几个功能,启动,启动,切换,运行,继续,暂停等...

例如,假设我要有2个场景,一个菜单和一个游戏。我在菜单上启动,我想转到游戏场景,如果我单击按钮,然后返回菜单场景。我通过调用start函数来达到这一目的,但是我注意到all,init,preload和create函数每次都被调用,因此我正在加载所有图像,一次又一次地设置所有侦听器。

这似乎是错误的,我应该使用启动或切换功能并暂停和恢复吗?但是如何隐藏上一个场景?

谢谢。

2 个答案:

答案 0 :(得分:2)

这个问题可能有点笼统,但是考虑到Phaser 3,它仍然取决于菜单的用途。

我认为大多数游戏都有一个主菜单,通常在游戏首次启动时会被调用,然后不再被调用。

如果这是一个游戏内菜单,可以在其中更改设置或可以重置/重新启动游戏的一部分,则重定向到完全不同的场景可能没有意义。

在Phaser 3支持多个场景的情况下-Dev Log #119Dev Log #121可能是当前最好的信息源-另一个选择是在当前场景中启动一个新场景来处理这个问题。 / p>

但是,如果这真的只是UI,则没有什么可以阻止您创建叠加层,而不是生成整个场景。

如果您担心性能,我可能会考虑是否需要调用整个菜单,或者简化菜单是否可以工作。另外,在进入菜单和主游戏之前,请确保已预先加载资产。

我个人使用“引导”>“预加载器”>“启动画面”>“主菜单”>“主游戏”场景,其中预加载器加载了我需要的大部分资产。这具有较长的初始载荷的缺点,但此点之后具有最小载荷的优点。

场景转换

my starter templates中如何处理这些内容是在创建场景时将场景添加到场景管理器中。然后我以start过渡到第一个场景。

this.scene.add(Boot.Name, Boot);
this.scene.add(Preloader.Name, Preloader);
this.scene.add(SplashScreen.Name, SplashScreen);
this.scene.add(MainMenu.Name, MainMenu);
this.scene.start(Boot.Name);

然后,我只是根据需要继续start播放下一个场景。

this.scene.start(Preloader.Name);

对于另一个使用多个场景的游戏,我最终创建了以下函数(TypeScript)来处理此问题:

private sleepPreviousParallelScene(sceneToStart: string): Phaser.Scene {
    if (this.uiSceneRunning !== sceneToStart) {
        // Make sure that we properly handle the initial state, when no scene is set as running yet.
        if (this.uiSceneRunning !== "") {
            this.scene.get(this.uiSceneRunning).scene.sleep();
        }
        const newScene = this.scene.get(sceneToStart);
        newScene.scene.start();
        this.scene.bringToTop(sceneToStart);
        this.uiSceneRunning = sceneToStart;

        return newScene;
    } else {
        return this.scene.get(this.uiSceneRunning);
    }
}

在我使用该游戏的游戏中,我试图复制一个标准的选项卡界面(就像上面“开发日志”中使用类似文件夹的界面一样)。

答案 1 :(得分:0)

好的,这是交易。在相位器3中,启动功能实际上在启动新场景时会关闭前一场景。这就是为什么您每次都会看到init,preload ext的原因。但是,如果您改为“启动”场景,则它们将不会经历整个关闭,重新启动的过程。您可以将它们移到顶部或底部,设置是否接收输入,等等。但是,当心!从相位器3.16开始,场景的睡眠或暂停不会关闭更新。结果,如果您启动一个场景然后将其休眠,则它基本上除了设置标志之外什么也没有做,即使它实际上不是,它也表示正在休眠。因此,任何更新处理都将在任何启动的场景中继续进行。您可以在开始时使用某种标志来短路更新(这就是我所采取的措施),但另一个难题是相机的大小。因此,所有场景都必须具有相同的摄像机尺寸,否则它们将渲染(即使处于“睡眠”状态)并弄乱您的显示。 因此,最重要的是,直到睡眠和暂停真正起作用之前,情况会一直很混乱。