Charger des images gif, jpeg, png ou des swf en ActionScript 3 (AS3)
Le chargement d'images ou de swf dans Flash va se faire grâce à deux nouvelles classes : Loader et URLRequest.
La classe Loader va nous permettre de créer un conteneur de chargement. La classe URLRequest va nous permettre de définir l'url absolue ou relative du fichier à charger.
Le chargement se fera grâce à la méthode load() de l'objet loader. L'affichage de l'image ou du swf se fera grâce à la méthode addChil().
-
// création du conteneur de l'image ou du swf
-
var conteneurImage:Loader = new Loader();
-
// url de l'image ou du swf à charger
-
var image:URLRequest = new URLRequest("images/tannoy.gif");
-
// chargement de l'image ou du swf dans le conteneur
-
conteneurImage.load(image);
-
// affichage du conteneur
-
this.addChild(conteneurImage);
L'image utilisée est celle-ci : 
;-)
A suivre un billet sur les événements liés au chargement d'images ou de swf :
http://www.bases-as3.fr/13-les-evenements-progress-et-complete-de-la-classe-loaderinfo
Je suis Antony Chauviré, développeur sur la Flash Platform.
Bonjour,
Avec cette nouvelle classe, que devient MovieClipLoader ? Et y-a-t-il un évènement à invoquer pour être sûr que l'image est bien chargée... pour éventuellement la manipuler ?
iPapy
MovieClipLoader c'est fini :) Maintenant il suffit d'attendre le prochain tuto à mon avis car Tannoy dit bien à la fin qu'il expliquera les événements...
A noter que la classe Loader est basé sur la classe URLLoader qui permet de charger tout et n'importe quoi en AS3 :)
eKA+ :)
Comme le dit eKA, la classe MovieClipLoader est remplacé par la classe Loader. De même que la classe LoadVars est remplacé par la classe URLLoader.
Voici la note d'Adobe :
"The ActionScript 2.0 MovieClipLoader and LoadVars classes are not used in ActionScript 3.0. The Loader and URLLoader classes replace them"
Autant pour moi... je n'avais pas lu la dernière ligne oups ;-)
Excellent, 2eme billet que j'utilise pour la conception du site de mon club de grimpe.
J'avais un peu bricolé en AS2 (merci ENI), mais je dois bien avouer un peu ramer pour basculer en AS3
Merci encore à toi
Bonjour, je viens personnellement de l'as1 avec un leger détour par l'as2 et je doit bien dire que cette nouvelle et derniere mouture me pose bien des difficultées.
Je comprend bien le code décrit ci-dessus mais admettons par exemple que je veuille déplacer mon image de quelques pixels sur la droite, est il possible de spécifier la position du conteneur par un propriété _x ? ce qui ne me parait pas possible ou englober le tout dans un movieclip dont on specifiera la position ? Ou suis je completement a coté de la plaque ?
Merci.
Yan
Bonjour Yan
En effet, tu vas pouvoir positionner ton conteneur en x ou en y. Cependant, en as3, le nom des propriétés a été uniformisé et on n'utilise plus le _ .
Tu ecriras donc :
conteneurImage.x = 50;
;)
Bonjour,
Comment faire pour recharger la dernière version du swf et pas le cache du navigateur ?
Slt,
j'ai deux questions :
Si l'on charge un swf mais qu'il y a des champs de saisie, es-ce normal que l'on ne puisse pas cliquer dans les champs de saisie et que le swf soit afficher comme une image ?
Si le fichier qui appel le swf est en as3 et que le swf appelé est en as2, le script as2 va t-il fonctionné ?
Merci !
Bonjour reineglad
Il n'est pas normal que tu ne puisses pas cliquer dans les champs de saisie, il devrait normalement être actif. D'autre part, un script as2 peut s'exécuter à l'intérieur d'un swf en as3 car le Flash Player 9 intègre l'AVM1 (ActionScript Virtual Machine 1), qui interprète le code as1 et as2, et l'AVM2 pour l'as3.
J'ai un exemple concernant tes 2 questions :
http://www.bases-as3.fr/exemples...
;)
Comment faire en sorte de toujour recharger le swf du serveur et pas celle du cache ? Idem pour le xml, comment charger un fichier XML toujours sur le serveur ?
Et pour charger une image de la bibliothèque, comment fait-on ?
Merci!
newty = > Tu fais la même chose qu'avec un clip comme explique dans ce billet : http://www.bases-as3.fr/index.php/2006/08/31/19-liaison-avec-un-clip-de-la-bibliotheque
Bonjour,
Voila j'ai un petit souci, j'utilise le code ci-dessous en AS3 pour charger un swf qui est en AS2:
var request:URLRequest = new URLRequest("ftp...blablabla");
var loader:Loader = new Loader()
loader.load(request);
addChild(loader);
Jusque la tt va bien, cependant le swf est une annonce flash reglementé par google. cette annonce doit obligatoirement comporté le code suivant:
on (release) {
if (clickTAG.substr(0, 5) == "http:") {
getURL(clickTAG, "_blank");
}
}
C la que ça coince. La fonction release ne marche pas sous AS3 puisqu'elle doit etre attribué à un bouton.
Comment je peux faire?? merci.
Salut luckyseb
Le code AS1 on(release)...., il est dans le fichier swf que tu charges ou bien, c'est à toi de l'ajouter dans ton propre swf ?
nan le AS2 on(release) est sur le swf qui a la fonction charger. la est le probleme, car sous AS3 je ne sais po komment faire...
luckyseb :
Tu ne peut pas écrire du code AS1 ou AS2 dans un fichier en AS3.
oki c bon jai trouvé kommen faire, jai tt fait sous AS2, tan pi, mais bon ca marche.
merci kan mm^^
moi j'ai un chti problème avec ce code.... j'arrive à charger un swf en as2 à partir d'un en as3 mais je ne comprends pas pourquoi le second est lu en boucle Pourtant j'ai bien spécifié dans Dreamweaver le sempiternel
pardon: le sempiternel param name=loop value=false... shit le tag code marche pas dsl.
a+ merci pour ceux qui pourront m'aider c très urgent
Il y a une petite erreur dans le texte précédant le code :
Le chargement se fera grâce à la méthode load() de l'objet loader. L'affichage de l'image ou du swf se fera grâce à la méthode addChil().
Oublie du d a child.
Merci de proposer un tel site :p
Bonjour,
Est-ce juste moi où la taille de l'image chargé n'est pas accessible directement???
j'ai fais pas mal de test, pour la largeur ici:
conteneurImage.width,
conteneurImage.stage.width,
var image:Bitmap = Bitmap(conteneurImage.content);
image.width;
image.stage.width;
image.bitmapData.width...
getRect/Bounds...Bon j'en passe, mais à chaque fois cela me renvois 0 *sauf* dès que je redimentionne la fenêtre du navigateur (callback onResize) manuellement, çà me renvois la bonne largeur ensuite...
j' utilise le SDK flex 3, flashDevelop et flash 10.0.22, je n' ai pas test de version antérieur du aux importantes failles de sécurités.
Bonjour SpaceInvader,
La taille de l'image chargée est disponible une fois l'événement Event.COMPLETE diffusé. On peut donc accèder aux dimensions de l'image dans la fonction callback de l'événement.
Tu trouveras dans le billet suivant une explication sur cet événement :
http://www.bases-as3.fr/index.php/2006/07/27/13-les-evenements-progress-et-complete-de-la-classe-loaderinfo
;)
Bonjour Tannoy,
Merci pour ta réponse, j'ai donc testé mais j'ai toujours le même problème, il doit y avoir quelque chose que je n'ai pas saisi ou alors je ne vois pas....
voici un paste de mon code si tu a une idée(sur pastebin pour éviter de flood):
Tout les commentaires sont bienvenus
Ah je viens de comprendre que le callback de l'event COMPLETE était éxecuté après mon code de centrage... :)
Merci pour les infos, sympas le site.
hello tous petite question pour vous :
Comment gère-t-on les UNLOAD ??? j’ai réalisé mon portfolio fullflash j’appelle donc des swf externes de manière à ce que toute mon anim soit liée et fluide : tout se passe très bien sauf que je n’arrive pas à gérer les UNLOAD tant et si bien que mes swf se superposent et finissent par tout faire ramer………….
Bonjour!
Même question que Olliesound, je n'arrive pas à gérer les unload, mes images sont stockées dans un tableau; j'affiche une image après l'autre dans une boucle...mais je les charge toute les unes au dessus des autres...
Si quelqu'un peut nous expliquer comment les décharger !
Merci
Bonjour Steph,
Si tes images sont affichés dans un conteneur, tu peux utiliser les méthodes removeChild ou removeChildAt de ton conteneur.
Sinon, il existe la méthode unload de la classe Loader.
;)
un grand merci pour ces infos. Explications pour initiés du AS mais on y arrive bien.
A charge de revanche.
Philippe
Bonjour tannoy,
Comment charger plusieurs images ? Je veux dire un nombre X d'images ?
Car si je crée une variable 'image', je prévois de ne charger qu'une seule image !
Mais si dans mon animation, je souhaite charger X images (dans un array par exemple), est-ce possible ? Ou faut il chaque fois créer une nouvelle variable, ou vider la précédente ?
J'ai lu ton billet "http://www.bases-as3.fr/28-utilisation-tableaux-donnees-array", mais cela ne m'a pas beaucoup aidé =(
Bonjour Julien,
Tu peux charger plusieurs images en utilisant une boucle et en créant un objet loader dans ta boucle.
;-)
Je voudrais mettre un loader en premier plan par rapport à tout le reste. Est-ce que quelqu'un sait comment faire ?
Salut John,
Tu peux utiliser la méthode addChildAt() et le nombre d'enfants du conteneur.
this.addChildAt(conteneurImage, this.numChildren - 1);;-)
Et ca marche aussi, si la navigation se trouve dans un clip avec le code qui va avec, et que je souhaite insérer le Loader sur la séquence principale, en dehors de ce clip ?
oui ça marche aussi.
;-)
Bonjour,
Anciennement AS2 je me met doucement à l'AS3... pas facile.
Je vous explique ce que je veux faire : quatre images carrées de détails d'images sur lesquelles, lorsque l'on clique, l'image correspondante s'agrandit et se voit donc entièrement. Je souhaite donc positionné mon conteneur à un endroit précis et que l'image ne soit pas visible en entier dans ce conteneur. Est-ce possible ?
De plus, j'aimerai que dans chacun des quatre conteneurs, les images apparaissent de manière aléatoire, mais que ce soit la bonne image qui s'agrandisse... Je sais pas si tout cela est très clair...
Pour l'instant, après avoir lu vos remarque, j'en suis arrivée à cela :
// création du conteneur de l'image ou du swf
var conteneurImage:Loader = new Loader();
// url de l'image ou du swf à charger
var image:URLRequest = new URLRequest("00.jpg");
// chargement de l'image ou du swf dans le conteneur
conteneurImage.load(image);
conteneurImage.x = 15
conteneurImage.y = 15
// affichage du conteneur
this.addChild(conteneurImage);
Il me manque donc le redimensionnement de l'image et l'appel aléatoire... Pouvez vous m'aider svp ???
Merci d'avance
Bonjour Hada,
Pour masquer une partie de ton image, tu peux utiliser la propriété mask de ton objet Loader.
//Creation d'un carré de 40x40 qui va servir à masquer une partie de l'imagevar square:Shape = new Shape();
square.graphics.beginFill(0xFF0000);
square.graphics.drawRect(0, 0, 40, 40);
addChild(square);
conteneurImage.mask = square;
Pour l'aléatoire, il existe la classe Math et sa méthode random().
Sinon tu peux aussi aller faire un tour sur le site de Mediabox où tu retrouveras pas mal d'infos et dans lequel tu pourras poster sur le forum.
;-)
merci beaucoup pour ton aide.
pouvez vous me répondre comment peut_t_on
regler la l'inclinaison d'une image aprés la charger avec action script3
Bonjour,
A présent que le SWF se charge, je n'arrive pas à trouver comment en charger un autre juste après le 1er ?
J'ai un swf principal et 2 swf externes, et je souhaite qu'à la fin du 1er appelé le second se lance et ainsi de suite. Ca fait 2h que je cherche sur différents forum mais étant un noob en AS3 je n'arrive pas à m'en sortir. D'ailleurs ça pourrait être une idée de billet car la question revient souvent mais n'est jamais traitée entièrement.
Merci pour votre aide !