我是phaser3的新手,在开始一个疯狂的项目之前,我想知道我应该如何开始,在场景之间切换。我看到有几个功能,启动,启动,切换,运行,继续,暂停等...
例如,假设我要有2个场景,一个菜单和一个游戏。我在菜单上启动,我想转到游戏场景,如果我单击按钮,然后返回菜单场景。我通过调用start函数来达到这一目的,但是我注意到all,init,preload和create函数每次都被调用,因此我正在加载所有图像,一次又一次地设置所有侦听器。
这似乎是错误的,我应该使用启动或切换功能并暂停和恢复吗?但是如何隐藏上一个场景?
谢谢。
答案 0 :(得分:2)
这个问题可能有点笼统,但是考虑到Phaser 3,它仍然取决于菜单的用途。
我认为大多数游戏都有一个主菜单,通常在游戏首次启动时会被调用,然后不再被调用。
如果这是一个游戏内菜单,可以在其中更改设置或可以重置/重新启动游戏的一部分,则重定向到完全不同的场景可能没有意义。
在Phaser 3支持多个场景的情况下-Dev Log #119和Dev 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开始,场景的睡眠或暂停不会关闭更新。结果,如果您启动一个场景然后将其休眠,则它基本上除了设置标志之外什么也没有做,即使它实际上不是,它也表示正在休眠。因此,任何更新处理都将在任何启动的场景中继续进行。您可以在开始时使用某种标志来短路更新(这就是我所采取的措施),但另一个难题是相机的大小。因此,所有场景都必须具有相同的摄像机尺寸,否则它们将渲染(即使处于“睡眠”状态)并弄乱您的显示。 因此,最重要的是,直到睡眠和暂停真正起作用之前,情况会一直很混乱。