L’événementiel en ActionScript 3…
…une vraie partie de plaisir.
L’ActionScript 3 intègre un nouveau modèle d’événements base sur le DOM Event Model Level3, bien plus propre et facile à implementer que dans sa version précédente.
Dans la mesure ou de nombreuses classes (MovieClip, Shape, TextField… “ba tous ce qui peut s’afficher” comme diraient certains, bref tous les enfants de displayObject) héritent d’EventDispatcher, plus besoin d’appeller le bon vieux EventDispatcher.initialize et de se mélanger dans les “i” à coup sur 2-3 fois, ni de définir les addEventListener, removeEventListener et dispatcherEvent. Tout est initialisé dès le constructeur.
Il ne reste plus qu’a créer l’évenement et le dispatcher.
Pour ce faire, deux méthodes, qui se rejoignent, sont possibles.
La première consiste à créer une classe de type d’évenement qui hérite de flash.events.Event. Vous pourrez y stocker tous les événements que vous souhaitez.
Exemple sur un évenement pour une vignette (VignetteEvent) :
package galerie { import flash.events.Event; public class VignetteEvent extends Event { static public const LOADED:String = "loaded"; static public const SELECTED:String = "selected"; public function VignetteEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable) ; } public function getName():String { return currentTarget.getName() ; } } }
Download this code: VignetteEvent.as
Le dispatcher, celui qui dispatche l’évenement, içi la vignette (Vignette) :
package galerie { import flash.display.MovieClip; import flash.events.MouseEvent; import galerie.VignetteEvent; public class Vignette extends MovieClip { function Vignette() { addEventListener(MouseEvent.MOUSE_UP, _onSelect); } public function setPhoto(pId:int):void { //Charger la photo } private function _onLoadPhoto(ev:Event):void { //Photo chargé, hop on lance l'événement LOADED var e:VignetteEvent = new VignetteEvent(VignetteEvent.LOADED); dispatchEvent(e); } private function _onSelect(ev:MouseEvent):void { //On clique sur la photo, hop on lance l'événement SELECTED var e:VignetteEvent = new VignetteEvent(VignetteEvent.SELECTED); dispatchEvent(e); } } }
Download this code: Vignette1.as
Et enfin, l’écouteur de la vignette (Library);
package morflickr.recherche { import flash.display.MovieClip; import galerie.VignetteEvent; public class Library extends MovieClip { function Resultat() { } /** * ... */ private function _createPhoto():void { //Création de la vignette var vignette:Vignette = new Vignette(); vignette.setPhoto(0); vignette.addEventListener(VignetteEvent.LOADED, _onCreatePhoto); vignette.addEventListener(VignetteEvent.SELECTED, _onSelected); this.addChild(vignette); } private function _onCreatePhoto(ev:VignetteEvent):void { //Vignette créée } private function _onSelected(ev:VignetteEvent):void { //Vignette selectionnée } } }
Download this code: Library1.as
Pour des évenements particuliés, utilisable une fois par exemple, on peut stocker l’action directement dans le dispatcher.
Exemple :
package galerie { import flash.display.MovieClip; import flash.events.MouseEvent; import flash.events.Event; public class Vignette extends MovieClip { static public const LOADED:String = "loaded"; static public const SELECTED:String = "selected"; function Vignette() { addEventListener(MouseEvent.MOUSE_UP, _onSelect); } public function setPhoto(pId:int):void { //Charger la photo } private function _onLoadPhoto(ev:Event):void { //Photo chargé, hop on lance l'événement LOADED var e:Event = new Event(LOADED); dispatchEvent(e); } private function _onSelect(ev:MouseEvent):void { //On clique sur la photo, hop on lance l'événement SELECTED var e:Event = new Event(SELECTED); dispatchEvent(e); } } }
Download this code: Vignette2.as
C’est un peu rapide mais l’essentiel y est. Pour plus d’infos, un très bon article est dispo sur Ekameleon.
février 15th, 2007 at 23:44
“plus besoin d’appeller le bon vieux EventDispatcher.initialize”
David Raymond ?
février 15th, 2007 at 23:51
Si il voyait ça… il serait tout émoustillé !
C’est tout de même triste que tu sois celui qui poste le plus de commentaires et celui qui comprend le moins (enfin je suppose.. tu me dis si je me trompe…)
février 16th, 2007 at 8:43
Je vois pas trop l’interêt d’etendre Event si c juste pour ajouter des constantes static pour les types. On pourrais ajouter dans Vignette.
Par contre, comme les Event ne sont pas dynamic ca peut etre utile quand on doit passer des paramètres particuliers aux méthode d’écouteurs.
février 16th, 2007 at 9:04
C’est un exemple pour bien comprendre le principe, dans la version originale, j’avait en effet rajouté quelques propriétés supplémentaires.
Pour ce qui est de le mettre en dynamic, je prefere créer un objet data ou y stocker les parametres particuliers afin d’éviter de rentrer en conflit avec les propriétés prédéfinies.
février 17th, 2007 at 21:25
Haha j’ai rien compris.
Concrètement ça sert à quoi ?
Publie des .swf pour que les nuls comme moi puissent juste “voir ce que ça fait”.
février 18th, 2007 at 21:29
Je trouve que ce site n’est pas souvent mis à jour.
Monsieur Manu Bonnet doit passer son temps à se prélasser devant la télévision plutôt que de bosser…
enfin bref, je vais pas tarder à changer de crèmerie si aucun nouveau billet n’arrive !
février 21st, 2007 at 19:00
Haha, moi pareil que woumpah!
On veut du swf aux petits oignons, des tutoriaux camtasia, des .as à télécharger! Au boulot!
février 21st, 2007 at 23:29
C’est noté, je vous prépare un petit truc pour ce WE. Vous allez pas etre déçu !