Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何管理加载的资产?_Actionscript 3_Oop - Fatal编程技术网

Actionscript 3 如何管理加载的资产?

Actionscript 3 如何管理加载的资产?,actionscript-3,oop,Actionscript 3,Oop,我正在从事一个AS3项目,该项目必须加载大量外部文件;图像、声音片段、电影片段等。程序首先加载一个XML文件,其中包含每个类所需的所有资产的文件名。从那时起,我不确定分配这些资产的最佳方式是什么 我考虑创建一个专用的assets类,该类将加载XML对象描述的所有内容,然后将其传递给每个类的构造函数,以便它们能够访问所需的对象。这似乎是“最整洁”的选项,但有没有管理已加载资产的最佳实践方法?您可以创建一个类来处理加载资产并将其存储为字节。然后,您可以通过引用(例如名称)从该类中获取资产,并对其执行

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


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

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

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
包
{
导入flash.display.Loader;
导入flash.display.Sprite;
导入flash.utils.ByteArray;
导入flash.events.Event;
公共类Main扩展了Sprite
{
私人var_资产:资产;
专用变量计数器:int;
私有var_资产XML:XML;
公共函数Main():void
{
if(stage)init();
else addEventListener(Event.ADDED_TO_STAGE,init);
}//端函数
私有函数init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE,init);
_资产XML=
;
_资产=新资产();
对于每个(var资产:_assetsXml.children()中的XML)
{
_assets.addEventListener(Event.COMPLETE、onAssetComplete);
_加载(资产@name,资产@url);
}//每个都结束
}//端函数
AssetComplete上的私有函数(e:事件):void
{
如果(++_计数器==_assetsXml.children().length())addImage();
}//端函数
私有函数addImage():void
{
变量加载器:加载器=新加载器()
loader.loadBytes(_assets.getAssetBytes语法名称(“菊花”);
addChild(装入器);
}//端函数
}//末级
}//端包
导入flash.events.Event;
导入flash.events.EventDispatcher;
导入flash.net.urloader;
导入flash.net.URLLoaderDataFormat;
导入flash.net.URLRequest;
导入flash.utils.ByteArray;
内部类资产扩展了EventDispatcher
{
私有var_资产加载程序:向量。;
公共功能资产():无效
{
_assetLoaders=新向量。();
}//末级
公共函数加载(名称:String,url:String):void
{
var assetLoader:assetLoader=新assetLoader(名称);
assetLoader.addEventListener(Event.COMPLETE,onAssetLoaderComplete);
assetLoader.load(url);
}//端函数
公共函数getAssetBytesByName(名称:String):ByteArray
{
对于每个(var assetLoader:assetLoader in_assetLoaders)
{
如果(assetLoader.name==name)中断;
}//每个都结束
返回assetLoader.bytes;
}//端函数
AssetLoaderComplete上的私有函数(e:事件):void
{
var assetLoader:assetLoader=e.target作为assetLoader;
_assetLoader.push(assetLoader);
dispatchEvent(新事件(Event.COMPLETE));
}//端函数
}//末级
内部类AssetLoader扩展了EventDispatcher
{
私有变量名称:字符串;
私有变量url:String;
私有变量字节:ByteArray;
公共函数get name():字符串{return\u name}
公共函数get url():字符串{return\u url};
公共函数get bytes():ByteArray{return\u bytes};
公共函数AssetLoader(名称:字符串):void
{
_名称=名称;
}//端函数
公共函数加载(url:字符串):无效
{
_url=url;
var urlLoader:urlLoader=新的urlLoader();
urlLoader.dataFormat=URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(Event.COMPLETE,onUrlLoaderComplete);
加载(新的url请求(_url));
}//端函数
onUrlLoaderComplete私有函数(e:事件):无效
{
var urlLoader:urlLoader=e.target作为urlLoader;
_字节=字节数组(urlLoader.data);
dispatchEvent(新事件(Event.COMPLETE));
}//端函数
}//末级

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

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
包
{
导入flash.display.Loader;
导入flash.display.Sprite;
导入flash.utils.ByteArray;
导入flash.events.Event;
公共类Main扩展了Sprite
{
私人var_资产:资产;
专用变量计数器:int;
私有var_资产XML:XML;
公共函数Main():void
{
if(stage)init();
else addEventListener(Event.ADDED_TO_STAGE,init);
}//端函数
私有函数init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE,init);
_资产XML=
;
_资产=新资产();
对于每个(var资产:_assetsXml.children()中的XML)
{
_assets.addEventListener(Event.COMPLETE、onAssetComplete);
_加载(资产@name,资产@url);
}//每个都结束
}//端函数
AssetComplete上的私有函数(e:事件):void
{
如果(++_计数器==_assetsXml.children().length())addImage();
}//端函数
私有函数addImage():void
{
变量加载器:加载器=新加载器()
loader.loadBytes(\u资产