私はユニバーサルアセットローダークラスを作成しようとしています(stackoverflowの人々の助けを借りて)。これは、以前にダウンロードしたアセットを連想配列に格納することで記憶します。
これが最終結果です。
AssetLoader.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 omzetteninflash.display.Bitmap。atGameShip/ onShipAssetComplete ()」-「タイプ変換に失敗しました。flash.display:: MovieClip@...をflash.display.Bitmapに変換できません」などの意味です。
では、このローダークラスを拡張して、キャッシュされたアセットを正しい方法で返すようにするにはどうすればよいのでしょうか。アセットを配列に格納する私の方法はおそらく無効ですか?または、AssetLoaderメソッドでloadBytes以外のものを使用する必要がありますか?