Je code plusieurs applications de bureau dans lesquelles j’utilise le framework Apache Flex combiné avec le moteur de jeu Starling, et je dois souvent utiliser plusieurs instances de Starling successivement. Aussi Starling possède une classe vraiment très utile pour la gestion des assets, à savoir la classe AssetManager.
Cependant, lorsque je lançais une nouvelle instance (c’est important…) de Starling, toutes mes textures devenaient inaccessibles, et la seule solution pour afficher de nouveau mes images était de relancer l’application.
Bien évidemment, je n’avais pas trop envie de dire aux utilisateurs que leur PC était vraiment très bizarre et qu’une solution était peut-être de relancer l’application ou, pire, de recoder totalement la gestion de mes assets.
Alors pourquoi ces textures s’envolaient-elles ? (c’est aussi un jeu de mot car Starling désigne également en anglais les Passeriformes, qui est une classe qui regroupe le plus grand nombre d’espèces/instances d’oiseaux. Bref c’est drôle).
Bon à savoir: lorsque les assets sont « enqueued » (cf. la classe AssetManager), ils sont attachés à une référence d’une seule instance de Starling.
Du coup, si on utilise un singleton pour gérer ses assets (comme dans le code ci-dessous, c’est cadeau), et qu’on instancie de nouveau Starling, alors les textures ne seront tout simplement plus accessibles, elles ne le seront que depuis l’ancienne instance de Starling (qui n’est au final plus accessible également…).
Une solution simple mais efficace est donc (1) de recharger les assets à chaque création d’une nouvelle instance (cf. la fonction loadAssets() ci-dessous), sans oublier (2) de purger l’AssetManager lorsque l’on « quitte » l’instance de Starling, et ceci avec la méthode purge() – donc ici assetsTests.purge().
[actionscript3]
package myAssets
{
import starling.utils.AssetManager;
[Bindable]
public class GetAssetsSingleton
{
private static var instance:GetAssetsSingleton = new GetAssetsSingleton();
// Variables
public var assetsTests:AssetManager = new AssetManager();
public var assetsEnqueued:Boolean=false;
public function GetAssetsSingleton()
{
if(instance)
{
throw new Error ("Une seule instance possible. Il faut utiliser la méthode getInstance()");
}
}
public static function getInstance():GetAssetsSingleton
{
return instance
}
public function loadAssets():void
{
assetsTests= new AssetManager();
assetsTests.enqueue(EmbeddedAssets);
assetsTests.loadQueue(function(ratio:Number):void
{
trace("Loading assets, progress:", ratio);
// Quand le ratio = 1, tous les assets sont "enqueued".
if (ratio == 1.0)
{
assetsEnqueued=true;
}
});
}
}
}
[/actionscript3]