2010-09-02 64 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框架将是一个很好的解决方案。它为松散耦合的对象在共享事件分派器上接收事件提供了一种简单的方法。