AS3:事件监听器未触发

时间:2014-01-03 09:26:51

标签: actionscript-3 flash

我是AS3 / Flash的新手,我正在学习事件处理。我有一个调用事件的“Bell”类,如果我向该Bell类的实例添加一个事件监听器,它可以正常工作。但这不是我想要的。我还有另一个班,Pet,我想听贝尔。我看到钟声的痕迹,但不是宠物的痕迹。

以下是贝尔的代码:

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');
    }
}

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

1 个答案:

答案 0 :(得分:2)

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

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);
    }
}