这个问题可能有点过于宽泛,但考虑到 Phaser 3,它仍然取决于您的菜单的用途。
我认为大多数游戏都有一个主菜单,通常会在游戏第一次启动时调用,然后不会再次调用。
如果这是一个游戏内菜单,可以更改设置或部分游戏可以重置/重新启动,那么重定向到完全不同的场景可能没有意义。
Phaser 3 支持多个场景 - Dev Log #119 和 Dev Log #121 可能是当前最好的信息来源 - 另一种选择是在当前场景中开始一个新场景来处理这个问题。
但是,如果这真的只是 UI,则没有什么可以阻止您创建叠加层,而不是生成整个场景。
如果您担心性能,我可能会考虑是否需要调用整个菜单,或者简化菜单是否可以工作。此外,请确保您在进入菜单和主游戏之前预加载资源。
我个人使用 Boot > Preloader > Splash Screen > Main Menu > Main Game 场景,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);
然后我会根据需要继续 starting 下一个场景。
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);
}
}
在我使用它的游戏中,我试图复制一个标准的选项卡界面(就像上面的开发日志中看到的那样,带有类似文件夹的界面)。