从 Phaser 游戏 JS 触发事件到外部 JS?

Firing an event from Phaser game JS to outer JS?

我正在创建一个 Phaser 游戏,它将构成一个更大的 JS 应用程序的一部分。当玩家完成一个关卡时,我需要隐藏游戏,以便在游戏在下一个关卡的稍后阶段再次显示之前返回执行其他任务。

我很难找到一种明智的方法来从 Phaser.Game 到实例化它的 JS 触发事件(或调用回调函数的另一种方法)。

目前唯一想到的就是手动给游戏添加回调:

function onLevelComplete() {
  // example callback function
}

this.game = new Phaser.Game(800, 600, Phaser.AUTO, this.el);
this.game.levelCompleteCallback = onLevelComplete;

那么 Phaser.Game 可用的任何地方(例如在一个州内)我都可以 this.game.levelCompleteCallback()

麻烦的是,这感觉真的很紧密。我想要的是一种方法来做类似 this.game.fireEvent('levelComplete') 的事情,而不必关心另一边是否有任何东西在听。

是否有任何内置的东西是我缺少的,可以让我做我需要的?

我会在你的游戏中使用信号:

this.onLevelComplete = new Phaser.Signal();

...

// some condition is met
this.onLevelComplete.dispatch();

只要 Signal 暴露给上面的应用程序,它就可以很容易地注册自己。也许是单个全局对象(gameEvents?),或者到当前状态的路由,或者游戏可能将事件的引用传递到某个地方的应用程序中。有无数种方法可以做到这一点。

function appDoesSomething() {}

gameEvents.onLevelComplete.add(this.appDoesSomething, this);

无论哪种方式,最终结果是游戏可以愉快地触发信号,而不用关心应用程序是否正在监听。

虽然这个设置完全分离是不可能的,但它们在某处连接在一起。由你决定。