Javascript 从Phaser游戏JS向外部JS发射事件?
我正在创建一个Phaser游戏,它将成为一个更大的JS应用程序的一部分。当玩家完成一个关卡时,我需要隐藏游戏,以便在下一关卡的稍后阶段再次显示游戏之前返回执行其他任务 我很难找到一种合理的方法从Javascript 从Phaser游戏JS向外部JS发射事件?,javascript,phaser-framework,Javascript,Phaser Framework,我正在创建一个Phaser游戏,它将成为一个更大的JS应用程序的一部分。当玩家完成一个关卡时,我需要隐藏游戏,以便在下一关卡的稍后阶段再次显示游戏之前返回执行其他任务 我很难找到一种合理的方法从Phaser.Game向实例化它的JS触发事件(或调用回调函数的另一种方法) 目前我唯一想到的是手动将回调添加到游戏中: function onLevelComplete() { // example callback function } this.game = new Phaser.Game(8
Phaser.Game
向实例化它的JS触发事件(或调用回调函数的另一种方法)
目前我唯一想到的是手动将回调添加到游戏中:
function onLevelComplete() {
// example callback function
}
this.game = new Phaser.Game(800, 600, Phaser.AUTO, this.el);
this.game.levelCompleteCallback = onLevelComplete;
然后任何地方都有相位器。Game
可用(例如,在一个州内),我可以这个.Game.levelCompleteCallback()
问题是,这感觉真的很紧密地结合在一起。我想要的是一种类似于this.game.firevent('levelComplete')
的方法,而不必关心对方是否有人在听
是否有我所缺少的东西可以让我做我需要的事情?我会使用游戏中的信号:
this.onLevelComplete = new Phaser.Signal();
...
// some condition is met
this.onLevelComplete.dispatch();
只要信号暴露在上面的应用程序中,它就可以很容易地注册自己。可能是单个全局对象(gameEvents?),或者是当前状态的路径,或者可能是游戏将对事件的引用传递到应用程序的某个位置。有很多方法可以做到这一点
function appDoesSomething() {}
gameEvents.onLevelComplete.add(this.appDoesSomething, this);
无论哪种方式,最终的结果都是,游戏可以愉快地发出信号,而无需关心应用程序是否在监听
但是,不可能将此设置完全解耦,因为它们在某个地方连接在一起。这取决于您的位置。我不知道
这个.game.firevent('levelComplete')
如何比这个.game.levelCompleteCallback()耦合得更少。您仍然需要提供一种方法来侦听正在触发的事件。因为如果未设置this.game.levelCompleteCallback
,则会出现错误。因此,代码需要检查它是否是函数等等。事件系统正是针对这种情况而存在的—发生某些事情时会附加0个或多个函数。如果(this.game.levelCompleteCallback!=未定义)
或类似的操作,您只需执行。如有必要,将其包装在一个callGameLevelComplete()
中。可能最好使用typeof
,但你是对的。但是,如果有两件事需要听呢?然后,回调路由变得混乱。它与el.onClick=function(){…}
vsel.addEventListener
同义。Phaser有信号
事件系统,所以为什么不按照公认的答案使用它呢?我同意回调会变得混乱。我认为非基于事件的回调可以被称为更耦合的回调,因为对于想要钩住的所有东西,都必须有多个回调属性(尽管它的侦听器数量不是动态的)。我不熟悉PhaserAPI:如果Signal
可以用于此目的,那就太好了:)。我的所有游戏组件都有一个名称空间。(例如Game.States.Play
)因此我添加了Game.events
和Game.events.onLevelComplete
作为信号。然后,任何其他内容都可以使用Game.events.onLevelComplete.add
按您的建议收听。谢谢你的指导!