Phaser3场景转换

8
我是Phaser3的新手,在开始一个疯狂项目之前,我想知道该如何开始,并在场景之间切换。我看到有几个函数,包括start、launch、switch、run、resume、pause等。
例如,假设我想要有两个场景,一个菜单和一个游戏。我启动菜单并希望进入游戏场景,如果我点击按钮,则返回菜单场景。
我通过调用start函数实现了这一点,但我注意到每次都会调用所有的init、preload和create函数,因此我一遍又一遍地加载所有图像,设置所有侦听器。
这似乎是错误的,我应该使用launch或switch函数并暂停和恢复吗?但是如何隐藏先前的场景?
提前感谢您的回答。
2个回答

4
这个问题可能有点宽泛,但考虑到Phaser 3,它仍然取决于您的菜单服务的目的。
我认为大多数游戏都有一个主菜单,通常在游戏开始时调用,然后不会再次调用。
如果这是一个游戏内菜单,可以更改设置或重置/重新启动游戏的一部分,则将重定向到完全不同的场景可能没有意义。
随着Phaser 3对多个场景的支持 - Dev Log #119 Dev Log #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);

然后我只需根据需要不断启动下一个场景。

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

在我使用这个的游戏中,我试图复制一个标准的选项卡界面(就像上面的Dev Logs中看到的文件夹式界面)。

你如何处理主游戏场景?是暂停和启动还是一次性全部开始?[我的问题不够明确,我举了菜单的例子,但也想知道其他游戏场景的过渡方式] - franmcod
1
我在我的回答中添加了更多关于转换的信息。基本上,我只是在需要时启动它们;Phaser会在您退出场景后进行清理。 - James Skemp
1
我现在正在查看你的另一个问题。 :) - James Skemp

1

好的,这里是问题。在Phaser 3中,start函数实际上会关闭前一个场景并启动新场景。这就是为什么每次都会看到init、preload等内容。但是,如果您使用“launch”来启动场景,则它们将不会经历整个关闭和重新启动的过程。您可以将它们移动到顶部或底部,设置是否接收输入等。但是,请注意!从Phaser 3.16开始,对场景进行睡眠或暂停不会关闭更新。因此,如果您启动了一个场景,然后将其置于睡眠状态,它基本上除了可能设置标志以外什么也不做,即使它实际上并没有睡眠。因此,任何启动的场景中的更新处理都将继续进行。您可以在开头使用某种标志来短路更新(这就是我采取的措施),但另一个需要注意的是相机大小。因此,所有场景必须具有相同的相机大小,否则它们将被渲染(即使处于“睡眠”状态),并且会破坏您的显示效果。 因此,最重要的是,在睡眠和暂停实际起作用之前,这将是混乱的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接