从Phaser游戏JS向外部JS触发事件

Firing an event from Phaser game JS to outer JS?

本文关键字:JS 事件 外部 Phaser 游戏      更新时间:2023-09-26

我正在创建一个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);

无论哪种方式,最终的结果都是游戏可以愉快地发出信号,而不在乎应用程序是否在听。

这是不可能完全解耦的设置,但他们是在某个地方连接的。这取决于你在哪里。