2011-06-25 31 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; 
      } 
     } 
    } 
}