as3事件调度和收听

时间:2010-09-02 17:30:56

标签: flash actionscript-3 events

我想要一个主逻辑类来侦听来自各种其他类的调度事件。

例如:

我有一个父Map类,它包含一个State类的X实例。 当用户点击State类时,我想发送一个CLICKED事件以及状态名称。

现在这个Logic类将看到这个新事件,并处理状态名称并执行其他逻辑操作......等等。

无论我尝试什么,我只能让它在State类侦听自己的Dispatched事件的地方工作。对我来说这似乎是浪费,我可以手动调用该函数。

我在线阅读了很多有关自定义事件/调度的教程,并且它们正在基本的一个类示例中使用。

3 个答案:

答案 0 :(得分:1)

使用singleton 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);

答案 1 :(得分:0)

如果父Map类包含许多State类实例,则可以在父类中创建Logic类,并将其作为事件调度程序传递给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) );
    }
}

答案 2 :(得分:0)

Robotlegs框架将是一个很好的解决方案。它为松散耦合的对象提供了一种在共享事件调度程序上接收事件的简单方法。