Actionscript 3 如何管理加载的资产?
我正在从事一个AS3项目,该项目必须加载大量外部文件;图像、声音片段、电影片段等。程序首先加载一个XML文件,其中包含每个类所需的所有资产的文件名。从那时起,我不确定分配这些资产的最佳方式是什么Actionscript 3 如何管理加载的资产?,actionscript-3,oop,Actionscript 3,Oop,我正在从事一个AS3项目,该项目必须加载大量外部文件;图像、声音片段、电影片段等。程序首先加载一个XML文件,其中包含每个类所需的所有资产的文件名。从那时起,我不确定分配这些资产的最佳方式是什么 我考虑创建一个专用的assets类,该类将加载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资产