отправка и прослушивание событий as3 - PullRequest
0 голосов
/ 02 сентября 2010

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

например:

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

теперь этот класс логики увидит это новое событие, обработает имя состояния и выполнит некоторые другие логические операции ... и т. Д.

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

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

Ответы [ 3 ]

1 голос
/ 02 сентября 2010

использовать одноэлементный подход 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 {}
Теперь в ваших классах State вы можете позвонить:
SingletonDispatcher.GetInstance().dispatchEvent(new StateEvent(...));
А в вашем основном классе Login вы можете слушать так:
SingletonDispatcher.GetInstance().addEventListener(StateEvent.SOME_EVENT, onstateEvent);
0 голосов
/ 04 сентября 2010

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

0 голосов
/ 03 сентября 2010

Если родительский класс Map содержит много экземпляров класса State, вы можете создать свой класс Logic в родительском классе и передать его в конструктор класса 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) );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...