2009-04-16 5 views
7

Je veux donc un moyen de configurer des événements afin que je puisse transmettre des données sans créer de fuites \ fuites de mémoire. Ceci est aussi loin que j'ai:Comment modifier les événements AS3 existants pour pouvoir transmettre des données?

package com.events { 
    import flash.events.Event; 

    public class CustomEvent extends Event { 
     public static const REMOVED_FROM_STAGE:String = "removedFromStage"; 
     public var data:*; 

     public function CustomEvent(type:String, customData:*=null, bubbles:Boolean=false, cancelable:Boolean=false) { 
      super(type, bubbles, cancelable); 
      this.data = customData; 
     } 

     public override function clone():Event { 
      return new CustomEvent(type, data, bubbles, cancelable); 
     } 

     public override function toString():String { 
      return formatToString("CustomEvent", "type", "data", "bubbles", "cancelable", "eventPhase"); 
     } 
    } 
} 

Cela me obtient le comportement suivant:

function testme(e:Event) { 
    trace(e); 
} 

test_mc.addEventListener(CustomEvent.REMOVED_FROM_STAGE, testme); 
test_mc.dispatchEvent(new CustomEvent(CustomEvent.REMOVED_FROM_STAGE, 42)); 
//Traces [CustomEvent type="removedFromStage" data=42 bubbles=false cancelable=false eventPhase=2] 
removeChild(test_mc); 
//Traces [Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2] 

Mon but est d'obtenir les données personnalisées que je veux passer pour se passer des flash se déclenche l'événement et pas seulement celui que je tire. Par exemple, que se passe-t-il si je veux passer un movieclip avec un événement loader.COMPLETE pour mettre le bitmap résultant?

Répondre

4

Vous avez étendu la classe Event pour l'envoyer avec des données supplémentaires, maintenant si vous voulez que la classe Loader distribue votre type d'événement personnalisé, étendez la classe Loader pour le faire (ou toute autre classe avec laquelle vous voulez faire) . Dans cet exemple, je vais passer outre URLLoader avec cette fonctionnalité (parce que Loader envoie en fait des événements à partir de son contentLoaderInfo, qui a besoin de deux classes surchargées, et je veux juste garder les choses simples)


package com.net 
{ 
    import flash.net.URLLoader; 
    import flash.events.Event; 

    import com.events.CustomEvent; 

    public class CustomLoader extends URLLoader 
    { 
     // URLLoader already has a data property, so I used extraData 
     public var extraData:*; 

     override public function dispatchEvent(event: Event) : Boolean 
     { 
      var customEvent: CustomEvent = new CustomEvent(event.type, extraData, event.bubbles, event.cancelable); 
      return super.dispatchEvent(customEvent); 
     } 
    } 
} 

maintenant à utiliser avec votre CustomEvent classe essayer ce code dans votre .fla


import com.net.CustomLoader; 
import com.events.CustomEvent; 

var loader: CustomLoader = new CustomLoader(); 
loader.extraData = "Extra Data"; 
loader.load(new URLRequest("test.xml")); 
loader.addEventListener(Event.COMPLETE, loadComplete); 

function loadComplete(event: CustomEvent) : void 
{ 
    trace(event.data); // Extra Data 
} 

BAM! Données personnalisées sur vos événements envoyés de manière innée!

+0

pouvez-vous s'il vous plaît donner un exemple de vous CustomEvent classe –

+0

nevermind. :) http://www.charglerode.com/blog/?p=51 –

+0

http://stackoverflow.com/questions/762521/custom-as3-loader-class-that-uses-a-custom-loaderinfo-class –

0

La figure suivante montre la manière la plus propre de créer un événement personnalisé. Typiquement, les types d'événements ont des références statiques publiques tapées dans toutes les lettres capitales. Lorsqu'un événement est distribué, il transmet un objet Event ou CustomEvent à la méthode du gestionnaire d'événements. C'est ici que vous pouvez récupérer votre valeur passée. Lorsque nous distribuons des événements, nous créons une nouvelle instance de l'événement à transmettre en tant que tel.

private var _someValue:int = 12; 
dispatchEvent(new CustomEvent(_somevalue)); 
+0

Il a une classe d'événements personnalisés pour les données personnalisées, il se demandait comment faire pour que les événements normaux envoient cette classe, en transportant ces données supplémentaires :) –

Questions connexes