2010-09-02 4 views
0

Je souhaite avoir une classe logique principale qui écoute les événements distribués provenant d'un assortiment d'autres classes.as3 répartition des événements et écoute

par exemple:

j'ai une classe parente de la carte qui contient des instances de X d'une classe d'État. Lorsque l'utilisateur clique sur une classe d'état, je souhaite envoyer un événement CLIQUÉ avec le nom de l'état.

maintenant cette classe logique verra ce nouvel événement et traiter le nom de l'État et effectuer quelques autres trucs logique ... etc.

peu importe ce que j'essaie je ne peux le faire fonctionner lorsque l'État class écoute son propre événement Dispatched. Ce qui me semble un gâchis, j'aurais pu appeler manuellement la fonction.

J'ai lu tant de tutoriels en ligne sur les événements personnalisés/dispatching et ils sont utilisés dans un exemple de base d'une classe.

Répondre

1

utilisez l'approche 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 {}
Maintenant, en vous des classes d'État, vous pouvez appeler:
SingletonDispatcher.GetInstance().dispatchEvent(new StateEvent(...));
Et vous classe principale de connexion, vous pouvez écouter comme ceci:
SingletonDispatcher.GetInstance().addEventListener(StateEvent.SOME_EVENT, onstateEvent);

+0

Merci bhups! Ce code m'a vraiment aidé à créer une répartition centrale pour mon application. Tu gères! –

0

Si la classe parent de la carte contient de nombreuses instances de classe d'état, vous pouvez créer votre classe logique dans la classe parente et transmettez-le dans le constructeur de votre classe d'état en tant que répartiteur d'événements. Pour cet exemple, je suppose que vous allez créer un LogicEvent avec une propriété stateName. Voici une version simplifiée du code:

 
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

cadre Robotlegs serait une bonne solution pour cela. Il fournit un moyen simple pour les objets faiblement couplés de recevoir des événements sur un répartiteur d'événements partagés.

Questions connexes