我正在使用AS3制作游戏。我有三个班级(太空飞船,UFO和记分牌),它们都是班级 GameEngine 的孩子。
我想将eventListeners放在记分板中,然后从 Spaceship 和 UFO 发送dispatchEvents以更新记分板实例
由于 Spaceship 和 UFO 既不是记分板的父母或子女,所以在dispatchEvent中添加bubbling = true参数不会做任何事情。
如何在不执行此操作的情况下让记分板监听* dispatchEvent *:
GameEngine.scoreboard.dispatchEvent(新事件(“shipWasHit”,true));
以这种方式这样做似乎很愚蠢。为什么我会使用dispatchEvent - 为什么不直接调用函数?如果我希望其他类监听相同的dispatchEvent怎么办?
请告知。
答案 0 :(得分:2)
查看观察者模式。这是一个很好的链接:
答案 1 :(得分:1)
由于任何使用没有传播中断的捕获阶段或气泡阶段的事件都会在阶段中运行,因此您只需为指定类的阶段添加一个侦听器。
示例代码:
public function Receiver()
{
addEventListener(Event.ADDED_TO_STAGE, added, false, 0, true);
}
private function added(evt:Event):void
{
stage.addEventListener(Event.shipWasHit, shipHit, false, 0, true);
}
private function shipHit(evt:Event):void
{
//code
evt.stopPropagation();
}
现在,这里有一些警告。首先,需要对该类进行实例化并将其添加到舞台中以引用该舞台。否则,您需要将阶段作为参数传递,并且在某些情况下可以返回null。最后,你必须在调度事件之前实例化它,尽管这对我现在看到的代码似乎不是一个问题。
答案 2 :(得分:0)
答案 3 :(得分:0)
你的宇宙飞船和UFO会这样做:
dispatchEvent(new Event("shipWasHit"));
并且您的记分牌需要知道哪些太空飞船和UFO会收听这些事件:
someShip.addEventListener("shipWasHit", onShipHit);
和
thatUFO.addEventListener("shipWasHit", onUFOHit);
添加这些听众的好地方是在创建太空船和UFO的类中,或者在记分板本身,如果在某些时候你告诉它要听哪些船只和UFO。