As3 - charger une image externe, l'utiliser plusieurs fois (avec une seule requete)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 043 fois - Téléchargée 16 fois

Contenu du snippet

Cette classe permet de charger une image externe et de l'utiliser plusieurs fois en ne générant qu'une seule requête.
L'image sera chargée uniquement au moment ou vous l'utiliserez (pas de préchargement au début de toutes les images).
Si elle à déjà été chargée elle est affichée sans faire de nouvelles requêtes sinon elle est chargée puis affichée.

Je l'ai utilisé pour faire un petit jeux en 3D isométrique, de nombreuses images étaient souvent utilisées plusieurs fois, je ne souhaitait pas faire 500 requêtes pour la même image, certaines images ne me servaient pas toujours, je n'ai donc pas fait de préchargement de toutes les images, et j'ai donc créé cette classe.

Je suis débutant en AS3, soyez indulgents c'est ma première source en AS3 ;D

Source / Exemple :


package {
	import flash.display.Loader;
	import flash.net.URLRequest;

	public class Image {
		
		private static var images:Array = new Array();

		public static function getImage(image:String):Loader {
			var index:int;
			var state:int;

			// On regarde l'état de chargement de l'image
			// Retourne -1 si l'image n'est pas chargée, renvoi l'index si l'image a été trouvée
			index = loadedState(image);
			
			// Si l'image n'est pas chargée
			if (index == -1) {
				var loader:Loader = new Loader();
				loader.load(new URLRequest(image));
				images[images.length] = new Array(image, loader);
				return loader;
			}
			
			// Si l'image est déjà chargée
			else {
				return images[index][1];
			}
		}
		
		private static function loadedState(image:String) {
			var i:int;
			var index:int = -1;
			// image[i][0] stocke le nom de l'image, et image[i][1] stocke le loader
			for (i = 0; i < images.length; i++) {
				if (images[i][0] == image) { index = i; break; }
			}
			
			return index;
		}
		
	}
}

Conclusion :


Pour utiliser cette classe, il suffit de l'importer puis par exemple pour ajouter une image sur le stage:
stage.addChild(Image.getImage("http://www.google.fr/images/srpr/logo2w.png"));

A voir également

Ajouter un commentaire

Commentaires

aerolyte
Messages postés
468
Date d'inscription
mardi 17 avril 2007
Statut
Membre
Dernière intervention
4 mai 2013
1 -
Bonjour,

A prime abord, j'aurais dit pourquoi pas?
Mais en faite, son interet n'est pas si évident.

D'une part, tu ne gère pas les événements,(chargement,fin et erreurs), ce qui est comphénsible du fait de la complexité de le coupler avec un return sur le loader. Du coup l'uasge de ta classe se reduit fortement.

D'autre part, je soupconne que dans une application un peu lourde si le garbage collector est actif, ton array "image" sera bon a etre effacé.

Enfin, je t'invite a découvrir le bibliothéques partagées. Pourquoi?
Tous simplement par ce qu'un élément que l'on retrouve de nombreuses fois dans une application, a tout interet a etre stocké dans une lib.(
Temps d'acces inexistant, et pour peu que tu face une bibiotheque qui se charge a l'execution, tu ne surchargeras pas ton swf principal.
Comme cela tu garde tes loaders pour des éléments individuels, vue le temps qu prend une requete url.

Cordialement
pegase31
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6 -
Je suis assez d'accord avec Aerolyte, si ce n'est sur les bibliothèques partagées (qui arrangent bien, mais ne résolvent pas tout, car il faut tout charger d'un coup avant d'utiliser)

Déjà je te conseillerais d'aller voir les fonctions avancées de type Array.some() et Array.every() qui remplaceraient ta fonction "loadedState".

Ensuite, il aurait été plus propre de ne renvoyer que le BitmapData au lieu du Loader complet. Ce dernier étant un objet qui contient un autre objet et donc une encapsulation plutôt inutile.
Le seul soucis est que, par défaut, une classe statique ne peut pas déclencher d’évènement et il est donc impossible de savoir quand ton fichier est fini de charger.

Il existe une méthode permettant de faire cela avec quelques lignes. Va voir là : http://upshots.org/?p=41

Mais il est plus simple de charger une image de type TileSet et d'en découper les morceaux (Tile) à l'aide d'une classe statique renvoyant un BitmapData. Celà évite les chargements multiples et permet d'avoir autant de Tile que désirés.

Peg'
cs_SuperChouquette
Messages postés
37
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
18 mai 2010
-
En fait je souhaitais que mon jeux commence même si toutes les images n'étaient pas chargés, un peux comme sur un navigateur web ou la page commence à s'afficher même si tous les éléments ne sont pas chargés. Je ne souhaitait pas non plus précharger toutes les images, mais juste les charger quand j'en avais besoin pareil pour pouvoir commencer à jouer rapidement.

C'est vrai que ce code ne convient pas pour une galerie photos (ou il faut mettre une barre de chargement, gestion des erreurs, etc..), mais je ne trouvais pas ça très embêtant qu'il n'y ai pas de barre de chargement et de gestion des erreurs pour chaque image (comme sur un navigateur web en fait).

Je suis débutant et je ne connaissais pas les bibliothèques partagées, merci de m'en avoir parlé, je vais de ce pas regarder ! =D
aerolyte
Messages postés
468
Date d'inscription
mardi 17 avril 2007
Statut
Membre
Dernière intervention
4 mai 2013
1 -
Bonjour,
Peg',l'intêret d'une runtime shared librairy (bibliotheque partagée à l'execution), utilisant une paire swf/swc est justement de ne pas avoir a charger tout le swf d'un coup, mais uniquement les classes que 'on souhaite au moment ou l'on veut.

Resumé:

Partagée : Utilisation illimité d'une classe.
A l'éxecution: la lib n'est pas compilée, dans le fla principal, du coup elle ne l'allourdi pas
Couple swf/swc: permet de ne pas chargée toute la lib mais uniquement les éléments voulus.
(Le swc, contient un xml qui index les classes présentes dans le swf.)

Cordialement
top30
Messages postés
1158
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
6 août 2010
-
Son idée est sympa et facile à réaliser...
Il a voulu faire vite et oublier des trucs important, comme lees URL non valides, que se passe t-il si tu charges 10 images de la mème URL dans un block...

Donc j'ai reprise le principe pour moi ici:
http://www.flashkod.com/codes/CLASS-IMAGE-IMAGEEVENT_53484.aspx.
Comme perso je suis pas partisant des bibliothèquepartagée puis l'as3...

A plus...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.