Phaser3 场景转场

Phaser3 Scenes transitions

我是 Phaser3 的新手,在开始一个疯狂的项目之前,我想知道我应该如何开始,在场景之间切换。看到有几个功能,start,launch,switch,运行,resume,pause等

例如,假设我想要 2 个场景,一个菜单和一个游戏。我在菜单上启动,我想去游戏场景,如果我点击一个按钮然后返回菜单场景。

我通过调用 start 函数实现了这一点,但我注意到 all、initpreloadcreate 函数每次都会被调用,因此我加载所有图片,一遍又一遍地设置所有监听器。

这似乎不对,我应该使用启动或切换功能并暂停和恢复吗?但是如何隐藏之前的场景呢?

提前致谢。

这个问题可能有点过于宽泛,但考虑到 Phaser 3,它仍然取决于您的菜单的用途。

我觉得大部分游戏都有一个主菜单,一般在游戏刚开始的时候会调用,之后就不会再调用了。

如果这是一个游戏内菜单,可以更改设置或部分游戏 reset/restarted,那么重定向到一个完全不同的场景可能没有意义。

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

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

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

我个人使用 Boot > Preloader > Splash Screen > Main Menu > Main Game scenes,其中 Preloader 加载了我需要的大部分资源。这有一个较长的初始负载的缺点,但在这一点之后最小负载的好处。

场景转换

我在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);
    }
}

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

好的,这是交易。在移相器 3 中,启动函数实际上在启动新场景时关闭了前一个场景。这就是为什么您每次都会看到 init, preload ext。但是,如果您 'launch' 您的场景,那么它们将不会经历整个关闭、重启序列。您可以将它们移动到顶部或底部,设置是否接收输入等。但是,请注意!从 Phaser 3.16 开始,场景的睡眠或暂停不会关闭更新。因此,如果您启动一个场景,然后让它休眠,它基本上除了可能设置标志外什么都不做,说它睡着了,即使它实际上没有。因此,任何更新处理都将在任何已启动的场景中继续进行。您可以在开始时使用某种标志来缩短更新(这就是我所采用的方法),但另一个问题是相机尺寸。因此,所有场景必须具有相同的相机尺寸,否则它们将渲染(即使 "sleeping")并弄乱您的显示。 所以,最重要的是,在 sleep 和 pause 真正起作用之前,它会变得一团糟。