我是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');
}
}
任何帮助都非常感谢! 事件已正确导入,并且没有编译器错误。
有几种方法可以做到这一点,这是最直接的...
public function Pet(name:String, bell:Bell):void {
bell.addEventListener(Bell.BELL_RING, heardBell)
}
然后:
myBell = new Bell()
myPet = new Pet("dog", myBell)
或。。。
如果贝尔是宠物的孩子,那么你可以将事件冒泡到显示列表中并在宠物中捕获它(但我怀疑情况是否如此)。
或。。。
您可以使用代理类(如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);
}
}