【发布时间】:2015-03-24 18:49:47
【问题描述】:
我正在创建一个 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.game.fireEvent('levelComplete')的耦合程度如何低于this.game.levelCompleteCallback()。您仍然需要提供一种方法来侦听被触发的事件。 -
因为如果
this.game.levelCompleteCallback没有设置,那么你会得到一个错误。因此,代码需要检查它是否是一个函数等等。事件系统正是针对这种情况存在的——当事情发生时会附加 0 个或多个函数。 -
你可以做
if (this.game.levelCompleteCallback != undefined)或类似的事情。如有必要,将其包裹在callGameLevelComplete()中。 -
typeof可能会更好,但是是的,你是对的。但是,如果有两件事需要听呢?然后回调路由变得混乱。它是el.onClick = function() { ... }与el.addEventListener的同义词。 Phaser 有Signal事件系统,那么为什么不按照公认的答案使用它呢? -
我同意回调变得混乱。我想非基于事件的回调可以被称为更耦合,因为你必须为所有想要挂钩的东西拥有多个回调属性(尽管它在侦听器的数量上不是动态的)。我不熟悉 Phaser API:如果
Signal用于此目的,那就太好了:)。
标签: javascript phaser-framework