Phaser3 场景转换

Posted

技术标签:

【中文标题】Phaser3 场景转换【英文标题】:Phaser3 Scenes transitions 【发布时间】:2019-04-13 19:10:40 【问题描述】:

我是 Phaser3 的新手,在开始一个疯狂的项目之前,我想知道我应该如何开始,在场景之间切换。我看到有几个功能,启动、启动、切换、运行、恢复、暂停等。

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

我通过调用 start 函数实现了这一点,但我注意到所有 initpreloadcreate 函数每次都被调用,因此我正在加载所有图像,设置所有一遍又一遍地倾听。

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

提前致谢。

【问题讨论】:

【参考方案1】:

这个问题可能有点过于宽泛,但考虑到 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);
    

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

【讨论】:

你如何处理主要的游戏场景?您是暂停并启动还是全部启动? [我的问题没有明确,我举了菜单的例子,但也想知道其他游戏场景的过渡] 我已在我的答案中添加了有关转换的更多信息。基本上我只是根据需要启动它们; Phaser 负责在你退出场景后进行清理。 实际上,我现在正在调查您的其他问题。 :)【参考方案2】:

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

【讨论】:

以上是关于Phaser3 场景转换的主要内容,如果未能解决你的问题,请参考以下文章

使用phaser3进行游戏开发系列二

在 Phaser 3 中更改场景的问题

Phaser 3 切换场景重叠文本

[phaser3入门探坑]使用phaser3制作山寨马里奥

(10)场景转换(Transitions)

在 Phaser 3 TypeError 中调用 this.scene.restart(): this.body is undefined