【问题标题】:AS3: Event Listener Not FiringAS3:事件侦听器未触发
【发布时间】:2014-01-03 09:26:51
【问题描述】:

我是 AS3/Flash 的新手,正在学习事件处理。我有一个分派事件的“Bell”类,如果我将事件侦听器添加到该 Bell 类的实例,它工作正常。不过,这不是我想要的。我还有另一门课,宠物,我想听贝尔。我看到了铃铛的痕迹,但没有看到宠物的痕迹。

这是铃铛的代码:

public class Bell extends EventDispatcher {
    public static const BELL_RING:String = "bellRing";
    public static const RING_INTERVAL:int = 1500;
    private var ringIntervalID:int;

    public function Bell()
    {
        ringIntervalID = setInterval(ringBell,RING_INTERVAL);
    }

    public function ringBell():void {
        trace("RINGING THE BELL");
        dispatchEvent(new Event(Bell.BELL_RING));
    }
}

...对于宠物:

public class VirtualPet {
    private var senseOfHearing:EventDispatcher = new EventDispatcher();

    public function Pet(name:String):void
    {
        senseOfHearing.addEventListener(Bell.BELL_RING,heardBell);
    }

    public function heardBell(e:Event):void {
        trace("Pet hears bell ringing");
    }
}

...对于主类:

public class VirtualZoo extends Sprite
{
    public function VirtualZoo()
    {
        var bell:Bell = new Bell();
        var pet:VirtualPet = new VirtualPet('Stan');
    }
}

非常感谢任何帮助!事件已正确导入,没有编译器错误。

【问题讨论】:

  • 这两个类是如何联系起来的?
  • 对不起,我更新了,把主类加到最后了。
  • 如果你想让铃铛响应宠物,你必须将一个对铃铛对象的引用传递给宠物,这样宠物就可以为它注册一个监听器并在何时响应需要。
  • 事件监听器需要添加到派发事件的类实例中。在您的情况下,Bell 调度事件,但事件侦听器被添加到 EventDispatcher 的实例中。

标签: actionscript-3 flash


【解决方案1】:

有几种方法可以做到这一点,这是最直接的...

public function Pet(name:String, bell:Bell):void {
    bell.addEventListener(Bell.BELL_RING, heardBell)
}

然后:

myBell = new Bell()
myPet = new Pet("dog", myBell)

或者……

如果 Bell 是 Pet 的孩子,那么您可以将事件冒泡到 DisplayList 中并在 Pet 中捕获它(但我怀疑是这种情况)。

或者……

您可以使用代理类,例如 senseOfHearing,并将该实例传递给 Bell 和 Dog,并使用它在两者之间分派事件。

编辑
根据您的评论:

var bells:Array = [];
// add some bells
var pet:Pet = new Pet("Marvin", bells);

public function Pet(name:String, bells:Array):void {
    for (var i:int = 0; i < bells.length; i++) {
        bells[i].addEventListener(Bell.BELL_RING, heardBell);
    }
}

【讨论】:

  • 所以换句话说,一个铃铛的事件监听器必须附加到一个铃铛上......任何旧类都不能只等待从铃铛发出的信号,它必须是一个铃铛监听为自己。对吗?
  • 不,是Pet 在监听BellPet 实例引用了将调度事件的东西。当这些事件之一被触发时,您想在Pet 中监听它。因此,在 Pet 中,您为特定事件 Bell.BELL_RING 添加了一个 EventListener,该事件由 bell 实例调度。
  • 把它想象成somethingThatDispatchesEvents.addAnEventListenerHereForThisEvent(SomeEvent, someLocalHandler)
  • 好的,我明白了。有没有办法让对象访问主类的实例变量?那么,我是否可以在 VirtualZoo 中拥有一个带有所有铃声的数组,并在我的 Pet 类中遍历该数组而不使该数组是静态的?
  • 澄清一下,你有很多钟声,你想让你的Pet 听每一个?
猜你喜欢
  • 2013-05-19
  • 2020-09-06
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多