我是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');
}
}
非常感谢任何帮助!事件已正确导入,并且没有编译器错误。
答案 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);
}
}