2014-01-03 4 views
1

Я новичок в AS3/Flash и узнаю о обработке событий. У меня есть класс «Белл», который отправляет событие, и если я добавлю слушателя событий к экземпляру этого класса Bell, он отлично работает. Это не то, что я хочу. У меня есть еще один класс, Pet, который я бы хотел прослушать Bell. Я вижу след из колокола, но не тот, что касается домашнего животного.AS3: прослушиватель событий не стреляет

Вот код 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'); 
    } 
} 

Любая помощь очень ценится! События импортируются правильно и ошибок компилятора нет.

+0

Как два занятия связаны? – putvande

+0

Извините, я обновил его, добавив основной класс в конец. –

+0

Если вы хотите, чтобы звонок отвечал домашнему животному, вам необходимо передать ссылку на объект звонка, домашнему животному, чтобы домашнее животное могло зарегистрировать слушателя и ответить в случае необходимости. –

ответ

2

Есть несколько способов сделать это, это самый прямой вперед ...

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

Тогда:

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

Или ...

если Белл ребенок Pet, тогда вы можете пузырить событие в DisplayList и захватить его в Pet (но я сомневаюсь, что это так).

Или ...

Вы можете использовать прокси-класс, как ваш senseOfHearing и передать этот экземпляр как Белл и собака и использовать его для отправки события между ними.

EDIT
Основываясь на ваш комментарий:

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

Итак, прослушиватель событий для звонка должен быть прикреплен к колоколу ... любой старый класс не может просто ждать сигнала, посланного от звонка, он должен быть колоколом, слушая сам. Это верно? –

+0

Нет, это 'Pet', слушая« Белл ». Экземпляр «Pet» имеет ссылку на то, что отправит событие. Когда одно из этих событий запущено, вы хотите прослушать его в 'Pet'. Итак, в 'Pet' вы добавляете EventListener для определенного события' Bell.BELL_RING', которое отправляется экземпляром 'bell'. – sberry

+0

Подумайте об этом как 'somethingThatDispatchesEvents.addAnEventListenerHereForThisEvent (SomeEvent, someLocalHandler)' – sberry

Смежные вопросы