使用循环AS3加载外部swfs

时间:2011-06-25 23:39:14

标签: actionscript-3 loops flash external

我花了几天时间研究这段代码,看起来很简单,但它永远不会奏效。我要做的就是在同一目录中自动加载person0.swfperson4.swf。我已经进行了设置,以便我可以更改单个数字并加载到person[whatever-the-new-number-is].swf

目前它加载了第一部电影,就是这样。我也收到了这个错误:

“TypeError:错误#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;
        }
    }
}

}

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:1)

我也想出了另一个解决方案,尽管BigLarry的设计有点复杂。当我从上一行.content中删除loader.content.x时,错误消失了。

此外,通过将每个加载器和URLRequest存储在一个数组中,所有swfs都显示在屏幕上,而不是重复替换相同的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;
            }
        }
    }
}

答案 2 :(得分:0)

你应该使用Greensock的LoaderMax(TweenLite / TweenMax的创建者)。

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

它非常方便,您只需传入一组文件路径,然后完成剩下的工作。在上面的链接上查看现场演示,你会被说服。