2012-04-02 6 views
0

Ich habe einen einfachen Code für eine Diashow erstellt, die Bilder dynamisch aus einem Unterordner lädt, abhängig davon, was in einer Textdatei aufgelistet ist.FLASH AS3 - Dynamisch geladene Diashow aus Txt-Datei

der Code:

import flash.display.MovieClip; 
import flash.events.Event; 
import flash.display.Loader; 
import flash.net.URLLoader; 
import flash.net.URLRequest; 
import flash.display.Bitmap; 
import flash.display.BitmapData; 

public class slideshow extends MovieClip { 

    public var listLoader:URLLoader; 
    public var newImgList:Array; 
    public var imgX:int = 0; 
    public var container:MovieClip; 

    public function slideshow() { 
     container = new MovieClip(); 
     stage.addChild(container); 

     listLoader = new URLLoader(new URLRequest("./slideshow.txt")); 
     listLoader.addEventListener(Event.COMPLETE, initImages); 
    } 

    public function initImages(event:Event):void { 
     var imgList:Array = listLoader.data.replace(/^\s+/,"").replace(/\s+$/,"").split(/\s+/); 
     newImgList = new Array(); 
     for(var line:int = 0; line < imgList.length; line++) { 
      if(imgList[line].indexOf(".png") != -1 || imgList[line].indexOf(".jpg") != -1) { 
       newImgList.push(imgList[line]); 
      } 
     } 
     loadImage(); 
    } 

    public function loadImage():void { 
     for(var loaderNum = 0; loaderNum < newImgList.length; loaderNum++) { 
      var imgLoader = new Loader(); 
      imgLoader.load(new URLRequest("./slideshow/" + newImgList[loaderNum])); 
      imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imgInit); 
     } 
    } 

    public function imgInit(event:Event):void { 
     var imgBmp:BitmapData = event.target.content.bitmapData; 
     var img:Bitmap = new Bitmap(imgBmp); 
     img.height = 150; 
     img.scaleX = img.scaleY; 
     img.y = 0; 
     img.x = imgX; 
     imgX = (imgX + img.width + 10); 
     container.addChild(img); 
    } 
} 

auch tatsächlich funktioniert es für mich in Ordnung, außer, dass die Bilder in einer fast zufälligen Reihenfolge angezeigt werden.

Ich denke, der Code lädt einige Bilder zu langsam, so dass einige von ihnen zum Movieclip hinzugefügt werden, obwohl sie nach dem geladen werden, der als nächstes gehen sollte.

so, was ich meine:

1.png geladen

1.png hinzugefügt wird

2.png geladen wird

3.png geladen wird

3.png wird hinzugefügt

2.png wird hinzugefügt

so meine Frage:

gibt es eine andere Propper/bessere Möglichkeit, dass die Diashow Last Bilder von einer Text-Datei, wo nur die vollständigen Namen der Bilder (die in einen machen Unterordner) sind aufgelistet?

danke für irgendwelche Vorschläge.

g.r.

+0

Verwenden [ 'XML'] (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/XML.html). Bitte, um Himmels willen, benutze ['XML'] (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/XML.html). – Marty

+0

würde ich, aber ich sollte nicht! Die Website, die ich mache, ist für dumme Leute, die nur schlau genug sind, um einige Bildnamen in eine Textdatei zu schreiben! wenn ich das ganze Ding in xml machen wollte, hätte ich es wahrscheinlich schon getan;) – Ace

+0

Ich finde es einfacher zu erklären, wie man Knoten wie '' welche sie kopiert und einfügt kann neue Zeilen einrücken/trennen, oder was auch immer sie wollen, ohne alles zu brechen, als wenn sie eine Textdatei manipulieren, die ein strengeres Layout benötigt. Stellen Sie Ihre Bilder auf jeden Fall in eine Warteschlange, anstatt sie alle gleichzeitig zu laden, um Ihr Problem zu beheben. – Marty

Antwort

1

Legen Sie Ihr Bildladeprogramm in die Warteschlange, damit sie bestellt werden können.

Raue Beispiel:

var queue:Array = []; // Populated from your text/whatever file. 
// If you want the images to load from first to last you will need 
// to use queue.reverse() once you get the filenames. 

/** 
* Beings loading the next image in queue. 
* Ignored if the queue has no remaining items. 
*/ 
function loadNext():void 
{ 
    if(queue.length > 0) 
    { 
     var imgSrc:String = queue.pop(); 

     var ldr:Loader = new Loader(); 
     ldr.load(new URLRequest(imgSrc)); 

     ldr.addEventListener(Event.COMPLETE, _done); 
    } 
} 


/** 
* Called once a Loader instance has finished loading a resource. 
* @param e Event.COMPLETE. 
*/ 
function _done(e:Event):void 
{ 
    e.target.removeEventListener(Event.COMPLETE, _done); 
    container.addChild(e.target as DisplayObject); 

    // Begin loading the next image in queue. 
    loadNext(); 
} 
+0

Danke für Ihre schnelle Antwort, jetzt sehe ich die Idee dahinter. scheint ziemlich offensichtlich ^^ Ich werde es versuchen ... – Ace

+0

@Ace No probs. Ja, sollte dich in die richtige Richtung schieben. – Marty

+0

jetzt habe ich nur die Idee mit den Doppelfunktionen, die sich gegenseitig aufrufen, aber ich habe den Code vollständig geändert. sowieso war es eine richtige Antwort ^^ – Ace