2010-09-02 63 views
0

我想要一個主邏輯類來偵聽來自各種其他類的派發事件。as3事件調度和監聽

例如:

我有一個包含一個國家類的X實例父Map類。 當用戶點擊一個國家班級時,我想分派一個事件CLICKED以及州的名字。

現在這個邏輯類將不管看到這個新的事件和處理狀態的名稱,並執行一些其他邏輯的東西...等

我怎麼努力,我只能得到它的工作是在國家類監聽它自己的Dispatched事件。這對我來說似乎是一種浪費,我可以手動調用該函數。

我已經在線閱讀了很多關於自定義事件/調度的教程,並且正在使用基本的一個類示例。

回答

1

使用單例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

感謝bhups!這對我來說是一個非常有用的代碼,用於爲我的應用程序構建一箇中央調度程序。你搖滾! – 2011-04-14 23:01:52

0

如果父Map類包含了許多國家的類實例,你可以在父類中創建你的邏輯類將它作爲事件調度器傳遞給State類的構造函數。對於這個例子,我假設你將創建一個具有stateName屬性的LogicEvent。 下面是一個簡單的代碼版本:

 
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框架將是一個很好的解決方案。它爲鬆散耦合的對象在共享事件分派器上接收事件提供了一種簡單的方法。