【问题标题】:How do I dispatch an event from one class and listen for it in another class that isn't a child or parent of the first class?如何从一个类中分派一个事件并在另一个不是第一类的子类或父类的类中监听它?
【发布时间】:2011-03-03 02:45:25
【问题描述】:

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

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

由于 SpaceshipUFO 既不是 Scoreboard 的父级也不是子级,因此向 dispatchEvent 添加 bubbling=true 参数没有任何作用。 p>

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

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

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

请指教。

【问题讨论】:

    标签: flash actionscript-3 event-handling event-listener dispatchevent


    【解决方案1】:

    【讨论】:

    • 啊,真可惜,我把它列为一个很好的链接,因为它曾经有一个下载示例 FLA 的链接。现在好像坏了。无论哪种方式,观察者模式都是我们想要的。 :)
    【解决方案2】:

    由于任何使用捕获阶段或未中断传播的冒泡阶段的事件都会在舞台上运行,因此您只需在指定类中为舞台添加监听器即可。

    示例代码:

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

    【讨论】:

      【解决方案3】:
      【解决方案4】:

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

      dispatchEvent(new Event("shipWasHit"));
      

      并且您的记分牌需要知道哪些宇宙飞船和 UFO 需要为这些事件收听:

      someShip.addEventListener("shipWasHit", onShipHit);
      

      thatUFO.addEventListener("shipWasHit", onUFOHit);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-18
        • 2021-11-19
        • 2016-07-11
        • 2013-11-10
        • 1970-01-01
        相关资源
        最近更新 更多