Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从Phaser游戏JS向外部JS发射事件?_Javascript_Phaser Framework - Fatal编程技术网

Javascript 从Phaser游戏JS向外部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游戏,它将成为一个更大的JS应用程序的一部分。当玩家完成一个关卡时,我需要隐藏游戏,以便在下一关卡的稍后阶段再次显示游戏之前返回执行其他任务

我很难找到一种合理的方法从
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(){…}
vs
el.addEventListener
同义。Phaser有
信号
事件系统,所以为什么不按照公认的答案使用它呢?我同意回调会变得混乱。我认为非基于事件的回调可以被称为更耦合的回调,因为对于想要钩住的所有东西,都必须有多个回调属性(尽管它的侦听器数量不是动态的)。我不熟悉PhaserAPI:如果
Signal
可以用于此目的,那就太好了:)。我的所有游戏组件都有一个名称空间。(例如
Game.States.Play
)因此我添加了
Game.events
Game.events.onLevelComplete
作为
信号。然后,任何其他内容都可以使用
Game.events.onLevelComplete.add
按您的建议收听。谢谢你的指导!