pratique d'action script 3 version 0.1.3

1094
trace("Pratique d'ActionScript 3"); // Thibault IMBERT

Upload: franck-emon

Post on 13-Jun-2015

879 views

Category:

Documents


0 download

TRANSCRIPT

  • 1. trace("PratiquedActionScript3");// Thibault IMBERT

2. Remerciements// "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) et Stphane Mortka pour leur soutien et leurs illustrationsqui mont permis denrichir 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, DavidDeraedt, Frderic Saunier, 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 vus 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." 3. trace("Pratique dActionScript 3");// Pratique dActionScript 3 sadresse tous les flasheurs.Cet ouvrage dresse un panorama de lutilisation dActionScript 3 et deses nouveauts, ainsi que du nouveau lecteur Flash 9.Lauteur explique au travers de nombreux exemples et cas concrets comment traiterdsormais les objets, le texte, le son et la vido, le chargement et lenvoi de donnesexternes (variables, XML, etc.), les sockets, etc.Certains sujets avancs et peu abords comme les classes bas niveau ou encoreFlash Remoting sont galement traits.Enfin, lauteur livre une application complte qui reprend les diffrents pointsvoqus.// Thibault IMBERT est aujourdhui 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 pdagogiquepour toutes les formations conernant la plate-forme Flash.Pendant son temps libre, Thibault exprimente ActionScript 3, comme en tmoigneson site www.bytearray.org. Il travaille galement sur diffrents projets tels queWiiFlash www.wiiflash.org ou AlivePDF www.alivepdf.orgAvril 2008 Environ 1200 pages. Pour un livre tlcharg, un platane plant.Graphisme couverture : Guillaume DURAND dgezeo 4. Prface// "Je pratique Flash depuis maintenant 10 ans et jai pu suivre de prs toutes ses volutions.Flash 3 a accompagn mes premiers pas dans lunivers du web. Jai dcouvert un logicielincroyablement accessible et dont lergonomie astucieuse, les outils danimation etdinteractivit rpondaient parfaitement aux besoins de lpoque.Quelques annes plus tard, un bond de gant est franchi avec Flash MX et lapparition de lapremire version robuste du langage ActionScript. Flash est alors un outil mr et quilibr.Au mme moment, sortent les premires versions de Flash Media Server etFlash Remoting qui deviennent des complments indispensables tout dveloppementambitieux.Suivant lvolution des crations web de plus en plus dynamiques et complexes, Flashbascule, non sans mal, vers un outil de dveloppement plus sophistiqu (Flash MX 2004),ncessitant la mise en place dquipes spcialises. Lpoque du flasheur maitrisant toutde A Z est rvolue. Flash sadresse dsormais deux publics distincts : graphistes duncot, dveloppeurs de lautre.Lquilibre devient alors prcaire et la tendance favoriser le code au dtriment delaccessibilit de loutil se dveloppe. Les ralisations du graphiste ou de lanimateur sontmaintenant souvent subordonnes au travail du dveloppeur, ce qui ne favorise pas toujoursla cration.Si Flash 8, grce aux filtres et mlanges, ouvre de nouvelles voies la cration et redonneun peu de place au graphiste, cest nanmoins, le plus souvent, le dveloppeur qui contrlele projet.Flash 9 et lActionScript 3 reprsentent une nouvelle tape vers la technicisation de loutil.Connatre lenvironnement auteur ne suffit plus, il est indispensable de comprendre etde maitriser les rouages du lecteur pour viter la ralisation dapplications totalementinstables.Etant au cur de la production, jai toujours dplor que les ouvrages Actionscript prennentsi peu en compte les ralits que peuvent rencontrer une agence, un studio, une quipe outout professionnel dans son travail quotidien.Japprcie particulirement louvrage de Thibault pour les exemples concrets, directementutilisables en production, quil nous livre. Il nous dispense justement dexplications tropvirtuelles ou dun esthtisme superflu du code.Fort de son exprience de formateur, il reste simple et clair au moyen dun vocabulaireprcis, sans jamais tomber, ni dans le perfectionnisme lexical, ni dans la vulgarisationimprcise.Cet ouvrage va bien au del de lapprentissage du langage ActionScript 3 en posant les basesde sa bonne utilisation dans Flash et en fournissant un clairage neuf et pertinent sur cetoutil fabuleux."Mathieu AnthoineGame Designer et co-fondateur du studio Yamago www.yamago.net 5. Chapitre 1 Quest ce que lActionScript 3 ? - version 0.1.11 / 5Thibault Imbertpratiqueactionscript3.bytearray.org1Quest ce que lActionScript 3HISTORIQUE...........................................................................................................110 RAISONS DE CODER EN ACTIONSCRIPT 3 ...............................................3OUTILS......................................................................................................................3LA PLATEFORME FLASH....................................................................................4HistoriqueCest en 1996 que laventure Flash commence lorsque la firmeMacromedia rachte la petite socit FutureWave auteur dun logicieldanimation vectoriel nomm Future Splash Animator. 6. Chapitre 1 Quest ce que lActionScript 3 ? - version 0.1.12 / 5Thibault Imbertpratiqueactionscript3.bytearray.orgFigure 1-1. Future Splash Animator sorti en avril1996.Dvelopp lorigine pour pouvoir animer du contenu vectoriel surInternet, Future Splash Animator intgrait dj les bases de Flash enmatire danimation mais ne possdait cette poque aucun langagede programmation associ. Macromedia renomma alors le logicielsous le nom de Flash 1.0 en 1996, mais il faut attendre 1999 afin quela notion de programmation fasse officiellement son apparition avecFlash 4.Les documentations de lpoque ne parlent pas encore de langageActionScript mais plus simplement dactions. Grce celles-ci, ildevient possible dajouter des comportements avancs aux boutons etautres objets graphiques. De nombreux graphistes laise avec laprogrammation commencrent dvelopper des comportementsavancs et se mirent changer des scripts par le biais de forums etautres plateformes communautaires. Flash connu alors un engouementfulgurant et devint rapidement un outil danimation avanc, capable deproduire diffrents types de contenus interactifs comme des sitesinternet, des jeux, ou des applications multimdia.Cest en 2001 que le langage ActionScript fait officiellementapparition au sein de Flash 5. La notion de syntaxe pointe est intgreau langage qui suit pour la premire fois les spcificationsECMAScript. Nous reviendrons sur cette notion au cours du prochainchapitre intitul Langage et APIMacromedia dveloppe alors une nouvelle version 3.0 du langageActionScript afin doffrir des performances optimales leur nouvellecration nomme Flex. Deux ans plus tard, la socit Macromedia sevoit rachete par le gant Adobe et lActionScript 3 voit le jour au seinde Flash en 2007, lors de la sortie de Flash CS3..Afin de rpondre une demande de la communaut pour un langageActionScript plus structur, Macromedia dveloppe alors une nouvelleversion dActionScript et lintgre en 2003 au sein de Flash MX 2004sous le nom dActionScript 2.0. Cette nouvelle version rpond auxbesoins des dveloppeurs en offrant un langage orient objet et nonprocdural comme ctait le cas en ActionScript 1.0.A lpoque, Macromedia fait le choix dune migration en douceur, etpropose un langage ActionScript 2.0 souple permettant auxdveloppeurs et graphistes de coder au sein dun mme projet enActionScript 1.0 et 2.0. Si cette nouvelle version du langage nesatisfait pas les dveloppeurs puristes, elle permet nanmoins auxdveloppeurs dbutant de migrer doucement vers un dveloppementorient objet. 7. Chapitre 1 Quest ce que lActionScript 3 ? - version 0.1.13 / 5Thibault Imbertpratiqueactionscript3.bytearray.org10 raisons de coder en ActionScript 3Si 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 deplus de 95%. Il demeure le lecteur multimdia le plus prsent surInternet. La vitesse dexcution du code est environ 10 fois suprieure auxprcdentes versions dActionScript. ActionScript 3 offre des possibilits incomparables aux prcdentesversions dActionScript. Le code ActionScript 3 savre plus logique que les prcdentes versionsdu langage. Le langage ActionScript 3 permet de dvelopper du contenu en Flash,Flex, ou AIR. Nous reviendrons trs vite sur ces diffrents frameworks. Il nest pas ncessaire de connatre un autre langage orient objet aupralable. ActionScript 3 est un langage orient objet. Sa connaissance vouspermettra daborder plus facilement dautres langages objets tels Java,C#, ou C++. Le langage ActionScript 3 et lAPI du lecteur Flash ont t entirementrepenss. Les dveloppeurs ActionScript 1 et 2 seront ravis de dcouvrirles nouveauts du langage et la nouvelle organisation de lAPI dulecteur. La technologie Flash ne cesse dvoluer, vous ne risquez pas de vousennuyer. ActionScript 3 est un langage souple, qui demeure ludique et accessible.Bien entendu, vous pouvez mmoriser ces diffrents points afin deconvaincre vos amis au cours dune soire geekOutils.ActionScript 3 ne vous sera pas dune grande utilit sans unenvironnement de dveloppement ddi. Nous allons nous attarderquelques instants sur les diffrents outils disponibles permettant deproduire du contenu ActionScript 3.Afin quil ny ait pas de confusions, voici les diffrents outils vouspermettant de coder en ActionScript 3 : Flash CS3 : permet le dveloppement danimations et dapplications enActionScript 3. Pour plus dinformations :http://www.adobe.com/fr/products/flash/ 8. Chapitre 1 Quest ce que lActionScript 3 ? - version 0.1.14 / 5Thibault Imbertpratiqueactionscript3.bytearray.org Flex Builder : il sagit dun environnement auteur permettant ledveloppement dapplications riches (RIA). Flex repose sur deuxlangages, le MXML afin de dcrire les interfaces, et ActionScript pour lalogique. Pour plus dinformations : Eclipse (SDK Flex et AIR) : les SDK de Flex et AIR permettent deproduire du contenu Flex et AIR gratuitement. Il sagit de plugins pourlenvironnement de dveloppement Eclipse.http://www.adobe.com/fr/products/flex/Vous avez dit plateforme ?La plateforme FlashPar le terme de plateforme Flash nous entendons lensemble destechnologies 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 lelecteur Flash, le lecteur Flash intgr AIR, ainsi que Flash Lite (notonsque Flash lite nest pas ce jour compatible avec ActionScript 3). Les outils de dveloppement : Flex Builder et Flash CS3 sont les deuxenvironnements auteurs permettant de produire du contenu Flash.Notons quil est aussi possible dutiliser lenvironnement Eclipse et lesSDK de Flex et AIR. Les frameworks : Flex est un framework conu pour faciliter ledveloppement dapplications riches. Grce AIR, ces applicationspeuvent sortir du navigateur et tre dployes sur le bureau.Chaque outil de dveloppement ou framework rpond une attentespcifique et correspond un profil type.Un graphiste-dveloppeur sera intress par le dveloppementdinterfaces animes et de sites Internet au sein de Flash CS3. Laconnaissance dun environnement comme Flash CS3 lui permettraaussi de dvelopper des composants rutilisables au sein de Flex etAIR.Un dveloppeur prfrera peut tre un environnement dedveloppement comme celui offert par Flex Builder. Les applicationsproduites grce au framework Flex seront de nature diffrente etpourront facilement tre dployes sur le bureau grce AIR.Notons que les exemples prsents dans cet ouvragepeuvent tre utiliss au sein de Flash CS3, Flex et AIR.Afin dentamer cette aventure au cur dActionScript 3, nous allonsnous intresser tout dabord aux diffrentes nouveauts du langage. 9. Chapitre 1 Quest ce que lActionScript 3 ? - version 0.1.15 / 5Thibault Imbertpratiqueactionscript3.bytearray.orgEn route pour le prochain chapitre intitul Langage et API ! 10. Chapitre 2 Langage et API - version 0.1.21 / 35Thibault Imbertpratiqueactionscript3.bytearray.org2Langage et APILE LANGAGE ACTIONSCRIPT 3.........................................................................1MACHINES VIRTUELLES ............................................................................................4TRADUCTION DYNAMIQUE ........................................................................................6GESTION DES TYPES LEXCUTION.........................................................................7ERREURS LEXCUTION........................................................................................13NOUVEAUX TYPES PRIMITIFS ..................................................................................15VALEURS PAR DFAUT ............................................................................................19NOUVEAUX TYPES COMPOSITES..............................................................................21NOUVEAUX MOTS-CLS ..........................................................................................21FONCTIONS .............................................................................................................22CONTEXTE DEXCUTION........................................................................................25BOUCLES.................................................................................................................26ENRICHISSEMENT DE LA CLASSE ARRAY.................................................................27RAMASSE-MIETTES .................................................................................................30BONNES PRATIQUES ................................................................................................33AUTRES SUBTILITS ................................................................................................34Le langage ActionScript 3Le langage ActionScript 3 intgre de nombreuses nouveauts que nousallons traiter tout au long de cet ouvrage. Ce chapitre va nous permettrede dcouvrir les nouvelles fonctionnalits et comportements essentiels tout dveloppeur ActionScript 3.Avant de dtailler les nouveauts lies au langage ActionScript 3, ilconvient de dfinir tout dabord ce que nous entendons par le termeActionScript.De manire gnrale, le terme ActionScript englobe deux composantesimportantes : 11. Chapitre 2 Langage et API - version 0.1.22 / 35Thibault Imbertpratiqueactionscript3.bytearray.org Le cur du langage : il sagit du langage ActionScript bas sur laspcification ECMAScript (ECMA-262) et intgre partiellement certainesfonctionnalits issues de la spcification ECMAScript LAPI du lecteur Flash : il sagit des fonctionnalits du lecteur Flash.Toutes les classes ncessitant dtre importes font partie de lAPI dulecteur et non du cur du langage ActionScript.4.Ainsi, linterface de programmation du lecteur ou le langage peuventtre mise jour indpendamment.Le lecteur Flash 10 devrait normalement intgrer une gestion de la 3Dnative ainsi quune implmentation plus complte de la spcificationECMAScript 4. La gestion de la 3D concerne ici uniquement linterfacede programmation du lecteur Flash, linverse les nouveaux objetsdfinis par la spcification ECMAScript 4 sont directement lis aucur du langage ActionScript.Dun ct rside le langage ActionScript 3, de lautre lAPI du lecteurappele gnralement interface de programmation.La figure 2-1 illustre les deux entits :Figure 2-1. Langage ActionScript 3.Contrairement aux prcdentes versions dActionScript, nousremarquons quen ActionScript 3, les diffrentes fonctionnalits dulecteur Flash sont dsormais stockes dans des paquetages spcifiques. 12. Chapitre 2 Langage et API - version 0.1.23 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgAfin dafficher une vido nous utiliserons les objets issus du paquetageflash.media. A linverse, pour nous connecter un serveur, nousutiliserons les objets issus du paquetage flash.net.Flash CS3 est configur afin dimporter automatiquement toutes lesclasses issues de lAPI du lecteur Flash. Il nest donc pas ncessairedimporter manuellement les classes lorsque nous codons au sein delenvironnement auteur.Un fichier implicitImports.xml situ au sein du rpertoire dinstallationde Flash CS3 (C:Program FilesAdobeAdobe FlashCS3frConfigurationActionScript 3.0) contient toutes lesdfinitions de classe importer :Afin de crer un clip dynamiquement nous pouvons criredirectement 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 lorsquenous programmerons dans lenvironnement auteur de Flash. Alinverse ds lintroduction des classes au sein du chapitre 8 intitulProgrammation oriente objet, nous importerons explicitement lesclasses utilises.A retenir 13. Chapitre 2 Langage et API - version 0.1.24 / 35Thibault Imbertpratiqueactionscript3.bytearray.org Le langage ActionScript 3 englobe deux composantes : le cur dulangage ActionScript et linterface de programmation du lecteurFlash. Le cur du langage est dfini par la spcification ECMAScript.Machines virtuellesLe code ActionScript est interprt par une partie du lecteur Flashappele machine virtuelle. Cest cette dernire qui se charge deretranscrire en langage machine le code binaire (ActionScript bytecode) gnr par le compilateur.Les prcdentes versions du lecteur Flash intgraient une seulemachine virtuelle appele AVM1 afin dinterprter le codeActionScript 1 et 2. En ralit, le code binaire gnr par lecompilateur en ActionScript 1 et 2 tait le mme, cest la raison pourlaquelle nous pouvions faire cohabiter au sein dun mme projet cesdeux versions du langage ActionScript.La figure 2-2 illustre la machine virtuelle 1 (AVM1) prsente dans lelecteur Flash 8 :Figure 2-2. AVM1 au sein du lecteur Flash 8.Le langage ActionScript 3 nest pas compatible avec cette premiremachine virtuelle, pour des raisons videntes de rtrocompatibilit, lelecteur Flash 9 embarque donc deux machines virtuelles.Lors de la lecture dun SWF, le lecteur slectionne automatiquement lamachine virtuelle approprie afin dinterprter le code ActionScriptprsent au sein du SWF. Ainsi, une application ActionScript 1 et 2 serainterprte au sein du lecteur Flash 9 par la machine virtuelle 1(AVM1) et ne bnficiera daucune optimisation des performances. 14. Chapitre 2 Langage et API - version 0.1.25 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgLa figure 2-3 prsente les deux machines virtuelles au sein du lecteurFlash 9 :Figure 2-3. Le lecteur Flash 9 et les deux machinesvirtuelles AVM1 et AVM2.Seules les animations compiles en ActionScript 3 pourront bnficierdes optimisations ralises par la nouvelle machine virtuelle (AVM2).A retenir Les prcdentes versions du lecteur Flash intgraient une seulemachine virtuelle afin dinterprter le code ActionScript 1 et 2. La machine virtuelle 1 (AVM1) interprte le code ActionScript 1 et2. La machine virtuelle 2 (AVM2) interprte seulement le codeActionScript 3. Le lecteur Flash intgre les deux machines virtuelles (AVM1 etAVM2). Le langage ActionScript 3 ne peut pas cohabiter avec les prcdentesversions dActionScript.Traduction dynamiqueAfin doptimiser les performances, la machine virtuelle 2 (AVM2) dulecteur Flash 9 intgre un mcanisme innovant de compilation du code la vole. Bien que le terme puisse paratre tonnant, ce principeappel gnralement traduction dynamiqueDans les prcdentes versions du lecteur Flash, le code prsent au seindu SWF tait directement retranscrit par la machine virtuelle enpermet dobtenir demeilleures performances dexcution du code en compilant ce dernier lexcution. 15. Chapitre 2 Langage et API - version 0.1.26 / 35Thibault Imbertpratiqueactionscript3.bytearray.orglangage machine sans aucune optimisation lie la plateforme encours.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-timecompiler). Ce dernier permet de compiler uniquement le code utilis etde manire optimise selon la plateforme en cours.La machine virtuelle peut donc optimiser les instructions pour unprocesseur spcifique tout en prenant en considration les diffrentescontraintes de la plateforme.Pour plus dinformations lies la compilation lexcution, rendezvous ladresse suivante :http://en.wikipedia.org/wiki/Just-in-time_compilationGestion des types lexcutionhttp://fr.wikipedia.org/wiki/Compilation_%C3%A0_la_vol%C3%A9eActionScript 2 introduit au sein de Flash MX 2004 la notion de typagefort. Cela consistait associer un type de donnes une variable laide de la syntaxe suivante :variable:TypeDans le code suivant, nous tentions daffecter une chane unevariable de type Number :var distance:Number = "150";Lerreur suivante tait gnre la compilation :Incompatibilit de types dans linstruction daffectation : String dtect aulieu de Number.En ActionScript 3, nous bnficions du mme mcanisme devrification des types la compilation. En compilant le mme code enActionScript 3, lerreur suivante est gnre :1067: Contrainte implicite dune valeur du type String vers un type sans rapportNumber.Ce comportement est appel Mode prcis dans Flash CS3 et peut tredsactiv par lintermdiaire du panneau Paramtres dActionScript3.0. A travers le panneau Paramtres de publication, puis de longletFlash, nous cliquons sur le bouton Paramtres.Nous obtenons un panneau Paramtres dActionScript 3 contenantdeux options lies aux erreurs comme lillustre la figure 2-4 : 16. Chapitre 2 Langage et API - version 0.1.27 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgFigure 2-4. Options du compilateur ActionScript 3.Nous remarquons que par dfaut, le Mode prcis est activ, nousreviendrons trs vite sur le Mode avertissements.En dcochant la case Mode prcis, nous dsactivons la vrification destypes la compilation afin de dcouvrir un comportement extrmementimportant apport par ActionScript 3.En testant le code suivant en mode non prcis, nous remarquonsquaucune erreur de compilation nest gnre :var distance:Number = "150";A lexcution, la machine virtuelle 2 (AVM2) convertitautomatiquement la chane de caractres 150 en un nombre entier detype int.Afin de vrifier cette conversion automatique, nous pouvons utiliser lafonction describeType du paquetage flash.utils :var distance:Number = "150";/* affiche :*/trace( describeType ( distance ) );La fonction describeType renvoie un objet XML dcrivant le typede la variable. Nous pouvons remarquer que lattribut name du nudtype renvoie int.En modifiant la chane de caractres nous obtenons une conversionautomatique vers le type Number :var distance:Number = "150.5";/* affiche :*/ 17. Chapitre 2 Langage et API - version 0.1.28 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgtrace( describeType ( distance ) );Si nous tentons daffecter un autre type de donnes celle-ci, lamachine virtuelle 2 (AVM2) conserve le type Number et convertitimplicitement les donnes lexcution.Contrairement au mode prcis, ce comportement devrification des types lexcution ne peut pas tredsactiv.Nous pourrions ainsi en conclure de toujours conserver le mode prcisafin de ne pas tre surpris par ce comportement, mais certaines erreursde types ne peuvent tre dtectes par le compilateur car celles-cininterviennent qu lexcution.Dans le code suivant, le compilateur ne dtecte aucune erreur :var tableauDonnees:Array = [ "150", "250" ];// lentre du tableau est automatiquement convertie en intvar distance:Number = tableauDonnees[0];A lexcution, la chane de caractres prsente lindex 0 estautomatiquement convertie en int. Cette conversion reste silencieusetant que celle-ci russit, le cas chant une erreur lexcution estleve.Dans le code suivant, nous tentons de stocker une chane de caractresau sein dune variable de type MovieClip :var tableauDonnees:Array = [ "clip", "250" ];// lve une erreur lexcutionvar clip:MovieClip = tableauDonnees[0];A lexcution, la machine virtuelle 2 (AVM2) tente de convertir lachane en MovieClip et choue, lerreur lexcution suivante estleve :TypeError: Error #1034: Echec de la contrainte de type : conversion de "clip" enflash.display.MovieClip impossible.Nous pouvons alors nous interroger sur lintrt dun telcomportement, pourquoi la machine virtuelle svertue-t-elle conserver les types lexcution et convertit automatiquement lesdonnes ?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 optimisespcifiquement pour ce type, ainsi que les instructions processeur. 18. Chapitre 2 Langage et API - version 0.1.29 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgIl 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, aucuneoptimisation ntait ralise. Le typage des variables ntait quuneaide la compilation.La grande nouveaut lie ActionScript 3 rside donc dans lintrt dutypage la compilation comme lexcution. En associant un type une variable en ActionScript 3 nous bnficions dune vrification destypes la compilation et dune optimisation des calculs raliss par leprocesseur 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 typeint :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 plusde temps sexcuter :var debut:Number = getTimer();for ( var i = 0; i< 500000; i++ ){}// affiche : 72trace( getTimer() - debut ); 19. Chapitre 2 Langage et API - version 0.1.210 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgDans le code suivant, la variable prenom ne possde pas de typespcifique, la machine virtuelle doit valuer elle-mme le type ce quiralentit le temps dexcution :var debut:Number = getTimer();var prenom = "Bobby";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 tempsdexcution de presque deux fois :var debut:Number = getTimer();var prenom:String = "Bobby";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 pouvonsapercevoir un deuxime mode de compilation appel Modeavertissements. Ce dernier permet dindiquer plusieurs types derreurscomme par exemple les erreurs lies la migration de code.Supposons que nous tentions dutiliser la mthode attachMovieAu lieu dindiquer un simple message derreur, le compilateur nousrenseigne que notre code nest pas compatible avec ActionScript 3 etnous propose son quivalent.dans un projet ActionScript 3 :var ref:MovieClip = this.attachMovie ("clip", "monClip", 0); 20. Chapitre 2 Langage et API - version 0.1.211 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgLe code prcdent gnre donc le message derreur suivant lacompilation :Warning: 1060: Problme de migration : la mthode attachMovie nest plus priseen charge. Si le nom de la sous-classe de MovieClip est A, utilisez var mc= newA(); addChild(mc). Pour plus dinformations, consultez la classeDisplayObjectContainer.Le Mode avertissements permet davertir le dveloppeur de certainscomportements lexcution risquant de le prendre au dpourvu.Attention, les avertissements nempchent ni lacompilation du code ni son excution, mais avertissentsimplement que le rsultat de lexcution risque de nepas tre celui attendu.Dans le code suivant, un dveloppeur tente de stocker une chane decaractre au sein dune variable de type Boolean :var prenom:Boolean = "Bobby";A la compilation, lavertissement suivant est affich :Warning: 3590: String utilise alors quune valeur boolenne est attendue.Lexpression va tre transtype comme boolenne.Il est donc fortement conseill de conserver le Mode prcis Il est possible de dsactiver la vrification de type la compilation.ainsi que lemode avertissements afin dintercepter un maximum derreurs lacompilation.Comme nous lavons vu prcdemment, le lecteur Flash 9 nchoueplus en silence et lve des erreurs lexcution. Nous allons nousintresser ce nouveau comportement dans la partie suivante.A retenir Il nest pas possible de dsactiver la vrification de type lexcution. Le typage en ActionScript 2 se limitait une aide la compilation. Le typage en ActionScript 3 aide la compilation et lexcution. Dans un souci doptimisation des performances, il est fortementrecommand de typer les variables en ActionScript 3. Il est fortement conseill de conserver le mode prcis ainsi que lemode avertissements afin dintercepter un maximum derreurs lacompilation.Erreurs lexcutionNous avons trait prcdemment des erreurs de compilation laide dumode prcis et abord la notion derreurs lexcution. 21. Chapitre 2 Langage et API - version 0.1.212 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgUne des grandes nouveauts du lecteur Flash 9 rside dans la gestiondes erreurs. Souvenez-vous, les prcdentes versions du lecteur Flashne levaient aucune erreur lexcution et chouaient en silence.En ActionScript 3 lorsque lexcution du programme est interrompuede manire anormale, on dit quune erreur dexcution est leve.Afin de gnrer une erreur lexcution nous pouvons tester le codesuivant :// dfinition dune variable de type MovieClip// sa valeur par dfaut est nullvar monClip:MovieClip;// nous tentons de rcuprer le nombre dimages 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 daccder la proprit ou lamthode dune rfrence dobjet nul.Afin de grer cette erreur, nous pouvons utiliser un bloc try catch :// dfinition dune variable de type MovieClip// sa valeur par dfaut est nullvar monClip:MovieClip;var nbImages:int;// grce au bloc try catch nous pouvons grer lerreurtry{nbImages = monClip.totalFrames;} catch ( pErreur:Error ){trace ( "une erreur dexcution a t leve !");}Bien entendu, nous nutiliserons pas systmatiquement les blocs trycatch Version de dbogage (afin dviter dafficher les erreurs lexcution. Certains testssimples, que nous dcouvrirons au cours de louvrage, nouspermettrons quelque fois dviter davoir recours ces blocs.Dans un contexte derreurs lexcution, il convient de dfinir lesdeux dclinaisons du lecteur Flash existantes :Player Debug) : cette version du lecteur estdestine au dveloppement et affiche les erreurs lexcution en ouvrantune fentre spcifique indiquant lerreur en cours. Ce lecteur est install 22. Chapitre 2 Langage et API - version 0.1.213 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgautomatiquement lors de linstallation de lenvironnement dedveloppement Flash CS3 ou Flex Builder 2 et 3. Version production (Player ReleaseAvec le lecteur de dbogage, les erreurs non gres par un bloc) : cette version du lecteur estdisponible depuis le site dAdobe. Les personnes nayant pasdenvironnement de dveloppement install utilisent cette version dulecteur. Ce lecteur naffiche pas les erreurs lexcution afin de ne pasinterrompre lexprience de lutilisateur.trycatch ouvrent un panneau derreur au sein du navigateur commelillustre la figure 2-5 :Figure 2-5. Exemple derreur lexcution.Lorsquune erreur est leve, lexcution du code est alors mise enpause. Nous pouvons alors dcider de continuer lexcution du codebien quune erreur vienne dtre leve ou bien de stopper totalementlexcution de lapplication.A retenir Le lecteur Flash 9 lve des erreurs lexcution. Ces erreurs ouvrent avec le lecteur de dbogage une fentre indiquantlerreur au sein du navigateur. Toutes les mthodes de lAPI du lecteur en ActionScript 3 peuventlever des erreurs lexcution. Le lecteur Flash 9 nchoue plus en silence, le dbogage est doncfacilit.Nouveaux types primitifsEn ActionScript 2, seul le type Number existait afin de dfinir unnombre, ainsi pour stocker un nombre entier ou dcimal le typeNumber tait utilis :var age:Number = 20;var vitesse:Number = 12.8; 23. Chapitre 2 Langage et API - version 0.1.214 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgAucune distinction ntait faite entre les nombres entiers, dcimaux etnon ngatifs.ActionScript 3 intgre dsormais trois types afin de reprsenter lesnombres : int: reprsente un nombre entier 32 bit (32 bit signed integer)uint: reprsente un nombre entier non sign 32 bit. (32 bit unsignedinteger)NumberNotons que les deux nouveaux types: reprsente un nombre dcimal 64 bit (64-bit IEEE 754double-precision floating-point number)int et uint ne prennent pas demajuscule, contrairement au type Number dj prsent au seindActionScript 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 oscillantentre 0 et 4294967295 :// 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 ausein dune variable de type int ou uint, le nombre estautomatiquement 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 savrebeaucoup plus rapide que la mthode floor de la classe Math. 24. Chapitre 2 Langage et API - version 0.1.215 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgDans 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 larrondidu nombre :var distance:Number = 45.2;var arrondi:int;var debut:Number = getTimer();for ( var i:int = 0; i< 500000; i++ ){arrondi = distance;}// affiche : 8trace( getTimer() - debut );// affiche : 45trace( arrondi );Nous obtenons le mme rsultat en 8 millisecondes, soit un tempsdexcution presque 14 fois plus rapide.Attention, cette astuce nest valable uniquement dans lecas de nombres positifs.Dans le code suivant, nous remarquons que la mthode floor de laclasse Math ne renvoie pas la mme valeur que la conversion en intpar la machine virtuelle :var distance:int = -3.2;// affiche : -3trace(distance);var profondeur:Number = Math.floor (-3.2);// affiche : -4 25. Chapitre 2 Langage et API - version 0.1.216 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgtrace( profondeur );Partant du principe quune distance est toujours positive, nous pouvonsutiliser le type uint qui offre dans ce cas prcis des performancessimilaires au type int :var arrondi:uint;Malheureusement, le type uint savre gnralement beaucoup pluslent, ds lors quune opration mathmatique est effectue. Enrevanche, le type Number savre plus rapide que le type int lors dedivision.Lors de la dfinition dune boucle, il convient de toujours prfrerlutilisation 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 chutentde 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 letype Number :var debut:Number = getTimer();for ( var i:Number = 0; i< 5000000; i++ ){}// affiche : 102trace( getTimer() - debut ); 26. Chapitre 2 Langage et API - version 0.1.217 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgNous obtenons ainsi un compromis en termes de performances entre letype int et uint.De manire gnrale, il est prfrable dviter le typeuint.La mme optimisation peut tre obtenue pour calculer larrondisuprieur. 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 lesperformances 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 );Pour plus dastuces lies loptimisation, rendez-vous ladressesuivante :http://lab.polygonal.de/2007/05/10/bitwise-gems-fast-integer-math/A retenir 27. Chapitre 2 Langage et API - version 0.1.218 / 35Thibault Imbertpratiqueactionscript3.bytearray.org Le type int Le typepermet de reprsenter un nombre entier 32 bit.uint Le typepermet de reprsenter un nombre entier 32 bit nonngatif.Number Il est conseill dutiliser le typepermet de reprsenter un nombre dcimal 64 bit.int Il est dconseill dutiliser le typepour les nombres entiers, sonutilisation permet doptimiser les performances.uint En cas dhsitation, il convient dutiliser le type.NumberValeurs par dfaut.Il est important de noter que les valeurs undefined et null ont uncomportement diffrent en ActionScript 3. Dsormais, une variablerenvoie undefinedLe tableau suivant illustre les diffrentes valeurs attribues pardfaut aux types de donnes :uniquement lorsque celle-ci nexiste pas olorsque nous ne la typons pas :var prenom;// affiche : undefinedtrace( prenom );Lorsquune variable est type mais ne possde aucune valeur, unevaleur 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 : nulltrace( personnage );// affiche : nulltrace( prenom );// affiche : undefinedtrace( donnees ); 28. Chapitre 2 Langage et API - version 0.1.219 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgType de donnes Valeur par dfautBoolean falseint 0Number NaNObject nullString nulluint 0Non type (quivalent au type *) undefinedAutres types nullTableau 1. Valeurs par dfaut associes aux types dedonnes.De la mme manire, si nous tentons daccder une propritinexistante au sein dune instance de classe non dynamique telleString, nous obtenons une erreur la compilation :var prenom:String = "Bob";// gnre une erreur la compilationtrace( prenom.proprieteInexistante );Si nous tentons daccder une proprit inexistante, au sein duneinstance de classe dynamique, le compilateur ne procde aucunevrification et nous obtenons la valeur undefined pour la propritcible :var objet:Object = new Object();// affiche : undefinedtrace( objet.proprieteInexistante );Attention, une exception demeure pour les nombres, qui ne peuventtre null ou undefined. Si nous typons une variable avec le typeNumber, la valeur par dfaut est NaN :var distance:Number;// affiche : NaNtrace( distance ); 29. Chapitre 2 Langage et API - version 0.1.220 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgEn utilisant le type int ou uint Une variable renvoie, les variables sont automatiquementinitialises 0 :var distance:int;var autreDistance:uint;// affiche : 0trace( distance );// affiche : 0trace( autreDistance );A retenirundefined Lorsquune variable est type mais ne possde aucune valeur, lamachine virtuelle attribue automatiquement une valeur par dfaut.uniquement lorsque celle-cinexiste pas ou nest pas type.Nouveaux types compositesDeux nouveaux types composites sont intgrs en ActionScript 3 : Les expressions rgulires (RegExp E4X (ECMAScript 4 XML) : la spcification ECMAScript 4 intgre unobjet XML en tant quobjet natif. Nous reviendrons sur le format XML etE4X au cours de certains exercices.) : elles permettent deffectuer desrecherches complexes sur des chanes de caractres. Nous reviendronssur les expressions rgulires au cours de certains exercices.Nouveaux mots-clsLe mot cl is introduit par ActionScript 3 remplace lancien mot-clinstanceof des prcdentes versions dActionScript.Ainsi pour tester si une variable est dun type spcifique nous utilisonsle mot-cl is :var tableauDonnees:Array = [5654, 95, 54, 687968, 97851];// affiche : truetrace( tableauDonnees is Array );// affiche : truetrace( tableauDonnees is Object );// affiche : falsetrace( tableauDonnees is MovieClip );Un autre mot-cl nomm as fait aussi son apparition. Ce dernierpermet de transtyper un objet vers un type spcifique. 30. Chapitre 2 Langage et API - version 0.1.221 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgDans le code suivant, nous dfinissons une variable de typeDisplayObject, mais celle-ci contient en ralit une instance deMovieClip :var monClip:DisplayObject = new MovieClip();Si nous tentons dappeler une mthode de la classe MovieClip sur lavariable monClip, une erreur la compilation est gnre.Afin de pouvoir appeler la mthode sans que le compilateur ne nousbloque, 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 maniresuivante :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 foisplus rapide. En cas dchec lors du transtypage lcriture prcdente nerenvoie pas nullFonctionsmais lve une erreur lexcution.ActionScript 3 intgre de nouvelles fonctionnalits lies la dfinitionde fonctions. Nous pouvons dsormais dfinir des paramtres pardfaut pour les fonctions.Prenons le cas dune fonction affichant un message personnalis :function alerte ( pMessage:String ):void{trace( pMessage );}Cette fonction alerte accepte un paramtre accueillant le message afficher. Si nous souhaitons lexcuter nous devons obligatoirementpasser un message :alerte ("voici un message dalerte !"); 31. Chapitre 2 Langage et API - version 0.1.222 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgSi nous omettons le paramtre :// gnre une erreur la compilationalerte ();Lerreur la compilation suivante est gnre :1136: Nombre darguments incorrect. 1 attendus.ActionScript 3 permet de dfinir une valeur par dfaut pour leparamtre :function alerte ( pMessage:String="message par dfaut" ):void{trace( pMessage );}Une fois dfinie, nous pouvons appeler la fonction alerte sans passerde paramtres :function alerte ( pMessage:String="message par dfaut" ):void{trace( pMessage );}// affiche : message par dfautalerte ();Lorsque nous passons un paramtre spcifique, celui-ci crase la valeurpar dfaut :function alerte ( pMessage:String="message par dfaut" ):void{trace( pMessage );}// affiche : un message personnalis !alerte ( "un message personnalis !" );En plus de cela, ActionScript 3 intgre un nouveau mcanisme li auxparamtres alatoires.Imaginons que nous devions crer une fonction pouvant accueillir unnombre alatoire de paramtres. En ActionScript 1 et 2, nous nepouvions lindiquer au sein de la signature de la fonction.Nous dfinissions donc une fonction sans paramtre, puis nousutilisions le tableau arguments regroupant lensemble desparamtres : 32. Chapitre 2 Langage et API - version 0.1.223 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgfunction 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 posaitnanmoins un problme de relecture du code. En relisant la signaturede la fonction, un dveloppeur pouvait penser que la fonctioncalculMoyenne nacceptait aucun paramtre, alors que ce ntait pasle cas.Afin de rsoudre cette ambigut, ActionScript 3 introduit un mot-clpermettant de spcifier dans les paramtres que la fonction en coursreoit un nombre variable de paramtres.Pour cela nous ajoutons trois points de suspensions en tant queparamtre 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++){total += parametres[i];}return total / lng;}var moyenne:Number = calculMoyenne ( 50, 48, 78, 20, 90 ); 33. Chapitre 2 Langage et API - version 0.1.224 / 35Thibault Imbertpratiqueactionscript3.bytearray.org// affiche : 57.2trace( moyenne );En relisant le code prcdent, le dveloppeur ActionScript 3 peutfacilement dtecter les fonctions accueillant un nombre de paramtresalatoires.Contexte dexcutionAfin que vous ne soyez pas surpris, il convient de sattarder quelquesinstants sur le nouveau comportement des fonctions passes enrfrence.Souvenez-vous, en ActionScript 1 et 2, nous pouvions passer enrfrence une fonction, celle-ci perdait alors son contexte dorigine etpousait comme contexte le nouvel objet :var personnage:Object = { age : 25, nom : "Bobby" };// la fonction parler est passe en rfrencepersonnage.parler = parler;function parler ( ){trace("bonjour, je mappelle " + this.nom + ", jai " + this.age + " ans");}// appel de la mthode// affiche : bonjour, je mappelle Bobby, jai 25 anspersonnage.parler();En ActionScript 3, la fonction parler conserve son contexte dorigineet ne sexcute donc plus dans le contexte de lobjet personnage :var personnage:Object = { age : 25, nom : "Bobby" };// la fonction parler est passe en rfrencepersonnage.parler = parler;function parler ( ){trace("bonjour, je mappelle " + this.nom + ", jai " + this.age + " ans");}// appel de la mthode// affiche : bonjour, je mappelle undefined, jai undefined anspersonnage.parler();De nombreux dveloppeurs ActionScript se basaient sur cechangement de contexte afin de rutiliser des fonctions. 34. Chapitre 2 Langage et API - version 0.1.225 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgNous devrons donc garder lesprit ce nouveau comportement apportpar ActionScript 3 durant lensemble de louvrage.BouclesActionScript 3 introduit une nouvelle boucle permettant ditrer ausein des proprits dun objet et daccder directement au contenu dechacune dentre elles.Dans le code suivant, nous affichons les proprits de lobjetpersonnage laide dune boucle for in :var personnage:Object = { prenom : "Bobby", age : 50 };for (var p:String in personnage){/* affiche :ageprenom*/trace( p );}Attention, lordre dnumration des proprits peut changer selon lesmachines. Il est donc essentiel de ne pas se baser sur lordrednumration des proprits.Notons que la boucle for in en ActionScript 3 ne boucle plus de ladernire entre la premire comme ctait le cas en ActionScript 1 et2, mais de la premire la dernire.Nous pouvons donc dsormais utiliser la boucle for in afin ditrerau sein dun tableau sans se soucier du fait que la boucle parte de la findu tableau :var tableauDonnees:Array = [ 5654, 95, 54, 687968, 97851];for ( var p:String in tableauDonnees ){/* affiche :5654955468796897851*/trace( tableauDonnees[p] );} 35. Chapitre 2 Langage et API - version 0.1.226 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgLa boucle for each accde elle, directement au contenu de chaqueproprit :var personnage:Object = { prenom : "Bobby", age : 50 };for each ( var p:* in personnage ){/* affiche :50Bobby*/trace( p );}Nous pouvons donc plus simplement itrer au sein du tableau laidede la nouvelle boucle for eachEnrichissement de la classe Array: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 deramasse-miettes qui savre trs important en ActionScript 3.La classe Array bnficie de nouvelles mthodes en ActionScript 3facilitant la manipulation de donnes.La mthode forEach permet ditrer simplement au sein du tableau :// Array.forEach procde une navigation simple// sur chaque lement laide dune fonction spcifiquevar prenoms:Array = [ "bobby", "willy", "ritchie" ];function navigue ( element:*, index:int, tableau:Array ):void{trace ( element + " : " + index + " : " + tableau);} 36. Chapitre 2 Langage et API - version 0.1.227 / 35Thibault Imbertpratiqueactionscript3.bytearray.org/* 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. Unefonction de navigation est passe en paramtre afin ditrer et de traiterles donnes au sein du tableau.La mthode every excute la fonction de navigation jusqu ce quecelle ci ou llment parcouru renvoient false.Il est donc trs simple de dterminer si un tableau contient des valeursattendues. Dans le code suivant, nous testons si le tableau donneescontient uniquement des nombres :var donnees:Array = [ 12, "bobby", "willy", 58, "ritchie" ];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 lafonction de navigation. Dans le code suivant, nous appliquons unformatage aux donnes du tableau prenomsLa mthode.Un nouveau tableau de prnoms formats est cr :var prenoms:Array = ["bobby", "willy", "ritchie"];function navigue ( element:*, index:int, tableau:Array ):String{return element.charAt(0).toUpperCase()+element.substr(1).toLowerCase();}// on cr un tableau partir du retour de la fonction naviguevar prenomsFormates:Array = prenoms.map ( navigue );// affiche : Bobby,Willy,Ritchietrace( prenomsFormates );map ne permet pas de filtrer les donnes. Toutes lesdonnes du tableau source sont ainsi places au sein du tableau gnr. 37. Chapitre 2 Langage et API - version 0.1.228 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgSi nous souhaitons filtrer les donnes, nous pouvons appeler lamthode filter. Dans le code suivant nous filtrons les utilisateursmineurs et obtenons un tableau dutilisateurs majeurs :var utilisateurs:Array = [ { prenom : "Bobby", age : 18 },{ prenom : "Willy", age : 20 },{ prenom : "Ritchie", age : 16 },{ prenom : "Stevie", 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 unefois au sein du tableau. La fonction de navigation est excute jusquce que celle ci ou un lment du tableau renvoient true :var utilisateurs:Array = [ { prenom : "Bobby", age : 18, sexe : "H" },{ prenom : "Linda", age : 18, sexe : "F" },{ prenom : "Ritchie", age : 16, sexe : "H"},{ prenom : "Stevie", age : 15, sexe : "H" } ]function navigue ( element:*, index:int, tableau:Array ):Boolean{return ( element.sexe == "F" );}// ya til une femme au sein du tableau dutilisateurs ?var resultat:Boolean = utilisateurs.some ( navigue );// affiche : truetrace( resultat ); 38. Chapitre 2 Langage et API - version 0.1.229 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgLes mthodes indexOf et lastIndexOf font elles aussi leurapparition au sein de la classe Array, celles-ci permettent derechercher si un lment existe et dobtenir sa position :var utilisateurs:Array = [ "Bobby", "Linda", "Ritchie", "Stevie", "Linda" ];var position:int = utilisateurs.indexOf ("Linda");var positionFin:int = utilisateurs.lastIndexOf ("Linda");// affiche : 1trace( position );// affiche : 4trace( positionFin );Les mthodes indexOf et lastIndexOf Pensez utiliser les nouvelles mthodes de la classepermettent de rechercher unlment de type primitif mais aussi de type composite.Nous pouvons ainsi rechercher la prsence de rfrences au sein duntableau :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 retenirArrayRamasse-miettesafin detraiter plus facilement les donnes au sein dun tableau.Tout au long de louvrage nous reviendrons sur le concept de ramasse-miettesPendant la dure de vie dun programme, certains objets peuventdevenir inaccessibles. Afin, de ne pas saturer la mmoire, unmcanisme de suppression des objets inutiliss est intgr au sein du. Bien que le terme puisse paraitre fantaisiste, ce mcanisme vasavrer extrmement important durant nos dveloppementsActionScript 3. 39. Chapitre 2 Langage et API - version 0.1.230 / 35Thibault Imbertpratiqueactionscript3.bytearray.orglecteur Flash. Ce mcanisme est appel ramasse-miettes ou pluscouramment Garbage collector en Anglais.Afin de bien comprendre ce mcanisme, nous dfinissons un simpleobjet rfrenc par une variable personnage :var personnage:Object = { prenom : "Bobby", age : 50 };Pour rendre cet objet inaccessible et donc ligible la suppression parle ramasse-miettes, nous pourrions tre tents dutiliser le mot cldelete :var personnage:Object = { prenom : "Bobby", 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 cldelete en ActionScript 3, qui ne peut tre utilis que sur desproprits dynamiques dobjets dynamiques.Ainsi, le mot cl delete pourrait tre utilis pour supprimer laproprit prenom au sein de lobjet personnage :var personnage:Object = { prenom : "Bobby", 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 lavaleur null celle-ci :var personnage:Object = { prenom : "Bobby", age : 50 };// supprime la rfrence vers lobjet personnagepersonnage = null;Lorsque lobjet ne possde plus aucune rfrence, nous pouvonsestimer que lobjet est ligible la suppressionAttention, laffectation de la valeur.Nous devrons donc toujours veiller ce quaucune rfrence nesubsiste vers notre objet, au risque de le voir conserv en mmoire.null unerfrence ne dclenche en aucun cas le passage du 40. Chapitre 2 Langage et API - version 0.1.231 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgramasse-miettes. Nous rendons simplement lobjetligible la suppression.Il est important de garder lesprit que le passage duramasse-miettes reste potentiel. Lalgorithme denettoyage effectu par ce dernier tant relativementgourmand en termes de ressources, son dclenchementreste limit au cas o le lecteur utiliserait trop demmoire.Dans le code suivant, nous supprimons une des deux rfrencesseulement :var personnage:Object = { prenom : "Bobby", age : 50 };// copie dune rfrence au sein du tableauvar tableauPersonnages:Array = [ personnage ];// suppression dune seule rfrencepersonnage = null;Une autre rfrence vers lobjet personnage subsiste au sein dutableau, lobjet ne sera donc jamais supprim par le ramasse-miettes :var personnage:Object = { prenom : "Bobby", age : 50 };// copie dune 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 dutableau afin de rendre lobjet personnage ligible la suppression :var personnage:Object = { prenom : "Bobby", age : 50 };// copie dune rfrence au sein du tableauvar tableauPersonnages:Array = [ personnage ];// supprime la premire rfrencepersonnage = null;// supprime la seconde rfrencetableauPersonnages[0] = null;Si la situation nous le permet, un moyen plus radical consiste craserle tableau contenant la rfrence :var personnage:Object = { prenom : "Bobby", age : 50 }; 41. Chapitre 2 Langage et API - version 0.1.232 / 35Thibault Imbertpratiqueactionscript3.bytearray.org// copie dune 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 dedclencher le ramasse-miettes manuellement laide de la mthode gcde la classe System. Notons que cette fonctionnalit nest accessiblequau sein du lecteur de dbogage.Nous reviendrons sur cette mthode au cours du prochain chapitreintitul Le modle vnementiel Il est possible de dclencher manuellement le ramasse-miettes au seindu lecteur de dbogage 9.0.115..A retenir Afin quun objet soit ligible la suppression par le ramasse-miettesnous devons passer toutes ses rfrences null Le ramasse-miettes intervient lorsque la machine virtuelle juge celancessaire..Bonnes pratiquesDurant lensemble de louvrage nous ferons usage de certaines bonnespratiques, dont voici le dtail :Nous typerons les variables systmatiquement afin doptimiser lesperformances de nos applications et garantir une meilleure gestion deserreurs la compilation.Lors de la dfinition de boucles, nous utiliserons toujours une variablede rfrence afin dviter que la machine virtuelle ne rvalue lalongueur 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++ ){}A cette criture non optimise : 42. Chapitre 2 Langage et API - version 0.1.233 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgvar 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 seindes 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 langageActionScript 3.Autres subtilitsAttention, le type Void existant en ActionScript 2, utilis au sein dessignatures de fonctions prend dsormais un v minuscule enActionScript 3.Une fonction ActionScript 2 ne renvoyant aucune valeur scrivait dela manire suivante :function initilisation ( ):Void{} 43. Chapitre 2 Langage et API - version 0.1.234 / 35Thibault Imbertpratiqueactionscript3.bytearray.orgEn ActionScript 3, le type void ne prend plus de majuscule :function initilisation ( ):void{}ActionScript 3 intgre un nouveau type de donnes permettantdindiquer quune variable peut accueillir nimporte quel type dedonnes.En ActionScript 2 nous nous contentions de ne pas dfinir de type, enActionScript 3 nous utilisons le type * :var condition:* = true;var total:* = 5;var couleur:* = 0x990000;var resultat:* = 45.4;var personnage:* = new Object();var prenom:* = "Bobby";Nous utiliserons donc systmatiquement le type * au sein dune bouclefor each, car la variable p doit pouvoir accueillir nimporte queltype de donnes :var personnage:Object = { prenom : "Bobby", age : 50 };for each ( var p:* in personnage ){/* affiche :50Bobby*/trace( p );}En utilisant un type spcifique pour la variable ditration p, nousrisquons de convertir implicitement les donnes itres.Dans le code suivant, nous utilisons le type Boolean pour la variablep :var personnage:Object = { prenom : "Bobby", age : 50 };for each ( var p:Boolean in personnage ){/* affiche :truetrue*/trace( p ); 44. Chapitre 2 Langage et API - version 0.1.235 / 35Thibault Imbertpratiqueactionscript3.bytearray.org}Le contenu des proprits est automatiquement converti en boolen.Au cas o une donne ne pourrait tre convertie en boolen, le codeprcdent pourrait lever une erreur lexcution.Passons prsent aux nouveauts lies linterface de programmationdu lecteur Flash.Les deux grandes nouveauts du lecteur Flash 9 concernent la gestionde laffichage ainsi que le modle vnementiel.Au cours du prochain chapitre intitul Le modle vnementiel nousallons nous intresser ce nouveau modle travers diffrentsexercices dapplications. Nous apprendrons matriser ce dernier etdcouvrirons comment en tirer profit tout au long de louvrage.Puis nous nous intresserons au nouveau mcanisme de gestion delaffichage appele Liste daffichage au cours du chapitre 4, nousverrons que ce dernier offre beaucoup plus de souplesse en termes demanipulation des objets graphiques et doptimisation de laffichage.Vous tes prt pour la grande aventure ActionScript 3 ? 45. Chapitre 3 Le modle vnementiel - version 0.1.21 / 33Thibault Imbertpratiqueactionscript3.bytearray.org3Le modle vnementielLHISTOIRE.............................................................................................................1UN NOUVEAU MODLE VNEMENTIEL......................................................5TOUT EST VNEMENTIEL ........................................................................................7ECOUTER UN VNEMENT........................................................................................9LOBJET VNEMENTIEL ........................................................................................12LA CLASSE EVENT..................................................................................................14LES SOUS-CLASSES DEVENT..........................................................................15ARRTER LCOUTE DUN VNEMENT..................................................................17MISE EN APPLICATION............................................................................................18LA PUISSANCE DU COUPLAGE FAIBLE........................................................23SOUPLESSE DE CODE ..............................................................................................26ORDRE DE NOTIFICATION...............................................................................28RFRENCES FAIBLES......................................................................................30SUBTILITS...........................................................................................................32LhistoireActionScript 3 intgre un tout nouveau modle vnementiel que nousallons tudier ensemble tout au long de ce chapitre. Avant delaborder, rappelons-nous de lancien modle vnementiel apparupour la premire fois avec le lecteur Flash 6.Jusqu maintenant nous dfinissions des fonctions que nous passionsen rfrence lvnement cout. Prenons un exemple simple. Pourcouter lvnement onRelease dun bouton nous devions crire lecode suivant :monBouton.onRelease = function () 46. Chapitre 3 Le modle vnementiel - version 0.1.22 / 33Thibault Imbertpratiqueactionscript3.bytearray.org{// affiche : _level0.monBoutontrace ( this );this._alpha = 50;}Une fonction anonyme tait dfinie sur la proprit onRelease dubouton. Lorsquun clic souris intervenait sur le bouton, le lecteurFlash excutait la fonction que nous avions dfinie et rduisaitlopacit du bouton de 50%. Cette criture posait plusieurs problmes.Dans un premier temps, la fonction dfinie sur le bouton ne pouvaitpas tre rutilise pour un autre vnement, sur un objet diffrent.Pour pallier ce problme de rutilisation, certains dveloppeursfaisaient appels des rfrences de fonctions afin de grerlvnement :function clicBouton (){// affiche : _level0.monBoutontrace (this);this._alpha = 50;}monBouton.onRelease = clicBouton;Cette criture permettait de rutiliser la fonction clicBouton pourdautres vnements lis diffrents objets, rendant le code plus aren particulier lors de lcoute dvnements au sein de boucles.Point important, le mot-cl this faisait ici rfrence au bouton et nonau scnario sur lequel est dfinie la fonction clicBouton. Lecontexte dexcution dorigine de la fonction clicBouton tait doncperdu lorsque celle-ci tait passe en rfrence. La fonction pousait lecontexte de lobjet auteur de lvnement.Lauto rfrence traduite par lutilisation du mot-cl this tait le seulmoyen de faire rfrence ce dernier. Ce comportement tait quelquepeu droutant pour une personne dcouvrant ActionScript.Voici un exemple mettant en vidence lambigut possible :function clicBouton (){// affiche : _level0.monBoutontrace ( this ); 47. Chapitre 3 Le modle vnementiel - version 0.1.23 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgthis._alpha = 50;}monBouton.onRelease = clicBouton;clicBouton();En excutant la fonction clicBouton de manire traditionnelle lemot-cl thisLe mcanisme tait le mme pour la plupart des vnements.Macromedia lpoque de Flash MX (Flash 6) stait rendu comptedu manque de souplesse de ce systme de fonctions dfinies sur lesvnements, et intgra la notion dcouteurs et de diffuseurs au seinfait alors rfrence au scnario sur lequel elle taitdfinie, 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 ( "monClip", "monClip"+i, i );ref.onRelease = function (){trace("cliqu");}}Les dveloppeurs prfraient donc lutilisation dune fonction sparerutilisable :var ref:MovieClip;for ( var i:Number = 0; i< 50; i++ ){ref = this.attachMovie ( "monClip", "monClip"+i, i );ref.onRelease = clicBouton;}function clicBouton ( ){trace("cliqu");} 48. Chapitre 3 Le modle vnementiel - version 0.1.24 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgdu lecteur Flash 6. Les classes Key, Selection, TextField furentles premires utiliser cette notion de diffuseurs couteurs.Pour couter la saisie dans un champ texte, nous pouvions utiliser lasyntaxe suivante :var monEcouteur:Object = new Object();monEcouteur.onChanged = function(pChamp:TextField){trace ( pChamp._name + " a diffus lvnement onChanged" );};monChampTexte.addListener ( monEcouteur );En appelant la mthode addListener sur notre champ texte noussouscrivions un objet appel ici monEcouteur en tant qucouteur delvnement onChanged. Une mthode du mme nom devait tredfinie sur lobjet couteur afin que celle-ci soit excute lorsquelvnement tait diffus.Cette approche permettait de souscrire un nombre illimit dcouteursauprs dun vnement, mais aussi de renvoyer des paramtres lamthode couteur. Ces paramtres taient gnralement desinformations lies lvnement, par exemple lauteur de lvnementdiffus.En 2004, lors de la sortie du lecteur Flash 7 (Flash MX 2004),ActionScript 2 faisait son apparition, ainsi quun lot de nouveauxcomposants appels composants V2. Ces derniers tendaient leconcept de diffuseurs couteurs en intgrant une mthodeaddEventListener pour souscrire un couteur auprs dunvnement. Contrairement la mthode addListener, cette mthodetendait le concept dcouteurs diffuseurs en stockant chaque couteurdans 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 puissantet standard et prolonge ce concept en intgrant un nouveau modlevnementiel appel Document Object Model (DOM3 EventModel) valable pour tous les objets lis lAPI du lecteur Flash 9.Le W3C dfinit la spcification de ce modle vnementiel. Vouspouvez lire les dernires rvisions ladresse suivante :http://www.w3.org/TR/DOM-Level-3-Events/ 49. Chapitre 3 Le modle vnementiel - version 0.1.25 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgLes dveloppeurs ActionScript 2 ayant dj utilis la classeEventDispatcher Lancien modle vnementiel a t entirement revu enActionScript 3.seront ravis de savoir que tous les objets lis aulecteur Flash hritent directement de cette classe. Nous allons doncdcouvrir en profondeur le concept de diffuseurs couteurs et voircomment cela amliore la clart et la souplesse de notre code.A retenir La grande puissance dActionScript 3 rside dans limplmentationnative dEventDispatcherUn nouveau modle vnementiel.En ActionScript 3 le modle vnementiel a clairement volu, lamanire dont les objets interagissent entre eux a t entirement revue.Le principe mme de ce modle vnementiel est tir dun modle deconception ou Design Pattern appel Observateur qui dfinitlinteraction entre plusieurs objets daprs un dcoupage bienspcifique.Habituellement ce modle de conception peut tre dfini de la maniresuivante : Le modle de conception observateur dfinit une relation entreobjets de type un plusieurs, de faon que, lorsque un objet changedtat, tous ceux qui en dpendent en soient notifis et soient mis jour automatiquement .Le modle de conception Observateur met en scne troisNous pouvons conceptualiser la notion dvnement comme unchangement dtat au sein du sujet. Un clic sur un bouton, la findun chargement de donnes provoquera la diffusion dunvnement par lobjet sujet. Tous les vnements existants enActionScript 3 sont stocks dans des proprits constantes declasses lies lvnement.acteurs :Le sujetIl est la source de lvnement, nous lappellerons sujet car cestlui qui diffuse les vnements qui peuvent tre couts ou non parles observateurs. Ce sujet peut tre un bouton, ou un clip parexemple. Ne vous inquitez pas, tous ces vnements sontdocuments, la documentation prsente pour chaque objet lesvnements diffuss.Lvnement 50. Chapitre 3 Le modle vnementiel - version 0.1.26 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgLcouteurLcouteur a pour mission dcouter tout vnement du sujet. Ilpeut tre une fonction ou une mthode. Lorsque le sujet changedtat, il diffuse un vnement appropri, si lcouteur est souscritauprs de lvnement diffus il en est notifi et excute uneaction. Il est important de souligner quil peut y avoir de multiplescouteurs pour un mme vnement, cest justement lun despoints forts de ce nouveau modle vnementiel reprsent par lafigure 3-1.Figure 3-1. Schma du modle de conceptionObservateurNos couteurs sont dpendants du sujet, ils y ont souscrit. Le sujet neconnat rien des couteurs, il sait simplement sil est observ ou non travers sa liste interne dcouteurs. Lorsque celui-ci change dtat unvnement est diffus, nos couteurs en sont notifisPrenons un exemple simple constitu dun bouton et dune fonctioncouteur ragissant lorsque lutilisateur clique sur ce bouton. Nouset peuvent alorsragir. Tout vnement diffus envoie des informations aux couteursleur permettant dtre tenus au courant des modifications et donc derester jour en permanence avec le sujet.Nous dcouvrirons au fil de ces pages, la souplesse apporte par cenouveau modle vnementiel, et vous apprcierez sonfonctionnement trs rapidement.Cela reste encore relativement abstrait, pour y remdier voyonsensemble comment ce modle vnementiel stablit au sein duneapplication Flash traditionnelle. 51. Chapitre 3 Le modle vnementiel - version 0.1.27 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgavons dans ce cas nos trois acteurs mettant en scne le nouveaumodle vnementiel ActionScript 3. Le sujet : le bouton Lvnement : le clic bouton Lcouteur : la fonctionTranspos dans une application ActionScript 3 traditionnelle, nouspouvons tablir le schma suivant :Figure 3-2. Modle vnementiel dans une applicationActionScript 3Notre bouton est un sujet pouvant diffuser un vnement. Celui-ci estcout par une fonction couteur.A retenir Il existe un seul et unique modle vnementiel en ActionScript 3 Ce modle vnementiel est bas sur le modle de conceptionObservateur Les trois acteurs de ce nouveau modle vnementiel sont : le sujet,lvnement, et lcouteur.. Nous pouvons avoir autant dcouteurs que nous le souhaitons. Plusieurs couteurs peuvent couter le mme vnement.Tout est vnementielLessentiel du modle vnementiel rside au sein dune seule etunique classe appele EventDispatcher. Cest elle qui offre lapossibilit un objet de diffuser des vnements. Tous les objets issusde lAPI du lecteur 9 hritent de cette classe, et possdent de ce fait la 52. Chapitre 3 Le modle vnementiel - version 0.1.28 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgcapacit de diffuser des vnements. Souvenez-vous que toutes lesclasses issues du paquetage flash sont relatives au lecteur Flash.Avant le lecteur 9, ces objets hritaient simplement de la classeObject, si nous souhaitions pouvoir diffuser des vnements nousdevions nous mme implmenter la classe EventDispatcher ausein de ces objets. En ActionScript 3 la classe EventDispatcher estla classe de base pour tous ces objets.Voici la chane dhritage de la classe MovieClip avant le lecteurFlash 9 :Object|+-MovieClipDans les prcdentes versions du lecteur Flash, la classe MovieCliptendait directement la classe Object, si nous souhaitions pouvoirdiffuser des vnements partir dun MovieClip nous devionsimplmenter nous-mmes un nouveau modle vnementiel. Voyonscomme 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 etbnficient donc de la diffusion dvnements en natif. Cest unegrande volution pour nous autres dveloppeurs ActionScript, car laplupart des objets que nous manipulerons auront la possibilit dediffuser des vnements par dfaut.Ainsi la classe MovieClip en ActionScript hrite dabord de la classeObject puis dEventDispatcher pour ensuite hriter desdiffrentes classes graphiques. Toutes les classes rsidant dans lepaquetage flash ne drogent pas la rgle et suivent ce mmeprincipe.Voici la chane dhritage complte de la classe MovieClip enActionScript 3 :Object|+-EventDispatcher|+-DisplayObject|+-InteractiveObject| 53. Chapitre 3 Le modle vnementiel - version 0.1.29 / 33Thibault Imbertpratiqueactionscript3.bytearray.org+-DisplayObjectContainer|+-Sprite|+-MovieClipVoyons ensemble comment utiliser ce nouveau modle vnementiel travers diffrents objets courants.Ecouter un vnementLorsque vous souhaitez tre tenu au courant des dernires nouveautsde votre vidoclub, vous avez plusieurs possibilits.La premire consiste vous dplacer jusquau vidoclub afin dedcouvrir les dernires sorties. Une approche classique qui nest pasvraiment optimise, nous pouvons dj imaginer le nombre de visitesque vous effectuerez dans le magasin pour vous rendre comptequaucun nouveau DVD ne vous intresse.Une deuxime approche consiste laisser une liste de films que vousattendez au grant du vidoclub et attendre que celui-ci vous appellelorsquun des films est arriv. Une approche beaucoup plus efficacepour 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, voustes alors lcouteur car vous tes souscrit un vnement prcis : ladisponibilit dun film que vous recherchez .En ActionScript 3 les objets fonctionnent de la mme manire. Pourobtenir une notification lorsque lutilisateur clique sur un bouton, noussouscrivons un couteur auprs dun vnement diffus par le sujet, icinotre bouton.Afin dcouter un vnement spcifique, nous utilisons la mthodeaddEventListeneraddEventListener(type:dont voici la signature :String, listener:Function, useCapture:Boolean = false,priority:int = 0, useWeakReference:Boolean = false):voidLe premier paramtre attend lvnement couter sous la formedune chane de caractres. Le deuxime paramtre prend en rfrencelcouteur qui sera souscrit auprs de lvnement. Les trois derniersparamtres seront expliqus plus tard. Souvenez-vous que seuls lesobjets rsidant dans le paquetage flash utilisent ce modlevnementiel. Voyons laide dun exemple simple, comment couterun vnement.Dans un nouveau document Flash, crez un symbole bouton, et placezune occurrence de ce dernier sur la scne et nommez la monBouton. 54. Chapitre 3 Le modle vnementiel - version 0.1.210 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgSur un calque AS tapez le code suivant :monBouton.addEventListener ( "click", clicBouton );function clicBouton ( pEvt:MouseEvent ):void{// affiche : vnement diffustrace("vnement diffus");}Nous passons en deuxime paramtre la mthodeaddEventListener une rfrence la fonction couteurclicBouton. Attention ne pas mettre les doubles parenthseslorsque nous passons la rfrence la fonction.Le code suivant ne pourrait pas tre compil :monBouton.addEventListener( "click", clicBouton() );function clicBouton ( pEvt:MouseEvent ):void{// affiche : vnement diffustrace ( "vnement diffus" );}Nous coutons ici lvnement click sur le bouton monBouton etnous passons la fonction clicBouton comme couteur. Lorsquelutilisateur clique sur le bouton, il diffuse un vnement click quiest cout par la fonction clicBouton.Mme si cette syntaxe fonctionne, et ne pose aucun problme pour lemoment, que se passe t-il si nous spcifions un nom dvnementincorrect ?Imaginons le cas suivant, nous faisons une erreur et coutonslvnement clicck :monBouton.addEventListener( "clicck", clicBouton );Si vous testez le code ci-dessus, la fonction clicBouton ne serajamais dclenche car lvnement clicck possde une erreur desaisie et de par sa non-existence nest jamais diffus.Afin dviter ces problmes de saisie, tous les noms des vnementssont dsormais stocks dans des classes lies chaque vnement.Lorsque vous devez couter un vnement spcifique pensezimmdiatement au type dvnement qui sera diffus. 55. Chapitre 3 Le modle vnementiel - version 0.1.211 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgLes classes rsidant dans le paquetage flash.events Les vnements autonomesconstituentlensemble des classes vnementielles en ActionScript 3. Ellespeuvent tre divises en deux catgories.Ce sont les vnements diffuss par les objets sans aucune interactionutilisateur, voici quelques classes lies aux vnements autonomes :flash.events.Event : stocke les vnements de base.flash.events.ProgressEvent : stocke les vnementslis aux chargements progressifs.flash.events.IOErrorEvent Les vnements interactifs: stocke les vnements lisaux erreurs de chargement.Ce sont les vnements diffuss par les objets, lorsquune interactionutilisateur intervient.flash.events.MouseEvent : stocke les vnements lis la souris.flash.events.KeyboardEvent : stocke les vnementslis au clavier.flash.events.TextEvent : stocke les vnements lis auxchamps texte.Dans notre cas, nous souhaitons couter un vnement qui relvedune interactivit utilisateur provenant de la souris. Nous nousdirigerons logiquement au sein de la classe MouseEvent.Pour rcuprer le nom dun vnement, nous allons cibler cesproprits constantes statiques, la syntaxe repose sur le systmesuivant :ClasseEvenement.MON_EVENEMENTPour bien comprendre ce concept, crez un nouveau document Flashet sur un calque AS tapez la ligne suivante :// affiche : clicktrace ( MouseEvent.CLICK );La classe MouseEvent contient tous les vnements relatifs lasouris, en ciblant la proprit statique CLICK nous rcuprons lachane de caractres click que nous passerons en premier paramtrede la mthode addEventListenerEn ciblant un nom dvnement par lintermdiaire dune propritstatique nous bnficions de deux avantages. Si jamais une erreur de. 56. Chapitre 3 Le modle vnementiel - version 0.1.212 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgsaisie survenait de par la vrification du code effectue par lecompilateur notre code ne pourrait pas tre compil.Ainsi le code suivant chouerait la compilation :monBouton.addEventListener ( MouseEvent.CLICCK, clicBouton );Et affiche dans la fentre de sortie le message derreur suivant :1119: Accs la proprit CLICCK peut-tre non dfinie, via larfrence de type static Class.Au sein de Flash CS3 et Flex Builder le simple fait de cibler uneclasse vnementielle comme MouseEvent vous affichera aussitttout les vnements lis cette classe. Vous naurez plus aucuneraison de vous tromper dans le ciblage de vos vnements.A plus long terme, si le nom de lvnement click venait changerou disparatre dans une future version du lecteur Flash, notre anciencode pointant vers la constante continuerait de fonctionner car cesproprits seront mises jour dans les futures versions du lecteurFlash.Pour couter le clic souris sur notre bouton, nous rcuprons le nomde lvnement et nous le passons la mthodeaddEventListenerLobjet vnementiel:monBouton.addEventListener( MouseEvent.CLICK, clicBouton );Cette nouvelle manire de stocker le nom des vnements apportedonc une garantie la compilation mais rgle aussi un souci decompatibilit future. Voyons ensemble les diffrentes classes lies auxvnements existant en ActionScript 3.Lorsquun vnement est diffus, un objet est obligatoirement envoyen paramtre la fonction couteur. Cet objet est appel objetvnementiel.Cest pour cette raison que la fonction couteur doit imprativementcontenir dans sa signature un paramtre du type de lvnementdiffus. Le type de lobjet vnementiel correspond au type de laclasse contenant le nom de lvnement. Dans notre exemple il sagitde MouseEvent. Lobjet vnementiel contient des informations lies lvnement en cours de diffusion. Ces informations sontdisponibles travers des proprits de lobjet vnementiel. Nousnous attarderons pour linstant sur trois de ces proprits, target,currentTarget et type. 57. Chapitre 3 Le modle vnementiel - version 0.1.213 / 33Thibault Imbertpratiqueactionscript3.bytearray.org La proprit target La propritfait rfrence lobjet cible de lvnement. Denimporte o nous pouvons savoir qui est la source de la propagationde lvnement.currentTarget fait rfrence lobjet diffuseur delvnement. Il sagit toujours de lobjet sur lequel nous avons appel lamthode addEventListener La proprit.type contient, elle, le nom de lvnement diffus, iciclickLe code suivant rcupre une rfrence vers lobjet cible et le nom delvnement :monBouton.addEventListener ( MouseEvent.CLICK, clicBouton );function clicBouton ( pEvt:MouseEvent ):void{// affiche : [object SimpleButton]trace( pEvt.target );// affiche : clicktrace( pEvt.type );}Nous reviendrons au cours du chapitre 6 intitul.Propagationvnementielle sur les diffrences entre la proprit target etcurrentTarget.Le paramtre pEvt dfinit un paramtre de type MouseEvent carlvnement cout est li un vnement souris. La proprittarget, prsente dans tout vnement diffus, permet en ralit uncouplage faible entre les objets. En passant par la proprit targetpour cibler le diffuseur, nous vitons de rfrencer lobjet source delvnement directement par son nom, qui en cas de modificationrendrait notre code rigide et pnible modifier.Si la fonction couteur ne possde pas dans sa signature un paramtrecens accueillir lobjet vnementiel, une exception sera leve lexcution. Le code suivant gnre une erreur darguments lexcution :monBouton.addEventListener ( MouseEvent.CLICK, clicBouton );function clicBouton ():void{}Affiche dans la fentre de sortie : 58. Chapitre 3 Le modle vnementiel - version 0.1.214 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgArgumentError: Error #1063: Non-correspondance du nombre darguments surbouton_fla::MainTimeline/onMouseClick(). 0 prvu(s), 1 dtect(s).A lexcution lorsque lvnement est diffus, aucun paramtrenaccueille lobjet vnementiel, une exception est donc leve.Souvenez-vous que la nouvelle machine virtuelle (AVM2) conserveles types lexcution, si le type de lobjet vnementiel dans lasignature de la fonction couteur ne correspond pas au type de lobjetvnementiel diffus, le lecteur tentera de convertir implicitementlobjet vnementiel. Une erreur sera aussitt leve si la conversionest impossible.Mettons en vidence ce comportement en spcifiant au sein de lasignature de la fonction couteur un objet vnementiel de typediffrent.Ici nous spcifions au sein de la signature de la fonction couteur, unparamtre de type flash.events.TextEvent :monBouton.addEventListener ( MouseEvent.CLICK, clicBouton );function clicBouton ( pEvt:TextEvent ):void{}Ce code affichera dans la fentre de sortie :TypeError: Error #1034: Echec de la contrainte de type : conversion deflash.events::MouseEvent@2ee7601 en flash.events.TextEvent impossible.A linverse, nous pouvons utiliser le type communflash.events.Event compatible avec toutes les classesvnementielles :monBouton.addEventListener ( MouseEvent.CLICK, clicBouton );function clicBouton ( pEvt:Event ):void{}Dcouvrons plus en dtail la classe EventLa classe Event.Comme nous lavons vu prcdemment, au sein du paquetageflash.events rside un ensemble de classes contenant tous lestypes dobjets dvnementiels pouvant tre diffuss. La classeparente tous les objets vnementiels est la classe EventCette classe dfinit la majorit des vnements diffuss enActionScript 3, le classique vnement.Event.ENTER_FRAME est 59. Chapitre 3 Le modle vnementiel - version 0.1.215 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgcontenu dans la classe Event, tout comme lvnementEvent.COMPLETE propre tout objet chargeant un lment externeau lecteur Flash.Dans un nouveau document Flash, crez un symbole MovieClip etplacez une occurrence de ce clip nomm monClip sur la scne.Le code suivant permet lcoute de lvnementEvent.ENTER_FRAME auprs dun MovieClip :monClip.addEventListener ( Event.ENTER_FRAME, execute );function execute ( pEvt:Event ):void{// affiche : [object MovieClip] : enterFrametrace( pEvt.target + " : " + pEvt.type );}Lvnement Event.ENTER_FRAME a la particularit dtreautomatiquement diffus ds lors quun couteur est souscrit. Commenous lavons abord prcdemment, certains vnements diffusent enrevanche des objets vnementiels de type tendus la classe Event,cest le cas par exemple des vnements provenant de la souris ou duclavier.Lorsquun vnement li la souris est diffus, ce nest pas un objetvnementiel de type Event que nous recevrons au sein de notrefonction couteur mais un objet de typeflash.events.MouseEvent.Pourquoi recevons-nous un objet vnementiel de type diffrent pourles vnements souris ?Cest ce que nous allons dcouvrir ensemble dans cette partie intituleLes sous classes dEventLes sous-classes dEvent.Lorsque lvnement Event.ENTER_FRAME est diffus, lobjetvnementiel de type Event na aucune information supplmentaire renseigner lcouteur. Les proprits target et typeA linverse, si vous souhaitez couter un vnement li au clavier, il ya de fortes chances que notre couteur ait besoin dinformationssupplmentaires, comme par exemple la touche du clavier qui vientdtre enfonce et qui a provoqu la diffusion de cet vnement. De lacommune cetype sont suffisantes. 60. Chapitre 3 Le modle vnementiel - version 0.1.216 / 33Thibault Imbertpratiqueactionscript3.bytearray.orgmme manire un vnement diffus par la souris pourra nousrenseigner sur sa position ou bien sur quel lment notre curseur