正如标题所说。。有没有一种方法可以在从";游戏";对象
目前,当我从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')
这将有效地调用myCurrentScene
的this.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');