2. Remerciements// quot;Je voudrais remercier tout
particulirement Mathieu Anthoine (Mama) pour sarelecture soigne et
ses conseils aviss durant toute la rdaction de louvrage.Son
exprience et sa vision du Flash est une source dinspiration.Jrme
Decoster pour sa relecture attentive, son soutien et ses conseils
toujourspertinents. Pour nos soires pizza discuter ActionScript 3
et te faire rentrer chez toien vlib. Chris Georgenes
(www.mudbubble.com) et Aurelien Marcheguay de Carton
Blanc(www.cartonblanc.com) pour leur soutien et leurs illustrations
qui mont permisdenrichir graphiquement louvrage.Je remercie tous
mes compagnons flasheurs qui mont forcment soutenu et aid un moment
donn : Joa Ebert, Didier Brun, Jrme Cordiez, Vincent Maitray,
FrdericSaunier, Benjamin Jung.Le centre Regart.net pour mavoir
soutenu. A Nicolas pour ses opinions, Eric pourses bonnes blagues,
et Guylaine pour ces annes chez Regart.Justin Everett-Church dAdobe
et Henri Torgemane de Yahoo pour leur aide et leursoutien.Sgolne
(www.chevaldetroie.net) pour avoir relu tous ces chapitres la
recherchede fautes dorthographes. Mes amis que je nai pas vu
pendant quasiment 8 mois : Sbastien, Bessam, Laurent,Paul, Juan,
Pascal, Bob Groove et bien sr Stevie Wonder.Sonia pour ce dimanche
20 aot 2006 o ma vie a change.Mes parents et ma sur qui mont
soutenu pendant lcriture. Bien entendu, je ne peux pas terminer les
remerciements sans remercier tous messtagiaires que jai pu
rencontrer depuis plus de trois ans de formations. Jai
apprisnormment chaque jour vos cts, vous avez particip cet ouvrage
dune faonou dune autre.quot;
3. trace(quot;Pratique d'ActionScript 3quot;);//Pratique
dActionScript 3 sadresse tous les flasheurs.Cet ouvrage dresse un
panorama de lutilisation dActionScript 3 et de ses nouveauts, ainsi
que du nouveau lecteur Flash 9. Lauteur explique au travers de
nombreux exemples et cas concrets comment traiter dsormais les
objets, le texte, le son et la vido, le chargement et lenvoi de
donnes externes (variables, XML, etc.), les sockets, etc. Certains
sujets avancs et peu abords comme les classes bas niveau ou encore
Flash Remoting sont galement traits. Enfin, lauteur livre une
application complte qui reprend les diffrents points
voqus.//Thibault IMBERT est aujourd'hui ingnieur systme chez Adobe
France.Il a commenc en tant que dveloppeur Flash pour diffrentes
agences, avant de rejoindre Regart.net comme formateur et
responsable pdagogique pour toutes les formations conernant la
plate-forme Flash.Pendant son temps libre, Thibault exprimente
ActionScript 3, comme en tmoigne son site www.bytearray.org. Il
travaille galement sur diffrents projets tels que WiiFlash
www.wiiflash.org ou AlivePDF www.alivepdf.org Avril 2008 Environ
1200 pages. Pour un livre tlcharg, un platane plant. Graphisme
couverture : Guillaume DURAND dgezeo
4. Chapitre 1 Quest ce que lActionScript 3 ? - version
0.11Quest ce que lActionScript 3
HISTORIQUE............................................................................................................1
10 RAISONS DE CODER EN ACTIONSCRIPT
3................................................3
OUTILS.......................................................................................................................3
LA PLATEFORME
FLASH.....................................................................................4
Historique Cest en 1996 que laventure Flash commence lorsque la
firme Macromedia rachte la petite socit FutureWave auteur dun
logiciel danimation vectoriel nomm Future Splash Animator.1/5
Thibault Imbert pratiqueactionscript3.bytearray.org
5. Chapitre 1 Quest ce que lActionScript 3 ? - version 0.1
Figure 1-1. Future Splash Animator sorti en avril1996. Dvelopp
lorigine pour pouvoir animer du contenu vectoriel sur Internet,
Future Splash Animator intgrait dj les bases de Flash en matire
danimation mais ne possdait cette poque aucun langage de
programmation associ. Macromedia renomma alors le logiciel sous le
nom de Flash 1.0 en 1996, mais il faut attendre 1999 afin que la
notion de programmation fasse officiellement son apparition avec
Flash 4. Les documentations de lpoque ne parlent pas encore de
langage ActionScript mais plus simplement dactions. Grce celles-ci,
il devient possible dajouter des comportements avancs aux boutons
et autres objets graphiques. De nombreux graphistes laise avec la
programmation commencrent dvelopper des comportements avancs et se
mirent changer des scripts par le biais de forums et autres
plateformes communautaire. Flash connu alors un engouement
fulgurant et devint rapidement un outil danimation avanc, capable
de produire diffrents types de contenus interactifs comme des sites
internet, des jeux, ou des applications multimdia. Cest en 2001 que
le langage ActionScript fait officiellement apparition au sein de
Flash 5. La notion de syntaxe pointe est intgre au langage qui suit
pour la premire fois les spcifications ECMAScript. Nous reviendrons
sur cette notion au cours du prochain chapitre intitul Langage et
API. Afin de rpondre une demande de la communaut pour un langage
ActionScript plus structur, Macromedia dveloppe alors une nouvelle
version dActionScript et lintgre en 2003 au sein de Flash MX 2004
sous le nom dActionScript 2.0. Cette nouvelle version rpond aux
besoins des dveloppeurs en offrant un langage orient objet et non
procdural comme ctait le cas en ActionScript 1.0. A lpoque,
Macromedia fait le choix dune migration en douceur, et propose un
langage ActionScript 2.0 souple permettant aux dveloppeurs et
graphistes de coder au sein dun mme projet en ActionScript 1.0 et
2.0. Si cette nouvelle version du langage ne satisfait pas les
dveloppeurs puristes, elle permet nanmoins aux dveloppeurs dbutant
de migrer doucement vers un dveloppement orient objet. Macromedia
dveloppe alors une nouvelle version 3.0 du langage ActionScript
afin doffrir des performances optimales leur nouvelle cration nomme
Flex. Deux ans plus tard, la socit Macromedia se voit rachete par
le gant Adobe et lActionScript 3 voit le jour au sein de Flash en
2007, lors de la sortie de Flash CS3. 2/5 Thibault Imbert
pratiqueactionscript3.bytearray.org
6. Chapitre 1 Quest ce que lActionScript 3 ? - version 0.1 10
raisons de coder en ActionScript 3 Si vous ntes pas encore
convaincu de migrer vers ActionScript 3, voici 10 raisons pour ne
plus hsiter : En dcembre 2007, le lecteur Flash 9 possde un taux de
pntration de plus de 95%. Il demeure le lecteur multimdia le plus
prsent sur Internet. La vitesse dexcution du code est environ 10
fois suprieure aux prcdentes versions dActionScript. ActionScript 3
offre des possibilits incomparables aux prcdentes versions
dActionScript. Le code ActionScript 3 savre plus logique que les
prcdentes versions du langage. Le langage ActionScript 3 permet de
dvelopper du contenu en Flash, Flex, ou AIR. Nous reviendrons trs
vite sur ces diffrents framework. Il nest pas ncessaire de connatre
un autre langage orient objet au pralable. ActionScript 3 est un
langage orient objet. Sa connaissance vous permettra daborder plus
facilement dautres langages objets tels Java, C#, ou C++. Le
langage ActionScript 3 et lAPI du lecteur Flash ont t entirement
repenss. Les dveloppeurs ActionScript 1 et 2 seront ravis de
dcouvrir les nouveauts du langage et la nouvelle organisation de
lAPI du lecteur. La technologie Flash ne cesse dvoluer, vous ne
risquez pas de vous ennuyer. ActionScript 3 est un langage souple,
qui demeure ludique et accessible. Bien entendu, vous pouvez
mmoriser ces diffrents points afin de convaincre vos amis au cours
dune soire geek. ActionScript 3 ne vous sera pas dune grande utilis
sans un environnement de dveloppement ddi. Nous allons nous
attarder quelques instants sur les diffrents outils disponibles
permettant de produire du contenu ActionScript 3.Outils Afin quil
ny ait pas de confusions, voici les diffrents outils vous
permettant de coder en ActionScript 3 : Flash CS3 : permet le
dveloppement danimations et dapplications en ActionScript 3. Pour
plus dinformations : http://www.adobe.com/fr/products/flash/3/5
Thibault Imbert pratiqueactionscript3.bytearray.org
7. Chapitre 1 Quest ce que lActionScript 3 ? - version 0.1 Flex
Builder : il sagit dun environnement auteur permettant le
dveloppement dapplications riches (RIA). Flex repose sur deux
langages, le MXML afin de dcrire les interfaces, et ActionScript
pour la logique. Pour plus dinformations :
http://www.adobe.com/fr/products/flex/ Eclipse (SDK Flex et AIR) :
les SDK de Flex et AIR permettent de produire du contenu Flex et
AIR gratuitement. Il sagit de plugins pour lenvironnement de
dveloppement Eclipse. Vous avez dit plateforme ?La plateforme Flash
Par le terme de plateforme Flash nous entendons lensemble des
technologies travers lesquelles nous retrouvons le lecteur Flash.
Nous pouvons diviser la plateforme Flash en trois catgories : Les
lecteurs Flash : parmi les diffrents lecteurs, nous comptons le
lecteur Flash, le lecteur Flash intgr AIR, ainsi que Flash Lite
(notons que Flash lite nest pas ce jour compatible avec
ActionScript 3). Les outils de dveloppement : Flex Builder et Flash
CS3 sont les deux environnements auteurs permettant de produire du
contenu Flash. Notons quil est aussi possible dutiliser
lenvironnement Eclipse et les SDK de Flex et AIR. Les framework :
Flex est un framework conu pour faciliter le dveloppement
dapplications riches. Grce AIR, ces applications peuvent sortir du
navigateur et tre dployes sur le bureau. Chaque outil de
dveloppement ou framework rpond une attente spcifique et correspond
un profil type. Un graphiste-dveloppeur sera intress par le
dveloppement dinterfaces animes et de sites Internet au sein de
Flash CS3. La connaissance dun environnement comme Flash CS3 lui
permettra aussi de dvelopper des composants rutilisablesau sein de
Flex et AIR. Un dveloppeur prfrera peut tre un environnement de
dveloppement comme celui offert par Flex Builder. Les applications
produites grce au framework Flex seront de nature diffrente et
pourront facilement tre dployes sur le bureau grce AIR.Notons que
les exemples prsents dans cet ouvrage peuvent tre utiliss au sein
de Flash CS3, Flex et AIR.Afin dentamer cette aventure au cur
dActionScript 3, nous allons nous intresser tout dabord aux
diffrentes nouveauts du langage. 4/5 Thibault Imbert
pratiqueactionscript3.bytearray.org
8. Chapitre 1 Quest ce que lActionScript 3 ? - version 0.1 En
route pour le prochain chapitre intitul Langage et API ! 5/5
Thibault Imbert pratiqueactionscript3.bytearray.org
9. Chapitre 2 Langage et API - version 0.1 2 Langage et API LE
LANGAGE ACTIONSCRIPT
3..........................................................................1
MACHINES
VIRTUELLES...................................................................................................4
TRADUCTION
DYNAMIQUE................................................................................................6
GESTION DES TYPES
LEXCUTION..................................................................................7
ERREURS
LEXCUTION..............................................................................................13
NOUVEAUX TYPES
PRIMITIFS..........................................................................................15
VALEURS PAR
DFAUT..................................................................................................19
NOUVEAUX TYPES
COMPOSITES......................................................................................21
NOUVEAUX
MOTS-CLS.................................................................................................21
FONCTIONS.................................................................................................................22
CONTEXTE
DEXCUTION...............................................................................................25
BOUCLES....................................................................................................................26
ENRICHISSEMENT DE LA CLASSE
ARRAY..........................................................................27
RAMASSE-MIETTES.......................................................................................................30
BONNES
PRATIQUES......................................................................................................33
AUTRES
SUBTILITS......................................................................................................34
Le langage ActionScript 3 Le langage ActionScript 3 intgre de
nombreuses nouveauts que nous allons traiter tout au long de cet
ouvrage. Ce chapitre va nous permettre de dcouvrir les nouvelles
fonctionnalits et comportements essentiels tout dveloppeur
ActionScript 3. Avant de dtailler les nouveauts lies au langage
ActionScript 3, il convient de dfinir tout dabord ce que nous
entendons par le terme ActionScript. De manire gnrale, le terme
ActionScript englobe deux composantes importantes :1 / 36 Thibault
Imbert pratiqueactionscript3.bytearray.org
10. Chapitre 2 Langage et API - version 0.1 Le cur du langage :
il sagit du langage ActionScript bas sur la spcification ECMAScript
(ECMA-262) et intgre partiellement certaines fonctionnalits issues
de la spcification ECMAScript 4. LAPI du lecteur Flash : il sagit
des fonctionnalits du lecteur Flash. Toutes les classes ncessitant
dtre importes font partie de lAPI du lecteur et non du cur du
langage ActionScript. Ainsi, linterface de programmation du lecteur
ou le langage peuvent tre mise jour indpendamment. Le lecteur Flash
10 devrait normalement intgrer une gestion de la 3D native ainsi
quune implmentation plus complte de la spcification ECMAScript 4.
La gestion de la 3D concerne ici uniquement linterface de
programmation du lecteur Flash, linverse les nouveaux objets dfinis
par la spcification ECMAScript 4 sont directement lis au cur du
langage ActionScript. Dun ct rside le langage ActionScript 3, de
lautre lAPI du lecteur appele gnralement interface de
programmation, la figure 2-1 illustre les deux entits : 2 / 36
Thibault Imbert pratiqueactionscript3.bytearray.org
11. Chapitre 2 Langage et API - version 0.1 Figure 2-1. Langage
ActionScript 3. Contrairement aux prcdentes versions dActionScript,
nous remarquons quen ActionScript 3, les diffrentes fonctionnalits
du lecteur Flash sont dsormais stockes dans des paquetages
spcifiques. Afin dafficher une vido nous utiliserons les objets
issus du paquetage flash.media. A linverse, pour nous connecter un
serveur, nous utiliserons les objets issus du paquetage
flash.net.Flash CS3 est configur afin dimporter automatiquement
toutes les classes issues de lAPI du lecteur Flash. Il nest donc
pas ncessaire dimporter manuellement les classes lorsque nous
codons au sein de lenvironnement auteur. Un fichier
implicitImports.xml situ au sein du rpertoire dinstallation de
Flash CS3 (C:Program FilesAdobeAdobe Flash3 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
12. Chapitre 2 Langage et API - version 0.1
CS3frConfigurationActionScript 3.0) contient toutes les dfinitions
de classe importer :Afin de crer un clip dynamiquement nous pouvons
crire directement sur une image du scnario :var monClip:MovieClip =
new MovieClip();Si nous plaons notre code lextrieur de Flash au
sein de classes, nous devons explicitement importer les classes
ncessaires :import flash.display.MovieClip; var monClip:MovieClip =
new MovieClip();Dans cet ouvrage nous nimporterons pas les classes
du lecteur lorsque nous programmerons dans lenvironnement auteur de
Flash. A linverse ds lintroduction des classes au sein du chapitre
8 intitul Programmation oriente objet, nous importerons
explicitement les classes utilises.A retenir Le langage
ActionScript 3 englobe deux composantes : lecur du langage
ActionScript et linterface deprogrammation du lecteur Flash. Le cur
du langage est dfini par la spcificationECMAScript.Machines
virtuelles Le code ActionScript est interprt par une partie du
lecteur Flash appele machine virtuelle. Cest cette dernire qui se
charge de retranscrire en langage machine le code binaire
(ActionScript byte code) gnr par le compilateur. 4 / 36 Thibault
Imbert pratiqueactionscript3.bytearray.org
13. Chapitre 2 Langage et API - version 0.1 Les prcdentes
versions du lecteur Flash intgraient une seule machine virtuelle
appele AVM1 afin dinterprter le code ActionScript 1 et 2. En ralit,
le code binaire gnr par le compilateur en ActionScript 1 et 2 tait
le mme, cest la raison pour laquelle nous pouvions faire cohabiter
au sein dun mme projet ces deux versions du langage ActionScript.
La figure 2-2 illustre la machine virtuelle 1 (AVM1) prsente dans
le lecteur Flash 8 :Figure 2-2. AVM1 au sein du lecteur Flash 8. Le
langage ActionScript 3 nest pas compatible avec cette premire
machine virtuelle, pour des raisons videntes de rtrocompatibilit,
le lecteur Flash 9 embarque donc deux machines virtuelles. Lors de
la lecture dun SWF, le lecteur slectionne automatiquement la
machine virtuelle approprie afin dinterprter le code ActionScript
prsent au sein du SWF. Ainsi, une application ActionScript 1 et 2
sera interprte au sein du lecteur Flash 9 par la machine virtuelle
1 (AVM1) et ne bnficiera daucune optimisation des performances. La
figure 2-3 prsente les deux machines virtuelles au sein du lecteur
Flash 9 : 5 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
14. Chapitre 2 Langage et API - version 0.1Figure 2-3. Le
lecteur Flash 9 et les deux machinesvirtuelles AVM1 et AVM2. Seules
les animations compiles en ActionScript 3 pourront bnficier des
optimisations ralises par la nouvelle machine virtuelle (AVM2).A
retenir Les prcdentes versions du lecteur Flash intgraient uneseule
machine virtuelle afin dinterprter le codeActionScript 1 et 2. La
machine virtuelle 1 (AVM1) interprte le codeActionScript 1 et 2. La
machine virtuelle 2 (AVM2) interprte seulement le codeActionScript
3. Le lecteur Flash intgre les deux machines virtuelles (AVM1et
AVM2). Le langage ActionScript 3 ne peut pas cohabiter avec
lesprcdentes versions dActionScript.Traduction dynamique Afin
doptimiser les performances, la machine virtuelle 2 (AVM2) du
lecteur Flash 9 intgre un mcanisme innovant de compilation du code
la vole. Bien que le terme puisse paratre tonnant, ce principe
appel gnralement traduction dynamique permet dobtenir de meilleures
performances dexcution du code en compilant ce dernier lexcution.
Dans les prcdentes versions du lecteur Flash, le code prsent au
sein du SWF tait directement retranscrit par la machine virtuelle
en langage machine sans aucune optimisation lie la plateforme en
cours. 6 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
15. Chapitre 2 Langage et API - version 0.1 En ActionScript 3
la machine virtuelle retranscrit le code binaire (ActionScript byte
code) en langage machine laide dun compilateur la vole appel
couramment compilateur la vole. (Just-in-time compiler). Ce dernier
permet de compiler uniquement le code utilis et de manire optimise
selon la plateforme en cours. La machine virtuelle peut donc
optimiser les instructions pour un processeur spcifique tout en
prenant en considration les diffrentes contraintes de la
plateforme. Pour plus dinformations lies la compilation lexcution,
rendez vous ladresse suivante :
http://en.wikipedia.org/wiki/Just-in-time_compilation
http://fr.wikipedia.org/wiki/Compilation_%C3%A0_la_vol%C3%A9eGestion
des types lexcution ActionScript 2 introduit au sein de Flash MX
2004 la notion de typage fort. Cela consistait associer un type de
donnes une variable laide de la syntaxe suivante :variable:TypeDans
le code suivant, nous tentions daffecter une chane une variable de
type Number :var distance:Number = quot;150quot;;Lerreur suivante
tait gnre la compilation :Incompatibilit de types dans
l'instruction d'affectation : String dtect aulieu de Number.En
ActionScript 3, nous bnficions du mme mcanisme de vrification des
types la compilation. En compilant le mme code en ActionScript 3,
lerreur suivante est gnre :1067: Contrainte implicite d'une valeur
du type String vers un type sansrapport Number.Ce comportement est
appel Mode prcis dans Flash CS3 et peut tre dsactiv par
lintermdiaire du panneau Paramtres dActionScript 3.0. A travers le
panneau Paramtres de publication, puis de longlet Flash, nous
cliquons sur le bouton Paramtres. Nous obtenons un panneau
Paramtres dActionScript 3 contenant deux options lies aux erreurs
comme lillustre la figure 2-4 : 7 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
16. Chapitre 2 Langage et API - version 0.1Figure 2-4. Options
du compilateur ActionScript 3. Nous remarquons que par dfaut, le
Mode prcis est activ, nous reviendrons trs vite sur le Mode
avertissements. En dcochant la case Mode prcis, nous dsactivons la
vrification des types la compilation afin de dcouvrir un
comportement extrmement important apport par ActionScript 3. En
testant le code suivant en mode non prcis, nous remarquons quaucune
erreur de compilation nest gnre :var distance:Number =
quot;150quot;;A lexcution, la machine virtuelle 2 (AVM2) convertit
automatiquement la chane de caractres 150 en un nombre entier de
type int.Afin de vrifier cette conversion automatique, nous pouvons
utiliser la fonction describeType du paquetage flash.utils :var
distance:Number = quot;150quot;; /* affiche :*/trace( describeType
( distance ) );La fonction describeType renvoie un objet XML
dcrivant le type de la variable. Nous pouvons remarquer que
lattribut name du nud type renvoie int.En modifiant la chane de
caractres nous obtenons une conversion automatique vers le type
Number :var distance:Number = quot;150.5quot;; /* affiche :*/trace(
describeType ( distance ) ); 8 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
17. Chapitre 2 Langage et API - version 0.1 Si nous tentons
daffecter un autre type de donnes celle-ci, la machine virtuelle 2
(AVM2) conserve le type Number et convertit implicitement les
donnes lexcution.Contrairement au mode prcis, ce comportement de
vrification des types lexcution ne peut pas tre dsactiv.Nous
pourrions ainsi en conclure de toujours conserver le mode prcis
afin de ne pas tre surpris par ce comportement, mais certaines
erreurs de types ne peuvent tre dtectes par le compilateur car
celles-ci ninterviennent qu lexcution. Dans le code suivant, le
compilateur ne dtecte aucune erreur :var tableauDonnees:Array = [
quot;150quot;, quot;250quot; ]; // l'entre du tableau est
automatiquement convertie en intvar distance:Number =
tableauDonnees[0];A lexcution, la chane de caractres prsente lindex
0 est automatiquement convertie en int. Cette conversion reste
silencieuse tant que celle-ci russie, au cas chant une erreur
lexcution est leve. Dans le code suivant, nous tentons de stocker
une chane de caractres au sein dune variable de type MovieClip :var
tableauDonnees:Array = [ quot;clipquot;, quot;250quot; ]; // lve
une erreur l'excutionvar clip:MovieClip = tableauDonnees[0];A
lexcution, la machine virtuelle 2 (AVM2) tente de convertir la
chane en MovieClip et choue, lerreur lexcution suivante est leve
:TypeError: Error #1034: Echec de la contrainte de type :
conversion de quot;clipquot;en flash.display.MovieClip
impossible.Nous pouvons alors nous interroger sur lintrt dun tel
comportement, pourquoi la machine virtuelle svertue-t-elle
conserver les types lexcution et convertit automatiquement les
donnes ? Afin de garantir des performances optimales, la machine
virtuelle 2 (AVM2) sappuie sur les types dfinis par le dveloppeur.
Ainsi, lorsque nous typons une variable, loccupation mmoire est
optimise spcifiquement pour ce type, ainsi que les instructions
processeur. 9 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
18. Chapitre 2 Langage et API - version 0.1Il ne faut donc pas
considrer ce comportement commeun dsagrment mais comme un avantage
contribuant de meilleures performances.Ce comportement diffre
dActionScript 2, o la machine virtuelle 1 (AVM1) valuait
dynamiquement tous les types lexcution, aucune optimisation ntait
ralise. Le typage des variables ntait quune aide la compilation. La
grande nouveaut lie ActionScript 3 rside donc dans lintrt du typage
la compilation comme lexcution. En associant un type une variable
en ActionScript 3 nous bnficions dune vrification des types la
compilation et dune optimisation des calculs raliss par le
processeur et dune meilleure optimisation mmoire. Il est donc
primordial de toujours typer nos variables enActionScript 3, les
performances en dpendent trsnettement. Nous typerons
systmatiquement nosvariables durant lensemble de louvrage.Voici un
exemple permettant de justifier cette dcision : Une simple boucle
utilise une variable dincrmentation i de type int :var debut:Number
= getTimer(); for ( var i:int = 0; i< 500000; i++ ) { } //
affiche : 5trace( getTimer() - debut );La boucle ncessite 5
millisecondes pour effectuer 500 000 itrations. Sans typage de la
variable i, la boucle suivante ncessite 14 fois plus de temps
sexcuter :var debut:Number = getTimer(); for ( var i = 0; i<
500000; i++ ) { } // affiche : 72trace( getTimer() - debut ); 10 /
36 Thibault Imbert pratiqueactionscript3.bytearray.org
19. Chapitre 2 Langage et API - version 0.1 Dans le code
suivant, la variable prenom ne possde pas de type spcifique, la
machine virtuelle doit valuer elle-mme le type ce qui ralentit le
temps dexcution :var debut:Number = getTimer(); var prenom =
quot;Bobbyquot;;var prenomRaccourci:String; for ( var i:int = 0;
i< 500000; i++ ) { prenomRaccourci = prenom.substr ( 0, 3 ); }
// affiche : 430trace( getTimer() - debut ); // affiche : Bobtrace
( prenomRaccourci );En typant simplement la variable prenom nous
divisons le temps dexcution de presque deux fois :var debut:Number
= getTimer(); var prenom:String = quot;Bobbyquot;;var
prenomRaccourci:String; for ( var i:int = 0; i< 500000; i++ ) {
prenomRaccourci = prenom.substr ( 0, 3 ); } // affiche : 232trace(
getTimer() - debut ); // affiche : Bobtrace ( prenomRaccourci );Au
sein du panneau Paramtres ActionScript 3, nous pouvons apercevoir
un deuxime mode de compilation appel Mode avertissements. Ce
dernier permet dindiquer plusieurs types derreurs comme par exemple
les erreurs lies la migration de code.attachMovie Supposons que
nous tentions dutiliser la mthode dans un projet ActionScript 3
:var ref:MovieClip = this.attachMovie (quot;clipquot;,
quot;monClipquot;, 0);Au lieu dindiquer un simple message derreur,
le compilateur nous renseigne que notre code nest pas compatible
avec ActionScript 3 et nous propose son quivalent. 11 / 36 Thibault
Imbert pratiqueactionscript3.bytearray.org
20. Chapitre 2 Langage et API - version 0.1 Le code prcdent
gnre donc le message derreur suivant la compilation :Warning: 1060:
Problme de migration : la mthode 'attachMovie' n'est plusprise en
charge. Si le nom de la sous-classe de MovieClip est A, utilisez
varmc= new A(); addChild(mc). Pour plus d'informations, consultez
la classeDisplayObjectContainer.Le Mode avertissements permet
davertir le dveloppeur de certains comportements lexcution risquant
de le prendre au dpourvu.Attention, les avertissements nempchent ni
la compilation du code ni son excution, mais avertissent simplement
que le rsultat de lexcution risque de ne pas tre celui attendu.Dans
le code suivant, un dveloppeur tente de stocker une chane de
caractre au sein dune variable de type Boolean :var prenom:Boolean
= quot;Bobbyquot;;A la compilation, lavertissement suivant est
affich :Warning: 3590: String utilise alors qu'une valeur boolenne
est attendue.L'expression va tre transtype comme boolenne.Il est
donc fortement conseill de conserver le Mode prcis ainsi que le
mode avertissements afin dintercepter un maximum derreurs la
compilation. Comme nous lavons vu prcdemment, le lecteur Flash 9
nchoue plus en silence et lve des erreurs lexcution. Nous allons
nous intresser ce nouveau comportement dans la partie suivante.A
retenir 12 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
21. Chapitre 2 Langage et API - version 0.1 Il est possible de
dsactiver la vrification de type lacompilation. Il nest pas
possible de dsactiver la vrification de type lexcution. Le typage
en ActionScript 2 se limitait une aide lacompilation. Le typage en
ActionScript 3 aide la compilation et lexcution. Dans un souci
doptimisation des performances, il estfortement recommand de typer
les variables en ActionScript3. Il est fortement conseill de
conserver le mode prcis ainsique le mode avertissements afin
dintercepter un maximumderreurs la compilation.Erreurs lexcution
Nous avons trait prcdemment des erreurs de compilation laide du
mode prcis et abord la notion derreurs lexcution. Une des grandes
nouveauts du lecteur Flash 9 rside dans la gestion des erreurs.
Souvenez-vous, les prcdentes versions du lecteur Flash ne levaient
aucune erreur lexcution et chouaient en silence. En ActionScript 3
lorsque lexcution du programme est interrompue de manire anormale,
on dit quune erreur dexcution est leve. Afin de gnrer une erreur
lexcution nous pouvons tester le code suivant :// dfinition d'une
variable de type MovieClip// sa valeur par dfaut est nullvar
monClip:MovieClip; // nous tentons de rcuprer le nombre d'images du
scnario du clip// il vaut null, une erreur d' excution est levevar
nbImages:int = monClip.totalFrames;La fentre de sortie affiche
lerreur suivante :TypeError: Error #1009: Il est impossible
d'accder la proprit ou lamthode d'une rfrence d'objet nul.Afin de
grer cette erreur, nous pouvons utiliser un bloc try catch ://
dfinition d'une variable de type MovieClip// sa valeur par dfaut
est nullvar monClip:MovieClip; var nbImages:int; // grce au bloc
try catch nous pouvons grer l'erreurtry13 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
22. Chapitre 2 Langage et API - version 0.1{ nbImages =
monClip.totalFrames; } catch ( pErreur:Error ) { trace ( quot;une
erreur d'excution a t leve !quot;); }Bien entendu, nous
nutiliserons pas systmatiquement les blocs try catch afin dviter
dafficher les erreurs lexcution. Certains tests simples, que nous
dcouvrirons au cours de louvrage, nous permettrons quelque fois
dviter davoir recours ces blocs. Dans un contexte derreurs
lexcution, il convient de dfinir les deux dclinaisons du lecteur
Flash existantes : Version de dbogage (Player Debug) : cette
version du lecteur est destine au dveloppement et affiche les
erreurs lexcution en ouvrant une fentre spcifique indiquant lerreur
en cours. Ce lecteur est install automatiquement lors de
linstallation de lenvironnement de dveloppement Flash CS3 ou Flex
Builder 2 et 3. Version production (Player Release) : cette version
du lecteur est disponible depuis le site dAdobe. Les personnes
nayant pas denvironnement de dveloppement install utilisent cette
version du lecteur. Ce lecteur naffiche pas les erreurs lexcution
afin de ne pas interrompre lexprience de lutilisateur. Avec le
lecteur de dbogage, les erreurs non gres par un bloc try catch
ouvrent un panneau derreur au sein du navigateur comme lillustre la
figure 2-5 : Figure 2-5. Exemple derreur lexcution. Lorsquune
erreur est leve, lexcution du code est alors mise en pause. Nous
pouvons alors dcider de continuer lexcution du code 14 / 36
Thibault Imbert pratiqueactionscript3.bytearray.org
23. Chapitre 2 Langage et API - version 0.1 bien quune erreur
vienne dtre leve ou bien de stopper totalement lexcution de
lapplication.A retenir Le lecteur Flash 9 lve des erreurs
lexcution. Ces erreurs ouvrent avec le lecteur de dbogage une
fentreindiquant lerreur au sein du navigateur. Toutes les mthodes
de lAPI du lecteur en ActionScript 3peuvent lever des erreurs
lexcution. Le lecteur Flash 9 nchoue plus en silence, le dbogage
estdonc facilit.Nouveaux types primitifs En ActionScript 2, seul le
type Number existait afin de dfinir un nombre, ainsi pour stocker
un nombre entier ou dcimal le type Number tait utilis :var
age:Number = 20; var vitesse:Number = 12.8;Aucune distinction ntait
faite entre les nombres entiers, dcimaux et non ngatifs.
ActionScript 3 intgre dsormais trois types afin de reprsenter les
nombres : int : reprsente un nombre entier 32 bit (32 bit signed
integer) uint : reprsente un nombre entier non sign 32 bit. (32 bit
unsigned integer) Number : reprsente un nombre dcimal 64 bit
(64-bit IEEE 754 double-precision floating-point number) Notons que
les deux nouveaux types int et uint ne prennent pas de majuscule,
contrairement au type Number dj prsent au sein dActionScript 2. Une
variable de type int peut contenir un nombre oscillant entre
-2147483648 et 2147483648 :// affiche : -2147483648trace(
int.MIN_VALUE ); // affiche : 2147483648trace( int.MAX_VALUE );Une
variable de type uint peut contenir un nombre entier oscillant
entre 0 et 4294967295 :15 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
24. Chapitre 2 Langage et API - version 0.1// affiche : 0trace(
uint.MIN_VALUE ); // affiche : 4294967295trace( uint.MAX_VALUE
);Attention, la machine virtuelle ActionScript 3 conserve les types
lexcution, si nous tentons de stocker un nombre virgule flottante
au sein dune variable de type int ou uint, le nombre est
automatiquement converti en entier par la machine virtuelle :var
age:int = 22.2; // affiche : 22trace ( age );Notons, que la machine
virtuelle arrondi lentier infrieur :var age:int = 22.8; // affiche
: 22trace ( age );Cette conversion automatique assure par la
machine virtuelle savre beaucoup plus rapide que la mthode floor de
la classe Math.Dans le code suivant, nous arrondissons lentier au
sein dune boucle laide de la mthode floor, la boucle ncessite 111
millisecondes :var distance:Number = 45.2;var arrondi:Number; var
debut:Number = getTimer(); for ( var i:int = 0; i< 500000; i++ )
{ arrondi = Math.floor ( distance ); } // affiche : 111trace(
getTimer() - debut );A prsent, nous laissons la machine virtuelle
grer pour nous larrondi du nombre :var distance:Number = 45.2;var
arrondi:int; var debut:Number = getTimer(); for ( var i:int = 0;
i< 500000; i++ ) { arrondi = distance; }16 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
25. Chapitre 2 Langage et API - version 0.1// affiche : 8trace(
getTimer() - debut ); // affiche : 45trace( arrondi );Nous obtenons
le mme rsultat en 8 millisecondes, soit un temps dexcution presque
14 fois plus rapide. Partant du principe quune distance est
toujours positive, nous pouvons utiliser le type uint qui offre
dans ce cas prcis des performances similaires au type int :var
arrondi:uint;Malheureusement, le type uint savre gnralement
beaucoup plus lent, ds lors quune opration mathmatique est
effectue. En revanche, le type Number savre plus rapide que le type
int lors de division. Lors de la dfinition dune boucle, il convient
de toujours prfrer lutilisation dune variable dincrmentation de
type int :var debut:Number = getTimer(); for ( var i:int = 0; i<
5000000; i++ ) {} // affiche : 61trace( getTimer() - debut );A
linverse, si nous utilisons un type uint, les performances chutent
de presque 400% :var debut:Number = getTimer(); for ( var i:uint =
0; i< 5000000; i++ ) {} // affiche : 238trace( getTimer() -
debut );Gardez lesprit, quen cas dhsitation, il est prfrable
dutiliser le type Number :var debut:Number = getTimer(); for ( var
i:Number = 0; i< 5000000; i++ ) 17 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
26. Chapitre 2 Langage et API - version 0.1{} // affiche :
102trace( getTimer() - debut );Nous obtenons ainsi un compromis en
termes de performances entre le type int et uint. De manire gnrale,
il est prfrable dviter le typeuint.La mme optimisation peut tre
obtenue pour calculer larrondi suprieur. Nous prfrons laisser la
machine virtuelle convertir lentier infrieur puis nous ajoutons 1
:var distance:Number = 45.2;var arrondi:int; var debut:Number =
getTimer(); for ( var i:int = 0; i< 500000; i++ ) { arrondi =
distance + 1; } // affiche : 12trace( getTimer() - debut ); //
affiche : 46trace( arrondi );En utilisant la mthode ceil de la
classe Math, nous ralentissons les performances denviron 300% :var
distance:Number = 45.2;var arrondi:Number; var debut:Number =
getTimer(); for ( var i:int = 0; i< 500000; i++ ) { arrondi =
Math.ceil ( distance ) + 1; } // affiche : 264trace( getTimer() -
debut ); // affiche : 46trace( arrondi ); 18 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
27. Chapitre 2 Langage et API - version 0.1 Pour plus dastuces
lies loptimisation, rendez-vous ladresse suivante :
http://lab.polygonal.de/2007/05/10/bitwise-gems-fast-integer-math/
A retenir Le type int permet de reprsenter un nombre entier 32 bit.
Le type uint permet de reprsenter un nombre entier 32 bitnon
ngatif. Le type Number permet de reprsenter un nombre dcimal64 bit.
Il est conseill dutiliser le type int pour les nombresentiers, son
utilisation permet doptimiser les performances. Il est dconseill
dutiliser le type uint. En cas dhsitation, il convient dutiliser le
type Number.Valeurs par dfaut Il est important de noter que les
valeurs undefined et null ont un comportement diffrent en
ActionScript 3. Dsormais, une variable renvoie undefined uniquement
lorsque celle-ci nexiste pas o lorsque nous ne la typons pas :var
prenom; // affiche : undefinedtrace( prenom );Lorsquune variable
est type mais ne possde aucune valeur, une valeur par dfaut lui est
attribue :var condition:Boolean;var total:int;var couleur:uint;var
resultat:Number;var personnage:Object;var prenom:String;var
donnees:*; // affiche : falsetrace( condition ); // affiche :
0trace( total ); // affiche : 0trace( couleur ); // affiche :
NaNtrace( resultat ); // affiche : null 19 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
28. Chapitre 2 Langage et API - version 0.1trace( personnage );
// affiche : nulltrace( prenom ); // affiche : undefinedtrace(
donnees );Le tableau suivant illustre les diffrentes valeurs
attribues par dfaut aux types de donnes :Type de donnesValeur par
dfautBooleanfalseint0Number NaNObject nullString nulluint 0Non type
(quivalent au type *) undefinedAutres types null Tableau 1. Valeurs
par dfaut associes aux types de donnes. De la mme manire, si nous
tentons daccder une proprit inexistante au sein dune instance de
classe non dynamique telle String, nous obtenons une erreur la
compilation :var prenom:String = quot;Bobquot;; // gnre une erreur
la compilationtrace( prenom.proprieteInexistante );Si nous tentons
daccder une proprit inexistante, au sein dune instance de classe
dynamique, le compilateur ne procde aucune vrification et nous
obtenons la valeur undefined pour la proprit cible :var
objet:Object = new Object(); // affiche : undefinedtrace(
objet.proprieteInexistante );20 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
29. Chapitre 2 Langage et API - version 0.1 Attention, une
exception demeure pour les nombres, qui ne peuvent tre null ou
undefined. Si nous typons une variable avec le type Number, la
valeur par dfaut est NaN :var distance:Number; // affiche :
NaNtrace( distance );En utilisant le type int ou uint, les
variables sont automatiquement initialises 0 :var distance:int; var
autreDistance:uint; // affiche : 0trace( distance ); // affiche :
0trace( autreDistance );A retenir Une variable renvoie undefined
uniquement lorsquecelle-ci nexiste pas ou nest pas type. Lorsquune
variable est type mais ne possde aucunevaleur, la machine virtuelle
attribue automatiquement unevaleur par dfaut.Nouveaux types
composites Deux nouveaux types composites sont intgrs en
ActionScript 3 : Les expressions rgulires (RegExp) : elles
permettent deffectuer des recherches complexes sur des chanes de
caractres. Nous reviendrons sur les expressions rgulires au cours
de certains exercices. E4X (ECMAScript 4 XML) : la spcification
ECMAScript 4 intgre un objet XML en tant quobjet natif. Nous
reviendrons sur le format XML et E4X au cours de certains
exercices.Nouveaux mots-cls Le mot cl is introduit par ActionScript
3 remplace lancien mot-cl instanceof des prcdentes versions
dActionScript.Ainsi pour tester si une variable est dun type
spcifique nous utilisons le mot-cl is :var tableauDonnees:Array =
[5654, 95, 54, 687968, 97851]; // affiche : truetrace(
tableauDonnees is Array ); 21 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
30. Chapitre 2 Langage et API - version 0.1// affiche :
truetrace( tableauDonnees is Object ); // affiche : falsetrace(
tableauDonnees is MovieClip );Un autre mot-cl nomm as fait aussi
son apparition. Ce dernier permet de transtyper un objet vers un
type spcifique. Dans le code suivant, nous dfinissons une variable
de type DisplayObject, mais celle-ci contient en ralit une instance
de MovieClip :var monClip:DisplayObject = new MovieClip();Si nous
tentons dappeler une mthode de la classe MovieClip sur la variable
monClip, une erreur la compilation est gnre.Afin de pouvoir appeler
la mthode sans que le compilateur ne nous bloque, nous pouvons
transtyper vers le type MovieClip :// transtypage en
MovieClip(monClip as MovieClip).gotoAndStop(2);En cas dchec du
transtypage, le rsultat du transtypage renvoie null, nous pouvons
donc tester si le transtypage russit de la manire suivante :var
monClip:DisplayObject = new MovieClip(); // affiche : truetrace(
MovieClip(monClip) != null );Nous aurions pu transtyper avec
lcriture traditionnelle suivante :var monClip:DisplayObject = new
MovieClip(); // transtypage en
MovieClipMovieClip(monClip).gotoAndStop(2);En termes de
performances, le mot cl as savre presque deux fois plus rapide. En
cas dchec lors du transtypage lcriture prcdente ne renvoie pas null
mais lve une erreur lexcution.Fonctions ActionScript 3 intgre de
nouvelles fonctionnalits lies la dfinition de fonctions. Nous
pouvons dsormais dfinir des paramtres par dfaut pour les fonctions.
Prenons le cas dune fonction affichant un message personnalis
:function alerte ( pMessage:String ):void { 22 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
31. Chapitre 2 Langage et API - version 0.1trace( pMessage );
}Cette fonction alerte accepte un paramtre accueillant le message
afficher. Si nous souhaitons lexcuter nous devons obligatoirement
passer un message :alerte (quot;voici un message d'alerte
!quot;);Si nous omettons le paramtre :// gnre une erreur la
compilationalerte ();Lerreur la compilation suivante est gnre
:1136: Nombre d'arguments incorrect.1 attendus.ActionScript 3
permet de dfinir une valeur par dfaut pour le paramtre :function
alerte ( pMessage:String=quot;message par dfautquot; ):void {
trace( pMessage ); }Une fois dfinie, nous pouvons appeler la
fonction alerte sans passer de paramtres :function alerte (
pMessage:String=quot;message par dfautquot; ):void { trace(
pMessage ); } // affiche : message par dfautalerte ();Lorsque nous
passons un paramtre spcifique, celui-ci crase la valeur par dfaut
:function alerte ( pMessage:String=quot;message par dfautquot;
):void { trace( pMessage ); } // affiche : un message personnalis
!alerte ( quot;un message personnalis !quot; );En plus de cela,
ActionScript 3 intgre un nouveau mcanisme li aux paramtres
alatoires. 23 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
32. Chapitre 2 Langage et API - version 0.1 Imaginons que nous
devions crer une fonction pouvant accueillir un nombre alatoire de
paramtres. En ActionScript 1 et 2, nous ne pouvions lindiquer au
sein de la signature de la fonction. Nous dfinissions donc une
fonction sans paramtre, puis nous utilisions le tableau arguments
regroupant lensemble des paramtres :function calculMoyenne
():Number { var lng:Number = arguments.length;var total:Number = 0;
for (var i:Number = 0; i< lng; i++) { total += arguments[i]; }
return total / lng; } var moyenne:Number = calculMoyenne ( 50, 48,
78, 20, 90 ); // affiche : 57.2trace( moyenne );Bien que cette
criture puisse paratre trs souple, elle posait nanmoins un problme
de relecture du code. En relisant la signature de la fonction, un
dveloppeur pouvait penser que la fonction calculMoyenne nacceptait
aucun paramtre, alors que ce ntait pas le cas. Afin de rsoudre
cette ambigut, ActionScript 3 introduit un mot-cl permettant de
spcifier dans les paramtres que la fonction en cours reoit un
nombre variable de paramtres. Pour cela nous ajoutons trois points
de suspensions en tant que paramtre de la fonction, suivi dun nom
de variable de notre choix. Le mme code scrit donc de la manire
suivante en ActionScript 3 :function calculMoyenne ( ...parametres
):Number { var lng:int = parametres.length;var total:Number = 0;
for (var i:Number = 0; i< lng; i++) {24 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
33. Chapitre 2 Langage et API - version 0.1total +=
parametres[i]; } return total / lng; } var moyenne:Number =
calculMoyenne ( 50, 48, 78, 20, 90 ); // affiche : 57.2trace(
moyenne );En relisant le code prcdent, le dveloppeur ActionScript 3
peut facilement dtecter les fonctions accueillant un nombre de
paramtres alatoires.Contexte dexcution Afin que vous ne soyez pas
surpris, il convient de sattarder quelques instants sur le nouveau
comportement des fonctions passes en rfrence. Souvenez-vous, en
ActionScript 1 et 2, nous pouvions passer en rfrence une fonction,
celle-ci perdait alors son contexte dorigine et pousait comme
contexte le nouvel objet :var personnage:Object = { age : 25, nom :
quot;Bobbyquot; }; // la fonction parler est passe en
rfrencepersonnage.parler = parler; function parler ( ) {
trace(quot;bonjour, je m'appelle quot; + this.nom + quot;, j'ai
quot; + this.age + quot; ansquot;); } // appel de la mthode//
affiche : bonjour, je m'appelle Bobby, j'ai 25
anspersonnage.parler();En ActionScript 3, la fonction parler
conserve son contexte dorigine et ne sexcute donc plus dans le
contexte de lobjet personnage :var personnage:Object = { age : 25,
nom : quot;Bobbyquot; }; // la fonction parler est passe en
rfrencepersonnage.parler = parler; function parler ( ) {
trace(quot;bonjour, je m'appelle quot; + this.nom + quot;, j'ai
quot; + this.age + quot; ansquot;); 25 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
34. Chapitre 2 Langage et API - version 0.1} // appel de la
mthode// affiche : bonjour, je m'appelle undefined, j'ai undefined
anspersonnage.parler();De nombreux dveloppeurs ActionScript se
basaient sur ce changement de contexte afin de rutiliser des
fonctions. Nous devrons donc garder lesprit ce nouveau comportement
apport par ActionScript 3 durant lensemble de louvrage.Boucles
ActionScript 3 introduit une nouvelle boucle permettant ditrer au
sein des proprits dun objet et daccder directement au contenu de
chacune dentre elles. Dans le code suivant, nous affichons les
proprits de lobjet personnage laide dune boucle for in :var
personnage:Object = { prenom : quot;Bobbyquot;, age : 50 }; for
(var p:String in personnage) { /* affiche :ageprenom*/trace( p );
}Attention, lordre dnumration des proprits peut changer selon les
machines. Il est donc essentiel de ne pas se baser sur lordre
dnumration des proprits. Notons que la boucle for in en
ActionScript 3 ne boucle plus de la dernire entre la premire comme
ctait le cas en ActionScript 1 et 2, mais de la premire la dernire.
Nous pouvons donc dsormais utiliser la boucle for in afin ditrer au
sein dun tableau sans se soucier du fait que la boucle parte de la
fin du tableau :var tableauDonnees:Array = [ 5654, 95, 54, 687968,
97851]; for ( var p:String in tableauDonnees ) { /* affiche
:56549526 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
35. Chapitre 2 Langage et API - version
0.15468796897851*/trace( tableauDonnees[p] ); }La boucle for each
accde elle, directement au contenu de chaque proprit :var
personnage:Object = { prenom : quot;Bobbyquot;, age : 50 }; for
each ( var p:* in personnage ) { /* affiche :50Bobby*/trace( p );
}Nous pouvons donc plus simplement itrer au sein du tableau laide
de la nouvelle boucle for each :var tableauDonnees:Array = [ 5654,
95, 54, 687968, 97851 ]; for each ( var p:* in tableauDonnees ) {
/* affiche :5654955468796897851*/trace( p ); }Nous allons nous
intresser dans la prochaine partie au concept de ramasse-miettes
qui savre trs important en ActionScript 3.Enrichissement de la
classe Array La classe Array bnficie de nouvelles mthodes en
ActionScript 3 facilitant la manipulation de donnes. La mthode
forEach permet ditrer simplement au sein du tableau ://
Array.forEach procde une navigation simple// sur chaque lement
l'aide d'une fonction spcifique var prenoms:Array = [
quot;bobbyquot;, quot;willyquot;, quot;ritchiequot; ]; 27 / 36
Thibault Imbert pratiqueactionscript3.bytearray.org
36. Chapitre 2 Langage et API - version 0.1function navigue (
element:*, index:int, tableau:Array ):void { trace ( element +
quot; : quot; + index + quot; : quot; + tableau); } /* affiche
:bobby : 0 : bobby,willy,ritchiewilly : 1 :
bobby,willy,ritchieritchie : 2 :
bobby,willy,ritchie*/prenoms.forEach( navigue );Toutes ces
nouvelles mthodes fonctionnent sur le mme principe. Une fonction de
navigation est passe en paramtre afin ditrer et de traiter les
donnes au sein du tableau. La mthode every excute la fonction de
navigation jusqu' ce quelle ci ou llment parcouru renvoient
false.Il est donc trs simple de dterminer si un tableau contient
des valeurs attendues. Dans le code suivant, nous testons si le
tableau donnees contient uniquement des nombres :var donnees:Array
= [ 12, quot;bobbyquot;, quot;willyquot;, 58, quot;ritchiequot; ];
function navigue ( element:*, index:int, tableau:Array ):Boolean {
return ( element is Number ); } var tableauNombres:Boolean =
donnees.every ( navigue ); // affiche : falsetrace( tableauNombres
);La mthode map permet la cration dun tableau relatif au retour de
la fonction de navigation. Dans le code suivant, nous appliquons un
formatage aux donnes du tableau prenoms.Un nouveau tableau de
prnoms formats est cre :var prenoms:Array = [quot;bobbyquot;,
quot;willyquot;, quot;ritchiequot;]; function navigue ( element:*,
index:int, tableau:Array ):String { return
element.charAt(0).toUpperCase()+element.substr(1).toLowerCase(); }
// on cre un tableau partir du retour de la fonction naviguevar
prenomsFormates:Array = prenoms.map ( navigue ); 28 / 36 Thibault
Imbert pratiqueactionscript3.bytearray.org
37. Chapitre 2 Langage et API - version 0.1// affiche :
Bobby,Willy,Ritchietrace( prenomsFormates );La mthode map ne permet
pas de filtrer les donnes. Toutes les donnes du tableau source sont
ainsi places au sein du tableau gnr. Si nous souhaitons filtrer les
donnes, nous pouvons appeler la mthode filter. Dans le code suivant
nous filtrons les utilisateurs mineurs et obtenons un tableau
dutilisateurs majeurs :var utilisateurs:Array = [ { prenom :
quot;Bobbyquot;, age : 18 },{ prenom : quot;Willyquot;, age : 20
},{ prenom : quot;Ritchiequot;, age : 16 },{ prenom :
quot;Steviequot;, age : 15 } ];function navigue ( element:*,
index:int, tableau:Array ):Boolean { return ( element.age >= 18
); } var utilisateursMajeurs:Array = utilisateurs.filter ( navigue
); function parcourir ( element:*, index:int, tableau:Array ):void
{ trace ( element.prenom, element.age ); } /* affiche :Bobby
18Willy 20*/utilisateursMajeurs.forEach( parcourir );La mthode some
permet de savoir si un lment existe au moins au sein du tableau. La
fonction de navigation est excute jusqu ce que celle ci ou un lment
du tableau renvoient true :var utilisateurs:Array = [ { prenom :
quot;Bobbyquot;, age : 18, sexe : quot;Hquot; }, { prenom :
quot;Lindaquot;, age : 18, sexe : quot;Fquot; }, { prenom :
quot;Ritchiequot;, age : 16, sexe : quot;Hquot;}, { prenom :
quot;Steviequot;, age : 15, sexe : quot;Hquot; } ]function navigue
( element:*, index:int, tableau:Array ):Boolean { return (
element.sexe == quot;Fquot; ); } // y'a t'il une femme au sein du
tableau d'utilisateurs ?29 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
38. Chapitre 2 Langage et API - version 0.1var resultat:Boolean
= utilisateurs.some ( navigue ); // affiche : truetrace( resultat
);Les mthodes indexOf et lastIndexOf font elles aussi leur
apparition au sein de la classe Array, celles-ci permettent de
rechercher si un lment existe et dobtenir sa position :var
utilisateurs:Array = [ quot;Bobbyquot;, quot;Lindaquot;,
quot;Ritchiequot;, quot;Steviequot;, quot;Lindaquot; ]; var
position:int = utilisateurs.indexOf (quot;Lindaquot;); var
positionFin:int = utilisateurs.lastIndexOf (quot;Lindaquot;); //
affiche : 1trace( position ); // affiche : 4trace( positionFin
);Les mthodes indexOf et lastIndexOf permettent de rechercher un
lment de type primitif mais aussi de type composite. Nous pouvons
ainsi rechercher la prsence de rfrences au sein dun tableau :var
monClip:DisplayObject = new MovieClip(); var
monAutreClip:DisplayObject = new MovieClip(); // une rfrence au
clip monClip est place au sein du tableauvar
tableauReferences:Array = [ monClip ]; var position:int =
tableauReferences.indexOf (monClip); var autrePosition:int =
tableauReferences.lastIndexOf (monAutreClip); // affiche : 0trace(
position ); // affiche : -1trace( autrePosition );Nous reviendrons
sur certaines de ces mthodes au sein de louvrage.A retenir Pensez
utiliser les nouvelles mthodes de la classe Arrayafin de traiter
plus facilement les donnes au sein duntableau.Ramasse-miettes Tout
au long de louvrage nous reviendrons sur le concept de ramasse-
miettes. Bien que le terme puisse paraitre fantaisiste, ce mcanisme
va 30 / 36 Thibault Imbert pratiqueactionscript3.bytearray.org
39. Chapitre 2 Langage et API - version 0.1 savrer
extrmementimportant durant nos dveloppements ActionScript 3.
Pendant la dure de vie dun programme, certains objets peuvent
devenir inaccessibles. Afin, de ne pas saturer la mmoire, un
mcanisme de suppression des objets inutiliss est intgr au sein du
lecteur Flash. Ce mcanisme est appel ramasse-miettes ou plus
couramment Garbage collector en Anglais. Afin de bien comprendre ce
mcanisme, nous dfinissons un simple objet rfrenc par une variable
personnage :var personnage:Object = { prenom : quot;Bobbyquot;, age
: 50 };Pour rendre cet objet inaccessible et donc ligible la
suppression par le ramasse-miettes, nous pourrions tre tents
dutiliser le mot cl delete :var personnage:Object = { prenom :
quot;Bobbyquot;, age : 50 }; // gnre une erreur la
compilationdelete personnage;Le code prcdent, gnre lerreur de
compilation suivante :1189: Tentative de suppression de la proprit
fixe personnage.Seules lesproprits dfinies dynamiquement peuvent
tre supprimes.Cette erreur traduit une modification du comportement
du mot cl delete en ActionScript 3, qui ne peut tre utilis que sur
des proprits dynamiques dobjets dynamiques. Ainsi, le mot cl delete
pourrait tre utilis pour supprimer la proprit prenom au sein de
lobjet personnage :var personnage:Object = { prenom :
quot;Bobbyquot;, age : 50 }; // affiche : Bobbytrace(
personnage.prenom ); // supprime la proprit prenomdelete (
personnage.prenom ); // affiche : undefinedtrace( personnage.prenom
);Afin de supprimer correctement une rfrence, nous devons affecter
la valeur null celle-ci : var personnage:Object = { prenom :
quot;Bobbyquot;, age : 50 }; // supprime la rfrence vers lobjet
personnagepersonnage = null;Lorsque lobjet ne possde plus aucune
rfrence, nous pouvons estimer que lobjet est ligible la
suppression. 31 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
40. Chapitre 2 Langage et API - version 0.1 Nous devrons donc
toujours veiller ce quaucune rfrence ne subsiste vers notre objet,
au risque de le voir conserv en mmoire.Attention, laffectation de
la valeur null une rfrence ne dclenche en aucun cas le passage du
ramasse-miettes. Nous rendons simplement lobjet ligible la
suppression. Il est important de garder lesprit passage du ramasse-
miettes reste potentiel. Lalgorithme de nettoyage effectu ce
dernier tant relativement gourmand en termes de ressources, son
dclenchement reste limit au cas o le lecteur utiliserait trop de
mmoire.Dans le code suivant, nous supprimons une des deux rfrences
seulement :var personnage:Object = { prenom : quot;Bobbyquot;, age
: 50 }; // copie d'une rfrence au sein du tableauvar
tableauPersonnages:Array = [ personnage ]; // suppression dune
seule rfrencepersonnage = null;Une autre rfrence vers lobjet
personnage subsiste au sein du tableau, lobjet ne sera donc jamais
supprim par le ramasse-miettes :var personnage:Object = { prenom :
quot;Bobbyquot;, age : 50 }; // copie d'une rfrence au sein du
tableauvar tableauPersonnages:Array = [ personnage ]; // supprime
une des deux rfrences seulementpersonnage = null; var
personnageOrigine:Object = tableauPersonnages[0]; // affiche :
Bobbytrace( personnageOrigine.prenom ); // affiche : 50trace(
personnageOrigine.age );Nous devons donc aussi supprimer la rfrence
prsente au sein du tableau afin de rendre lobjet personnage ligible
la suppression :var personnage:Object = { prenom : quot;Bobbyquot;,
age : 50 }; // copie d'une rfrence au sein du tableauvar
tableauPersonnages:Array = [ personnage ]; // supprime la premire
rfrencepersonnage = null; // supprime la seconde rfrence32 / 36
Thibault Imbert pratiqueactionscript3.bytearray.org
41. Chapitre 2 Langage et API - version
0.1tableauPersonnages[0] = null;Si la situation nous le permet, un
moyen plus radical consiste craser le tableau contenant la rfrence
:var personnage:Object = { prenom : quot;Bobbyquot;, age : 50 }; //
copie d'une rfrence au sein du tableauvar tableauPersonnages:Array
= [ personnage ]; // supprime la premire rfrencepersonnage = null;
// crase le tableau stockant la rfrencetableauPersonnages = new
Array();Depuis la version 9.0.115 du lecteur Flash 9, il est
possible de dclencher le ramasse-miettes manuellement laide de la
mthode gc de la classe System. Notons que cette fonctionnalit nest
accessible quau sein du lecteur de dbogage. Nous reviendrons sur
cette mthode au cours du prochain chapitre intitul Le modle
vnementiel.A retenir Il est possible de dclencher manuellement le
ramasse-miettes au sein du lecteur de dbogage 9.0.115. Afin quun
objet soit ligible la suppression par le ramasse-miettes nous
devons passer toutes ses rfrences null. Le ramasse-miettes
intervient lorsque la machine virtuellejuge cela ncessaire.Bonnes
pratiques Durant lensemble de louvrage nous ferons usage de
certaines bonnes pratiques, dont voici le dtail : Nous typerons les
variables systmatiquement afin doptimiser les performances de nos
applications et garantir une meilleure gestion des erreurs la
compilation. Lors de la dfinition de boucles, nous utiliserons
toujours une variable de rfrence afin dviter que la machine
virtuelle ne rvalue la longueur du tableau chaque itration. Nous
prfrerons donc le code suivant :var tableauDonnees:Array = [ 5654,
95, 54, 687968, 97851]; // stockage de la longueur du tableauvar
lng:int = tableauDonnees.length; for ( var i:int = 0; i< lng;
i++ ) 33 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
42. Chapitre 2 Langage et API - version 0.1{ }A cette criture
non optimise :var tableauDonnees:Array = [ 5654, 95, 54, 687968,
97851]; for ( var i:int = 0; i< tableauDonnees.length; i++ ) {
}De la mme manire, nous viterons de redfinir nos variables au sein
des boucles. Nous prfrerons lcriture suivante :var
tableauDonnees:Array = [5654, 95, 54, 687968, 97851]; var lng:int =
tableauDonnees.length; // dclaration de la variable elementEnCours
une seule et unique foisvar elementEnCours:int; for ( var i:int =
0; i< lng; i++ ) { elementEnCours = tableauDonnees[i]; }A
lcriture suivante non optimise :var tableauDonnees:Array = [5654,
95, 54, 687968, 97851]; for ( var i:int = 0; i<
tableauDonnees.length; i++ ) { // dclaration de la variable
elementEnCours chaque itrationvar elementEnCours:int =
tableauDonnees[i]; }Dcouvrons prsent quelques dernires subtilits du
langage ActionScript 3.Autres subtilits Attention, le type Void
existant en ActionScript 2, utilis au sein des signatures de
fonctions prend dsormais un v minuscule en ActionScript 3. Une
fonction ActionScript 2 ne renvoyant aucune valeur scrivait de la
manire suivante : 34 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
43. Chapitre 2 Langage et API - version 0.1function
initilisation ( ):Void {}En ActionScript 3, le type void ne prend
plus de majuscule :function initilisation ( ):void {}ActionScript 3
intgre un nouveau type de donnes permettant dindiquer quune
variable peut accueillir nimporte quel type de donnes. En
ActionScript 2 nous nous contentions de ne pas dfinir de type, en
ActionScript 3 nous utilisons le type * :var condition:* = true;var
total:* = 5;var couleur:* = 0x990000;var resultat:* = 45.4;var
personnage:* = new Object();var prenom:* = quot;Bobbyquot;;Nous
utiliserons donc systmatiquement le type * au sein dune boucle for
each, car la variable p doit pouvoir accueillir nimporte quel type
de donnes :var personnage:Object = { prenom : quot;Bobbyquot;, age
: 50 }; for each ( var p:* in personnage ) { /* affiche
:50Bobby*/trace( p ); }En utilisant un type spcifique pour la
variable ditration p, nous risquons de convertir implicitement les
donnes itres. Dans le code suivant, nous utilisons le type Boolean
pour la variable p:var personnage:Object = { prenom :
quot;Bobbyquot;, age : 50 }; for each ( var p:Boolean in personnage
) {35 / 36 Thibault Imbert pratiqueactionscript3.bytearray.org
44. Chapitre 2 Langage et API - version 0.1/* affiche
:truetrue*/trace( p ); }Le contenu des proprits est automatiquement
converti en boolen. Au cas o une donne ne pourrait tre convertie en
boolen, le code prcdent pourrait lever une erreur lexcution.
Passons prsent aux nouveauts lies linterface de programmation du
lecteur Flash. Les deux grandes nouveauts du lecteur Flash 9
concernent la gestion de laffichage ainsi que le modle vnementiel.
Au cours du prochain chapitre intitul Le modle vnementiel nous
allons nous intresser ce nouveau modle travers diffrents exercices
dapplications. Nous apprendrons matriser ce dernier et dcouvrirons
comment en tirer profit tout au long de louvrage. Puis nous nous
intresserons au nouveau mcanisme de gestion de laffichage appele
Liste daffichage au cours du chapitre 4, nous verrons que ce
dernier offre beaucoup plus de souplesse en termes de manipulation
des objets graphiques et doptimisation de laffichage. Vous tes prt
pour la grande aventure ActionScript 3 ? 36 / 36 Thibault Imbert
pratiqueactionscript3.bytearray.org
45. Chapitre 3 Le modle vnementiel - version 0.13Le modle
vnementiel
LHISTOIRE..............................................................................................................1
UN NOUVEAU MODLE
VNEMENTIEL......................................................5TOUT
EST
VNEMENTIEL...............................................................................................7ECOUTER
UN
VNEMENT...............................................................................................9LOBJET
VNEMENTIEL...............................................................................................12LA
CLASSE
EVENT......................................................................................................14
LES SOUS-CLASSES
DEVENT...........................................................................15ARRTER
LCOUTE DUN
VNEMENT...........................................................................17MISE
EN
APPLICATION.................................................................................................18
LA PUISSANCE DU COUPLAGE
FAIBLE........................................................23SOUPLESSE
DE
CODE....................................................................................................26
ORDRE DE
NOTIFICATION...............................................................................28
RFRENCES
FAIBLES.......................................................................................30
SUBTILITS............................................................................................................32
Lhistoire ActionScript 3 intgre un tout nouveau modle vnementiel
que nous allons tudier ensemble tout au long de ce chapitre. Avant
de laborder, rappelons-nous de lancien modle vnementiel apparu pour
la premire fois avec le lecteur Flash 6. Jusqu maintenant nous
dfinissions des fonctions que nous passions en rfrence lvnement
cout. Prenons un exemple simple. Pour couter lvnement onRelease dun
bouton nous, devions crire le code suivant :monBouton.onRelease =
function () 1 / 33 Thibault Imbert
pratiqueactionscript3.bytearray.org
46. Chapitre 3 Le modle vnementiel - version 0.1{ // affiche :
_level0.monBoutontrace ( this ); this._alpha = 50; }Une fonction
anonyme tait dfinie sur la proprit onRelease du bouton. Lorsquun
clic souris intervenait sur le bouton, le lecteur Flash excutait la
fonction que nous avions dfinie et rduisait lopacit du bouton de
50%. Cette criture posait plusieurs problmes. Dans un premier
temps, la fonction dfinie sur le bouton ne pouvait pas tre rutilise
pour un autre vnement, sur un objet diffrent. Pour pallier ce
problme de rutilisation, certains dveloppeurs faisaient appels des
rfrences de fonctions afin de grer lvnement :function clicBouton ()
{ // affiche : _level0.monBoutontrace (this); this._alpha = 50; }
monBouton.onRelease = clicBouton;Cette criture permettait de
rutiliser la fonction clicBouton pour dautres vnements lis
diffrents objets, rendant le code plus ar en particulier lors de
lcoute dvnements au sein de boucles. Point important, le mot-cl
this faisait ici rfrence au bouton et non au scnario sur lequel est
dfinie la fonction clicBouton. Le contexte dexcution dorigine de la
fonction clicBouton tait donc perdu lorsque celle-ci tait passe en
rfrence. La fonction pousait le contexte de lobjet auteur de
lvnement. Lauto rfrence traduite par lutilisation du mot-cl this
tait le seul moyen de faire rfrence ce dernier. Ce comportement
tait quelque peu droutant pour une personne dcouvrant ActionScript.
Voici un exemple mettant en vidence lambigut possible :function
clicBouton () { // afiche : _level0.monBoutontrace ( this );2 / 33
Thibault Imbert pratiqueactionscript3.bytearray.org
47. Chapitre 3 Le modle vnementiel - version 0.1this._alpha =
50; } monBouton.onRelease = clicBouton; clicBouton();En excutant la
fonction clicBouton de manire traditionnelle le mot-cl this fait
alors rfrence au scnario sur lequel elle tait dfinie, son contexte
dorigine. Le code suivant tait peu digeste et rigide :var
ref:MovieClip; for ( var i:Number = 0; i< 50; i++ ) { ref =
this.attachMovie ( quot;monClipquot;, quot;monClipquot;+i, i );
ref.onRelease = function () { trace(quot;cliququot;); } }Les
dveloppeurs prfraient donc lutilisation dune fonction spare
rutilisable :var ref:MovieClip; for ( var i:Number = 0; i< 50;
i++ ) { ref = this.attachMovie ( quot;monClipquot;,
quot;monClipquot;+i, i ); ref.onRelease = clicBouton; } function
clicBouton ( ) { trace(quot;cliququot;); }Le mcanisme tait le mme
pour la plupart des vnements. Macromedia lpoque de Flash MX (Flash
6) stait rendu compte du manque de souplesse de ce systme de
fonctions dfinies sur les vnements, et intgra la notion dcouteurs
et de diffuseurs au sein3 / 33 Thibault Imbert
pratiqueactionscript3.bytearray.org
48. Chapitre 3 Le modle vnementiel - version 0.1 du lecteur
Flash 6. Les classes Key, Selection, TextField furent les premires
utiliser cette notion de diffuseurs couteurs. Pour couter la saisie
dans un champ texte, nous pouvions utiliser la syntaxe suivante
:var monEcouteur:Object = new Object(); monEcouteur.onChanged =
function(pChamp:TextField) {trace ( pChamp._name + quot; a diffus
lvnement onChangedquot; ); }; monChampTexte.addListener (
monEcouteur );En appelant la mthode addListener sur notre champ
texte nous souscrivions un objet appel ici monEcouteur en tant
qucouteur de lvnement onChanged. Une mthode du mme nom devait tre
dfinie sur lobjet couteur afin que celle-ci soit excute lorsque
lvnement tait diffus. Cette approche permettait de souscrire un
nombre illimit dcouteurs auprs dun vnement, mais aussi de renvoyer
des paramtres la mthode couteur. Ces paramtres taient gnralement
des informations lies lvnement, par exemple lauteur de lvnement
diffus. En 2004, lors de la sortie du lecteur Flash 7 (Flash MX
2004), ActionScript 2 faisait son apparition, ainsi quun lot de
nouveaux composants appels composants V2. Ces derniers tendaient le
concept de diffuseurs couteurs en intgrant une mthode
addEventListener pour souscrire un couteur auprs dun vnement.
Contrairement la mthode addListener, cette mthode tendait le
concept dcouteurs diffuseurs en stockant chaque couteur dans des
tableaux internes diffrents pour chaque vnement. En regardant
lvolution dActionScript au cours des dernires annes, nous pouvons
nous rendre compte du travail des ingnieurs visant intgrer la
notion dcouteurs auprs de tous nouveaux objets crs. ActionScript 3
a t dvelopp dans le but doffrir un langage puissant et standard et
prolonge ce concept en intgrant un nouveau modle vnementiel appel
Document Object Model (DOM3 Event Model) valable pour tous les
objets lis lAPI du lecteur Flash 9. Le W3C dfinit la spcification
de ce modle vnementiel. Vous pouvez lire les dernires rvisions
ladresse suivante : http://www.w3.org/TR/DOM-Level-3-Events/ 4 / 33
Thibault Imbert pratiqueactionscript3.bytearray.org
49. Chapitre 3 Le modle vnementiel - version 0.1 Les
dveloppeurs ActionScript 2 ayant dj utilis la classe
EventDispatcher seront ravis de savoir que tous les objets lis au
lecteur Flash hritent directement de cette classe. Nous allons donc
dcouvrir en profondeur le concept de diffuseurs couteurs et voir
comment cela amliore la clart et la souplesse de notre code.A
retenir Lancien modle vnementiel a t entirement revu enActionScript
3. La grande puissance dActionScript 3 rside danslimplmentation
native dEventDispatcher. Un nouveau modle vnementiel En
ActionScript 3 le modle vnementiel a clairement volu, la manire
dont les objets interagissent entre eux a t entirement revue. Le
principe mme de ce modle vnementiel est tir dun modle de conception
ou Design Pattern appel Observateur qui dfinit linteraction entre
plusieurs objets daprs un dcoupage bien spcifique.Habituellement ce
modle de conception peut tre dfini de la manire suivante : Le modle
de conception observateur dfinit une relation entreobjets de type
un plusieurs, de faon que, lorsque un objet change dtat, tous ceux
qui en dpendent en soient notifis et soient mis jour
automatiquement . Le modle de conception Observateur met en scne
trois acteurs : Le sujet Il est la source de lvnement, nous
lappellerons sujet car cest lui qui diffuse les vnements qui
peuvent tre couts ou non par les observateurs. Ce sujet peut tre un
bouton, ou un clip par exemple. Ne vous inquitez pas, tous ces
vnements sont documents, la documentation prsente pour chaque objet
les vnements diffuss. Lvnement Nous pouvons conceptualiser la
notion dvnement comme un changement dtat au sein du sujet. Un clic
sur un bouton, la fin dun chargement de donnes provoquera la
diffusion dun vnement par lobjet sujet. Tous les vnements existants
en ActionScript 3 sont stocks dans des proprits constantes de
classes lies lvnement. 5 / 33 Thibault Imbert
pratiqueactionscript3.bytearray.org
50. Chapitre 3 Le modle vnementiel - version 0.1 Lcouteur
Lcouteur a pour mission dcouter tout vnement du sujet. Il peut tre
une fonction ou une mthode. Lorsque le sujet change dtat, il
diffuse un vnement appropri, si lcouteur est souscrit auprs de
lvnement diffus il en est notifi et excute une action. Il est
important de souligner quil peut y avoir de multiples couteurs pour
un mme vnement, cest justement lun des points forts de ce nouveau
modle vnementiel reprsent par la figure 3-1.Figure 3-1. Schma du
modle de conceptionObservateur Nos couteurs sont dpendants du
sujet, ils y ont souscrits. Le sujet ne connat rien des couteurs,
il sait simplement sil est observ ou non travers sa liste interne
dcouteurs. Lorsque celui-ci change dtat un vnement est diffus, nos
couteurs en sont notifis et peuvent alors ragir. Tout vnement
diffus envoie des informations aux couteurs leur permettant dtre
tenus au courant des modifications et donc de rester jour en
permanence avec le sujet. Nous dcouvrirons au fil de ces pages, la
souplesse apporte par ce nouveau modle vnementiel, et vous
apprcierez son fonctionnement trs rapidement. Cela reste encore
relativement abstrait, pour y remdier voyons ensemble comment ce
modle vnementiel stablit au sein dune application Flash
traditionnelle. Prenons un exemple simple constitu dun bouton et
dune fonction couteur ragissant lorsque lutilisateur clique sur ce
bouton. Nous6 / 33 Thibault Imbert
pratiqueactionscript3.bytearray.org
51. Chapitre 3 Le modle vnementiel - version 0.1 avons dans ce
cas nos trois acteurs mettant en scne le nouveau modle vnementiel
ActionScript 3. Le sujet : le bouton Lvnement : le clic bouton
Lcouteur : la fonction Transpos dans une application ActionScript 3
traditionnelle, nous pouvons tablir le schma suivant :Figure 3-2.
Modle vnementiel dans une application ActionScript 3 Notre bouton
est un sujet pouvant diffuser un vnement. Celui-ci est cout par une
fonction couteur.A retenir Il existe un seul et unique modle
vnementiel enActionScript 3 Ce modle vnementiel est bas sur le
modle deconception Observateur. Les trois acteurs de ce nouveau
modle vnementiel sont :le sujet, lvnement, et lcouteur. Nous
pouvons avoir autant dcouteurs que nous lesouhaitons. Plusieurs
couteurs peuvent couter le mme vnement.Tout est vnementiel
Lessentiel du modle vnementiel rside au sein dune seule et unique
classe appele EventDispatcher. Cest elle qui offre la 7 / 33
Thibault Imbert pratiqueactionscript3.bytearray.org
52. Chapitre 3 Le modle vnementiel - version 0.1 possibilit un
objet de diffuser des vnements. Tous les objets issus de lAPI du
lecteur 9 hritent de cette classe, et possdent de ce fait la
capacit de diffuser des vnements. Souvenez-vous que toutes les
classes issues du paquetage flash sont relatives au lecteur
Flash.Avant le lecteur 9, ces objets hritaient simplement de la
classe Object, si nous souhaitions pouvoir diffuser des vnements
nous devions nous mme implmenter la classe EventDispatcher au sein
de ces objets. En ActionScript 3 la classe EventDispatcher est la
classe de base pour tous ces objets. Voici la chane dhritage de la
classe MovieClip avant le lecteur Flash 9 :Object|+-MovieClipDans
les prcdentes versions du lecteur Flash, la classe MovieClip
tendait directement la classe Object, si nous souhaitions pouvoir
diffuser des vnements partir dun MovieClip nous devions implmenter
nous-mmes un nouveau modle vnementiel. Voyons comme cela a volu
avec lActionScript 3 au sein du lecteur 9. Depuis lecteur 9 et
ActionScript 3 :Object|+-EventDispatcherLa classe EventDispatcher
hrite dsormais de la classe Object, tous les autres objets hritent
ensuite dEventDispatcher et bnficie donc de la diffusion dvnements
en natif. Cest une grande volution pour nous autres dveloppeurs
ActionScript, car la plupart des objets que nous manipulerons
auront la possibilit de diffuser des vnements par dfaut. Ainsi la
classe MovieClip en ActionScript hrite dabord de la classe Object
puis dEventDispatcher pour ensuite hriter des diffrentes classes
graphiques. Toutes les classes rsidant dans le paquetage flash ne
drogent pas la rgle et suivent ce mme principe. Voici la chane
dhritage complte de la classe MovieClip en ActionScript 3
:Object|+-EventDispatcher | +-DisplayObject|8 / 33 Thibault Imbert
pratiqueactionscript3.bytearray.org
53. Chapitre 3 Le modle vnementiel - version 0.1
+-InteractiveObject | +-DisplayObjectContainer |
+-Sprite|+-MovieClipVoyons ensemble comment utiliser ce nouveau
modle vnementiel travers diffrents objets courants.Ecouter un
vnement Lorsque vous souhaitez tre tenu au courant des dernires
nouveauts de votre vidoclub, vous avez plusieurs possibilits. La
premire consiste vous dplacer jusquau vidoclub afin de dcouvrir les
dernires sorties. Une approche classique qui nest pas vraiment
optimise, nous pouvons dj imaginer le nombre de visites que vous
effectuerez dans le magasin pour vous rendre compte quaucun nouveau
DVD ne vous intresse. Une deuxime approche consiste laisser une
liste de films que vous attendez au grant du vidoclub et attendre
que celui-ci vous appelle lorsquun des films est arriv. Une
approche beaucoup plus efficace pour vous et pour le grant qui en a
assez de vous voir repartir du. Le grant incarne alors le
diffuseur, et vous-mme devenez lcouteur. Le grant du vidoclub ne
sait rien sur vous, il est donc le sujet, vous tes alors lcouteur
car vous tes souscrit un vnement prcis : la disponibilit dun film
que vous recherchez . En ActionScript 3 les objets fonctionnent de
la mme manire. Pour obtenir une notification lorsque lutilisateur
clique sur un bouton, nous souscrivons un couteur auprs dun vnement
diffus par le sujet, ici notre bouton. Afin dcouter un vnement
spcifique, nous utilisons la mthode addEventListener dont voici la
signature :addEventListener(type:String, listener:Function,
useCapture:Boolean = false,priority:int = 0,
useWeakReference:Boolean = false):voidLe premier paramtre attend
lvnement couter sous la forme dune chane de caractres. Le deuxime
paramtre prend en rfrence lcouteur qui sera souscrit auprs de
lvnement. Les trois derniers paramtres seront expliqus plus tard.
Souvenez-vous que seuls les objets rsidants dans le paquetage flash
utilisent ce modle vnementiel. Voyons laide d'un exemple simple,
comment couter un vnement. 9 / 33 Thibault Imbert
pratiqueactionscript3.bytearray.org
54. Chapitre 3 Le modle vnementiel - version 0.1 Dans un
nouveau document Flash, crez un symbole bouton, et placez une
occurrence de ce dernier sur la scne et nommez la monBouton.Sur un
calque AS tapez le code suivant :monBouton.addEventListener (
quot;clickquot;, clicBouton ); function clicBouton (
pEvt:MouseEvent ):void {// affiche : vnement
diffustrace(quot;vnement diffusquot;); }Nouspassonsen
deuximeparamtre la mthode addEventListener une rfrence la fonction
couteur clicBouton. Attention ne pas mettre les doubles parenthses
lorsque nous passons la rfrence la fonction. Le code suivant ne
pourrait pas tre compil :monBouton.addEventListener(
quot;clickquot;, clicBouton() ); function clicBouton (
pEvt:MouseEvent ):void { // affiche : vnement diffustrace (
quot;vnement diffusquot; ); }Nous coutons ici lvnement click sur le
bouton monBouton et nous passons la fonction clicBouton comme
couteur. Lorsque lutilisateur clique sur le bouton, il diffuse un
vnement click qui est cout par la fonction clicBouton.Mme si cette
syntaxe fonctionne, et ne pose aucun problme pour le moment, que se
passe t-il si nous spcifions un nom dvnement incorrect ? Imaginons
le cas suivant, nous faisons une erreur et coutons lvnement clicck
:monBouton.addEventListener( quot;clicckquot;, clicBouton );Si vous
testez le code ci-dessus, la fonction clicBouton ne sera jamais
dclenche car lvnement clicck possde une erreur de saisie et de par
sa non-existence nest jamais diffus. Afin dviter ces problmes de
saisie, tous les noms des vnements sont dsormais stocks dans des
classes lies chaque vnement. 10 / 33 Thibault Imbert
pratiqueactionscript3.bytearray.org
55. Chapitre 3 Le modle vnementiel - version 0.1 Lorsque vous
devez couter un vnement spcifique pensez immdiatement au type
dvnement qui sera diffus. Les classes rsidant dans le paquetage
flash.events constituent lensemble des classes vnementielles en
ActionScript 3. Elles peuvent tre divises en deux catgories. Les
vnements autonomes Ce sont les vnements diffuss par les objets sans
aucune interaction utilisateur, voici quelques classes lis aux
vnements autonomes :flash.events.Event : stocke les vnements de
base.flash.events.ProgressEvent:stocke lesvnements lis aux
chargements progressifs.flash.events.IOErrorEvent : stocke les
vnementslis aux erreurs de chargement. Les vnements interactifs Ce
sont les vnements diffuss par les objets, lorsquune interaction
utilisateur intervient.flash.events.MouseEvent : stocke les
vnementslis la souris. :flash.events.KeyboardEventstocke
lesvnements lis au clavier.flash.events.TextEvent : stocke les
vnements lisaux champs texte. Dans notre cas, nous souhaitons
couter un vnement qui relve dune interactivit