2010-09-02 4 views
0

Я хочу иметь основной логический класс, который прослушивает отправленные события из ассортимента других классов.as3 отправка и прослушивание событий

, например:

У меня есть родительский класс Map, содержащий X экземпляры государственного класса. Когда пользователь нажимает на класс State, я хочу отправить событие CLICKED вместе с именем состояния.

теперь эта логика класс не будет видеть это новое событие и обработать название государства и выполнять некоторые другие логики вещей ... и т.д.

независимо от того, что я стараюсь я могу получить только это работать, где государство класс прослушивает собственное событие Dispatched. Который мне кажется пустой тратой, я мог бы просто назвать функцию вручную.

Я читал так много учебников онлайн о пользовательских событиях/диспетчеризации, и они используются в основном примере одного класса.

ответ

1

использование одиночныйton EventDispatcher подход.

package 
{ 
    import flash.events.*; 
    public class SingletonDispatcher extends EventDispatcher { 
    private static var dispatcher:SingletonDispatcher = null; 
    public function SingletonDispatcher (enforcer:SingletonEnforcer) : void { 
     if (!enforcer) { 
     throw new Error("Direct instatiation is not allowed"); 
     } 
     return; 
    }// end function 
    public static function GetInstance() : SingletonDispatcher { 
     if (!dispatcher) { 
     dispatcher= new SingletonDispatcher (new SingletonEnforcer()); 
     }// end if 
     return dispatcher; 
    }// end function 
    } 
} 
class SingletonEnforcer {}
Теперь у вас государственные классов вы можете позвонить:
SingletonDispatcher.GetInstance().dispatchEvent(new StateEvent(...));
И в вас главном Входе класса вы можете слушать, как это:
SingletonDispatcher.GetInstance().addEventListener(StateEvent.SOME_EVENT, onstateEvent);

+0

Спасибо, бхуп! Это был действительно полезный кусок кода для меня, чтобы использовать для создания центральной отправки для моего приложения. Ты жжешь! –

0

Если родительский класс Map содержит много экземпляров класса состояния, вы можете создать свой класс логики в родительском классе и передайте его в конструкторе вашего класса State в качестве диспетчера событий. В этом примере я предполагаю, что вы создадите LogicEvent с свойством stateName. Вот упрощенный код версии:

 
public class Map extends Sprite 
{ 
    private var logic:Logic = new Logic(); 

    public function Map() 
    { 

     //when you create your state instances 
     var state:State = new State(logic); 
    } 
} 

public class Logic extends EventDispatcher 
{ 
    public function Logic() 
    { 
     this.addEventListener(LogicEvent.STATE , logicEventListener); 
    } 

    private function logicEventListener(event:LogicEvent):void 
    { 
     trace(event.stateName); 
    } 
} 

public class State extends Sprite 
{ 
    private var dispatcher:EventDispatcher; 

    public function State(dispatcher:EventDispatcher) 
    { 
     this.dispatcher = dispatcher; 
    } 

    private function clickHandler(event:MouseEvent):void 
    { 
     dispatcher.dispatchEvent(new LogicEvent(this.name)); 
    } 
} 
0

Robotlegs рамки будет хорошим решением для этого. Он обеспечивает простой способ для слабосвязанных объектов для приема событий в диспетчере общих событий.

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