2012-04-02 2 views
0

Я сделал простой код для слайд-шоу, который динамически загружает изображения из подпапки, в зависимости от того, что является списком в текстовом файле.FLASH AS3 - динамически загруженное слайд-шоу из файла Txt

код:

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); 
    } 
} 

а на самом деле она отлично работает для меня, что изображения отображаются в почти случайном порядке, за исключением.

Я думаю, что код загружает некоторые изображения слишком медленно, поэтому некоторые из них добавляются в мувиклип, хотя они загружаются после того, который должен идти дальше.

так, что я имею в виду:

1.png загружается

1.png добавляют

2.png загружается

3.png загружается

3.png добавлен

2.png добавляет

поэтому мой вопрос:

есть ли другой Проппер/лучший способ сделать это слайд-шоу загружать изображения из текстового файла, где только полные имена изображений (которые находятся в вложенной папке)?

спасибо за любые предложения.

g.r.

+0

С помощью [ 'XML'] (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/XML.html). Пожалуйста, для любви к Богу, используйте ['XML'] (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/XML.html). – Marty

+0

я бы, но я не должен! сайт, который я делаю для глупых beople, которые просто умны, чтобы написать имена изображений в текстовый файл! Если бы я хотел сделать все это в xml, я бы, возможно, сделал это уже;) – Ace

+0

Мне легче объяснить, как копировать и вставлять узлы, такие как '', которые они могут отступать/разделяться на новых строках или независимо от того, что они хотят, не нарушая ничего, кроме того, что они калечат текстовый файл, который требует более строгой компоновки. В любом случае, ставьте очередь изображений, а не загружайте их сразу, чтобы исправить свою проблему. – Marty

ответ

1

Очередь загрузки изображения, чтобы заказать их.

Грубый пример:

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

thx для вашего быстрого ответа, теперь я вижу идею этого. кажется довольно очевидным ^^ Я дам ему попробовать ... – Ace

+0

@Ace Нет проблем. Да, должен подтолкнуть вас в правильном направлении. – Marty

+0

теперь я только что использовал идею с двойными функциями, которые называют друг друга, но я полностью изменил код. в любом случае это был правильный ответ ^^ – Ace

Смежные вопросы