如何管理已加载的资产?

时间:2011-07-23 10:19:41

标签: actionscript-3 oop

我正在开发一个必须加载大量外部文件的AS3项目;图像,声音片段,影片剪辑等程序首先加载一个XML文件,其中包含每个类所需的所有资产的文件名。从那时起,我不确定分发这些资产的最佳方式是什么。

我考虑过创建一个专用资产类来加载XML对象描述的所有内容,然后将它传递给每个类的构造函数,以便他们可以访问所需的对象。这似乎是“最整洁”的选项,但有没有一种管理负载资产的最佳实践方法?

1 个答案:

答案 0 :(得分:1)

您可以创建一个处理资源加载并将其存储为字节的类。然后,您可以通过引用(例如名称)从该类中获取资产,并根据需要执行所需操作。我已经创建了一个示例来证明这一点:

package 
{
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.utils.ByteArray;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        private var _assets:Assets;
        private var _counter:int;
        private var _assetsXml:XML;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            _assetsXml = <assets>
                             <asset name="chrysanthemum" url="assets/chrysanthemum.jpg"></asset>
                             <asset name="kalimba" url="assets/kalimba.mp3"></asset>
                             <asset name="wildlife" url="assets/wildlife.wmv"></asset>
                         </assets>;

            _assets = new Assets();

            for each(var asset:XML in _assetsXml.children())
            {
                _assets.addEventListener(Event.COMPLETE, onAssetComplete);
                _assets.load(asset.@name, asset.@url);

            }// end for each

        }// end function

        private function onAssetComplete(e:Event):void
        {
            if (++_counter == _assetsXml.children().length()) addImage();

        }// end function

        private function addImage():void 
        {
            var loader:Loader = new Loader()
            loader.loadBytes(_assets.getAssetBytesByName("chrysanthemum"));
            addChild(loader);

        }// end function

    }// end class

}// end package

import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;

internal class Assets extends EventDispatcher
{
    private var _assetLoaders:Vector.<AssetLoader>;

    public function Assets():void 
    {
        _assetLoaders = new Vector.<AssetLoader>();

    }// end class

    public function load(name:String, url:String):void
    {
        var assetLoader:AssetLoader = new AssetLoader(name);
        assetLoader.addEventListener(Event.COMPLETE, onAssetLoaderComplete);
        assetLoader.load(url);

    }// end function

    public function getAssetBytesByName(name:String):ByteArray
    {
        for each(var assetLoader:AssetLoader in _assetLoaders)
        {
            if (assetLoader.name == name) break;

        }// end for each

        return assetLoader.bytes;

    }// end function

    private function onAssetLoaderComplete(e:Event):void
    {
        var assetLoader:AssetLoader = e.target as AssetLoader;
        _assetLoaders.push(assetLoader);

        dispatchEvent(new Event(Event.COMPLETE));

    }// end function

}// end class

internal class AssetLoader extends EventDispatcher
{
    private var _name:String;
    private var _url:String;
    private var _bytes:ByteArray;

    public function get name():String { return _name }
    public function get url():String { return _url };
    public function get bytes():ByteArray { return _bytes };

    public function AssetLoader(name:String):void
    {
        _name = name;

    }// end function

    public function load(url:String):void
    {
        _url = url;

        var urlLoader:URLLoader = new URLLoader();
        urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
        urlLoader.addEventListener(Event.COMPLETE, onUrlLoaderComplete);
        urlLoader.load(new URLRequest(_url));

    }// end function

    private function onUrlLoaderComplete(e:Event):void
    {
        var urlLoader:URLLoader = e.target as URLLoader;
        _bytes = ByteArray(urlLoader.data);

        dispatchEvent(new Event(Event.COMPLETE));

    }// end function

}// end class