0

我正在使用 AS3 制作游戏。我有三个类(Spaceship、UFO 和 Scoreboard),它们都是GameEngine类的子类。

我想将 eventListeners 放在记分牌中,然后从SpaceshipUFO发送 dispatchEvents以更新记分牌实例。

由于SpaceshipUFO既不是Scoreboard的父级也不是子级,因此向 dispatchEvent 添加一个 bubbling=true 参数不会执行任何操作。

如何在不这样做的情况下让记分板监听 * dispatchEvent *s:

GameEngine.scoreboard.dispatchEvent(new Event("shipWasHit", true));

这样做似乎很愚蠢。为什么我要使用 dispatchEvent —— 为什么不直接调用函数呢?如果我希望其他类监听相同的 dispatchEvent 怎么办?

请指教。

4

4 回答 4

2

查看观察者模式。这是一个很好的链接:

http://www.swinburne.edu.au/design/tutorials/P-flash/T-The-Observer-Design-Pattern-in-Actionscript-3/ID-145/

于 2011-03-03T03:07:12.113 回答
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。最后,您必须在分派事件之前实例化它,尽管这似乎不是我现在看到的代码的问题。

于 2011-03-03T03:28:46.700 回答
0

我使用这个解决方案(已经在 SO 上发布)

于 2011-03-03T09:34:40.610 回答
0

你的宇宙飞船和不明飞行物会这样做:

dispatchEvent(new Event("shipWasHit"));

你的记分牌需要知道哪些宇宙飞船和不明飞行物要听这些事件:

someShip.addEventListener("shipWasHit", onShipHit);

thatUFO.addEventListener("shipWasHit", onUFOHit);

添加这些听众的好地方是在创建这些宇宙飞船和 UFO 的类中,或者在记分牌本身中,如果在某些时候你告诉它要听什么飞船和 UFO。

于 2011-03-03T14:44:29.567 回答