相位器 3:从全局"game"对象启动场景(停止所有其他正在运行的场景)



正如标题所说。。有没有一种方法可以在从";游戏";对象

目前,当我从Scene对象外部调用game.scene.start(...)时,不会发生任何事情。我目前的解决方案是保持一个全局变量指向最近启动的场景(在我的所有场景中,我用类似currentScene = this;的东西重置create()函数中的全局变量(,所以当我想启动一个新的场景时,我调用currentScene.scene.start(...)。但显然这是不可靠的,因为我可能会忘记在所有场景中重置全局变量(currentScene(,等等…

编辑:

为了阐明我想要实现的目标:我正在制作一款小型多人游戏,其中有几个场景和一些GameObjects。我有一个";插座";处理客户端和服务器之间所有流量的模块(我使用的是socket.io(

this.socket.on('game_end', (data) => {
// Server decides when the game stops and sends an event to all clients.
// Here I need to stop the currently running scene (i.e. SceneInGame)
// and show the "game finished / results" scene.
this.game.scene.start('SceneGameEnd');
// ^ That doesn't work. SceneInGame keeps playing and SceneGameEnd doesn't start
});

您真的不应该在Phaser3中使用game.scene(事实上,从Phaser3.50.0起,这甚至不起作用(。场景操作应该通过ScenePlugin进行,它可以在任何场景中作为this.scene访问。即this.scene.start('otherScene')停止当前场景,然后在下一个游戏步骤按顺序启动给定场景。当game.scene.start在不关心游戏步骤或它的名字的情况下快速通过时。

然而,没有办法"停止所有正在运行的场景",但除非您启动了多个场景(通过launch或类似方法(,否则实际上不会有任何其他正在运行的场面。显示一些实际的代码,然后我们可以给出更有针对性的响应。

我有一种方法可以做到这一点,至少可以通过手动访问当前场景并从那里启动新场景来使用Phaser 3.55。

例如:game.scene.keys.myCurrentScene.scene.start('SceneGameEnd')这将有效地调用myCurrentScenethis.scene,并通过启动SceneGameEnd来替换该场景

其中myCurrentScene将是当前运行场景的关键。您可以在game.scene.keys属性中看到场景关键帧,其中所有场景都按关键帧名称列出。但是,只有当您知道当前运行场景的关键是什么时,这才会起作用。也许有一种方法可以获得当前的跑步场景,但我无法回答这个问题。

然而,如果你不知道当前运行场景的关键,还有一种更暴力的解决方法。您可以在game.scene.scenes数组中的所有场景中运行一个循环,无论它是否正在运行,并在所有场景上调用scene.stop,然后只运行您需要的一个。

例如:

// Stop all scenes
game.scenes.forEach((scene) => {
const key = scene.scene.key; // This is not a typo, the scene here is more like a "game" object, so the scene actually is under the "scene" property.
game.scene.stop(key);
})
// After stopping all scenes, then you can start only the scene you need
game.scene.start('SceneGameEnd');

相关内容

最新更新