J'ai essayé de créer une classe universelle de chargeur d'actifs (avec l'aide des gens de stackoverflow), qui se souvient des assets précédemment téléchargés en les stockant dans un tableau associatif.Comment étendre la classe Loader et renvoyer les actifs mis en cache dans actionscript/flex 3?
Ceci est le résultat final:
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 est égal à "http://site.com/assets/"
Maintenant, mon problème est qu'il est à l'origine du client à planter chaque fois qu'il essaie de récupérer la version des caches (la nouvelle version téléchargée fonctionne) de la classe:
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
}
Lorsque la version en cache est en cours de chargement, j'obtiens l'erreur suivante en néerlandais: "TypeError: Erreur # 1034: Afgedwongen typeomzetting est mislukt: kan flash.display :: MovieClip @ 5c13421 niet omzetten dans flash.display.Bitmap. à GameShip/onShipAssetComplete() "- signifie quelque chose comme" conversion de type a échoué, ne peut pas convertir flash.display :: MovieClip @ ... en flash.display.Bitmap "
Alors, je me demande, comment devrais-je étendre cette classe loader et lui faire retourner un actif en cache de la bonne manière? Est-ce que ma façon de stocker l'actif dans le tableau est peut-être invalide? ou dois-je utiliser autre chose que loadBytes dans la méthode AssetLoader?
Vous avez vu SuperImage d'Eli Greenfield? Les bits de mise en cache sont vraiment sympa: http://www.quietlyscheming.com/blog/2007/01/23/some-thoughts-on-doubt-on-flex-as-the- best-option-orhow-i-fait-mon-flex-images-stop-dancing/ –
Je viens de le vérifier, mais il est destiné uniquement aux images, alors que ma classe est pour tous les types d'actifs. Je sais ce qui ne va pas dans le code que j'ai posté – Tom