我是Phaser3的新手,在开始一个疯狂的项目之前,我想知道应该如何开始,在场景之间切换。我看到有几个功能,启动、启动、切换、运行、恢复、暂停等。
例如,假设我想要两个场景,一个菜单和一个游戏。我在菜单上启动,我想去游戏场景,如果我点击一个按钮,然后回到菜单场景。
我已经通过调用start函数实现了这一点,但我注意到每次都会调用all、init
、preload
和create
函数,因此我正在加载所有图像,一遍又一遍地设置所有侦听器。
这似乎是错误的,我应该使用启动或切换功能并暂停和恢复吗?但是我该如何隐藏前一个场景呢?
提前谢谢。
这个问题可能有点过于宽泛,但考虑到Phaser3,它仍然取决于菜单的用途。
我认为大多数游戏都有一个主菜单,通常会在游戏刚开始时调用,然后不会再调用。
如果这是一个游戏内菜单,可以更改设置或重置/重新启动部分游戏,那么重定向到完全不同的场景可能没有意义。
由于Phaser 3支持多个场景——开发人员日志#119和开发人员日志#121可能是当前最好的信息来源——另一种选择是在当前场景中启动一个新场景来处理这一问题。
然而,如果这真的只是UI,那么没有什么可以阻止您创建覆盖,而不是生成整个场景。
如果你关心性能,我可能会考虑是否需要调用整个菜单,或者简化菜单是否有效。此外,在进入菜单和主游戏之前,请确保您正在预加载资产。
我个人使用引导>预加载程序>启动屏幕>主菜单>主游戏场景,预加载程序加载我需要的大部分资产。这样做的缺点是初始载荷较长,但在这一点之后的优点是最小载荷。
场景过渡
我在入门模板中处理这些问题的方法是在创建场景时将场景添加到场景管理器中。然后我通过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。然而,如果你"启动"你的场景,那么它们将不会经历整个关闭、重新启动的过程。您可以将它们移动到顶部或底部,设置为是否接收输入,等等。无论如何,小心!从相位器3.16开始,场景的睡眠或暂停不会关闭更新。因此,如果你启动一个场景,然后让它入睡,它基本上只会设置标志,说它睡着了,尽管它真的没有睡着。因此,任何更新处理都将在任何启动的场景中继续。你可以在一开始用某种标志来短路更新(这就是我所采用的(,但另一个问题是相机的大小。因此,所有场景都必须具有相同的相机大小,否则它们将渲染(即使是"睡眠"(并扰乱显示。所以,最重要的是,在睡眠和暂停真正起作用之前,一切都会很混乱。