我一直在尝试创建一个通用资产加载器类(在 stackoverflow 的人们的帮助下),它通过将之前下载的资产存储在关联数组中来记住它们。
这是最终结果:
资源加载器.as
package
{
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
import flash.utils.ByteArray;
public final class AssetLoader extends Loader
{
public static var storedAssets:Object = {};
private var postUrl:String;
private var urlRequest:URLRequest;
private var cached:Boolean = false;
public final function AssetLoader(postUrl:String):void
{
this.postUrl = postUrl;
if (storedAssets[postUrl])
{
cached = true;
}
else
{
urlRequest = new URLRequest(Settings.ASSETS_PRE_URL + postUrl);
contentLoaderInfo.addEventListener(Event.COMPLETE, OnAssetLoadComplete);
}
}
//starts loading the asset
public final function loadAsset():void
{
if (cached)
{
loadBytes(storedAssets[postUrl]);
}
else
{
load(urlRequest);
}
}
//runs when the asset download has been completed
private final function OnAssetLoadComplete(event:Event):void
{
storedAssets[postUrl] = contentLoaderInfo.bytes;
}
}
}
Settings.ASSETS_PRE_URL 等于“ http://site.com/assets/ ”
现在,我的问题是它会导致客户端在尝试从类中检索缓存版本(新下载的版本确实有效)时崩溃:
var assetLdr:AssetLoader = new AssetLoader("ships/" + graphicId + ".gif");
assetLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, onShipAssetComplete);
assetLdr.loadAsset();
private function onShipAssetComplete(event:Event):void
{
var shipImage:Bitmap = Bitmap(event.target.loader.content);
// Do stuff with shipImage
}
加载缓存版本时,我收到以下荷兰语错误:“TypeError: Error #1034: Afgedwongen typeomzetting is mislukt: kan flash.display::MovieClip@5c13421 niet omzetten in flash.display.Bitmap. at GameShip/onShipAssetComplete ()” - 表示“类型转换失败,无法将 flash.display::MovieClip@... 转换为 flash.display.Bitmap”。
所以,我想知道,我应该如何扩展这个加载器类并让它以正确的方式返回缓存资产?我将资产存储在数组中的方式可能无效吗?或者我应该在 AssetLoader 方法中使用 loadBytes 以外的其他东西吗?