一遍又一遍地加载相同的SWF。有一个更好的方法吗?

时间:2009-12-23 21:02:04

标签: flash actionscript-3

我有点问题......

我们有一个应用程序需要根据用户输入加载不同数量的行图形。目前,使用Flash.Display.Loader重复加载每一行SWF。 swf相当大(17k),装载10个左右需要一些时间。有没有办法只加载这个文件一次并多次使用它?

我是Flash / actionscript的新手。如果需要任何其他信息,请告诉我,我会尽力提供。

感谢。

2 个答案:

答案 0 :(得分:2)

嘿那里,是的你可以加载一次;您可以将所有资产放在一个SWF中,并在加载后立即使用它们。

例如,假设您要在要加载的SWF上使用两个图形行(影片剪辑),rowA和rowB;此SWF将充当您的资产库。您需要做的是在库中创建rowA和rowB影片剪辑,并将它们设置为导出以供Actionscript使用。 (在FLA的库中,右键单击它们并单击属性,然后选择Export for Actionscript,在类输入字段中为此示例输入“rowA”,并分别输入“rowB”)。现在您已经拥有了库中的资源(他们没有在舞台上)发布swf文件。

现在,让我们转到SWF,您将实际使用此“库”。在这里,您只需要加载SWF库(带有图形资源的库),您就可以了。代码示例,

    // Our URL Request
    var req:URLRequest = new URLRequest();
    req.url = "assets.swf";

    // Let create our loader
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLibLoaded);

    var context:LoaderContext = new LoaderContext();
    context.applicationDomain=ApplicationDomain.currentDomain;

    loader.load(req,context);


    function onLibLoaded(e:Event):void
    {
     createRows();
    }

    function createRows()
    {
     var myRowAClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("rowA")  as  Class;
     var rowA:MovieClip = new myRowAClass() as MovieClip;
     this.addChild(rowA);

     var myRowBClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("rowB")  as  Class;
     var rowB:MovieClip = new myRowBClass() as MovieClip;
     rowB.y = rowA.height;
     this.addChild(rowB);
    }

正如您所看到的,一旦加载了资产库,您就可以按照自己喜欢的方式使用资产。无论如何,希望这会有所帮助,希望是你想要的。

答案 1 :(得分:2)

除了falomir所说的,你还可以使用两种方法:

1.-如果您的SWF只是一个图像(并且您可以将其用作位图),您可以创建加载的SWF的BitmapData,然后根据需要多次使用它:

var bmp:BitmapData = new BitmapData(loader.width, loader.height, true, 0);
bmp.draw(loader);
var row1:Bitmap=new Bitmap(bmp);
var row2:Bitmap=new Bitmap(bmp);

2.-如果您的swf是动画和/或交互式(不仅仅是位图),您可以将其加载为二进制URLLoader,然后使用Loader.loadBytes在您的应用程序中复制它:

var urlloader:URLLoader = new URLLoader();
urlloader.dataFormat = URLLoaderDataFormat.BINARY;
urlloader.addEventListener(Event.COMPLETE, swfloaded);
urlloader.load("miswf.swf");
function swfloaded(e:Event):void {
    var bytes = urlloader.data;
    var row1:Loader = new Loader();
    row1.loadBytes(bytes);
    var row2:Loader = new Loader();
    row2.loadBytes(bytes);
}

请注意,loadBytes是异步的,因此您需要等待其loaderInfo COMPLETE事件能够操作其内容......它类似于您正在使用的内容(使用Loader),但它只需要一个服务器请求。