2010-11-03 76 views
0

我在使用AS3在Flash中創建高分表,我已經成功地獲得了顯示名稱和分數的工作代碼,但也是我需要顯示用戶國旗的高分表的一部分。標誌的圖像存儲在遠程服務器上。AS3如何在循環中加載外部圖像?

現在我知道如何加載單個圖像並將其添加到我的影片剪輯中,但是當我想通過迭代循環來加載20 +時,情況變得非常複雜。我看了很多例子,只是不能採用示例代碼爲我工作。無論如何,沒有進一步的做到這裏是我到目前爲止。

// Load High scores from server 
var hiscoreloader:URLLoader = new URLLoader(); 
hiscoreloader.addEventListener(Event.COMPLETE, highScoresLoaded); 
var hiscorexml:XML; 
function highScoresLoaded(e:Event):void 
{ 
    hiscorexml = new XML(e.target.data); 
    var hsList:XMLList = hiscorexml.highscores.highscore; 
    for(var i:uint = 0; i < hsList.length(); i++) 
    { 
     this["hs_score_"+i].text = zeroPad(hsList.score.text()[i], 8); 
     this["hs_name_"+i].text = hsList.name.text()[i]; 
     // Load in Flag 
     // url of flag will be: "http://wfwxg.philosophydesign.com/images/flags/" + hsList.country.text()[i] + ".png" 
     // Move clip instance name the above image needs adding too will be: this["hs_flag_"+i] 
    } 
} 
hiscoreloader.load(new URLRequest("http://wfwxg.philosophydesign.com/includes/top20.php?nocache=" + new Date().getTime()));

任何人都可以修改我的代碼做什麼我之後?

非常感謝

斯科特

回答

2

這裏有一個快速的解決方案。

實際上,我會建議封裝關注點,以便代碼不緊密耦合。現在,您可以在一個函數中處理幾乎所有內容,同時將結果數據分配給您的主要MovieClip。這就是爲什麼我創建了一個數組來保存XML數據以及加載的圖像。

一種可能的結構可能是:
- 首先檢索XML數據並將其分配給數據Array。
- 通過數據Array循環加載圖像,並將加載的內容分配給相關對象。
- 所有圖像都加載完畢後,使用數據數組來設置你的顯示器

 // Load High scores from server 
     var hiscoreloader:URLLoader = new URLLoader(); 

      //Create an Array to hold your XML data 
     var data:Array = []; 

     hiscoreloader.addEventListener(Event.COMPLETE, highScoresLoaded); 

     var hiscorexml:XML; 

     function highScoresLoaded(e:Event):void 
     { 
      hiscorexml = new XML(e.target.data); 
       var hsList:XMLList = hiscorexml.highscores.highscore; 

      for(var i:uint = 0; i < hsList.length(); i++) 
      { 
      //here we create a new Object to hold the retrieved data 
      //and add it to the data Array 
      data[i] = { 
          hs_score:zeroPad(hsList.score.text()[i], 8), 
      hs_name: hsList.name.text()[i], 
      flagURL:"http://wfwxg.philosophydesign.com/images/flags/" 
          + hsList.country.text()[i] + ".png", 
      mc_name:"hs_flag_"+i.toString(); 
      }; 

      //load the images 
      var loader:Loader = new Loader(); 
      configureListeners(loader.contentLoaderInfo); 
      loader.name = i.toString(); 
      loader.load(new URLRequest(data[i].flagURL)); 
      } 
     } 

     function configureListeners(info:LoaderInfo):void 
     { 
      //add all your event listeners here 
      info.addEventListener(Event.COMPLETE , completeHandler); 
     } 

     function removeListeners(info:LoaderInfo):void 
     { 
      //remove all your event listeners here 
      info.removeEventListener(Event.COMPLETE , completeHandler); 
     } 


    function completeHandler(event:Event):void 
    { 
     var index:int = int(event.currentTarget.loader.name); 
     //add the image data to your data Array 
     data[index].flag = event.currentTarget.loader.content; 
     removeListeners(event.currentTarget); 
    } 
+0

非常感謝您的幫助。我重新標記了你給出的代碼,並在你有索引的完整處理程序中修正了一個錯誤,然後使用了i。這是我現在的代碼:http://pastebin.com/zk3AWKN9當我運行時出現此錯誤:1118:隱式強制將靜態類型爲Object的值轉換爲可能不相關的類型flash.display:LoaderInfo。 – Brady 2010-11-04 10:02:33

+0

我無法測試您的代碼,嘗試加載XML會引發安全錯誤。僅僅通過查看它很難調試:)嘗試使用斷點,如果不嘗試將代碼分成幾部分。例如,首先通過註釋加載器代碼來測試循環,如果可行,請僅註釋loader.load ...等等,直到找到它的中斷點爲止。這段代碼相當直接,我看不到這個錯誤的原因,我認爲這可能是由於你的環境,也許是一個變量名衝突... – PatrickS 2010-11-05 02:36:46

+0

在我以前的評論中,我突出了代碼,它在哪裏打破在。對我來說這個錯誤意味着它不像event.currentTarget被傳遞給:LoaderInfo類型。所以我改變了它只是一個對象。該代碼的作品,但我真的不知道這是否是正確的,它正確清理事件監聽器。這裏是我現在的代碼:http://pastebin.com/1dLzxtDc – Brady 2010-11-08 12:38:00