2011-06-25 56 views
0

我花了好幾天的時間研究這段代碼,它看起來很簡單,但它從來沒有工作。我所要做的就是創建一個循環,在同一目錄中自動加載person0.swfperson4.swf。我有它的設置,以便我可以更改一個數字,它可以加載到person[whatever-the-new-number-is].swf用循環加載外部swfs,AS3

目前它加載第一部電影,就是它。我也收到此錯誤:

「類型錯誤:錯誤#1009。在菜單()無法訪問空對象引用 屬性或方法」

下面是代碼

package { 

import flash.display.*; 
import flash.net.URLRequest; 
import flash.events.*; 

public class Menu extends MovieClip { 
    var loaders:Array; 
    var loadedCount:uint; 
    var person:Array = new Array(); 
    var filenum:int = 5; 

    function Menu() { 
     for (var i = 0; i < 4; i++) { 
      var loader = new Loader(); 
      person.push("person" + i + ".swf"); 
      var currentperson = person[i]; 
      var url:URLRequest = new URLRequest(currentperson); 
      loader.load(url); 
      addChild(loader); 
      loader.content.x = i * 240; 
     } 
    } 
} 

}

回答

2

我認爲發生的事情是,在嘗試移動加載程序內容的位置之前,加載程序沒有時間來完成加載過程。由於內容尚未到位,因爲內容爲空,所以會返回錯誤。

如果您註釋掉「loader.content.x = i * 240;」你會發現它運行良好。

因此,您可能需要做的是在加載程序通過向加載程序的contentLoaderInfo屬性添加事件偵聽器來分派「完成」事件之後移動內容。

試試這個:

private var person:Array = new Array();  
private var itemCount:Number = 0; 
private var itemMax:Number = 4; 

public function Main():void 
{ 
    loadSWFs(); 
} 

private function loadSWFs() 
{ 
    person.push("person" + itemCount + ".swf"); 
    var currentPerson = person[itemCount]; 
    var url:URLRequest = new URLRequest(currentPerson); 
    var loader:Loader = new Loader(); 
    loader.load(url); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, moveLoaderChild); 
    addChild(loader); 
} 

private function moveLoaderChild(e) 
{ 
    e.target.content.x = itemCount * 240; 
    if (itemCount < itemMax) 
    { 
     itemCount++; 
     loadSWFs(); 
    } 
} 
+0

輝煌!我喜歡你如何在兩個不同的函數之間循環,使用事件監聽器來重新啓動加載過程!這爲我想要做的其他事情打開了大門......您也有權利,錯誤來自「loader.content.x = i * 240;」線。我發佈後不久,我發現了。感謝所有的幫助! –

0

您應該使用Greensock的LoaderMax(TweenLite/TweenMax的創建者)。

http://www.greensock.com/loadermax/

這是非常方便的,你只是傳遞的文件路徑數組並沒有休息。在上面的鏈接檢查現場演示,你會相信。

+0

看起來非常有用。我只是想出了我自己的裝載機,但可能會看到這個未來的程序 –

1

我也想通了另一種解決方案,雖然BigLarry的是更復雜一點。當我從前一行loader.content.x中刪除.content時,錯誤消失。

另外,通過將每個加載器和URLRequest存儲在一個數組中,所有的swfs都顯示在屏幕上,而不是重複替換相同的一個。

package { 
    import flash.display.*; 
    import flash.net.URLRequest; 
    import flash.events.*; 

    public class Menu extends MovieClip { 
     public function Menu() { 
      var loaders:Array = new Array(); 
      var person:Array = new Array(); 
      var url:Array = new Array(); 
      var filenum:int = 5; 

      for (var i = 0; i < filenum; i++) { 
       loaders.push(new Loader()); 
       person.push("person" + i + ".swf"); 
       url.push(new URLRequest(person[i])); 
       loaders[i].load(url[i]); 
       addChild(loaders[i]); 
       loaders[i].x = i * 240; 
      } 
     } 
    } 
}