Meistens bastelt man sich schnell einen eigenen Loader für das leidige Thema des SWFs nachladen. Und wenn man dann auch noch in der Flash IDE arbeiten muss, ist jede Zeile eine Qual (hoch lebe FDT!). Ich hab also irgendwann einmal ein Snippet geschrieben, das ich für fast jedes (und das sind viele) Projekt verwende, um eine SWF nachzuladen und zu adden. Entladen wird sie ja meist, wenn man einen Close-Button drückt, daher kommt das dispatchEvent in diesem Beispiel aus der geladenen SWF. Ist aber natürlich vollkommen jucks, wer die unloadSWF-Methode aufruft. :-)

Here we go:

Actionscript:
  1. var _swfLoader:Loader;
  2. var _swfContent:MovieClip;
  3.  
  4. loadSWF("01.swf");
  5.  
  6. function loadSWF(path:String):void {
  7.     var _req:URLRequest = new URLRequest();
  8.     _req.url = path;
  9.  
  10.     _swfLoader = new Loader();
  11.     setupListeners(_swfLoader.contentLoaderInfo);
  12.    
  13.     _swfLoader.load(_req);
  14. }
  15.  
  16. function setupListeners(dispatcher:IEventDispatcher):void {
  17.     dispatcher.addEventListener(Event.COMPLETE, addSWF);
  18.     dispatcher.addEventListener(ProgressEvent.PROGRESS, preloadSWF);
  19. }
  20.  
  21. function preloadSWF(event:ProgressEvent):void {
  22.     var _perc:int = (event.bytesLoaded / event.bytesTotal) * 100;
  23.     // swfPreloader.percentTF.text = _perc + "%";
  24. }
  25.  
  26. function addSWF(event:Event):void {
  27.     event.target.removeEventListener(Event.COMPLETE, addSWF);
  28.     event.target.removeEventListener(ProgressEvent.PROGRESS, preloadSWF);
  29.    
  30.     _swfContent = event.target.content;
  31.     _swfContent.addEventListener("close", unloadSWF);
  32.  
  33.     addChild(_swfContent);
  34. }
  35.  
  36. function unloadSWF(event:Event):void {
  37.     _swfLoader.unloadAndStop();
  38.    
  39.     removeChild(_swfContent);
  40.     _swfContent = null;
  41. }

Das Snippet zeigt also, wie zunächst der Ladevorgang gestartet wird und die EventListener für PROGRESS und COMPLETE an den zum Loader gehörenden Dispatcher registriert werden. Das ProgressEvent feuert immer dann, wenn neue Daten empfangen werden. Mit den bytesLoaded und bytesTotal kriegen wir also die Prozentzahl des Ladevorgangs - wichtig für Preloader. Sobald die SWF vollständig geladen wurde wird die addSWF-Funktion aufgerufen, die zunächst die EventListener entfernt und dann den Inhalt des LoaderObjekts (unsere geladene SWF also) in einem leeren MovieClip referenziert.

Wie wir nun auf den Inhalt unserer SWF zugreifen können seht ihr hier:
Auf MovieClips & Funktionen externer SWFs zugreifen
Falls ihr aus der geladenen SWF eine Funktion im Hauptfilm aufrufen wollt: Aus externer SWF mit dem Hauptfilm kommunizieren

Die unloadSWF-Funktion wird durch ein aus der geladenen SWF gefeuertes Event gestartet und entfernt sowohl den Loader-Inhalt als auch unsere Referenz.

3 Kommentare

  1. Alternative zu removeChild - Flashforum:

    [...] [...]

  2. Wolfgang:

    Hallo, super Sache! Funktioniert im Prinzip!! Nun, ich habe ein kleines Flash gebaut was zunächst einfach nur Bilder „eintweent“. Damit der erste SWF nicht zu gross wird möchte ich nachher einen SWFcontainer nachladen wo dann noch mehr Bilder drin sind und diese dann ebenso im MainSWF im laufende Tween mit einbauen!.

    So weit so gut!!

    Nun ich habe einen SWFcontainer gebaut und dort wie imMainSWF Bilder bereit gestellt. Zum test einfach einen simples Rechteck mal dazu.
    Zum einen werden die Bilder nicht „gemocht“ als auch der simple Zugriff aud das bescheidene Rechteck wie z.B:
    mytestmc2.alpha = 0.5;
    wird immer mit der Fehlermeldung quittiert:

    TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.

    Wieso NULL Objekt! Wenn ich das direkt im SWFcontainer mache fluppt das!!

    Hilfffffffeeeeee biiiiitttteeee!

    Gruss
    Eine AS3 Novize!!

    By the Way. Das ist hier sehr schön erklärt und nachvollziehbar nur eben…!!

    Mein Script:

    import fl.transitions.Tween;
    import fl.transitions.easing.*;
    import fl.transitions.TweenEvent;

    function run_loop(){

    var _swfLoader:Loader;
    var _swfContent:MovieClip;

    loadSWF(“contain2.swf”);

    function loadSWF(path:String):void {
    var _req:URLRequest = new URLRequest();
    _req.url = path;

    _swfLoader = new Loader();
    _swfLoader.contentLoaderInfo.addEventListener(Event.INIT, addSWF);
    _swfLoader.load(_req);}

    function addSWF(event:Event):void {
    event.target.removeEventListener(Event.INIT, addSWF);

    _swfContent = event.target.content;
    addChild(_swfContent); }

    var n:int =5;

    var i:Number = 1+ Math.floor(Math.random()*n);

    var runnum;

    ///////////////
    switch(i)
    {
    case 1:
    runnum=_swfContent.banner5; // hier ist der versuchte Zugriff auf den externen SWFcontainer
    break;
    case 2:
    runnum=pic_mc02;
    break;
    case 3:
    runnum=pic_mc03;
    break;
    default:
    runnum=pic_mc04;
    }
    /////////////////

    var myImage:BitmapData = new runnum(1, 1);
    var bitmap:Bitmap = new Bitmap(myImage)

    bitmap.alpha =0;
    bitmap.x =0;
    bitmap.y =0;

    addChild(bitmap);

    var my_tween:Tween = new Tween(runnum, “alpha”, Strong.easeIn, 1, 0, 3, true);
    my_tween.addEventListener(TweenEvent.MOTION_FINISH, nachoben);

    function nachoben(){

    run_loop();}}

    run_loop();

  3. Marvin Blase:

    hi wolfgang,
    sorry, dass ich mich erst jetzt melde – bin momentan etwas land unter hier. ich schaue mir dein snippet demnächst in ruhe an. auf den ersten blick würde ich vermuten, dass du

    _swfcontent.mytestmc2.alpha = .5;

    schreiben müsstest, da deine geladene swf ja mit _swfcontent angesprochen wird. und IN der swf ja dein mc liegt..

Kommentar hinterlassen: