【问题标题】:Firing an event from Phaser game JS to outer JS?触发从 Phaser 游戏 JS 到外部 JS 的事件?
【发布时间】: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


【解决方案1】:

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

this.onLevelComplete = new Phaser.Signal();

...

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

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

function appDoesSomething() {}

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

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

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

【讨论】:

  • 我的所有游戏组件都已经有了一个命名空间。 (例如Game.States.Play)所以我添加了Game.eventsGame.events.onLevelComplete作为Signal。然后可以按照您的建议使用Game.events.onLevelComplete.add 收听其他任何内容。感谢您的指导!
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多