Apprendre flash par des formations professionnelles Nouveau thème
May 05

Alors que l'AS3 apporte beaucoup de belles nouveautées, certaines choses basiques (à nos yeux en tout cas) sont toujours manquantes, comme le fait de ne pas pouvoir dupliquer un swf.

En tout cas c'est ce que je pensais naivement au début, puisque après une petite heure de recherche, je suis arrivé à une solution simple et qui devrait (avec un petit peu d'arrangement et d'encapsulation) être très intéréssante.

Attention, je ne dis pas que je vais vous apprendre beaucoup avec ce billet, cette solution ou quelque chose de bien plus interessant peut etre disponible ailleurs sur le web :) (d'ailleurs si vous avez des liens/idées à partager, les commentaire sont activés hein ^^).

JavaScript:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.*;
  5.     import flash.net.*;
  6.     import flash.utils.ByteArray;
  7.     import flash.display.MovieClip;
  8.     import flash.display.Loader;
  9.  
  10.     public class DuplicateSWF extends Sprite
  11.     {
  12.         // Mettez votre chemin vers votre swf ici (attention aux limitations de securité du flash player).
  13.         public const swfFile:String = "test.swf";
  14.        
  15.         public function DuplicateSWF()
  16.         {
  17.             var loader:URLLoader = new URLLoader();
  18.             configureListeners(loader);
  19.             loader.dataFormat = URLLoaderDataFormat.BINARY;
  20.             var request:URLRequest = new URLRequest( swfFile );
  21.             try
  22.             {
  23.                 loader.load(request);
  24.             }
  25.             catch (error:Error)
  26.             {
  27.                 trace("Unable to load requested document.");
  28.             }
  29.         }
  30.  
  31.         private function configureListeners(dispatcher:IEventDispatcher):void
  32.         {
  33.             dispatcher.addEventListener(Event.COMPLETE, completeHandler);
  34.         }
  35.  
  36.         private function completeHandler(event:Event):void
  37.         {
  38.             var loader:URLLoader = URLLoader(event.target);
  39.             var data:ByteArray = (loader.data as ByteArray );
  40.             // --
  41.             var l:Loader = new Loader();
  42.             l.loadBytes( data );
  43.             addChild( l );
  44.             // --
  45.             var l2:Loader = new Loader();
  46.             l2.loadBytes( data );
  47.             l2.x = 100;
  48.             addChild( l2 );
  49.             // --
  50.             var l3:Loader = new Loader();
  51.             l3.loadBytes( data );
  52.             l3.x = 200;
  53.             addChild( l3 );
  54.         }
  55.     }
  56. }

Je mettrais surement un petit exemple en ligne plus tard si je vois que cela vous interesse, mais comme vous le voyez, la solution est simple, et semble fonctionelle.

La gestion des données binaire est vraiment un des plus gros avantage de l'AS3 (même si moi j'attendais une accélération matérielle ou des routines graphiques plus performantes), et il n'y a qu'a voir le nombre de projet arrivant sur le web l'utilisant (WiiFlash, client de messagerie Yahoo online (dispo que pour les US actuellement), et surement bien d'autres que je ne connais pas.

3 commentaires pour “Dupliquer un SWF dynamique en AS3”

  1. ali_o_kan a dit :

    Yes, merci pour l'astuce :)

  2. Olircadia a dit :

    J'ai du mal à suivre la procédure... Dans ton exemple, l'élément que tu souhaites dupliquer est un swf, et donc, si je comprends bien, tu le charges plusieurs fois, mais admettons que tu veuilles charger un swf, et que dans ce swf, il y ait uniquement un élément (instancié) que tu souhaite dupliquer, comment s'y prendre ?
    Ta solution pourrait-elle s'y appliquer ?

  3. kiroukou a dit :

    Salut,
    non pour cela, je te recommande cet utilitaire:
    http://www.senocular.com/flash/actionscript.php?file=ActionScript_3.0/com/senocular/display/duplicateDisplayObject.as

    Ca correspondra mieux à ce que tu souhaites faire je pense.

Répondre