我正在创建一个2d flash游戏(在flex/actionscript 3中编码),在需要时下载资源。目前,我有它的设置是这样的:运行时加载外部资产并在actionscript 3中重新使用预加载的资产?
AssetLoader.as
package
{
import flash.display.Loader;
import flash.net.URLRequest;
public class AssetLoader extends Loader
{
//set vars
private var url:String = "http://test.com/client/assets/";
public function AssetLoader(url:String)
{
Logger.log("AssetLoader request: " + this.url + url);
var request:URLRequest = new URLRequest(this.url + url);
this.load(request);
}
}
}
然后,在这里我要加载的资产我做到以下几点:
var asset:AssetLoader = new AssetLoader("ships/" + graphicId + ".gif");
asset.contentLoaderInfo.addEventListener(Event.COMPLETE, onShipAssetComplete, false, 0, true);
private function onShipAssetComplete(event:Event):void
{
var loader:Loader = Loader(event.target.loader);
shipImage = Bitmap(loader.content);
shipImage.smoothing = true;
addChild(shipImage);
}
的事情是,这种方法不检查已经下载的资产,所以它会在第二次请求同样的资产时重新下载它们(我认为)。
所以,我需要的是一个数组,其中存储了所有下载的资产,并根据请求检查此资产的名称是否存在于数组中。所以如果它已经被下载,那么来自内存的资源必须被返回而不是被重新下载。
我可以使assetloader一个静态类,但我必须等待事件时,它的完成下载图像火 - 所以我不能简单地让一个静态函数返回相应的图像。任何想法我应该如何做到这一点?
编辑征求意见后企图:
package
{
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
public final class AssetManager
{
private static var assets:Object = {};
private static var preUrl:String = Settings.ASSETS_PRE_URL;
public static function load(postUrl:String):*
{
if (assets[postUrl])
{ //when the asset already exists
//continue
}
else
{ //the asset still has to be downloaded
var request:URLRequest = new URLRequest(preUrl + postUrl);
var loader:Loader = new Loader();
loader.load(request);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
function(event:Event):void
{
var loader:Loader = Loader(event.target.loader);
assets[postUrl] = loader.content;
}, false, 0, true);
}
}
}
}
EDIT2:另一种尝试
package
{
import flash.display.Loader;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.URLRequest;
public final class AssetManager
{
private static var assets:Object = {};
private static var preUrl:String = Settings.ASSETS_PRE_URL;
public static function load(postUrl:String):*
{
if (assets[postUrl])
{ //the asset already exists
var dispatcher:EventDispatcher = new EventDispatcher();
dispatcher.dispatchEvent(new CustomEvent(CustomEvent.LOAD_COMPLETE, assets[postUrl]));
}
else
{ //the asset still has to be downloaded
var request:URLRequest = new URLRequest(preUrl + postUrl);
var loader:Loader = new Loader();
loader.load(request);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
function(event:Event):void
{
var loader:Loader = Loader(event.target.loader);
assets[postUrl] = loader.content;
var dispatcher:EventDispatcher = new EventDispatcher();
dispatcher.dispatchEvent(new CustomEvent(CustomEvent.LOAD_COMPLETE, assets[postUrl]));
}, false, 0, true);
}
}
}
}
然后,我尝试以下方法:
var asset:AssetManager = AssetManager.load("ships/" + graphicId + ".gif");
asset.addEventListener(CustomEvent.LOAD_COMPLETE, onShipAssetComplete, false, 0, true);
,但得到的错误,“undefin ed方法addEventListener通过类型静态AssetManager的引用“(粗略翻译)。
嘿,我不太清楚你想要我做什么。我可以用资产URL和内容创建一个全球图书馆。当一个资产被请求时,我想我可以在图书馆已经找到这个URL的时候启动它。但是,如何让这个事件,然后返回此网址的库内容?我不太明白。 – Tom 2009-08-11 23:02:51
我第一次尝试编辑原始文章。但是,如评论中所解释的,我陷入困境......也许您或其他人有任何建议? – Tom 2009-08-12 13:10:35
Lior可能暗示你有一张包含资源url - >加载资源的地图。就像'assets [url] = loadedContent' – 2009-08-12 13:25:36