Tween2 : quand Tween rencontre EventDispatcher
Par -Alexandre LEGOUT aka LAlex- le vendredi, septembre 17 2004, 20:28 - AS2 - Lien permanent
Sortant tout juste d'un développement utilisant des composants Macromedia à profusion, j'ai pas la même occasion eu l'opportunité de commencer à fréquenter le model évenementiel de ceux-ci, introduit par la classe EventDispatcher ... En effet, jusqu'à aujourd'hui, j'étais assez satisfait des services de AsBroadcaster (d'ailleurs, je ne trouve toujours pas d'utilité à la classe BroadcasterMX, offrant exactement la même chose mais en AS, donc moins performant) ...
Il ne m'a pas fallu longtemps pour me rendre compte de l'interêt de ce nouveau système, que ce soit en terme d'externalisation de l'interception des événements (même si c'était déjà possible avant), de performance acrues du fait de la diffusion propre à chaque évenement, mais aussi et surtout de souplesse grâce à la délégation d'évenement. D'ailleurs, je suis bien fan de la classe EventDelegate à mon sens bien plus élégante que Delegate, fourni avec la MAJ 7.2 de Flash.
J'ai donc suivi la voie tracée par Grant Skinner, qui propose ses classes XML2 et LoadVars2, utilisant EventDispatcher, en créant ma classe fille de l'illustre Tween de Penner (maintenant intégrée à la distribution de Flash MX 2004 en tant que mx.transitions.Tween), qui utilise dorénavant EventDispatcher.
Deux petits avantages mineurs amenés aussi par cette version sont qu'on ne peut du coup plus utiliser les méthodes "old-school" directement avec l'objet Tween, qui sont devenues des membres privés, forcant à externaliser le code sous forme d'écouteurs, et également le typage fort des paramètres du constructeur ... En gros, ca oblige un peu plus à faire les choses correctement ![]()
Exemple d'utilisation :import com.lalex.animation.Tween2;
import com.robertpenner.easing.Expo;
var tw:Tween2 = new Tween2(myClip, "_x", Expo.easeOut, 100, 300, 32);
var listen:Object = {};
listen.motionChanged = function(e:Object) {
trace("Clip position : " + e.position);
}
tw.addEventListener("motionChanged", listen);
On peut imaginer que les "classes" (?) telles que Mouse; Stage ou Keyboard pourraient être remplacées par leur "version 2" assez facilement (sans héritage celle-là par contre), mais cela mérite des tests : je ne suis pas persuadé des performances prodiguées par des évenements qui interviennent aussi souvent ... :o
Commentaires
hello


Une fonction en natif comme AsBroadcaster ce serait pas mal non plus ... intégrant si possible les ajouts du GDispatcher de Grant Skinner
Par contre faut que je texte la classe EventDelegate ... je ne l'ai pas encore fait
Sinon pour ce qui est de la classe de Penner.. étant donné que j'utilise celle que j'ai recodé en AS2 en suivant son livre (utilisant la classe Motion au passage qui n'est pas utilisé dans les classes mx.transitions.Tween ... j'ai pu facilement changer le système événmentiel sans trop m'embêter à faire une classe "Tween2".
Sinon dans le cadre de mes projets ... j'ai ajouté aussi à mes composants qui héritent de la classe MovieClip un évément onEnabled .. en effet je trouvais qu'il manquait un évément lors de l'appel de la propriété enabled d'un clip
/* ----------------
Name : ComponentDispatcher
Package : net.eka.core
Version : 1.0.0
Date : 2004-07-02
Author : ekameleon
URL : http://www.ekameleon.net
Mail : contact@ekameleon.net
----------------------
USE
----------------------
import mx.utils.Delegate ;
var onEnbledEvent = function (item) {
trace (item.type + " -> " item.target + " : " + item.target.enabled ) ;
}
attachMovie ("MYComponent", "myComponent", 1) ;
myComponent.addEventListener ("onEnabled" , Delegate.create (this, onEnabledEvent) ) ;
----------------------
THANKS
----------------------
Grant Skinner : http://www.gskinner.com/blog/archives/000027.html
Petepx : http://www.tweenpix.net/archives/000058.html
------------------------------------------------------------------------- */
import com.gskinner.event.GDispatcher ;
class net.eka.core.ComponentDispatcher extends MovieClip {
// ----o Author Properties
public static var className:String = "ComponentDispatcher" ;
public static var classPackage:String = "net.eka.core" ;
public static var version:String = "1.0.0";
public static var author:String = "ekameleon";
public static var link:String = "http://www.ekameleon.net" ;
// ----o Init Dispatcher
static private var __initDispatcher = GDispatcher.initialize (ComponentDispatcher.prototype) ;
// ----o Public Properties
public var dispatchEvent:Function ;
public var addEventListener:Function ;
public var removeEventListener:Function ;
public var eventListenerExists:Function ;
// ----o Private Properties
private var $enabled:Boolean = enabled ;
// ----o Constructor
public function ComponentDispatcher () {}
// ----o Virtual Properties
public function get enabled () : Boolean { return getEnabled () }
public function set enabled ( bool : Boolean ) : Void { setEnabled (bool) }
// ----o Public Methods
public function getEnabled () : Boolean { return $enabled }
public function setEnabled (bool:Boolean) : Void {
$enabled = bool ;
dispatchEvent( { type : "onEnabled", target : this } ) ;
}
}
PS : je sais pas ce qu'il en est maintenant de la EULA et de la classe de Grant skinner.. mais dans tous les cas ... la méthode eventListenerExists et la possibilité d'ajouter une délégation dans les addEvenListener et d'utiliser la propriété "ALL" c'est vraiment le top
bye
Ah je suis nul .. lol j'ai oublié qu'il fallait utiliser la balise AS
sorry 
C'st vrai que c'est le top de pouvoir jouer avec les classe de MM sans devoir toujours l'intérieur.

Moi je m'amuse comme un petit fou
Vive l'as2 et les Classe
yop, juste pour te signaler que le dernier param 'useSeconds' est de type Boolean, pas Number, ça passe peut-être dans flash mais pas dans mtasc
Oups !
C'est réparé ^^
Fil des commentaires de ce billet