2009-03-22 7 views
1

Je travaille sur une application Flex qui utilise de nombreux objets, par ex. LED, ampoules, jauges créées en Flash. Les objets se composent intérieurement de plusieurs petits MovieClips et ont leur propre logique à l'intérieur. L'une des exigences initiales était que les objets devaient être chargés au moment de l'exécution, ils étaient donc exportés en tant que SWF, et non SWC. Cependant, nous avons rencontré un problème lorsque nous avons essayé de dupliquer le fichier SWF chargé. Il s'est avéré que la classe MovieClip n'a ni constructeur ni méthode de copie qui nous permettraient de cloner un MovieClip existant. De cette façon, nous finirions par charger un objet à chaque fois depuis hdd, ce qui implique beaucoup de frais généraux. Est-il possible qu'un langage comme ActionScript 3 ne dispose pas d'un tel mécanisme? Avons-nous manqué quelque chose? Si non, ai-je raison de dire que la seule solution est d'utiliser Flash Component Kit, de créer des composants personnalisés et de les inclure en tant que SWC au moment de la compilation?Utilisation de fichiers SWF externes dans une application Flex - duplication de MovieClip?

Répondre

0

Vous avez raison qu'il n'y a pas construit de façon à dupliquer un MovieClip. Il existe cependant des solutions de contournement. La façon la plus simple que je vois est de donner les classes de MovieClips.

Vous ne devez pas faire les classes réelles. Il suffit d'écrire n'importe quel nom dans le champ de classe lors de la mise en place de la liaison sur le plus grand MovieClip qui doit être copié. Donc un nom pour vous LED MovieClip, un autre nom pour l'ampoule, etc

Le benifit est que vous avez maintenant une classe que vous pouvez initier des objets.

Non lorsque vous Grap un des MovieClips vous pouvez dupliquer avec la méthode suivante:

public function DuplicateDisplayObject(dO:DisplayObject):DisplayObject 
{ 
    if(dO == null) 
     return null; 
    var dOClass:Class = Object(dO).contructor; 
    return DisplayObject(new dOClass()); 
} 

Cela suppose la cause que vous pouvez réellement obtenir une prise de l'un des MovieClips premier. Et gardez à l'esprit qu'il ne copie pas l'état du MovieClip. Une autre remarque plus importante est que cela ne fonctionne que si vous liez les MovieClips aux classes. Les classes n'ont pas à exister (flash va créer des classes vides pour vous).

D'autres solutions pourraient être:

  • Compiler contre les classes sans y compris les (voir la tag « bibliothèque externe chemin » pour le compilateur Flex ) et charger le leur à exécution (de swf).
  • Compilant les classes en tant que RSL (Runtime Share Library), le fichier swc sera chargé au moment de l'exécution.

Adobe a plus d'informations sur la façon de le faire, devrait être facile à trouver sur leur site Web.

Une solution plus exotique serait de copier le bytecode d'un objet. Je ne sais pas si cela fonctionnerait avec quelque chose sur la liste d'affichage, correctement non. A propos de la solution utilisant getDefinitionByName(): Si je me souviens bien, vous devez toujours donner les fausses classes movieclips, puisque getQualifiedClassName ne renvoie que la classe MovieClip. Mais je peux me tromper.

0

Une autre solution:

 private function duplicateImg(sourceLoaderInfo:LoaderInfo, target:Image):void 
    { 
     var ba:ByteArray = sourceLoaderInfo.bytes;   
     var dupCliploader:Loader = new Loader(); 

     dupCliploader.contentLoaderInfo.addEventListener(
      Event.COMPLETE, bytesLoaded); 

     dupCliploader.loadBytes(ba); 
    } 

    private function bytesLoaded(event:Event):void 
    {   
    var mc:MovieClip = event.currentTarget.content as MovieClip; 

    _img.source = mc; 
    _img.width = mc.width; 
    _img.height = mc.height+5;     
    } 
Questions connexes