Sie sind auf Seite 1von 858

PROGRAMMATION AVEC ACTIONSCRIPT 3.

2007 Adobe Systems Incorporated. Tous droits rservs. Programmation avec ActionScript 3.0 Si le prsent guide est fourni avec un logiciel rgi par un contrat dutilisateur final, ce guide ainsi que le logiciel dcrit, sont fournis sous licence et peuvent tre utiliss ou copis uniquement selon les clauses et conditions de la licence. Sauf indication expresse dans le contrat de licence, aucune partie de ce guide ne peut tre reproduite, stocke dans un systme dextraction ni transmise de quelque manire que soit, lectronique, mcanique, par enregistrement ou autre, sans laccord crit pralable dAdobe Systems Incorporated. Veuillez noter que le contenu de ce guide est protg par les lois de copyright mme sil nest pas diffus avec le logiciel comprenant laccord de licence utilisateur final. Le contenu de ce guide est fourni titre dinformation uniquement, peut faire lobjet de modifications sans pravis et ne saurait tre considr comme un engagement quelconque de la part dAdobe Systems Incorporated. Adobe Systems Incorporated dcline toute responsabilit quant aux erreurs ou imprcisions susceptibles dapparatre dans les informations que prsente ce guide. Rappelez-vous que certaines illustrations ou images que vous souhaitez inclure dans votre projet peuvent tre protges par les lois de copyright. Linclusion sans autorisation de tels lments dans vos propres travaux peut porter atteinte aux droits du dtenteur de ce copyright. Veillez obtenir toutes les autorisations ncessaires auprs de ce dernier. Toutes les rfrences aux noms de socits dans les exemples de modles sont fournies titre dillustration uniquement et ne visent aucune entreprise existante. Adobe, le logo Adobe, Flex, Flex Builder et Flash Player sont des marques dposes ou des marques dAdobe Systems Incorporated aux Etats-Unis et/ou dans dautres pays. ActiveX et Windows sont des marques ou des marques dposes de Microsoft Corporation aux Etats-Unis et dans dautres pays. Macintosh est une marque dApple Inc., dpose aux Etats-Unis et dans dautres pays. Toutes les autres marques sont la proprit de leurs dtenteurs respectifs. Technologie de compression et dcompression audio discours utilise sous licence de Nellymoser, Inc. (www.nellymoser.com). Technologie de compression et dcompression vido Sorenson Spark utilise sous licence de Sorenson Media, Inc.

Navigateur Opera Copyright 1995-2002 Opera Software ASA et ses fournisseurs. Tous droits rservs. Adobe Systems Incorporated, 345 Park Avenue, San Jose, Californie 95110, E.-U. Avis aux utilisateurs finaux dpendant du gouvernement des Etats-Unis. Le logiciel et la documentation sont des articles commerciaux , selon la dfinition tablie par larticle 48 C.F.R. 2.101, composs dun logiciel informatique commercial et dune documentation de logiciel informatique commercial , tels que dfinis dans les articles 48 C.F.R. 12.212 ou 48 C.F.R. 227.7202, selon le cas. Conformment aux articles 48 C.F.R. 12.212 ou 48 C.F.R. 227.7202-1 227.7202-4, selon le cas, le logiciel informatique commercial et la documentation de logiciel informatique commercial sont fournis sous licence aux utilisateurs finaux dpendant du gouvernement des Etats-Unis (a) comme articles commerciaux uniquement et (b) avec les seuls droits normalement accords aux utilisateurs finaux, en accord avec les conditions gnrales applicables. Les droits non publis sont rservs conformment aux lois sur le copyright en vigueur aux Etats-Unis. Adobe Systems Incorporated, 345 Park Avenue, San Jose, CA 95110-2704, E.-U. Pour les utilisateurs finaux ne dpendant pas du gouvernement des Etats-Unis, Adobe accepte de respecter toutes les lois applicables relatives lgalit des chances, y compris, sil y a lieu, aux dispositions du dcret 11246 et ses modifications, de la section 402 de la loi sur laide la rhabilitation des vtrans du Vietnam (Vietnam Era Veterans Readjustment Assistance Act) de 1974 (38 USC 4212), de la section 503 de la loi de rhabilitation (Rehabilitation Act) de 1973 et ses modifications, et des rglements des articles 41 CFR 60-1 60-60, 60-250 et 60-741. La clause relative la discrimination positive et les rgulations nonces dans la phrase prcdente sont incluses par rfrence.

Table des matires

A propos de ce manuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Utilisation de ce manuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Accs la documentation ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Ressources ActionScript destines la formation . . . . . . . . . . . . . . . . . 19 Chapitre 1: Introduction ActionScript 3.0 . . . . . . . . . . . . . . . . . . 21 A propos dActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Avantages dActionScript 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Nouveauts dActionScript 3.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Fonctions du langage de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Fonctions API de Flash Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Compatibilit avec les versions prcdentes . . . . . . . . . . . . . . . . . . . . . .27 Chapitre 2: Prise en main dActionScript . . . . . . . . . . . . . . . . . . . 29 Concepts de programmation de base . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Quel est le rle dun programme informatique. . . . . . . . . . . . . . . . . . 29 Variables et constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Types de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Utilisation des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Proprits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Mthodes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Evnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Gestion des vnements de base . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Description du processus de gestion des vnements. . . . . . . . .37 Exemples de gestion dvnements . . . . . . . . . . . . . . . . . . . . . . . . . 41 Cration dinstances dobjets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Elments de programme courants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Exemple : Elment de portfolio danimation . . . . . . . . . . . . . . . . . . . . . . 46 Cration dapplications avec ActionScript . . . . . . . . . . . . . . . . . . . . . . . 50 Options dorganisation du code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Choix de loutil appropri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Processus de dveloppement ActionScript . . . . . . . . . . . . . . . . . . . 55

Cration de vos propres classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Stratgies de conception dune classe . . . . . . . . . . . . . . . . . . . . . . . . 56 Ecriture du code dune classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Suggestions dorganisation des classes . . . . . . . . . . . . . . . . . . . . . . . 59 Exemple : Cration dune application de base . . . . . . . . . . . . . . . . . . . . 60 Excution des exemples suivants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Chapitre 3: Syntaxe et langage ActionScript . . . . . . . . . . . . . . . . 71 Prsentation du langage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Objets et classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Packages et espaces de nom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Espaces de noms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Types de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Vrification des types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Classes dynamiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Descriptions des types de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . .101 Conversions de type. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Oprateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118 Instructions conditionnelles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Boucle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131 Concepts de fonction de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Paramtres de fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Fonctions comme objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Domaine de la fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Chapitre 4: Programmation oriente objet en ActionScript. . . . 147 Principes de la programmation oriente objet . . . . . . . . . . . . . . . . . . . 148 Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Dfinitions de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151 Attributs de proprit de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Les mthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Les numrations et les classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Les classes des lments incorpors. . . . . . . . . . . . . . . . . . . . . . . . . 169 Interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Hritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 Rubriques avances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Exemple : GeometricShapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

Chapitre 5: Utilisation des dates et heures . . . . . . . . . . . . . . . . . 205 Principes de base des dates et des heures. . . . . . . . . . . . . . . . . . . . . . 205 Gestion des dates calendaires et des heures . . . . . . . . . . . . . . . . . . . . 206 Contrle des intervalles temporels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .210 Exemple : une horloge analogique simple. . . . . . . . . . . . . . . . . . . . . . . .213 Chapitre 6: Utilisation des chanes . . . . . . . . . . . . . . . . . . . . . . . . 217 Principes de base des chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .218 Cration de chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 La proprit length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .221 Utilisation de caractres dans des chanes. . . . . . . . . . . . . . . . . . . . . . 222 Comparaison de chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Rcupration des reprsentations de chane dautres objets. . . . . . 223 Concatnation de chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Recherche de sous-chanes et de motifs dans des chanes . . . . . . . 225 Conversion de la casse dans des chanes. . . . . . . . . . . . . . . . . . . . . . . 230 Exemple : ASCII art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .231 Chapitre 7: Utilisation de tableaux . . . . . . . . . . . . . . . . . . . . . . . . 239 Principes de base des tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Tableaux indexs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 Tableaux associatifs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .251 Tableaux multidimensionnels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Clonage de tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Rubriques avances :. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 Exemple : PlayList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 Chapitre 8: Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 Principes de base de la gestion des erreurs . . . . . . . . . . . . . . . . . . . . . 272 Types derreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 Gestion des erreurs dans ActionScript 3.0 . . . . . . . . . . . . . . . . . . . . . 277 Elments de gestion des erreurs ActionScript 3.0. . . . . . . . . . . . . 278 Stratgies de gestion des erreurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Utilisation de la version de dbogage de Flash Player . . . . . . . . . . . . 280 Gestion des erreurs synchrones dans une application. . . . . . . . . . . . .281 Cration de classes derreur personnalises . . . . . . . . . . . . . . . . . . . . 286 Rponse des vnements derreurs et au statut . . . . . . . . . . . . . . . 288

Comparaison des classes Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .292 Classes Error de base ECMAScript . . . . . . . . . . . . . . . . . . . . . . . . . .292 Classes Error de base dActionScript. . . . . . . . . . . . . . . . . . . . . . . . 295 Classes Error du package flash.error . . . . . . . . . . . . . . . . . . . . . . . . .296 Exemple : Application CustomErrors . . . . . . . . . . . . . . . . . . . . . . . . . . .298 Chapitre 9: Utilisation dexpressions rgulires . . . . . . . . . . . . 305 Principes de base des expressions rgulires. . . . . . . . . . . . . . . . . . . 306 Syntaxe dexpression rgulire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 Cration dune instance dune expression rgulire . . . . . . . . . . . . 310 Caractres, caractres de remplacement et mtasquences. . . . .311 Classes de caractre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 Quantificateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 Permutation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 Groupes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 Indicateurs et proprits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .322 Mthodes dutilisation dexpressions rgulires avec des chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 Exemple : Un analyseur Wiki. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328 Chapitre 10: Gestion dvnements. . . . . . . . . . . . . . . . . . . . . . . 335 Principes de base de la gestion des vnements. . . . . . . . . . . . . . . . .336 Variation de la gestion dvnements dans ActionScript 3.0 par rapport aux versions antrieures . . . . . . . . . . . . . . . . . . . . . . . . . . . .339 Flux dvnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .343 Objets vnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .345 Ecouteurs dvnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 Exemple : un rveil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 Chapitre 11: Utilisation de XML . . . . . . . . . . . . . . . . . . . . . . . . . . .367 Principes de base de XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .368 Lapproche E4X concernant le traitement XML. . . . . . . . . . . . . . . . . . 372 Objets XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 XMLList, objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 Initialisation de variables XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 Assemblage et transformation dobjets XML . . . . . . . . . . . . . . . . . . . 380 Parcours de structures XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 Utilisation despaces de nom XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 Conversion de type XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .388 Lecture de documents XML externes. . . . . . . . . . . . . . . . . . . . . . . . . . 390 Exemple : Chargement de donnes RSS depuis Internet . . . . . . . . 390

Chapitre 12: Programmation de laffichage . . . . . . . . . . . . . . . . 395 Bases de la programmation de laffichage . . . . . . . . . . . . . . . . . . . . . . 395 Classes daffichage de base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .401 Avantages de lutilisation de la liste daffichage. . . . . . . . . . . . . . . . . . 403 Utilisation des objets daffichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 Proprits et mthodes de la classe DisplayObject. . . . . . . . . . . . 406 Ajout dobjets daffichage la liste daffichage . . . . . . . . . . . . . . . . 407 Utilisation des conteneurs dobjets daffichage. . . . . . . . . . . . . . . . 407 Traverse de la liste daffichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 Dfinition des proprits de la scne . . . . . . . . . . . . . . . . . . . . . . . . .413 Gestion des vnements des objets daffichage . . . . . . . . . . . . . . . 417 Choix dune sous-classe de DisplayObject . . . . . . . . . . . . . . . . . . . .418 Manipulation des objets daffichage. . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 Modification de la position . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 Dfilement horizontal et vertical des objets daffichage . . . . . . . . 426 Redimensionnement et mise lchelle des objets . . . . . . . . . . . . 428 Contrle de la distorsion lors de la mise lchelle . . . . . . . . . . 429 Mise en cache des objets daffichage . . . . . . . . . . . . . . . . . . . . . . . . 432 Pertinence de la mise en cache . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 Activation de la mise en cache sous forme de bitmap . . . . . . . 435 Dfinition dune couleur darrire-plan opaque . . . . . . . . . . . . . 435 Application de modes de fondu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 Modification des couleurs des objets daffichage. . . . . . . . . . . . . . 437 Modification par code des valeurs des couleurs. . . . . . . . . . . . . 438 Modification par code des effets de couleur et de luminosit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 Rotation des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 Application deffets de fondu des objets . . . . . . . . . . . . . . . . . . . . 440 Masquage des objets daffichage. . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 Animation des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 Chargement dynamique de contenu afficher . . . . . . . . . . . . . . . . . . 446 Chargement dobjets daffichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 Suivi de la progression du chargement. . . . . . . . . . . . . . . . . . . . . . . 447 Spcification du contexte de chargement . . . . . . . . . . . . . . . . . . . . 449 Exemple : SpriteArranger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .451 Chapitre 13: Utilisation de la gomtrie. . . . . . . . . . . . . . . . . . . . 459 Principes de base de la gomtrie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 Utilisation des objets Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462 Utilisation dobjets Rectangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 Utilisation des objets Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 Exemple : Application dune transformation de matrice un objet daffichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470

Chapitre 14: Utilisation de lAPI de dessin . . . . . . . . . . . . . . . . . 475 Les bases dutilisation de lAPI de dessin. . . . . . . . . . . . . . . . . . . . . . . . 476 Prsentation de la classe Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478 Dessin de lignes et de courbes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .479 Dessin de formes laide des mthodes intgres . . . . . . . . . . . . . . .482 Cration de lignes et de remplissages en dgrad. . . . . . . . . . . . . . . .483 Utilisation de la classe Math avec les mthodes de dessin . . . . . . . 489 Animation avec lAPI de dessin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490 Exemple : gnrateur algorithmique deffets visuels . . . . . . . . . . . . . . 491 Chapitre 15: Filtrage des objets daffichage . . . . . . . . . . . . . . . . 495 Bases du filtrage des objets daffichage. . . . . . . . . . . . . . . . . . . . . . . . 495 Cration et application de filtres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .497 Cration dun nouveau filtre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .497 Application dun filtre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498 Le fonctionnement des filtres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 Problmes potentiels dutilisation des filtres. . . . . . . . . . . . . . . . . . 500 Filtres daffichage disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 Filtre de biseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 Filtre de flou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 Filtre dombre porte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 Filtre de rayonnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505 Filtre de biseau dgrad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Filtre de rayonnement dgrad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .507 Exemple : combinaison de filtres de base . . . . . . . . . . . . . . . . . . . . 508 Filtre matrice de couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 Filtre de convolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .511 Filtre mappage de dplacement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 Exemple : Filter Workbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 Chapitre 16: Utilisation des clips . . . . . . . . . . . . . . . . . . . . . . . . . . 521 Principes de base des clips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 Utilisation des objets MovieClip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 Contrle de la lecture dun clip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 Utilisation des squences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .527 Cration dobjets MovieClip laide dActionScript. . . . . . . . . . . . . . .528 Exportation des symboles de bibliothque pour ActionScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .528 Chargement dun fichier SWF externe . . . . . . . . . . . . . . . . . . . . . . . . . .532 Exemple : RuntimeAssetsExplorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . .533

Chapitre 17: Utilisation de texte . . . . . . . . . . . . . . . . . . . . . . . . . . 539 Les bases de lutilisation du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 Affichage du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 Types de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 Modification du contenu dun champ texte . . . . . . . . . . . . . . . . . . . 544 Affichage du texte HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 Utilisation dimages dans des champs texte . . . . . . . . . . . . . . . . . . 545 Dfilement du texte dans un champ texte . . . . . . . . . . . . . . . . . . . . 546 Slection et manipulation de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 Capture de la saisie de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 Restriction de la saisie de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 Formatage du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .551 Attribution de formats texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .551 Application de feuilles de style en cascade . . . . . . . . . . . . . . . . . . . 552 Chargement de fichiers CSS externes . . . . . . . . . . . . . . . . . . . . . . . 553 Formatage de plages de texte au sein dun champ texte . . . . . . . 555 Fonctions avances daffichage de texte . . . . . . . . . . . . . . . . . . . . . . . 556 Utilisation de texte statique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 Exemple : formatage du texte dans le style journal . . . . . . . . . . . . 560 Lecture du fichier CSS externe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .561 Disposition des lments de larticle sur la page . . . . . . . . . . . . . . 564 Modification de la taille de la police en fonction de la taille du champ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 Rpartition du texte sur plusieurs colonnes . . . . . . . . . . . . . . . . . . . 567 Chapitre 18: Utilisation des graphismes bitmap . . . . . . . . . . . . . . 571 Les bases de lutilisation des bitmaps . . . . . . . . . . . . . . . . . . . . . . . . . . . 571 Les classes Bitmap et BitmapData . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 Manipulation des pixels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577 Manipulation individuelle de pixels. . . . . . . . . . . . . . . . . . . . . . . . . . . 577 Dtection de collision au niveau des pixels . . . . . . . . . . . . . . . . . . . 579 Copie de donnes bitmap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .581 Cration de textures avec les fonctions de bruit alatoire . . . . . . . . . 582 Dfilement du contenu dimages bitmap. . . . . . . . . . . . . . . . . . . . . . . . 584 Exemple : animation dobjets Sprite laide dune image bitmap hors cran. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585 Chapitre 19: Utilisation de la vido. . . . . . . . . . . . . . . . . . . . . . . . 587 Principes de base de la vido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588 Prsentation du format vido Flash (FLV) . . . . . . . . . . . . . . . . . . . . . . .591 Prsentation de la classe Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592

Chargement de fichiers vido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 Contrle de la lecture de la vido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594 Dtection de la fin dun flux vido . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 Lecture de fichiers vido en flux continu . . . . . . . . . . . . . . . . . . . . . . . 596 Prsentation des points de repre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .597 Cration de mthodes de rappel pour les gestionnaires dvnements onCuePoint et onMetaData . . . . . . . . . . . . . . . . . . . . . .598 Dfinir la proprit client de lobjet NetStream comme Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 Crer une classe et dfinir des mthodes pour grer les mthodes de rappel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600 tendre la classe NetStream et lui ajouter des mthodes pour grer les mthodes de rappel . . . . . . . . . . . . . . . . . . . . . . . . . 601 tendre la classe NetStream et la rendre dynamique. . . . . . . . . . 602 Dfinir la proprit client de lobjet NetStream comme this. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604 Utilisation des points de repre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604 Utilisation des mtadonnes de la vido . . . . . . . . . . . . . . . . . . . . . . . 605 Capture dun signal vido provenant de la camra de lutilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 Prsentation de la classe Camera . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 Affichage du signal provenant de la camra . . . . . . . . . . . . . . . . . . . 610 Conception dune application grant une camra locale . . . . . . . . 610 tablissement dune connexion avec la camra de lutilisateur . . .611 Vrification de la prsence de camras . . . . . . . . . . . . . . . . . . . . . . . .611 Dtection de lautorisation daccder la camra. . . . . . . . . . . . . . 612 Optimisation de la qualit dimage vido . . . . . . . . . . . . . . . . . . . . . . 614 Suivi des conditions de lecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616 Envoi de vido un serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617 Rubriques avances : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617 Compatibilit de Flash Player avec les fichiers FLV cods . . . . . . 617 La configuration de fichier FLV pour lhbergement sur un serveur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618 Le ciblage des fichiers FLV locaux sur Macintosh . . . . . . . . . . . . . 619 Exemple : Video Jukebox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619 Chapitre 20: Utilisation du son . . . . . . . . . . . . . . . . . . . . . . . . . . .627 Principes de base de lutilisation du son . . . . . . . . . . . . . . . . . . . . . . . . .628 Prsentation de larchitecture audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 Chargement de fichiers audio externes . . . . . . . . . . . . . . . . . . . . . . . . .633 Utilisation des sons incorpors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .636 Utilisation de fichiers audio de lecture en continu . . . . . . . . . . . . . . . . 637

10

Lecture de sons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 Pause et reprise dun son . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639 Surveillance de la lecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640 Arrt de sons diffuss en continu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642 Scurit lors du chargement et de la lecture des sons. . . . . . . . . . . . 642 Contrle du volume du son et de la balance . . . . . . . . . . . . . . . . . . . . . 643 Utilisation des mtadonnes audio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646 Accs aux donnes audio brutes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647 Capture de lentre de son . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .651 Accs un microphone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .651 Acheminement de laudio du microphone vers des haut-parleurs locaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652 Modification de laudio du microphone . . . . . . . . . . . . . . . . . . . . . . . 653 Dtection de lactivit du microphone. . . . . . . . . . . . . . . . . . . . . . . . 653 Envoi daudio vers et depuis une passerelle multimdia . . . . . . . . 655 Exemple : Podcast Player. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655 Lecture de donnes RSS pour une chane de balado . . . . . . . . . . 657 Simplification de la lecture et du chargement du son laide de la classe SoundFacade . . . . . . . . . . . . . . . . . . . . . . . . 657 Affichage de la progression de la lecture . . . . . . . . . . . . . . . . . . . . . .661 Interruption et reprise de la lecture. . . . . . . . . . . . . . . . . . . . . . . . . . . 662 Extension de lexemple Podcast Player . . . . . . . . . . . . . . . . . . . . . . 663 Chapitre 21: Capture des donnes saisies par lutilisateur . . . . 665 Principes de base de la saisie utilisateur . . . . . . . . . . . . . . . . . . . . . . . . Capture de la saisie au clavier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capture des entres de souris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemple : WordSearch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665 667 670 675

Chapitre 22: Rseau et communication . . . . . . . . . . . . . . . . . . . 679 Principes de base de la mise en rseau et de la communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679 Utilisation de donnes externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 Connexion dautres instances Flash Player. . . . . . . . . . . . . . . . . . . . 690 Connexions socket. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 Stockage des donnes locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702 Utilisation des chargements et tlchargements de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706 Exemple : cration dun client Telnet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717 Exemple : chargement et tlchargement de fichiers . . . . . . . . . . . . . 721

11

Chapitre 23: Environnement du systme client. . . . . . . . . . . . . . 731 Principes de base de lenvironnement du systme client . . . . . . . . . . 731 Utilisation de la classe System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734 Utilisation de la classe Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735 Utilisation de la classe ApplicationDomain . . . . . . . . . . . . . . . . . . . . . . 736 Utilisation de la classe IME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .740 Exemple : dtection des capacits du systme . . . . . . . . . . . . . . . . . .746 Chapitre 24: Impression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751 Principes de base de limpression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752 Impression dune page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753 Tches Flash Player et impression systme . . . . . . . . . . . . . . . . . . . . .755 Dfinition de la taille, de lchelle et de lorientation . . . . . . . . . . . . . . 758 Exemple : Impression sur plusieurs pages . . . . . . . . . . . . . . . . . . . . . . . 761 Exemple : Redimensionnement, recadrage et ajustement . . . . . . . . . 764 Chapitre 25: Utilisation de lAPI externe . . . . . . . . . . . . . . . . . . .767 Principes de base de lutilisation de lAPI externe . . . . . . . . . . . . . . . . 768 Avantages de lAPI externe et conditions requises . . . . . . . . . . . . . . . 772 Utilisation de la classe ExternalInterface . . . . . . . . . . . . . . . . . . . . . . . . 773 Obtention dinformations sur le conteneur externe . . . . . . . . . . . . . 774 Appel de code externe partir dActionScript . . . . . . . . . . . . . . . . . 774 Appel du code ActionScript partir du conteneur . . . . . . . . . . . . . 775 Format XML de lAPI externe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777 Exemple : utilisation de lAPI externe dans un conteneur de page Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779 Exemple : utilisation de lAPI externe avec un conteneur ActiveX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787 Chapitre 26: La scurit dans Flash Player . . . . . . . . . . . . . . . . .797 Prsentation de la scurit dans Flash Player . . . . . . . . . . . . . . . . . . .798 Prsentation des contrles dautorisation . . . . . . . . . . . . . . . . . . . . . . . 801 Sandboxes de scurit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 812 Restriction des API de rseau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815 Scurit du mode plein cran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817 Chargement de contenu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818 Programmation croise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .822 Accs aux mdias chargs comme sil sagissait de donnes. . . . . .826 Chargement des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .829 Chargement de contenu incorpor partir de fichiers SWF imports dans un domaine de scurit . . . . . . . . . . . . . . . . . . . .832

12

Utilisation de contenus existants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dfinition des autorisations LocalConnection . . . . . . . . . . . . . . . . . . . Contrle de laccs aux scripts dans une page Web hte. . . . . . . . . Objets partags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Accs la camra, au microphone, au presse-papiers, la souris et au clavier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

833 833 834 836 838

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839

13

14

A propos de ce manuel
Ce manuel peut servir de base au dveloppement dapplications avec ActionScript 3.0. Il est prfrable de matriser les concepts de programmation gnraux (types de donnes, variables, boucles et fonctions) afin de mieux comprendre les ides et techniques dcrites. Il est galement conseill de comprendre les concepts de programmation orients objet (classes et hritage). La connaissance dActionScript 1.0 ou ActionScript 2.0 est utile mais pas ncessaire.

Contenu
Utilisation de ce manuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Accs la documentation ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 Ressources ActionScript destines la formation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

15

Utilisation de ce manuel
Les chapitres de ce manuel sont structurs en groupes logiques (indiqus ci-dessous) afin de faciliter la recherche de sections de documentation ActionScript connexes :
Chapitres Chapitres 1 4, prsentation de la programmation avec ActionScript Description Dcrit les concepts ActionScript 3.0 de base, y compris la syntaxe, les instructions et les oprateurs du langage, la spcification de langage ECMAScript version 4, la programmation ActionScript oriente objet et la nouvelle faon de grer des objets daffichage sur la liste daffichage Adobe Flash Player 9. Dcrit les types de donnes de niveau suprieur dans ActionScript 3.0 qui font galement partie de la spcification ECMAScript. Dcrit les fonctions importantes mises en uvre dans des packages et des classes propres Adobe Flash Player 9, notamment la gestion dvnements, la mise en rseau et les communications, le fichier dE/S, linterface externe, le modle de scurit de lapplication, etc.

Chapitres 5 10, classes et types de donnes ActionScript 3.0 de base Chapitres 11 26, API de Flash Player

Ce manuel contient galement de nombreux fichiers dexemple qui dcrivent des concepts de programmation dapplications pour des classes importantes ou couramment utilises. Les fichiers dexemple sont prpars de faon ce que vous puissez les charger et les utiliser plus facilement avec Adobe Flash CS3 Professional. Ils peuvent inclure des fichiers enveloppes. Nanmoins, lexemple de code de base est du code ActionScript 3.0 pur que vous pouvez utiliser dans lenvironnement de dveloppement de votre choix. ActionScript 3.0 peut tre crit et compil de plusieurs faons diffrentes :

En utilisant lenvironnement de dveloppement dAdobe Flex Builder 2 En utilisant un diteur de texte et un compilateur de ligne de commande (celui fourni avec Flex Builder 2, par exemple) En utilisant loutil de programmation Adobe Flash CS3 Professional

Pour plus dinformations sur les environnements de dveloppement dActionScript, voir Chapitre 1, Introduction ActionScript 3.0 .

16

A propos de ce manuel

Pour comprendre les exemples de code fournis dans ce manuel, vous navez pas besoin de savoir utiliser les environnements de dveloppement intgrs pour ActionScript (Flex Builder ou loutil de cration Flash, par exemple). En revanche, vous pouvez consulter la documentation relative ces outils pour savoir comment les utiliser pour crire et compiler du code ActionScript 3.0. Pour plus dinformations, voir Accs la documentation ActionScript , la page 17.

Accs la documentation ActionScript


Etant donn que ce manuel traite principalement de la description dActionScript 3.0 qui est un langage de programmation orient objet riche et puissant, il ne dcrit pas de faon dtaille le processus de dveloppement de lapplication ou le flux de travail au sein dune architecture serveur ou dun outil particulier. Par consquent, outre la Programmation avec ActionScript 3.0, vous pouvez consulter dautres sources de documentation lorsque vous concevez, dveloppez, testez et dployez des applications ActionScript 3.0.

Documentation ActionScript 3.0


Ce manuel dcrit les concepts qui sous-tendent le langage de programmation ActionScript 3.0 et fournit des dtails et des exemples dimplmentation illustrant les fonctions importantes du langage. Nanmoins, il ne constitue pas un guide de rfrence du langage complet. Pour cela, consultez la Rfrence du langage et des composants ActionScript 3.0, qui dcrit chaque classe, chaque mthode, chaque proprit et chaque vnement dans le langage. La Rfrence du langage et des composants ActionScript 3.0 fournit des informations de rfrence dtailles sur le langage de base, les composants Flash (dans les packages fl) et les API de Flash Player (dans les packages flash).

Documentation Flash
Si vous utilisez lenvironnement de dveloppement Flash, vous pouvez consulter les manuels suivants :
Manuel
Utilisation de Flash

Description
Dcrit comment dvelopper vos applications Web dynamiques dans lenvironnement de programmation de Flash Dcrit lutilisation spcifique du langage ActionScript 3.0 et de lAPI de base de Flash Player

Programmation avec ActionScript 3.0

Accs la documentation ActionScript

17

Manuel
Rfrence du langage et des composants ActionScript 3.0 Utilisation des composants ActionScript 3.0 Formation ActionScript 2.0 dans Adobe Flash

Description
Fournit des exemples de code, dutilisation et de syntaxe pour les composants de Flash et lAPI dActionScript 3.0 Explique comment utiliser les composants pour dvelopper des applications Flash Passe en revue les principes gnraux de la syntaxe ActionScript 2.0 et explique comment utiliser ce langage pour intervenir sur diffrents types dobjet Fournit des exemples de code, dutilisation et de syntaxe pour les composants de Flash et lAPI dActionScript 2.0 Explique de faon dtaille comment utiliser les composants ActionScript 2.0 pour dvelopper des applications Flash Dcrit chaque composant disponible dans larchitecture des composants Adobe, version 2, avec son API Dcrit les objets, les mthodes et les proprits disponibles dans lAPI de JavaScript Explique comment utiliser Adobe Flash Lite 2.x pour dvelopper des applications et fournit des exemples de code, dutilisation et de syntaxe pour les fonctions ActionScript disponibles avec Flash Lite 2.x

Guide de rfrence du langage ActionScript 2.0 Utilisation des composants ActionScript 2.0

Rfrence du langage des composants ActionScript 2.0 Extension de Flash Prise en main de Flash Lite 2.x

Dveloppement dapplications Flash Lite 2.0 Explique comment dvelopper des applications Flash Lite 2.x Introduction ActionScript Flash Lite 2.x Explique comment dvelopper des applications avec Flash Lite 2.x et dcrit toutes les fonctions ActionScript disponibles pour les dveloppeurs de Flash Lite 2.x Fournit des exemples de code, dutilisation et de syntaxe pour lAPI dActionScript 2.0 disponible dans Flash Lite 2.x Prsente Flash Lite 1.x et dcrit comment tester votre contenu laide de lmulateur CS3 dAdobe Device Central

Rfrence du langage ActionScript Flash Lite 2.x Prise en main de Flash Lite 1.x

18

A propos de ce manuel

Manuel
Dveloppement dapplications Flash Lite 1.x

Description
Dcrit comment dvelopper des applications pour des priphriques mobiles laide de Flash Lite 1.x Explique comment utiliser ActionScript dans des applications Flash Lite 1.x et dcrit toutes les fonctions ActionScript disponibles avec Flash Lite 1.x Fournit la syntaxe et lutilisation dlments ActionScript disponibles avec Flash Lite 1.x

Formation ActionScript Flash Lite 1.x

Guide de rfrence du langage ActionScript Flash Lite 1.x

Ressources ActionScript destines la formation


Outre le contenu de ces manuels, Adobe fournit des articles, des ides de conception et des exemples mis jour rgulirement dans le Ple de dveloppement et le Ple de cration Adobe.

Ple de dveloppement Adobe


Le Ple de dveloppement dAdobe constitue votre ressource pour consulter les dernires informations concernant ActionScript, des articles sur le dveloppement dapplication et des informations sur des problmes importants. Consultez le Ple de dveloppement ladresse www.adobe.com/go/developer_fr.

Ple de cration Adobe


Consultez les dernires nouveauts en matire de design numrique et danimations. Parcourez les uvres dartistes renomms, dcouvrez les nouvelles tendances de design et consolidez vos connaissances laide de didacticiels, de flux de travail cls et de techniques avances. Vrifiez deux fois par mois si de nouveaux didacticiels et articles ainsi que des pices de galerie dinspiration sont disponibles. Consultez le Ple de cration ladresse www.adobe.com/go/designcenter_fr.

Ressources ActionScript destines la formation

19

20

A propos de ce manuel

CHAPITRE 1

Introduction ActionScript 3.0


Ce chapitre offre une prsentation gnrale dActionScript 3.0, la version la plus rcente et la plus rvolutionnaire dActionScript.

Contenu
A propos dActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Avantages dActionScript 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Nouveauts dActionScript 3.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Compatibilit avec les versions prcdentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

A propos dActionScript
ActionScript est un langage de programmation destin lenvironnement dexcution dAdobe Flash Player. Il assure linteractivit, le traitement des donnes et bien dautres fonctions du contenu Flash et dans les applications associes. ActionScript est excut par la machine virtuelle ActionScript, un composant de Flash Player. Le code ActionScript est gnralement compil en pseudo-code binaire (une sorte de langage de programmation crit et compris par les ordinateurs) par un compilateur, par exemple celui intgr dans Adobe Flash CS3 Professional ou Adobe Flex Builder, ou celui fourni dans le kit de dveloppement Adobe Flex SDK et les services de donnes Flex Data Services. Le pseudo-code binaire est incorpor aux fichiers SWF, qui sont excut par Flash Player dans lenvironnement dexcution. ActionScript 3.0 constitue un modle de programmation solide, bien connu des dveloppeurs dots des connaissances lmentaires de la programmation oriente objet. Les fonctions principales dActionScript 3.0 sont les suivantes :

Une nouvelle machine virtuelle ActionScript, nomme AVM2, qui exploite un nouveau jeu dinstructions de pseudo-code binaire et amliore grandement les performances.

21

Une base de code de compilation plus moderne, davantage en accord avec la norme ECMAScript (ECMA 262) et qui accomplit de meilleures optimisations que les versions antrieures du compilateur. Une interface de programmation (API) tendue et amliore, avec contrle de bas niveau des objets et un vritable modle orient objet. Un langage de base reposant sur la future version 4 de la spcification ECMAScript (ECMA-262). Une API XML reposant sur la spcification ECMAScript pour XML (E4X) (ECMA-357 niveau 2). E4X est une extension de langage dECMAScript qui ajoute XML comme type de donnes natif. Un modle dvnements fond sur la spcification dvnements du modle dobjet de document (DOM, Document Object Model) niveau 3.

Avantages dActionScript 3.0


Les possibilits dActionScript 3.0 dpassent largement les fonctions de programmation des versions prcdentes. Cette version est conue pour faciliter la cration dapplications trs complexes impliquant dimportants jeux de donnes et des bases de code orientes objet et rutilisables. Si ActionScript 3.0 nest pas indispensable lexcution de contenu dans Adobe Flash Player 9, il ouvre nanmoins la voie des amliorations de performance uniquement disponibles dans AVM2, la nouvelle machine virtuelle. Le code dActionScript 3.0 peut sexcuter jusqu dix fois plus vite que le code des versions antrieures dActionScript. Lancienne version de la machine virtuelle, AVM1, excute le code ActionScript 1.0 et ActionScript 2.0. Elle est prise en charge par Flash Player 9 pour assurer la compatibilit ascendante avec le contenu existant. Pour plus dinformations, voir Compatibilit avec les versions prcdentes , la page 27.

22

Introduction ActionScript 3.0

Nouveauts dActionScript 3.0


Bien que de nombreuses classes et fonctions dActionScript 3.0 seront familires aux programmeurs dActionScript, son architecture et sa conceptualisation diffrent des versions prcdentes. Parmi les amliorations dActionScript 3.0, on compte de nouvelles fonctions du langage de base et une API Flash Player avance, qui accrot le contrle des objets de bas niveau.

Fonctions du langage de base


Le langage de base dfinit les lments de construction fondamentaux du langage de programmation, par exemple les arguments, expressions, conditions, boucles et types. ActionScript 3.0 contient de nombreuses fonctions qui acclrent le processus de dveloppement.

Exceptions dexcution
ActionScript 3.0 peut signaler davantage de conditions derreur que les versions prcdentes dActionScript. Utilises pour les conditions derreur courantes, les exceptions dexcution amliorent la procdure de dbogage et vous permettent de dvelopper des applications susceptibles de grer les erreurs de manire fiable. Les erreurs dexcution peuvent fournir des traces dempilement qui identifient le fichier source et le numro de ligne, pour un reprage plus rapide des erreurs.

Types dexcution
Dans ActionScript 2.0, les annotations de type visaient avant tout aider le dveloppeur ; lors de lexcution, toutes les valeurs taient types dynamiquement. Dans ActionScript 3.0, les informations de type sont prserves lors de lexcution et utilises plusieurs fins. Flash Player 9 effectue une vrification du type dexcution afin damliorer la scurit du systme quant aux types. Les informations de type servent galement reprsenter les variables dans les reprsentations machine natives, ce qui accrot les performances et rduit lutilisation de la mmoire.

Nouveauts dActionScript 3.0

23

Classes scelles
ActionScript 3.0 introduit le concept de classe scelle. Une telle classe possde uniquement un jeu fixe de proprits et de mthodes, dfinies lors de la compilation. Il est impossible dajouter dautres proprits et mthodes. Ainsi, la vrification effectue au moment de la compilation est plus stricte et garantit une plus grande robustesse des programmes. Lutilisation de la mmoire est galement optimise puisque la table de hachage nest pas requise pour chaque instance dobjet. Les classes dynamiques sont galement disponibles, par le biais du mot-cl dynamic. Bien que scelles par dfaut, toutes les classes dActionScript 3.0 peuvent tre dclares dynamiques grce au mot-cl dynamic.

Fermetures de mthodes
ActionScript 3.0 permet lutilisation dune fermeture de mthode qui se rappelle automatiquement linstance de lobjet dorigine. Cette fonction savre utile dans le traitement des vnements. Dans ActionScript 2.0, les fermetures de mthode ne gardaient pas la trace de linstance dobjet partir de laquelle il tait extrait, ce qui provoquait un comportement inattendu lors de lappel de la fermeture de mthode. La classe mx.utils.Delegate tait une solution prise, qui nest dsormais plus ncessaire.

ECMAScript pour XML (E4X)


ActionScript 3.0 intgre ECMAScript pour XML (E4X), rcemment normalis sous le nom ECMA-357. E4X offre un jeu dlments de langage naturels et courants qui permettent de manipuler XML. Contrairement aux API classiques danalyse XML, XML et E4X fonctionnent la manire dun type de donnes natif du langage. E4X simplifie le dveloppement dapplications exploitant XML grce une rduction drastique du volume de code requis. Pour plus dinformations sur lintgration dE4X dans ActionScript 3.0, voir Chapitre 11, Utilisation de XML , la page 367. Pour visualiser la spcification E4X dECMA, consultez le site www.ecma-international.org.

Expressions rgulires
ActionScript 3.0 inclut une prise en charge native des expressions rgulires afin dacclrer la recherche et la manipulation des chanes. Dans ActionScript 3.0, cette prise en charge suit la version 3 de la spcification de langage ECMAScript (ECMA-262).

24

Introduction ActionScript 3.0

Espaces de noms
Les espaces de noms sont semblables aux spcificateurs daccs classiques qui assurent le contrle de visibilit des dclarations (public, private, protected). Ils fonctionnent comme des spcificateurs daccs personnaliss, qui portent le nom de votre choix. Les espaces de noms sont dots dun identifiant de ressource universel (URI, Universal Resource Identifier) afin dviter les collisions. Ils servent galement reprsenter les espaces de noms XML en cas dutilisation dE4X.

Nouveaux types de primitives


ActionScript 2.0 utilise un seul type numrique, Number, un nombre en virgule flottante deux dcimales. ActionScript 3.0 comprend les types int et uint. Le type int est un entier sign 32 bits qui permet au code ActionScript de profiter de la rapidit de traitement mathmatique de lunit centrale. Il savre pratique pour les compteurs de boucles et les variables utilisant des entiers. Le type uint est un type dentier non sign 32 bits, utile pour les valeurs de couleurs RVB, les compteurs doctets, etc.

Fonctions API de Flash Player


LAPI Flash Player dActionScript 3.0 contient un grand nombre de nouvelles classes qui vous permettent de contrler les objets de bas niveau. Larchitecture du langage est compltement nouvelle et plus intuitive. Ces nouvelles classes tant trop nombreuses pour autoriser une prsentation dtaille ce stade, les sections ci-aprs mettent en avant quelques changements significatifs.

Modle dvnements DOM3


Le modle dvnements Document Object Model de niveau 3 (DOM3) offre une mthode standard de gnration et de traitement des messages dvnement, qui permet aux objets composant les applications dinteragir et de communiquer tout en conservant leur tat et en ragissant aux changements. Etabli partir des spcifications dvnements DOM niveau 3 du World Wide Web Consortium, ce modle fournit un mcanisme plus clair et plus efficace que les systmes dvnement disponibles dans les versions antrieures dActionScript. Les vnements et vnements derreur se trouvent dans le package flash.events. La structure des composants Flash utilise le mme modle dvnements que lAPI de Flash Player ; ainsi le systme dvnements est unifi sur lensemble de la plate-forme Flash.

Nouveauts dActionScript 3.0

25

API de liste daffichage


LAPI daccs la liste daffichage Flash Player, cest--dire larborescence contenant tous les lments visuels dune application Flash, est constitue de classes permettant de manipuler les primitives visuelles dans Flash. La nouvelle classe Sprite est un lment de construction lger, semblable la classe MovieClip mais plus adapte la classe de base des composants dinterface. La nouvelle classe Shape reprsente des formes vectorielles brutes. Il est possible dinstancier ces classes naturellement laide de loprateur new, mais aussi de les redfinir dynamiquement comme parent tout moment. Grce la gestion de profondeur dsormais automatique et intgre Flash Player, le rendu daffectation de numros de profondeur nest plus ncessaire. De nouvelles mthodes permettent de spcifier et de grer lordre z des objets.

Gestion des donnes et contenus dynamiques


ActionScript 3.0 comprend des mcanismes de chargement et de gestion des actifs et des donnes au sein de lapplication Flash qui se caractrisent par leur intuitivit et leur cohrence dans lensemble de lAPI. La nouvelle classe Loader propose un unique mcanisme de chargement des fichiers SWF et des actifs dimage, et permet daccder des informations dtailles sur le contenu charg. La classe URLLoader offre un mcanisme distinct de chargement du texte et des donnes binaires dans les applications orientes donnes. La classe Socket permet la lecture et lcriture des donnes binaires dans les sockets de serveur, quel que soit le format.

Accs aux donnes de bas niveau


De nombreuses API permettent daccder des donnes de bas niveau jusquici indisponibles dans ActionScript. Pour le tlchargement de donnes, la classe URLStream, mise en oeuvre par URLLoader, donne accs aux donnes sous forme binaire brute pendant le tlchargement. Avec la classe ByteArray, vous pouvez optimiser la lecture, lcriture et la manipulation des donnes binaires. La nouvelle API Sound assure le contrle prcis du son par le biais des classes SoundChannel et SoundMixer. De nouvelles API lies la scurit fournissent des informations sur les droits de scurit dun fichier SWF ou du contenu charg, pour une gestion plus efficace des erreurs de scurit.

26

Introduction ActionScript 3.0

Utilisation du texte
ActionScript 3.0 contient un package flash.text destin lensemble des API relatives au texte. La classe TextLineMetrics fournit des dimensions dtailles pour les lignes de texte dun champ texte ; elle remplace la mthode TextField.getLineMetrics() dans ActionScript 2.0. La classe TextField contient plusieurs nouvelles mthodes de bas niveau intressantes, qui peuvent fournir des informations spcifiques sur une ligne de texte ou un simple caractre dans un champ texte. Parmi ces mthodes, on compte notamment les suivantes : getCharBoundaries(), qui renvoie un rectangle reprsentant le cadre de slection dun caractre, getCharIndexAtPoint(), qui renvoie lindex dun caractre un point donn et getFirstCharInParagraph(), qui renvoie lindex du premier caractre dun paragraphe. Les mthodes de niveau de ligne incluent getLineLength(), qui renvoie le nombre de caractres dune ligne de texte donne, et getLineText(), qui renvoie le texte de la ligne spcifie. La nouvelle classe Font permet de grer les polices incorpores des fichiers SWF.

Compatibilit avec les versions prcdentes


Comme toujours, Flash Player garantit une compatibilit totale avec les versions prcdentes et les contenus publis antrieurement. Tous les contenus lisibles dans les anciennes versions de Flash Player sexcutent dans Flash Player 9. Lintroduction dActionScript 3.0 dans cette dernire version prsente cependant quelques problmes dinteroprabilit entre les contenus anciens et nouveaux lus dans Flash Player 9. Les problmes de compatibilit sont les suivants :

Un mme fichier SWF ne peut combiner du code ActionScript 1.0 ou 2.0 et du code ActionScript 3.0. Le code ActionScript 3.0 peut charger un fichier SWF crit en ActionScript 1.0 ou 2.0, mais ne peut accder aux variables et fonctions de ce fichier. Les fichiers SWF crits en ActionScript 1.0 ou 2.0 ne peuvent charger des fichiers SWF crits en ActionScript 3.0. Cela a pour consquence que les fichiers SWF crs dans Flash 8 ou Flex Builder version 1.5 ou antrieure ne peuvent charger des fichiers SWF ActionScript 3.0. Il existe une seule exception cette rgle : un fichier SWF ActionScript 2.0 peut se remplacer par un fichier SWF ActionScript 3.0 condition que le fichier ActionScript 2.0 nest effectu aucun chargement quelque niveau que ce soit. Pour ce faire, le fichier SWF ActionScript 2.0 doit appeler loadMovieNum() et passer la valeur 0 au paramtre level.

Compatibilit avec les versions prcdentes

27

En gnral, les fichiers SWF crits en ActionScript 1.0 ou 2.0 doivent faire lobjet dune migration sils sont destins fonctionner avec des fichiers SWF crits en ActionScript 3.0. Imaginez par exemple que vous ayez cr un lecteur de mdia avec ActionScript 2.0. Ce lecteur peut charger de nombreux contenus galement crs laide dActionScript 2.0. Mais vous ne pouvez pas crer un contenu avec ActionScript 3.0 et le charger dans ce lecteur. Vous devez migrer le lecteur vers ActionScript 3.0. Nanmoins, si vous avez cr un lecteur de mdia avec ActionScript 3.0, ce lecteur peut effectuer de simples chargements de votre contenu ActionScript 2.0.

Le tableau ci-aprs rcapitule les limitations des versions prcdentes de Flash Player relatives au chargement de nouveaux contenus et lexcution de code, ainsi que les restrictions lies la programmation croise entre les fichiers SWF crits avec diffrentes versions dActionScript.
Fonctionnalit prise en charge Environnement dexcution
Flash Player 7 Peut charger les fichiers SWF pour Machine virtuelle incluse Excute les fichiers SWF crits en ActionScript version 7 et antrieure AVM1 1.0 et 2.0 Flash Player 8 version 8 et antrieure AVM1 1.0 et 2.0 Flash Player 9 version 9 et antrieure AVM1 et AVM2 1.0, 2.0 et 3.0

Fonctionnalit prise en charge*

Contenu cr dans
ActionScript 1.0 et 2.0 ActionScript 3.0 ActionScript 1.0 et 2.0 et ActionScript 3.0 ActionScript 3.0

Peut charger du contenu et excuter le code de contenus cr dans Peut programmer le contenu cr dans *

ActionScript 1.0 et 2.0 uniquement ActionScript 1.0 et 2.0 uniquement

Contenu lisible dans Flash Player version 9 ou ultrieure. Le contenu lisible dans Flash Player version 8 ou antrieure peut tre charg, affich, excut et programm avec ActionScript 1.0 et 2.0 uniquement. ActionScript 3.0 via LocalConnection ActionScript 1.0 et 2.0 via LocalConnection

28

Introduction ActionScript 3.0

CHAPITRE 2

Prise en main dActionScript


Ce chapitre vise vous familiariser avec la programmation dActionScript et vous offrir les informations ncessaires la comprhension des concepts et des exemples prsents dans le reste de ce manuel. Nous commencerons par voquer les concepts de base de la programmation, tels quils sappliquent ActionScript. Nous verrons aussi les principes fondamentaux qui rgissent lorganisation et la construction dune application ActionScript.

Contenu
Concepts de programmation de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Utilisation des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Elments de programme courants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Exemple : Elment de portfolio danimation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Cration dapplications avec ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Cration de vos propres classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Exemple : Cration dune application de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Excution des exemples suivants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Concepts de programmation de base


ActionScript tant un langage de programmation, il vous sera plus facile de lapprendre si vous matrisez dj quelques concepts gnraux de programmation.

Quel est le rle dun programme informatique


Pour commencer, il est intressant davoir une ide conceptuelle de la nature et du rle dun programme informatique. Un tel programme prsente deux aspects principaux :

Il sagit dune srie dinstructions ou dtapes que lordinateur doit effectuer. Chaque tape implique terme la manipulation dinformations ou de donnes.

29

Dans un sens gnral, un programme informatique nest rien dautre quune liste dactions pas pas que vous ordonnez lordinateur, qui les excute une une. Chacune de ces actions reprsente une instruction. Comme vous le verrez tout au long de ce manuel, dans ActionScript, chaque instruction se termine par un point-virgule. Par nature, le seul rle dune instruction dun programme consiste manipuler quelques donnes stockes dans la mmoire de lordinateur. Voici un exemple simple : vous pouvez demander lordinateur dajouter deux nombres et de stoker le rsultat dans sa mmoire. Dans un cas de figure plus compliqu, imaginez un rectangle dessin sur lcran ; vous crivez un programme pour le dplacer un autre endroit de lcran. Lordinateur garde une trace de certaines informations relatives au rectangle : les coordonnes x, y de sa position, sa largeur et sa longueur, sa couleur, etc. Chacune de ces informations est stocke dans la mmoire de lordinateur. Un programme qui dplacerait le rectangle vers un autre emplacement comprendrait des procdures du type remplacer la coordonne x par 200, remplacer la coordonne y par 150 , cest--dire qui spcifieraient de nouvelles valeurs pour les coordonnes x et y. Bien entendu, lordinateur agit sur ces donnes pour effectivement modifier limage lcran en fonction de ces chiffres. Cependant, pour ce qui nous intresse, il est suffisant de savoir que le dplacement dun rectangle sur lcran nimplique rellement que la modification de quelques bits de donnes dans la mmoire de lordinateur.

Variables et constantes
La programmation reposant sur la modification dinformations dans la mmoire de lordinateur, il est ncessaire dtablir une reprsentation de chaque information au sein du programme. Une variable est un nom qui reprsente une valeur dans la mmoire de lordinateur. Lorsque lon crit des instructions visant manipuler des valeurs, on crit le nom de la variable plutt que la valeur. Chaque fois que lordinateur rencontre le nom de la variable dans le programme, il cherche dans sa mmoire la valeur utiliser. Si vous disposez par exemple de deux variables nommes value1 et value2, chacune contenant un nombre, vous pouvez additionner ces deux nombres laide de linstruction suivante :
value1 + value2

Lorsquil excute vritablement la procdure, lordinateur recherche les valeurs correspondant chaque variable et les ajoute. Dans ActionScript 3.0, une variable se compose de trois lments :

La nom de la variable Le type de donnes qui peut tre stock dans la variable La valeur relle stocke dans la mmoire de lordinateur

30

Prise en main dActionScript

Nous venons de voir comment lordinateur utilise le nom comme une balise demplacement destine la valeur. Le type de donnes a galement une importance. Lorsque vous crez une variable ActionScript, vous spcifiez le type de donnes quelle contiendra. A partir de l, les instructions de votre programme peuvent uniquement stocker ce type de donnes dans la variable considre et la valeur peut tre manipule selon les caractristiques associes ce type de donnes. Dans ActionScript, la cration dune variable (on parle galement de dclaration de variable) seffectue laide de linstruction var :
var value1:Number;

Dans ce cas, nous indiquons lordinateur quil doit crer une variable value1, qui contiendra uniquement des donnes Number, un type de donnes spcialement dfini dans ActionScript. Il est possible de stocker immdiatement une valeur dans la variable :
var value2:Number = 17;

Adobe Flash CS3 Professional offre une autre mthode de dclaration des variables. Lorsque vous placez un symbole de clip, un symbole de bouton ou un champ texte sur la scne, vous pouvez lui attribuer un nom doccurrence dans linspecteur Proprits. Derrire les squences, Flash cre une variable du mme nom que le nom doccurrence, que vous pouvez utiliser dans votre code ActionScript pour faire rfrence llment de la scne. Par exemple, si un symbole de clip se trouve sur la scne et que vous lui attribuez le nom doccurrence rocketShip, chaque fois que vous utilisez la variable rocketShip dans votre code ActionScript, cest en fait ce clip que vous manipulez.

Types de donnes
Dans ActionScript, de nombreux types de donnes sont votre disposition pour la cration de variables. Certains dentre eux peuvent tre considrs comme simples ou fondamentaux :

String : une valeur textuelle, telle quun nom ou le texte dun chapitre de livre Numeric : ActionScript 3.0 inclut trois types de donnes spcifiques aux valeurs numriques :

Number : toute valeur numrique, y compris les valeurs avec ou sans fraction int : un nombre entier (sans fraction) uint : un nombre entier non sign , cest--dire un nombre qui ne peut tre ngatif

Boolean : une valeur vrai/faux, qui indique par exemple si une instruction Switch est active ou si deux valeurs sont gales

Concepts de programmation de base

31

Les types de donnes simples reprsentent une seule information : par exemple, un seul nombre ou une seule squence de texte. Cependant, la majorit des types de donnes dfinis dans ActionScript peuvent tre considrs comme complexes puisquils reprsentent un ensemble de valeurs regroupes. Par exemple, une variable du type Date reprsente une valeur unique, un point temporel. Nanmoins, la valeur de date est reprsente par diffrentes valeurs : le jour, le mois, lanne, les heures, les minutes, les secondes, etc., et toutes correspondent des nombres distincts. Ainsi, bien que nous percevions une date comme une valeur unique (et quil soit possible de la traiter comme telle en crant une variable Date), lordinateur, en interne, la considre comme un groupe de valeurs qui, ensemble, dfinissent une seule date. La plupart des types de donnes intgrs et ceux crs par les programmeurs, sont des types de date complexes. Voici quelques exemples de types de donnes complexes que vous pourriez rencontrer :

MovieClip : un symbole de clip TextField : un champ texte dynamique ou saisi SimpleButton : un symbole de bouton Date : une information relative un point temporel (date et heure)

Deux termes sont souvent utiliss comme synonymes de type de donnes : classe et objet. Une classe est tout simplement la dfinition dun type de donnes. Il sagit dun modle applicable tous les types dobjets du type de donnes, comme si lon dclarait : toutes les variables du type de donnes Exemple prsentent les caractristiques suivantes : A, B et C . A linverse, un objet nest quune instance de classe : une variable dont le type de donnes est MovieClip peut tre dcrite comme un objet MovieClip. Les exemples ci-aprs dcrivent la mme chose :

Le type de donnes de la variable myVariable est Number. La variable myVariable est une instance de Number. La variable myVariable est un objet Number. La variable myVariable est une instance de la classe Number.

32

Prise en main dActionScript

Utilisation des objets


ActionScript constitue ce que lon appelle un langage de programmation orient objet. Ce terme dsigne une simple approche de la programmation, rien dautre quune manire dorganiser le code dun programme laide dobjets. Nous avons dfini plus haut un programme informatique comme une srie de procdures ou dinstructions que lordinateur effectue. Nous pouvons alors considrer quun programme informatique nest quune longue liste dinstructions. Dans le cas de la programmation oriente objet, les instructions du programme se divisent nanmoins en diffrents objets : le code tant rassembl en groupes de fonctionnalits, un mme conteneur runit des types de fonctionnalits et des informations connexes. En fait, si vous avez travaill avec des symboles dans Flash, vous savez dj manipuler les objets. Imaginons que vous ayez dfini un symbole de clip, par exemple le dessin dun rectangle, et que vous en ayez plac une copie sur la scne. Ce symbole de clip constitue aussi un objet (au sens littral) dans ActionScript ; il sagit dune instance de la classe MovieClip. Vous avez la possibilit de modifier plusieurs caractristiques du clip. Sil est slectionn, vous pouvez par exemple modifier certaines valeurs de linspecteur Proprits, telles que la coordonne x ou la largeur, ou encore diffrents rglages de couleur comme la transparence alpha ou lapplication dun filtre dombre porte. Dautres outils Flash vous permettent deffectuer davantage de modifications, par exemple loutil Transformer librement pour faire pivoter le rectangle. Toutes ces actions de transformation du symbole de clip disponibles dans lenvironnement de programmation de Flash sont galement disponibles dans ActionScript. Pour les utiliser, vous devez modifier les donnes runies dans un ensemble appel objet MovieClip. Dans la programmation oriente objet que propose ActionScript, chaque classe comprend trois types de caractristiques :

Proprits Mthodes Evnements

Pris ensemble, ces lments servent grer les donnes que le programme utilise, et dterminer les actions excuter ainsi que lordre dexcution.

Utilisation des objets

33

Proprits
Une proprit reprsente lune des donnes runies dans un objet. Un objet song, par exemple, peut prsenter des proprits nommes artist et title. La classe MovieClip possde des proprits telles que rotation, x, width et alpha. Les proprits sutilisent comme des variables individuelles ; on pourrait mme envisager les proprits comme les variables enfant dun objet. Voici des exemples de code ActionScript utilisant des proprits. Cette ligne de code dplace le MovieClip nomm square vers la coordonne x 100 pixels :
square.x = 100;

Le code ci-aprs utilise la proprit rotation pour faire pivoter le MovieClip square de manire lui donner la mme orientation que le MovieClip triangle :
square.rotation = triangle.rotation;

Ce code altre lchelle horizontale du MovieClip square pour quil soit une fois et demie plus large que prcdemment :
square.scaleX = 1.5;

Vous remarquerez la structure commune : vous utilisez une variable (square, triangle) pour nommer lobjet, suivie dun point (.), puis le nom de la proprit (x, rotation, scaleX). Le point, ou oprateur point, sert indiquer que vous accdez lun des lments enfant dun objet. La structure dans son ensemble, nom de variable-point-nom de proprit est utilise telle une variable, comme le nom dune valeur unique dans la mmoire de lordinateur.

Mthodes
Une mthode est une action qui peut tre effectue par un objet. Par exemple, si vous avez labor dans Flash un symbole de clip dont le scnario contient plusieurs cadres et animations, ce clip peut tre lu ou arrt, ou recevoir linstruction de placer la tte de lecture sur un cadre donn. Le code ci-dessous indique au MovieClip nomm shortFilm de commencer la lecture :
shortFilm.play();

Cette ligne de code arrte la lecture du MovieClip shortFilm (la tte de lecture sarrte lendroit o elle se trouve, comme lorsque vous suspendez une vido) :
shortFilm.stop();

Ce code-ci indique au MovieClip shortFilm de placer la tte de lecture sur Frame 1 et darrter la lecture (comme si vous rembobiniez une vido) :
shortFilm.gotoAndStop(1);

34

Prise en main dActionScript

Comme vous pouvez le constater, laccs aux mthodes, comme pour les proprits, seffectue en crivant le nom de lobjet (une variable), suivi dun point puis du nom de la mthode et de parenthses. Les parenthses servent indiquer que vous appelez la mthode , cest--dire que vous demandez lobjet deffectuer une action. Certaines valeurs (ou variables) sont places dans ces parenthses de manire transmettre des informations supplmentaires ncessaires lexcution de laction. On appelle ces valeurs des paramtres de mthode. Par exemple, la mthode gotoAndStop() doit savoir quel cadre atteindre ; un paramtre est donc requis dans les parenthses. Dautres mthodes, telles play() et stop(), ont une signification univoque et ne requirent donc aucune information complmentaire. Elles sont nanmoins suivies de parenthses. Contrairement aux proprits (et aux variables), les mthodes ne servent pas despaces rservs. Certaines mthodes peuvent cependant effectuer des calculs et renvoyer des rsultats pouvant servir de variables. Par exemple, la mthode toString() de la classe Number convertit une valeur numrique en une reprsentation textuelle :
var numericData:Number = 9; var textData:String = numericData.toString();

Par exemple, vous pouvez utiliser la mthode toString() si vous souhaitez afficher la valeur dune variable Number dans un champ texte lcran. La proprit text de la classe TextField (qui reprsente le contenu textuel rel affich lcran) se dfinit comme une chane (String), de manire quelle ne puisse contenir que des valeurs textuelles. Cette ligne de code convertit la valeur numrique de la variable numericData en texte, puis la fait apparatre lcran dans lobjet TextField nomm calculatorDisplay :
calculatorDisplay.text = numericData.toString();

Evnements
Tel que nous lavons dcrit, un programme informatique est une srie dinstructions que lordinateur effectue pas pas. Certains programmes trs simples ne sont rien de plus : lordinateur effectue quelques procdures, puis le programme se termine. Toutefois, les programmes ActionScript sont conus pour poursuivre leur excution, dans lattente dune saisie utilisateur, par exemple. Les vnements sont des mcanismes qui dterminent quelles instructions lordinateur doit suivre et quand.

Utilisation des objets

35

Par essence, des vnements sont des faits qui surviennent et auxquels ActionScript peut rpondre parce quil les connat. De nombreux dvnements sont lis linteraction de lutilisateur, par exemple un clic sur un bouton ou une pression sur une touche du clavier. Il existe nanmoins dautres types dvnement. Par exemple, si vous utilisez ActionScript pour charger une image externe, un vnement est capable de vous prvenir lorsque le chargement de limage est termin. Pendant lexcution dun programme ActionScript, Adobe Flash Player attend que des vnements se produisent et lorsque cest le cas, il excute le code ActionScript que vous avez spcifi en rponse.

Gestion des vnements de base


La gestion des vnements est la technique qui permet de spcifier les actions excuter en rponse des vnements particuliers. Lors de lcriture de code ActionScript en vue de la gestion des vnements, trois lments importants sont identifier :

La source de lvnement : quel objet sera concern par lvnement ? Par exemple, sur quel bouton aura lieu le clic ou quel objet Loader charge-t-il limage ? La source de lvnement est galement appele cible de lvnement car elle reprsente lobjet o lvnement est cibl par Flash Player (l o lvnement a lieu). Lvnement : que doit-il se passer, quel vnement voulez-vous rpondre ? Ce point est trs important, car de nombreux objets dclenchent plusieurs vnements. La rponse : quelles actions doivent faire suite loccurrence de lvnement ?

Tout code ActionScript de gestion des vnements doit contenir ces trois lments et respecte la structure de base suivante (les lments en gras sont des espaces rservs remplir selon le cas envisag) :
function eventResponse(eventObject:EventType):void { // Les actions excutes en rponse lvnement apparaissent ici. } eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);

Ce code a deux rles. Tout dabord, il dfinit une fonction, qui est une manire de spcifier les actions excuter en rponse lvnement. Ensuite, il appelle la mthode addEventListener() de lobjet source, inscrivant ainsi la fonction auprs de lvnement spcifi de manire que lorsque lvnement survient, les actions de la fonction ont lieu. Nous allons tudier chacun de ces rles en dtail.

36

Prise en main dActionScript

Une fonction sert regrouper des actions sous un nom unique, un raccourci qui vous permet de les excuter. La fonction est identique la mthode, cette exception prs quelle nest pas ncessairement associe une classe particulire (on pourrait dailleurs dfinir la mthode ainsi : une fonction associe une classe donne). Lorsque vous crez une fonction de gestion des vnements, vous devez choisir le nom de la fonction (dans ce cas eventResponse) mais aussi spcifier un paramtre (eventObject dans cet exemple). La spcification dun paramtre de fonction ressemble la dclaration de variable ; vous devez dans ce cas aussi indiquer le type de donnes du paramtre. Il existe une classe ActionScript dfinie pour chaque vnement, et le type de donnes que vous spcifiez pour le paramtre de fonction est toujours la classe associe lvnement particulier auquel vous souhaitez rpondre. Enfin, entre les accolades ouvrantes et fermantes ({ ... }), vous devez crire les instructions que lordinateur doit suivre lorsque lvnement survient. Une fois que vous avez crit la fonction de gestion dvnement, vous devez indiquer lobjet source (lobjet qui cause lvnement, par exemple le bouton) que la fonction appeler lorsque lvnement survient est votre fonction. Pour ce faire, appelez la mthode addEventListener() de cet objet (tous les objets lis des vnements ont une mthode addEventListener()). La mthode addEventListener() rclame deux paramtres :

Tout dabord, le nom de lvnement auquel vous voulez rpondre. Comme nous lavons dj vu, chaque vnement est affili une classe spcifique pour laquelle est dfinie une valeur spciale chaque vnement (en quelque sorte le nom unique de lvnement). Cette valeur sert de premier paramtre. Vient ensuite le nom de votre fonction de rponse lvnement. Sachez quun nom de fonction est crit sans parenthses lors du transfert en tant que paramtre.

Description du processus de gestion des vnements


Vous trouverez ci-dessous une description dtaille du processus ayant lieu lorsque vous crez un couteur dvnements. Dans ce cas, il sagit dun exemple illustrant la cration dune fonction dcouteur appele lorsque vous cliquez sur un objet myButton. Le code crit par le programmeur est le suivant :
function eventResponse(event:MouseEvent):void { // Actions performed in response to the event go here. } myButton.addEventListener(MouseEvent.CLICK, eventResponse);

Utilisation des objets

37

Voici comment ce code devrait fonctionner lorsquil est excut dans Flash Player :
1.

Lors du chargement du fichier SWF, Flash Player remarque quil existe une fonction eventResponse().

2.

Flash Player excute ensuite le code (notamment les lignes de code qui ne sont pas dans une fonction). Dans ce cas, il ny a quune ligne de code : lappel la mthode addEventListener() sur lobjet source (appel myButton) et le transfert de la fonction eventResponse en tant que paramtre.

38

Prise en main dActionScript

a.

En interne, myButton a une liste de fonctions qui coutent chaque vnement. Par consquent, lorsque sa mthode addEventListener() est appele, myButton stocke la fonction eventResponse() dans sa liste dcouteurs dvnements.

3.

A un certain moment, lutilisateur clique sur lobjet myButton et dclenche ainsi son vnement click (identifi comme MouseEvent.CLICK dans le code).

A ce stade, les oprations suivantes ont lieu :

Utilisation des objets

39

a.

Flash Player cre un objet, une instance de la classe associe lvnement en question (MouseEvent dans cet exemple). Pour de nombreux vnements, il sagira dune instance de la classe Event ; pour des vnements de souris, une instance MouseEvent et pour dautres vnements, une instance de la classe associe cet vnement. Cet objet cr est appel lobjet vnement. Il contient des informations spcifiques sur lvnement qui a eu lieu : le type dvnement, lendroit o il sest produit et dautres informations propres lvnement, le cas chant.

b.

Flash Player consulte ensuite la liste des couteurs dvnements stocks par myButton. Il parcourt ces fonctions lune aprs lautre en les appelant et en transmettant lobjet vnement la fonction en tant que paramtre. Etant donn que la fonction eventResponse() est lun des couteurs de myButton, Flash Player appelle la fonction eventResponse() dans le cadre de ce processus.

40

Prise en main dActionScript

c.

Lorsque la fonction eventResponse() est appele, le code quelle contient est excut et vos actions spcifies sont effectues.

Exemples de gestion dvnements


Voici quelques exemples plus concrets dvnements qui vous donneront une ide des lments les plus courants et des variations que vous pourrez utiliser lors de lcriture de votre propre code de gestion des vnements :

Clic sur un bouton pour lancer la lecture du clip actif. Dans lexemple suivant, playButton est le nom doccurrence du bouton et this est un nom spcial qui signifie lobjet actif :
this.stop(); function playMovie(event:MouseEvent):void { this.play(); } playButton.addEventListener(MouseEvent.CLICK, playMovie);

Dtection de la saisie dans un champ texte. Dans cet exemple, entryText est un champ de saisie de texte et outputText est un champ texte dynamique :
function updateOutput(event:TextEvent):void { var pressedKey:String = event.text; outputText.text = "You typed: " + pressedKey; } entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);

Utilisation des objets

41

Clic sur un bouton pour atteindre une URL. Dans ce cas, linkButton est le nom doccurrence du bouton :
function gotoAdobeSite(event:MouseEvent):void { var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/"); navigateToURL(adobeURL); } linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);

Cration dinstances dobjets


Bien entendu, pour utiliser un objet dans ActionScript, cet objet doit exister. La cration dun objet repose en partie sur la dclaration dune variable. Nanmoins la variable cre uniquement un emplacement vide dans la mmoire de lordinateur. Vous devez lui attribuer une valeur relle (cest--dire crer un objet et le stocker dans une variable) avant de pouvoir lutiliser ou le manipuler. Le processus de cration dun objet est appel instanciation de lobjet, soit la cration dune instance dune classe particulire. La cration dune instance dobjet peut passer par une mthode simple, qui nimplique pas ActionScript. Dans Flash, lorsque vous placez un symbole de clip, un symbole de bouton ou un champ texte sur la scne, puis que vous lui attribuez un nom doccurrence dans linspecteur Proprits, lapplication dclare une variable dote de ce nom doccurrence, cre une instance dobjet et stocke cet objet dans la variable. Il en va de mme dans Adobe Flex Builder : si vous crez un composant dans Macromedia MXML partir dAdobe (soit par codage dune balise MXML, soit en plaant le composant dans lditeur en mode Cration) et lui attribuez un identifiant (dans la balise MXML ou dans la vue des proprits Flex), cet identifiant devient le nom dune variable ActionScript et une instance du composant est cre et stocke dans la variable. Toutefois, vous ne pourrez pas toujours crer un objet visuellement. Plusieurs mthodes permettent donc de crer des instances dobjet laide dActionScript uniquement. A partir de plusieurs types de donnes ActionScript, vous pouvez tout dabord crer une instance en utilisant une expression littrale, une valeur crite directement dans le code ActionScript. Voici quelques exemples :

Valeur numrique littrale (entrez le nombre directement) :


var someNumber:Number = 17.239; var someNegativeInteger:int = -53; var someUint:uint = 22;

Valeur de chane littrale (placez le texte entre guillemets doubles) :


var firstName:String = "George"; var soliloquy:String = "To be or not to be, that is the question...";

42

Prise en main dActionScript

Valeur boolenne littrale (utilisez la valeur littrale true ou false) :


var niceWeather:Boolean = true; var playingOutside:Boolean = false;

Valeur XML littrale (entrez le XML directement) :


var employee:XML = <employee> <firstName>Harold</firstName> <lastName>Webster</lastName> </employee>;

ActionScript dfinit galement des expressions littrales pour les types de donnes Array, RegExp, Object et Function. Pour des informations dtailles sur ces classes, voir Utilisation de tableaux , la page 239, Utilisation dexpressions rgulires , la page 305 et Type de donnes Object , la page 104. Pour tout autre type de donnes, crez une instance dobjet laide de loprateur new et du nom de classe, comme suit :
var raceCar:MovieClip = new MovieClip(); var birthday:Date = new Date(2006, 7, 9);

Pour cette mthode de cration dun objet laide de loprateur new, on dit souvent appeler le constructeur de classe . Un constructeur est une mthode spciale qui est appele dans le cadre de la cration dune instance de classe. Notez que lorsque vous crez une instance de cette manire, vous placez des parenthses aprs le nom de classe et spcifiez parfois des valeurs de paramtres, comme vous le faites lorsque vous appelez une mthode.
REMARQUE

Vous pouvez utiliser loprateur new pour crer une instance dobjet mme pour les types de donnes qui permettent de crer des instances avec une expression littrale. Par exemple, ces deux lignes de code produisent exactement le mme rsultat :
var someNumber:Number = 6.33; var someNumber:Number = new Number(6.33);

Il est important de se familiariser avec la mthode new ClassName() de cration dobjets. Dans le cas dun type de donnes ActionScript qui ne dispose pas de reprsentation visuelle (et ne peut donc pas tre cr en plaant un lment sur la scne de Flash ou dans lditeur en mode Cration de Flex Builder), vous pouvez uniquement crer un objet directement dans ActionScript laide de loprateur new. Dans Flash, loprateur new peut en outre servir crer une instance dun symbole de clip dfini dans la bibliothque sans tre plac sur la scne. Pour plus dinformations ce sujet, voir Cration dobjets MovieClip laide dActionScript , la page 528.

Utilisation des objets

43

Elments de programme courants


Outre la dclaration des variables, la cration dinstances dobjets et la manipulation des objets laide des proprits et des mthodes, dautres lments de construction peuvent servir la cration dun programme ActionScript.

Oprateurs
Les oprateurs sont des symboles spciaux (et parfois des mots) qui permettent deffectuer des calculs. Ils sont surtout utiliss dans les oprations mathmatiques et pour la comparaison de valeurs. En rgle gnrale, un oprateur utilise une ou plusieurs valeurs et tablit un rsultat unique. Voici un exemple :

Loprateur de somme (+) ajoute deux valeurs pour obtenir un nombre unique :
var sum:Number = 23 + 32;

Loprateur de multiplication (*) multiplie une valeur par une autre pour obtenir un nombre unique :
var energy:Number = mass * speedOfLight * speedOfLight;

Loprateur dgalit (==) compare deux valeurs pour vrifier si elles sont gales, afin dobtenir une valeur vrai/faux (boolenne) unique :
if (dayOfWeek == "Wednesday") { takeOutTrash(); }

Comme illustr ici, loprateur dgalit et les autres oprateurs de comparaison sont le plus souvent utiliss avec linstruction if afin de dterminer si certaines actions sont effectuer ou non. Pour plus dinformations et dexemples sur lutilisation des oprateurs, voir Oprateurs , la page 118

44

Prise en main dActionScript

Commentaires
Lors de la rdaction du code ActionScript, il peut savrer utile de conserver des notes personnelles, expliquant par exemple le fonctionnement de certaines lignes de code ou la raison pour laquelle vous avez fait tel ou tel choix. Les commentaires de code vous permettent dinsrer du texte dans votre code que lordinateur devra ignorer. ActionScript comprend deux types de commentaires :

Commentaire sur une ligne : un commentaire sur une ligne est indiqu par linsertion de deux barres obliques en tout point dune ligne. Tout ce qui apparat aprs les barres obliques, jusqu la fin de la ligne, est ignor par lordinateur :
// Ceci est un commentaire, que lordinateur ignore. var age:Number = 10; // Dfinir lge sur 10 par dfaut.

Commentaire sur plusieurs lignes : un commentaire sur plusieurs lignes inclut un marqueur de dbut (/*), le contenu du commentaire, puis un marqueur de fin de commentaire (*/). Lordinateur ignore tout ce qui apparat entre les marqueurs de dbut et de fin, quel que soit le nombre de lignes utilis par le commentaire :
/* Ceci peut tre une description trs longue, qui dcrit par exemple ce quoi sert une fonction particulire ou qui explique une section du code. Dans tous les cas, lordinateur ignore ces lignes. */

Une autre utilit des commentaires est de dsactiver temporairement une ou plusieurs lignes de code, par exemple, si vous testez diffrentes manires daboutir un rsultat ou essayez didentifier pourquoi le code ActionScript ne fonctionne pas comme vous le pensiez.

Contrle du flux
Dans bien des cas, il vous sera ncessaire de rpter des actions de votre code, den effectuer certaines et pas dautres, de raliser des actions de remplacement selon les conditions rencontres, etc. Le contrle de flux permet de matriser les actions excutes. ActionScript propose plusieurs types dlments de contrle de flux.

Fonctions : les fonctions sont comme des raccourcis, elles permettent de regrouper une srie dactions sous un mme nom, qui serviront des calculs. Essentielles la gestion des vnements, elles constituent en outre un outil gnrique de regroupement des instructions. Pour plus dinformations sur les fonctions, voir Fonctions , la page 131.

Elments de programme courants

45

Boucles : les structures en boucle vous permettent de dsigner un jeu dinstructions que lordinateur excutera un nombre dfini de fois ou jusqu ce quune condition change. Souvent, les boucles sont utilises pour manipuler plusieurs lments connexes laide dune variable dont la valeur change chaque fois que lordinateur achve une boucle. Pour plus dinformations sur les boucles, voir Boucle , la page 128. Instructions conditionnelles : les instructions conditionnelles permettent de dsigner certaines actions effectuer uniquement dans certaines circonstances ou de dfinir des ensembles dactions destins diffrentes conditions. Linstruction conditionnelle la plus courante est linstruction if. Cette instruction if vrifie la valeur ou lexpression place dans ses parenthses. Si le rsultat est true, les lignes de code entre accolades sont excutes ; dans le cas contraire, elles sont ignores. Voici un exemple dutilisation :
if (age < 20) { // show special teenager-targeted content }

Linstruction if peut sassocier linstruction else, qui vous permet de dsigner les actions effectuer si la condition nest pas true :
if (username == "admin") { // effectuer des actions rserves ladministrateur, // par exemple afficher des options supplmentaires } else { // effectuer des actions non rserves ladministrateur }

Pour plus dinformations sur les instructions conditionnelles, voir Instructions conditionnelles , la page 126.

Exemple : Elment de portfolio danimation


Cet exemple indique comment vous pouvez assembler des bits dActionScript dans une application complte ActionScript. Llment de portfolio danimation est un exemple de la faon dont vous pourriez prendre une animation linaire existante (par exemple, un lment cr pour un client) et ajouter des lments interactifs mineurs pour lincorporer dans un portfolio en ligne. Le comportement interactif que nous ajouterons lanimation comprendra deux boutons sur lesquels lutilisateur pourra cliquer : lun pour dmarrer lanimation, et lautre pour naviguer vers une URL spare (le menu du portfolio ou la page daccueil de lauteur, par exemple).

46

Prise en main dActionScript

Le processus de cration de cet lment peut tre divis en deux sections principales :
1. 2. 3. 4.

Prparer le fichier FLA pour ajouter des lments ActionScript interactifs. Crer et ajouter les boutons. Ecrire le code ActionScript. Tester lapplication.

Prparation lajout de linteractivit


Avant dajouter des lments interactifs notre animation, nous devons configurer le fichier FLA en crant des emplacements pour ajouter notre nouveau contenu. Ceci comprend la cration dun espace sur la scne o les boutons sont placs, et la cration dun espace dans le fichier FLA pour garder diffrents lments spars.
Pour configurer votre FLA et ajouter des lments interactifs :
1.

Si vous navez pas encore danimation linaire laquelle vous ajouterez de linteractivit, crez un fichier FLA avec une animation simple (une interpolation de mouvement simple ou une interpolation de forme, par exemple). Autrement, ouvrez le fichier FLA contenant lanimation que vous prsentez dans le projet, et enregistrez-le sous un nouveau nom pour crer un nouveau fichier de travail. Choisissez lendroit o vous souhaitez que les deux boutons apparaissent lcran (un pour dmarrer lanimation et lautre pour effectuer un lien vers le portfolio de lauteur ou la page daccueil). Si ncessaire, effacez ou ajoutez de lespace sur la scne pour ce nouveau contenu. Si lanimation nen possde pas, vous pouvez crer une page de garde sur la premire image (vous pouvez dcaler lanimation dessus afin quelle dmarre sur limage 2 ou ultrieurement). Ajoutez un nouveau calque, au-dessus des autres calques dans le scnario, et renommez-le boutons. Il sagira du calque auquel vous ajouterez les boutons. Ajoutez un nouveau calque, au-dessus du calque boutons, et renommez-le actions. Il sagira du calque auquel vous ajouterez le code ActionScript votre application.

2.

3.

4.

Exemple : Elment de portfolio danimation

47

Cration et ajout de boutons


Nous allons ensuite crer et positionner les boutons qui constitueront le centre de notre application interactive.
Pour crer et ajouter des boutons au FLA :
1.

A laide des outils de dessin, crez laspect visuel de votre premier bouton (le bouton de lecture) sur le calque boutons. Par exemple, vous pouvez dessiner un ovale horizontal avec du texte au-dessus. A laide de loutil de slection, slectionnez toutes les parties graphiques du bouton. Dans le menu principal, choisissez Modifier > Convertir en symbole. Dans la bote de dialogue, choisissez le type de symbole de bouton, donnez-lui un nom et cliquez sur OK. Lorsque le bouton est slectionn, dans linspecteur Proprits, affectez-lui le nom doccurrence playButton. Rptez les tapes 1 5 afin de crer le bouton qui permettra lutilisateur daccder la page daccueil de lauteur. Nommez ce bouton homeButton.

2. 3. 4.

5.

6.

Ecriture du code
Le code ActionScript pour cette application peut tre divis en trois ensembles de fonctionnalits, mme sils seront tous entrs au mme endroit. Le code doit effectuer les trois oprations suivantes :

Arrter la tte de lecture ds le chargement du fichier SWF (lorsque la tte de lecture atteint limage 1). Ecouter un vnement pour dmarrer la lecture du fichier SWF lorsque lutilisateur clique sur le bouton de lecture. Ecouter un vnement pour que le navigateur accde lURL approprie lorsque lutilisateur clique sur le bouton de la page daccueil de lauteur.

Pour crer un code qui arrte la tte de lecture lorsquelle atteint limage 1 :
1. 2. 3.

Slectionnez limage-cl sur limage 1 du calque actions. Pour ouvrir le panneau Actions, slectionnez Fentre > Actions dans le menu principal. Dans le panneau Script, entrez le code suivant :
stop();

48

Prise en main dActionScript

Pour crire un code qui dmarre lanimation lorsque lutilisateur clique sur le bouton de lecture :
1. 2.

A la fin du code entr aux tapes prcdentes, ajoutez deux lignes vides. Entrez le code suivant en bas du script :
function startMovie(event:MouseEvent):void { this.play(); }

Ce code dfinit une fonction appele startMovie(). Lorsque la fonction startMovie() est appele, elle lance la lecture du scnario principal.
3.

Sur la ligne qui suit le code ajout ltape prcdente, entrez cette ligne de code :
playButton.addEventListener(MouseEvent.CLICK, startMovie);

Cette ligne de code enregistre la fonction startMovie() comme couteur pour lvnement click de playButton. Ainsi, chaque fois que lutilisateur clique sur le bouton playButton, la fonction startMovie() est appele.
Pour crire un code qui permet au navigateur daccder une URL lorsque lutilisateur clique sur le bouton de la page daccueil :
1. 2.

A la fin du code entr aux tapes prcdentes, ajoutez deux lignes vides. Entrez ce code en bas du script :
function gotoAuthorPage(event:MouseEvent):void { var targetURL:URLRequest = new URLRequest("http://example.com/"); navigateToURL(targetURL); }

Ce code dfinit une fonction gotoAuthorPage(). Cette fonction cre dabord une instance URLRequest reprsentant lURL http://example.com/, puis transmet cette URL la fonction navigateToURL() afin que le navigateur de lutilisateur louvre.
3.

Sur la ligne qui suit le code ajout ltape prcdente, entrez cette ligne de code :
homeButton.addEventListener(MouseEvent.CLICK, gotoAuthorPage);

Cette ligne de code enregistre la fonction gotoAuthorPage() comme couteur pour lvnement click de homeButton. Ainsi, chaque fois que lutilisateur clique sur le bouton homeButton, la fonction gotoAuthorPage() est appele.

Exemple : Elment de portfolio danimation

49

Test de lapplication
A ce stade, lapplication devrait fonctionner compltement. Testons-la.
Pour tester lapplication :
1.

Dans le menu principal, slectionnez Contrle > Tester lanimation. Flash cre le fichier SWF et louvre dans une fentre Flash Player. Testez les deux boutons pour vrifier quils fonctionnent. Si ce nest pas le cas, vrifiez les points suivants :

2. 3.

Les deux boutons ont-ils des noms dinstance diffrents ? Les appels la mthode addEventListener() utilisent-ils les mmes noms que les noms dinstance des boutons ? Les noms dvnement corrects sont-ils utiliss dans les appels la mthode addEventListener() ? Le paramtre correct est-il spcifi pour chacune des fonctions ? (Elles doivent toutes les deux avoir un seul paramtre avec le type de donnes MouseEvent.)

Tous ces points et la plupart des autres erreurs possibles devraient entraner lapparition dun message lorsque vous choisissez la commande Tester lanimation ou lorsque vous cliquez sur le bouton. Recherchez les erreurs de compilation dans le panneau prvu cet effet (celles qui ont lieu lorsque vous choisissez dabord Tester lanimation), et recherchez les erreurs dexcution dans le panneau Sortie (erreurs qui ont lieu pendant la lecture du fichier SWF - lorsque vous cliquez sur un bouton, par exemple).

Cration dapplications avec ActionScript


La cration dune application avec ActionScript requiert dautres connaissances que la syntaxe et les noms de classes utiliser. Bien que le contenu de ce manuel soit essentiellement ax sur ces deux sujets (la syntaxe et lutilisation des classes ActionScript), dautres informations pourront vous tre utiles, notamment quels programmes permettent dcrire du code ActionScript, comment ce code sorganise et sintgre dans une application et quelles tapes il faut respecter dans le dveloppement dune application ActionScript.

50

Prise en main dActionScript

Options dorganisation du code


Le code ActionScript 3.0 peut servir gnrer de nombreuses applications, quil sagisse dune simple animation graphique ou dun systme complexe de traitement des transactions client/ serveur. Selon le type dapplication envisag, vous choisirez lune ou plusieurs des mthodes suivantes pour intgrer ActionScript dans votre projet.

Stockage de code dans les images dun scnario Flash


Dans lenvironnement de programmation Flash, vous pouvez ajouter du code ActionScript toute image place dans un scnario. Ce code sera excut pendant la lecture du clip, au moment o la tte de lecture atteindra limage. Linsertion de code ActionScript dans des images est une manire simple dajouter des comportements des applications cres dans loutil de programmation Flash. Vous pouvez placer du code dans nimporte quelle image du scnario principal ou du scnario dun symbole de clip. Cette souplesse a nanmoins un cot. Lorsque vous crez des applications assez volumineuses, vous risquez de ne plus savoir quelles images contiennent quels scripts. A terme, cela peut compliquer la maintenance de lapplication. Pour simplifier lorganisation de leur code ActionScript, les dveloppeurs placent ce code uniquement dans la premire image du scnario ou sur un calque spcifique du document Flash. Il est ainsi plus facile de localiser et de maintenir le code dans les fichiers FLA Flash. Toutefois, la rutilisation du mme code dans un autre projet Flash oblige copier et coller le code dans le nouveau fichier. Si vous voulez continuer pouvoir utiliser votre code ActionScript dans de futurs projets Flash, vous prfrerez sans doute stocker ce code dans des fichiers ActionScript externes (des fichiers texte dots de lextension .as).

Stockage du code dans des fichiers ActionScript


Si votre projet implique une quantit importante de code ActionScript, la meilleure solution consiste stocker le code dans des fichiers source ActionScript (des fichiers texte dots de lextension .as). Un fichier ActionScript peut suivre deux structures, selon lutilisation que vous prvoyez den faire dans votre application.

Code ActionScript non structur : les lignes de code ActionScript, y compris les instructions et les dfinitions de fonction, sont crites comme si elles taient saisies directement dans un script de scnario, un fichier MXML, etc.

Cration dapplications avec ActionScript

51

Ecrit de cette faon, le code est accessible par le biais de linstruction ActionScript include ou de la balise <mx:Script> dans Adobe Flex MXML. Linstruction ActionScript include provoque linsertion du contenu dun fichier ActionScript externe un endroit particulier dun script et sur une tendue donne, comme sil avait t saisi directement. Dans le langage Flex MXML, la balise <mx:Script> vous permet de spcifier lattribut source qui identifie le fichier ActionScript externe charger cet endroit de lapplication. Par exemple, la balise suivante charge un fichier ActionScript externe nomm Box.as :
<mx:Script source=Box.as />

Dfinition de la classe ActionScript : la dfinition dune classe ActionScript, y compris ses dfinitions de mthode et de proprit. Lorsque vous dfinissez une classe, vous pouvez accder au code ActionScript correspondant en crant une instance de cette classe et en utilisant ses proprits, mthodes et vnements, comme vous le feriez avec toute classe ActionScript intgre. Cela implique deux oprations :

Utilisez linstruction import pour spcifier le nom complet de la classe, de manire ce que le compilateur ActionScript sache o la trouver. Par exemple, pour utiliser la classe MovieClip dans ActionScript, vous devez commencer par importer cette classe laide de son nom complet, en incluant le package et la classe.
import flash.display.MovieClip;

Une autre solution consiste importer le paquet contenant la classe MovieClip, ce qui revient crire des instructions import pour chaque classe du package :
import flash.display.*;

Cette obligation dimporter les classes auxquelles vous faites rfrence dans votre code ne sapplique pas aux classes de niveau suprieur, qui ne sont pas dfinies dans le package.
R E M A R QU E

Dans Flash, pour les scripts joints des images du scnario, les classes intgres (dans les packages flash.*) sont automatiquement importes. Cependant, si vous crivez vos propres classes, travaillez avec des composants de programmation de Flash (les packages fl.*) ou travaillez dans Flex, vous devez importer explicitement toutes les classes dont vous souhaitez crer des instances avec votre code.

52

Prise en main dActionScript

Ecrivez le code qui fait spcifiquement rfrence au nom de classe (normalement par dclaration dune variable dont le type de donnes est cette classe et par cration dune instance de la classe stocker dans la variable). Lorsque vous faites rfrence un autre nom de classe dans le code ActionScript, vous indiquez au compilateur de charger la dfinition de cette classe. Par exemple, si lon considre une classe externe nomme Box, linstruction suivante provoque la cration dune nouvelle instance de la classe Box :
var smallBox:Box = new Box(10,20);

Lorsque le compilateur rencontre pour la premire fois la rfrence de la classe Box, il effectue une recherche dans le code source charg afin de localiser la dfinition de la classe Box.

Choix de loutil appropri


Selon les contraintes quimpose votre projet et les ressources dont vous disposez, vous pouvez avoir le choix entre plusieurs outils ( utiliser individuellement ou en combinaison) pour lcriture et la modification de votre code ActionScript.

Outil de programmation Flash


Outre ses capacits de cration graphique et danimation, Adobe Flash CS3 Professional comprend des outils qui permettent de manipuler le code ActionScript, quil soit joint des lments dun fichier FLA ou regroup dans des fichiers ActionScript externes. Loutil de programmation Flash savre idal pour les projets impliquant des animations ou vidos consquentes, ou lorsque vous dsirez crer la plupart des actifs graphiques vous-mme, et tout particulirement lorsque linteraction utilisateur ou la fonctionnalit assure par ActionScript est minimale. Cet outil peut galement vous paratre adapt au dveloppement de votre projet ActionScript si vous prfrez crer les actifs visuels et crire le code dans une seule et mme application. Enfin, cet outil Flash peut vous convenir si vous souhaitez utiliser des composants dinterface printgrs et que la rduction de la taille du fichier SWF et la facilit denveloppement visuel sont des aspects essentiels de votre projet. Adobe Flash CS3 Professional inclut deux outils permettant lcriture de code ActionScript :

Panneau action : disponible lorsque vous manipulez un fichier FLA, ce panneau vous permet dcrire du code ActionScript associ aux images dun scnario. Fentre de script : la fentre de script est un diteur de texte ddi permettant de travailler sur des fichiers de code ActionScript (.as).

Cration dapplications avec ActionScript

53

Flex Builder
Adobe Flex Builder est le principal outil de cration de projets avec le cadre dapplication Flex. Au-del de ses outils de prsentation visuelle et ddition MXML, Flex Builder comprend un diteur ActionScript complet, qui permet de crer des projets Flex ou ActionScript. Les applications Flex prsentent de nombreux avantages, notamment un large ventail de commandes dinterface printgres et de commandes de disposition dynamique souples, ainsi que des mcanismes intgrs permettant de manipuler des sources de donnes externes et de lier des donnes externes aux lments dinterface utilisateur. Toutefois, ces fonctions ncessitant davantage de code, les applications Flex se caractrisent par une taille de fichier suprieure et leur enveloppe ne peut tre remanie aussi facilement que leurs homologues Flash. Utilisez Flex Builder si vous voulez crer avec Flex, dans un seul et mme outil, des applications de donnes sur Internet riches en fonctions, tout en modifiant du code ActionScript et MXLM et en disposant les lments de manire visuelle.

Editeur ActionScript tiers


Les fichiers ActionScript (.as) tant stocks comme de simples fichiers texte, tout programme susceptible de modifier des fichiers texte brut peut servir crire des fichiers ActionScript. Outre les produits ActionScript dAdobe, plusieurs programmes tiers ddition de texte ont t crs avec des fonctions propres ActionScript. Vous pouvez crire un fichier MXML ou des classes ActionScript laide de tout diteur de texte. A partir de ces fichiers, vous pouvez ensuite crer une application SWF (une application Flex ou ActionScript seul) laide du kit SDK Flex, qui comprend les classes dapplication Flex ainsi que le compilateur Flex. Pour de nombreux dveloppeurs, une autre solution consiste crire les classes ActionScript dans un diteur ActionScript tiers, en combinaison avec loutil de programmation Flash pour la cration du contenu graphique. Vous pouvez choisir un diteur ActionScript tiers dans les cas suivants :

Vous prfrez crire le code ActionScript dans un programme distinct, tout en concevant les lments visuels dans Flash. Vous utilisez une application de programmation non ActionScript (par exemple pour la cration de pages HTML ou llaboration dapplication dans un autre langage de programmation) et vous souhaitez lutiliser pour le code ActionScript galement. Vous voulez crer des projets ActionScript seul ou Flex laide du kit SDK Flex sans avoir acqurir Flash ou Flex Builder.

54

Prise en main dActionScript

Les principaux diteurs de code prenant en charge ActionScript sont les suivants :

Adobe Dreamweaver CS3 ASDT FDT FlashDevelop PrimalScript SE|PY XCode (avec modle ActionScript et fichiers conseil de code).

Processus de dveloppement ActionScript


Quelle que soit la taille de votre projet ActionScript, lutilisation dun processus de conception et de dveloppement vous aidera travailler plus efficacement. Les tapes ci-aprs forment le processus de dveloppement de base pour la conception dune application avec ActionScript 3.0 :
1.

Concevez votre application. Avant de commencer construire votre application, vous devez la dcrire dune manire ou dune autre.

2.

Composez votre code ActionScript 3.0. Vous pouvez crer du code ActionScript dans Flash, Flex Builder, Dreamweaver ou un diteur de texte.

3.

Crez un fichier application Flash ou Flex pour excuter votre code. Dans loutil de programmation Flash, cela implique la cration dun nouveau fichier FLA, la dfinition des paramtres de publication, lajout de composants dinterface lapplication et le rfrencement du code ActionScript. Dans lenvironnement de dveloppement Flex, la cration dun nouveau fichier dapplication requiert la dfinition de lapplication et lajout de composants dinterface laide de MXML, puis le rfrencement du code ActionScript.

4.

Publiez et testez votre application ActionScript. Cela implique que vous excutiez votre application au sein de lenvironnement de programmation Flash ou de dveloppement Flex, et que vous vrifiiez quelle effectue toutes les oprations voulues.

Cration dapplications avec ActionScript

55

Il nest pas indispensable de suivre ces tapes dans cet ordre ou dachever lune delle avant de passer la suivante. Par exemple, vous pouvez concevoir un cran de votre application (tape 1), puis crer les graphiques, boutons, etc. (tape 3), avant dcrire le code ActionScript (tape 2) et de le tester (tape 4). Vous pouvez tout aussi bien concevoir une partie de lcran, puis ajouter un bouton ou un lment dinterface la fois, crire le code ActionScript correspondant et le tester ds quil est prt. Bien quil soit judicieux de garder lesprit ces quatre stades du processus de dveloppement, il est en pratique plus efficace daller et venir entre ces tapes en fonction des besoins.

Cration de vos propres classes


Le processus de cration des classes destines vos projets peut paratre rbarbatif. Cependant, la partie la plus difficile de la cration dune classe est sa conception, cest--dire lidentification des mthodes, des proprits et des vnements quelle comprend.

Stratgies de conception dune classe


La conception oriente objet est un sujet complexe ; des carrires entires ont t consacres ltude acadmique et la pratique professionnelle de cette discipline. Voici tout de mme quelques suggestions dapproches qui vous aideront dmarrer votre projet.
1.

Rflchissez au rle que les instances de la classe auront jouer dans lapplication. En rgle gnrale, les objets servent lun des objectifs suivants :

Objet de valeur : ces objets constituent avant tout des conteneurs de donnes, cest-dire quils possdent plusieurs proprits et peu de mthodes (parfois aucune). Il sagit en gnral dune reprsentation dans le code dlments clairement dfinis, tels quune classe Song (reprsentant une seule chanson) ou une classe Playlist (reprsentant un groupe conceptuel de chansons) dans une application musicale. Objet daffichage : ce type correspond des objets qui saffichent rellement lcran, par exemple des lments dinterface, tels que des listes droulantes ou des libells dtat, des lments graphiques tels que des cratures dans un jeu vido, etc. Structure dapplication : ces objets jouent un large ventail de rles dans la logique ou le traitement effectu par les applications. Il sagit par exemple dun objet ralisant des calculs dans une simulation de biologie, un objet charg de synchroniser les valeurs entre une commande physique et le volume de sortie dune application musicale, un objet que gre les rgles dun jeu vido ou un objet qui charge une image enregistre dans une application de dessin.

56

Prise en main dActionScript

2.

Dcidez de la fonctionnalit requise pour la classe. Les diffrentes fonctionnalits constituent souvent les mthodes de la classe. Si la classe est destine servir dobjet de valeur, choisissez les donnes que les instances pourront inclure. Ces lments peuvent facilement devenir des proprits. Puisque que vous concevez la classe spcialement pour votre projet, le plus important est que vous tablissiez la fonctionnalit ncessaire votre application. Pour vous aider, vous pouvez rpondre ces questions :

3.

4.

Quel type dinformations lapplication stockera, surveillera et manipulera ? Vous pourrez alors identifier les objets de valeurs et les proprits qui vous serviront. Quels jeux dactions devront tre excuts, par exemple lors du premier chargement de lapplication, lorsque lutilisateur clique sur un bouton donn, lorsque la lecture de la squence sarrte, etc. ? Ces lments constituent souvent des mthodes (ou des proprits, si les actions consistent uniquement modifier des valeurs isoles). Pour chaque action considre, quelles informations seront ncessaires la classe pour son excution ? Ces lments deviennent les paramtres de la mthode. Pendant le fonctionnement de lapplication, quelles modifications surviendront dans la classe qui devront tre communiques dautres parties de lapplication ? Ces lments forment en gnral des vnements.

5.

Si un objet existant est semblable lobjet dont vous avez besoin mais quil lui manque certaines fonctionnalits que vous souhaitez ajouter, envisagez de crer une sous-classe (une classe qui repose sur la fonctionnalit dune classe existante plutt que de dfinir lensemble de sa fonctionnalit propre). Par exemple, si vous voulez crer une classe correspondant un objet affich lcran, vous pouvez crer votre classe en vous appuyant sur le comportement de lun des objets daffichage existants (par exemple, Sprite ou MovieClip). Dans ce cas, MovieClip (ou Sprite) constituerait la classe de base, que votre classe viendrait tendre. Pour plus dinformations sur la cration dune sous-classe, voir Hritage , la page 173.

Ecriture du code dune classe


Une fois que vous avez conu votre classe ou au moins identifi les informations quelle manipulera et les actions quelle devra effectuer, lcriture et la syntaxe utiliser sont relativement simples. Voici la procdure minimale de cration dune classe ActionScript :
1.

Ouvrez un nouveau document texte dans un programme ActionScript tel que Flex Builder ou Flash, dans un outil de programmation gnrique tel que Dreamweaver ou dans toute application vous permettant de manipuler des documents en texte brut.

Cration de vos propres classes

57

2.

Saisissez une instruction class afin de dfinir le nom de la classe. Pour ce faire, entrez les mots public class, puis le nom de la classe suivi dune paire daccolades qui entoureront le contenu de la classe (les dfinitions de mthode et de proprit). Voici un exemple dutilisation :
public class MyClass { }

Le mot public indique que la classe est accessible par tout autre code. Pour dautres possibilits, voir Attributs despace de nom pour le contrle daccs , la page 154.
3.

Entrez une instruction de package, qui indique le nom du package dans lequel le vtre apparatra. La syntaxe est le mot package suivi du nom complet du package, puis dune paire daccolages (qui entoureront llment structurel class). Par exemple, nous pouvons modifier le code prcdent comme suit :
package mypackage { public class MyClass { } }

4.

Dfinissez chaque proprit de la classe laide de linstruction var ajoute dans le corps de la classe. Utilisez la mme syntaxe que pour la dclaration de variable (en y ajoutant le qualificatif public). Par exemple, les lignes suivantes ajoutes entre les accolages de la dfinition de classe permettent de crer des proprits nommes textVariable, numericVariable et dateVariable :
public var textVariable:String = "some default value"; public var numericVariable:Number = 17; public var dateVariable:Date;

5.

Dfinissez chaque mthode de la classe laide de la syntaxe utilise pour dfinir une fonction. Voici un exemple :

Pour crer une mthode myMethod(), saisissez :


public function myMethod(param1:String, param2:Number):void { // utiliser les paramtres }

58

Prise en main dActionScript

Pour crer un constructeur (la mthode spciale appele pendant la cration dune instance de classe), crez une mthode dont le nom correspond exactement au nom de la classe :
public function MyClass() { // dfinir les valeurs initiales pour les proprits // et autrement dfinit lobjet textVariable = "Hello there!"; dateVariable = new Date(2001, 5, 11); }

Si vous nincluez aucune mthode constructeur dans votre classe, le compilateur cre automatiquement un constructeur vide (sans paramtres ni instructions) dans votre classe. Dautres lments de classe peuvent tre dfinis, mais avec plus dimplication.

Les accesseurs constituent un croisement spcial entre une mthode et une proprit. Lorsque vous crivez le code de dfinition dune classe, laccesseur scrit comme une mthode, de manire ce que vous puissiez accomplir plusieurs actions, et pas seulement la lecture ou lattribution dune valeur, seules actions disponibles lors de la dfinition dune proprit. Toutefois, lorsque vous crez une instance de votre classe, vous traitez laccesseur comme une proprit, en utilisant uniquement son nom pour lire ou attribuer la valeur. Pour plus dinformations, voir Les mthodes accesseurs de lecture et de dfinition , la page 163. Dans ActionScript, les vnements ne sont pas dfinis laide dune syntaxe spcifique. Pour dfinir les vnements de votre classe, vous utilisez la fonctionnalit de la classe EventDispatcher qui permet de suivre les couteurs dvnements et de notifier les vnements qui surviennent. Pour plus dinformations sur la cration dvnements dans vos propres classes, voir Chapitre 10, Gestion dvnements , la page 335.

Suggestions dorganisation des classes


Contrairement aux versions prcdentes dActionScript, ActionScript 3.0 ne vous impose pas dutiliser uniquement une classe par fichier. Avec ActionScript 3.0, vous pouvez enregistrer le code source de plusieurs classes dans un mme fichier .as. Dans certains cas, il semblera plus pratique de runir plusieurs classes dans un seul fichier source ; cela constitue pourtant une pratique de programmation peu recommand, pour deux raisons :

Il est difficile de rutiliser les classes de manire individuelle si elles sont toutes stockes dans un seul fichier volumineux. Il est difficile de localiser le code source dune classe dtermine si le nom du fichier ne correspond pas au nom de la classe.

Ainsi, Adobe vous recommande de toujours enregistrer le code source de chaque classe dans un fichier distinct et de nommer ce fichier comme la classe.
Cration de vos propres classes 59

Exemple : Cration dune application de base


Il est possible de crer des fichiers source ActionScript externes, dots de lextension .as, dans plusieurs applications : Flash, Flex Builder, Dreamweaver ou tout diteur de texte. ActionScript 3.0 peut sutiliser dans divers environnements de dveloppement dapplication, notamment loutil de programmation Flash et Flex Builder. Cette section tudie les diffrentes tapes de la cration et de lamlioration dune simple application ActionScript 3.0 laide de loutil de programmation Flash ou de loutil Flex Builder 2. Lapplication laborer prsente une manire simple dutiliser les fichiers de classe externes ActionScript 3.0 dans Flash et Flex. Cette mthode peut sappliquer tous les autres exemples dapplication proposs dans ce manuel.

Conception dune application ActionScript


Vous devez avoir une ide de lapplication laborer avant de commencer. La reprsentation de cette conception peut tre trs simple (le nom de lapplication et une brve description de son utilit) ou trs complique (un ensemble de cahiers des charges contenant de nombreux diagrammes UML). Le but de ce manuel nest pas de discuter en dtail des principes de conception dun logiciel. Il est toutefois important de garder lesprit que la conception de lapplication est une tape essentielle du dveloppement dans ActionScript. Notre premier exemple dapplication ActionScript est une application standard de salutation, du type Hello World . Sa conception est donc trs simple :

Lapplication se nommera HelloWorld. Elle affichera un seul champ texte contenant les termes Hello World! . Pour quelle soit facilement rutilisable, elle utilisera une seule classe oriente objet, nomme Greeter, qui pourra tre exploite dans un document Flash ou une application Flex. Une fois la version de base cre, vous pourrez ajouter dautres fonctionnalits, par exemple inviter lutilisateur saisir son nom et comparer ce nom une liste dutilisateurs reconnus.

Cette dfinition bien tablie, vous pouvez commencer crer lapplication elle-mme.

60

Prise en main dActionScript

Cration du projet HelloWorld et de la classe Greeter


Selon les dcisions de conception, le code de lapplication Hello World doit tre facilement rutilisable. Pour satisfaire cette exigence, lapplication utilise une seule classe oriente objet, nomme Greeter, qui est exploite au sein de lapplication que vous allez crer dans Flex Builder ou loutil de programmation Flash.
Pour crer la classe Greeter dans loutil de programmation Flash :
1. 2.

Dans loutil de programmation Flash, choisissez Fichier > Nouveau. Dans la bote de dialogue Nouveau document, slectionnez un fichier ActionScript et cliquez sur OK. Une nouvelle fentre de modification ActionScript saffiche. Choisissez Fichier > Enregistrer. Slectionnez un dossier pour votre application, nommez le fichier ActionScript Greeter.as, puis cliquez sur OK. Passez Ajout de code la classe Greeter , la page 61.

3.

Ajout de code la classe Greeter


La classe Greeter dfinit un objet, Greeter, que vous pourrez utiliser dans votre application HelloWorld.
Pour ajouter du code la classe Greeter :
1.

Tapez le code suivant dans le nouveau fichier :


package { public class Greeter { public function sayHello():String { var greeting:String; greeting = "Hello World!"; return greeting; } } }

La classe Greeter inclut une seule mthode sayHello() ; celle-ci renvoie une chane qui dit Hello au nom dutilisateur indiqu.
2.

Slectionnez Fichier > Enregistrer pour enregistrer ce fichier ActionScript.

Vous pouvez maintenant utiliser la classe Greeter dans une application Flash ou Flex.

Exemple : Cration dune application de base

61

Cration dune application utilisant votre code ActionScript


La classe Greeter que vous avez cre dfinit un ensemble autonome de fonctions logicielles, mais ne constitue pas pour autant une application complte. Pour lutiliser, vous devez crer un document Flash ou une application Flex. Lapplication HelloWorld cre une nouvelle instance de la classe Greeter. Voici la procdure dassociation de la classe Greeter votre application.
Pour crer une application ActionScript laide de loutil de programmation Flash :
1. 2.

Slectionnez Fichier > Nouveau. Dans la bote de dialogue Nouveau document, slectionnez Document Flash et cliquez sur OK. Une nouvelle fentre Flash apparat. Choisissez Fichier > Enregistrer. Slectionnez le mme dossier qui contient le fichier de la classe Greeter.as, nommez le document Flash HelloWorld.fla, puis cliquez sur OK. Dans la palette des outils de Flash, slectionnez loutil Texte et faites-le glisser sur la scne pour dfinir un nouveau champ texte denviron 300 pixels de largeur et 100 pixels de hauteur. Dans la fentre Proprits, slectionnez le champ texte sur la scne et tapez mainText comme nom dinstance du champ texte. Cliquez sur la premire image du scnario principal. Dans le panneau Actions, tapez le script suivant :
var myGreeter:Greeter = new Greeter(); mainText.text = myGreeter.sayHello("Bob");

3.

4.

5.

6. 7.

8.

Enregistrez le fichier.

Passez Publication et test de votre application ActionScript , la page 63.

62

Prise en main dActionScript

Publication et test de votre application ActionScript


Le dveloppement logiciel est un processus itratif. Vous crivez du code, essayez de le compiler, puis modifiez ce code jusqu ce que la compilation soit russie. Vous excutez, puis testez lapplication compile, pour voir si elle rpond aux intentions de conception. Si ce nest pas le cas, vous modifiez nouveau le code, jusqu obtenir satisfaction. Les environnements de dveloppement Flash et Flex Builder offrent plusieurs manires de publier, tester et dboguer vos applications. Voici une liste de base des tapes de test de lapplication HelloWorld dans chacun de ces environnements.
Pour publier et tester une application ActionScript laide de loutil de programmation Flash :
1.

Publiez votre application et recherchez les erreurs de compilation. Dans loutil de programmation Flash, slectionnez Contrle > Tester lanimation pour compiler votre code ActionScript et excutez lapplication HelloWorld. Si des erreurs ou des avertissements saffichent dans la fentre Sortie lorsque vous testez votre application, rsolvez-les dans les fichiers HelloWorld.fla ou HelloWorld.as, puis essayez de nouveau de tester lapplication. Sil nexiste aucune erreur de compilation, une fentre Flash Player affiche lapplication Hello World. Le texte Hello, Bob saffiche.

2.

3.

Vous venez de crer une application oriente objet simple mais complte qui utilise ActionScript 3.0. Passez Amlioration de lapplication HelloWorld , la page 63.

Amlioration de lapplication HelloWorld


Pour rendre lapplication un peu plus attrayante, vous allez maintenant faire en sorte quelle demande le nom de lutilisateur et le compare une liste prdfinie de noms. Tout dabord, vous devez mettre jour la classe Greeter de manire ajouter cette fonctionnalit. Vous devez ensuite mettre jour lapplication Flex ou Flash afin dexploiter cette fonctionnalit.
Pour mettre jour le fichier Greeter.as :
1.

Ouvrez le fichier Greeter.as.

Exemple : Cration dune application de base

63

2.

Remplacez son contenu par le suivant (les lignes nouvelles et modifies sont indiques en gras) :
package { public class Greeter { /** * Defines the names that should receive a proper greeting. */ public static var validNames:Array = ["Sammy", "Frank", "Dean"]; /** * Builds a greeting string using the given name. */ public function sayHello(userName:String = ""):String { var greeting:String; if (userName == "") { greeting = "Hello. Please type your user name, and then press the Enter key."; } else if (validName(userName)) { greeting = "Hello, " + userName + "."; } else { greeting = "Sorry, " + userName + ", you are not on the list."; } return greeting; } /** * Checks whether a name is in the validNames list. */ public static function validName(inputName:String = ""):Boolean { if (validNames.indexOf(inputName) > -1) { return true; } else { return false; } } } }

64

Prise en main dActionScript

La classe Greeter prsente maintenant plusieurs fonctions nouvelles :

Le tableau validNames rpertorie les noms dutilisateurs valables. Lors du chargement de la classe Greeter, ce tableau contient trois noms. La mthode sayHello() accepte dsormais un nom dutilisateur et modifie la salutation en fonction de certaines conditions. Si le nom dutilisateur userName est une chane vide (""), la proprit greeting permet de demander le nom de lutilisateur. Si le nom dutilisateur est valable, la salutation devient "Hello, userName." Enfin, si lune de ces deux conditions nest pas satisfaite, la variable greeting renvoie la valeur "Sorry, userName, you are not on the list." (Dsol, nom dutilisateur, vous ntes pas sur la liste). La mthode validName() renvoie la valeur true si le nom entr inputName se trouve dans le tableau validNames, et la valeur false sil ne sy trouve pas. Linstruction validNames.indexOf(inputName) compare toutes les chanes du tableau validNames la chane inputName. La mthode Array.indexOf() renvoie la position dindex de la premire instance dun objet dans un tableau ou la valeur -1 si lobjet ne sy trouve pas.

Ensuite, vous devez modifier le fichier Flash ou Flex qui rfrence cette classe ActionScript.
Pour modifier lapplication laide de loutil de programmation Flash :
1. 2.

Ouvrez le fichier HelloWorld.fla. Modifiez le script dans limage 1 de faon ce quune chane vide ("") soit transmise la mthode sayHello() de la classe Greeter :
var myGreeter:Greeter = new Greeter(); mainText.text = myGreeter.sayHello("");

3.

Slectionnez loutil Texte dans la palette des outils, puis crez deux champs texte sur la scne, lun ct de lautre, et directement sous le champ texte mainText existant. Dans le premier nouveau champ texte, tapez le texte Nom dutilisateur : comme libell. Slectionnez lautre nouveau champ texte et dans linspecteur Proprits, slectionnez InputText comme type de champ texte. Tapez textIn comme nom dinstance. Cliquez sur la premire image du scnario principal.

4. 5.

6.

Exemple : Cration dune application de base

65

7.

Dans le panneau Actions, ajoutez les lignes suivantes la fin du script existant :
mainText.border = true; textIn.border = true; textIn.addEventListener(KeyboardEvent.KEY_UP, keyPressed); function keyPressed(event:Event):void { if (event.keyCode == Keyboard.ENTER) { mainText.text = myGreeter.sayHello(textIn.text); } }

Le nouveau code ajoute la fonctionnalit suivante :


Les deux premires lignes dfinissent les bordures de deux champs texte. Un champ texte dentre tel que le champ textIn a un ensemble dvnements quil peut envoyer. La mthode addEventListener() vous permet de dfinir une fonction excute lorsquun type dvnement se produit. Dans ce cas, cet vnement est le fait dappuyer sur la touche Entre du clavier. La fonction personnalise keyPressed() appelle la mthode sayHello() de lobjet myGreeter, en transmettant le texte du champ texte textIn comme paramtre. Cette mthode renvoie une chane greeting en fonction de la valeur transmise. La chane renvoye est ensuite affecte la proprit text du champ texte mainText.

Le script complet pour limage 1 est le suivant :


mainText.border = true; textIn.border = true; var myGreeter:Greeter = new Greeter(); mainText.text = myGreeter.sayHello(""); textIn.addEventListener(KeyboardEvent.KEY_UP, keyPressed); function keyPressed(event:Event):void { if (event.keyCode == Keyboard.ENTER) { mainText.text = myGreeter.sayHello(textIn.text); } } 8. 9.

Enregistrez le fichier. Choisissez Contrle > Tester lanimation pour excuter lapplication. Lorsque vous excutez lapplication, il vous est demand dentrer un nom dutilisateur. Sil est valide (Sammy, Frank, ou Dean), lapplication affiche le message de confirmation hello .

66

Prise en main dActionScript

Excution des exemples suivants


Maintenant que vous avez dvelopp et excut lapplication ActionScript 3.0 HelloWorld , vous devez disposer des connaissances suffisantes pour excuter les autres exemples de code proposs dans ce manuel.

Test des exemples de code contenus dans un chapitre


Au fur et mesure que vous avancez dans ce manuel, vous pouvez tester les exemples de code utiliss pour illustrer les diffrentes rubriques. Ce test peut impliquer laffichage de la valeur des variables certains stades du programme, ou bien laffichage ou linteraction avec un contenu lcran. Pour tester le contenu visuel ou linteraction, les lments ncessaires seront dcrits avant ou dans le codeil vous suffira de crer un document avec les lments comme indiqu pour tester le code. Si vous souhaitez afficher la valeur dune variable un certain stade du programme, vous disposez de diffrentes faons pour le faire. Vous pouvez utiliser un dbogueur tel que ceux intgrs dans Flex Builder et Flash. Pour un test simple, nanmoins, il peut tre plus facile dimprimer les valeurs des variables pour les visualiser. Les tapes suivantes vous aideront crer un document Flash que vous pouvez utiliser pour tester un code et afficher des valeurs de variables :
Pour crer un document Flash afin de tester des exemples contenus dans un chapitre :
1. 2.

Crez un document Flash et enregistrez-le sur votre disque dur. Pour afficher des valeurs de test dans un champ texte sur la scne, activez loutil Texte et crez un champ texte dynamique sur la scne. Un champ texte haut et large avec le type de ligne dfini sur Multiligne et la bordure active sera trs utile. Dans linspecteur Proprits, donnez un nom dinstance au champ texte (par exemple outputText ). Pour crire des valeurs dans le champ texte, vous ajouterez un code qui appelle la mthode appendText() sur lexemple de code (dcrit ci-dessous). Vous pouvez galement ajouter un appel de la fonction trace() au code (comme dcrit cidessous) pour afficher les rsultats de lexemple. Pour tester un exemple donn, copiez le code dans le panneau Actions ; si ncessaire, ajoutez un appel de la fonction trace() ou ajoutez une valeur au champ texte laide de sa mthode appendText(). Dans le menu principal, choisissez Contrle > Tester lanimation pour crer un fichier SWF et afficher les rsultats.

3.

4.

5.

Excution des exemples suivants

67

Etant donn que cette approche sert afficher les valeurs de variables, vous disposez de deux faons pour effectuer cette opration pendant que vous testez les exemples : crire des valeurs dans une instance de champ texte sur la scne, ou utiliser la fonction trace() pour imprimer des valeurs sur le panneau Sortie.

La fonction trace() : La fonction trace() dActionScript crit les valeurs des paramtres qui lui sont transmis (variables ou expressions littrales) sur le panneau Sortie. Un grand nombre des exemples fournis dans ce manuel comprend dj un appel de la fonction trace(). Par consquent, pour ces exemples, il vous suffit de copier le code dans votre document et de tester le projet. Si vous souhaitez utiliser trace() pour tester la valeur dune variable dans un code qui ne la contient pas encore, ajoutez un appel trace() au code en transmettant la variable comme paramtre. Par exemple, si vous avez rencontr un code tel que celui-ci dans le chapitre,
var albumName:String = "Three for the money";

vous pouvez copier le code dans le panneau Actions, ajoutez ensuite un appel la fonction trace() tel que celui-ci pour tester le rsultat du code :
var albumName:String = "Three for the money"; trace("albumName =", albumName);

Lorsque vous excuterez le programme, cette ligne sera imprime :


albumName = Three for the money

Chaque appel de la fonction trace() peut prendre plusieurs paramtres, qui se suivent tous et forment une unit reprsente par une ligne imprime. Un saut de ligne est ajout la fin de chaque appel de la fonction trace(). Par consquent, des appels trace() spars sont imprims sur des lignes spares.

Un champ texte sur la scne : Si vous prfrez ne pas utiliser la fonction trace(), vous pouvez ajouter un champ texte dynamique sur la scne laide de loutil Texte et crire les valeurs dans ce champ texte de faon afficher les rsultats dun code. La mthode appendText() de la classe TextField peut tre utilise pour ajouter une valeur String la fin du contenu du champ texte. Pour accder au champ texte laide dActionScript, vous devez lui donner un nom dinstance dans linspecteur Proprits. Par exemple, si votre champ texte a le nom dinstance outputText, le code suivant peut tre utilis pour vrifier la valeur de la variable albumName :
var albumName:String = "Three for the money"; outputText.appendText("albumName = "); outputText.appendText(albumName);

Ce code crit le texte suivant dans le champ texte outputText :


albumName = Three for the money

68

Prise en main dActionScript

Comme le montre lexemple, la mthode appendText() ajoutera le texte sur la mme ligne que le contenu prcdent. Par consquent, il est possible dajouter plusieurs valeurs sur la mme ligne de texte laide de plusieurs appels appendText(). Pour que le texte continue sur la ligne suivante, vous pouvez ajouter un caractre de nouvelle ligne ("\n") :
outputText.appendText("\n"); // adds a line break to the text field

Contrairement la fonction trace(), la mthode appendText() accepte une seule valeur comme paramtre. Cette valeur doit tre une chane (une instance String ou un littral de chane). Pour imprimer la valeur dune variable qui nest pas une chane, vous devez dabord convertir la valeur en une chane. Pour cela, la meilleure faon est dappeler la mthode toString() de lobjet :
var albumYear:int = 1999; outputText.appendText("albumYear = "); outputText.appendText(albumYear.toString());

Utilisation des exemples de fin de chapitre


A linstar de ce chapitre, la plupart des chapitres de ce manuel contient un exemple de fin de chapitre qui reprend un grand nombre des concepts traits. Nanmoins, contrairement lexemple Hello World de ce chapitre, ces exemples ne seront pas prsents avec des explications dtailles. Dans chaque exemple, le code ActionScript 3.0 considr sera mis en vidence et tudi, mais aucune instruction ne sera fournie sur son excution dans un environnement de dveloppement spcifique. Nanmoins, les fichiers exemple fournis avec ce manuel incluent tous les fichiers ncessaires la compilation et lexcution des exemples, selon lenvironnement que vous aurez choisi.

Excution des exemples suivants

69

70

Prise en main dActionScript

CHAPITRE 3

Syntaxe et langage ActionScript


ActionScript 3.0 comprend le langage ActionScript de base et linterface de programmation dapplication dAdobe Flash Player (API). Le langage de base est la partie dActionScript qui implmente la spcification de langage ECMAScript (ECMA-262), version 4. LAPI de Flash Player fournit un accs par programme Flash Player. Ce chapitre fournit une brve introduction la syntaxe et au langage ActionScript de base. Il explique comment utiliser des types de donnes, des variables et la syntaxe approprie et comment contrler le flux de donnes entrant dans votre programme.

Contenu
Prsentation du langage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Objets et classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Packages et espaces de nom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Types de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Syntaxe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Oprateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118 Instructions conditionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Boucle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131

71

Prsentation du langage
Les objets sont au centre du langage ActionScript 3.0 : ils constituent ses lments fondamentaux. Chaque variable que vous dclarez, chaque fonction que vous crivez et chaque instance de classe que vous crez est un objet. Un programme ActionScript 3.0 peut tre compar un groupe dobjets qui effectuent des tches, rpondent des vnements et communiquent entre eux. Les programmeurs qui matrisent la programmation oriente objet dans Java ou C++ peuvent considrer les objets comme des modules contenant deux types de membres : les donnes enregistres dans des variables de membre ou des proprits, et le comportement accessible via des mthodes. La version 4 dECMAScript, la norme sur laquelle est base ActionScript 3.0, dfinit des objets de faon presque identique. Dans la version dECMAScript, les objets sont simplement des ensembles de proprits. Ces proprits sont des conteneurs pouvant contenir non seulement des donnes, mais galement des fonctions ou dautres objets. Si une fonction est associe un objet de cette faon, il sagit dune mthode. Alors quen thorie, la dfinition prliminaire dECMAScript peut paratre un peu trange pour les programmeurs ayant lhabitude dutiliser le langage Java ou C++, en pratique, la dfinition de types dobjets avec des classes ActionScript 3.0 est trs semblable la faon dont les classes sont dfinies dans Java ou C++. Il est important de distinguer les deux dfinitions dobjet lors de la prsentation du modle dobjet ActionScript et dautres rubriques plus techniques, mais gnralement, le terme proprits fait rfrence des variables de membre de classe, par opposition aux mthodes. La Rfrence du langage et des composants ActionScript 3.0, par exemple, utilise le terme proprits pour des variables ou des proprits de lecture/ dfinition. Il utilise le terme mthodes pour des fonctions faisant partie dune classe. Une lgre diffrence entre les classes dans ActionScript et les classes dans Java ou C++ rside dans le fait que dans ActionScript, elles ne sont pas que des entits abstraites. Les classes ActionScript sont reprsentes par des objets de classe qui stockent les mthodes et les proprits de la classe. Ainsi, des techniques pouvant sembler tranges pour les programmeurs de Java et C++ comme linsertion dinstructions ou de code excutable au niveau suprieur dune classe ou dun package sont autorises.

72

Syntaxe et langage ActionScript

Une autre diffrence entre les classes ActionScript et les classes Java ou C++ rside dans le fait que chaque classe ActionScript possde un objet prototype. Dans les versions prcdentes dActionScript, les objets prototypes, lis les uns aux autres en chanes de prototypes, servaient de base lensemble de la hirarchie dhritage de classe. Dans ActionScript 3.0, nanmoins, les objets prototypes ne jouent quun rle mineur dans le systme dhritage. Cependant, lobjet prototype peut toujours tre utile comme solution de rechange aux mthodes et aux proprits statiques si vous souhaitez partager une proprit et sa valeur parmi toutes les instances dune classe. Auparavant, les programmeurs ActionScript expriments pouvaient manipuler directement la chane du prototype avec des lments de langage intgrs spciaux. Maintenant que le langage fournit une implmentation plus avance dune interface de programmation base sur des classes, un grand nombre de ces lments de langage spciaux (__proto__ et __resolve,, par exemple) ne font plus partie du langage. De plus, les optimisations du mcanisme dhritage interne qui amliorent nettement les performances de Flash Player empchent daccder directement au mcanisme.

Objets et classes
Dans ActionScript 3.0, chaque objet est dfini par une classe. Une classe peut tre considre comme un modle pour un type dobjet. Les dfinitions de classe peuvent inclure des variables et des constantes, qui comprennent des valeurs de donnes, et des mthodes, qui sont des fonctions encapsulant le comportement li la classe. Les valeurs stockes dans les proprits peuvent tre des valeurs primitives ou dautres objets. Les valeurs primitives sont des nombres, des chanes ou des valeurs boolennes. ActionScript contient de nombreuses classes intgres faisant partie du langage de base. Certaines de ces classes intgres (Number, Boolean et String, par exemple), reprsentent les valeurs primitives disponibles dans ActionScript. Dautres (Array, Math et XML, par exemple) dfinissent des objets plus complexes faisant partie de la norme ECMAScript. Toutes les classes, quelles soient intgres ou dfinies par lutilisateur, drivent de la classe Object. Pour les programmeurs ayant une exprience avec ActionScript, il est important de noter que le type de donnes Object nest plus le type de donnes par dfaut, mme si toutes les autres classes en drivent. Dans ActionScript 2.0, les deux lignes de code suivantes taient quivalentes car labsence dune annotation de type signifiait quune variable aurait t de type Object :
var someObj:Object; var someObj;

Objets et classes

73

ActionScript 3.0, nanmoins, prsente le concept de variables non types, qui peuvent tre dsignes des deux faons suivantes :
var someObj:*; var someObj;

Une variable non type est diffrente dune variable de type Object. La diffrence majeure est que les variables non types peuvent contenir la valeur spciale undefined, alors quune variable de type Object ne le peut pas. Vous pouvez dfinir vos propres classes laide du mot-cl class. Vous pouvez dclarer des proprits de classe de trois faons diffrentes : vous pouvez dfinir des constantes avec le motcl const, des variables avec le mot-cl var et des proprits de lecture et de dfinition au moyen des attributs get et set dans une dclaration de mthode. Vous pouvez dclarer des mthodes avec le mot-cl function. Vous crez une instance dune classe laide de loprateur new. Lexemple suivant cre une instance de la classe Date appele myBirthday.
var myBirthday:Date = new Date();

Packages et espaces de nom


Les packages et les espaces de noms sont des concepts associs. Les packages vous permettent de regrouper des dfinitions de classe de faon faciliter le partage de code et rduire les conflits de noms. Les espaces de nom vous permettent de contrler la visibilit des identifiants (noms de mthode et de proprit, par exemple) et peuvent tre appliqus un code se trouvant lintrieur ou lextrieur dun package. Utilisez des packages pour organiser vos fichiers de classe et des espaces de nom pour grer la visibilit des mthodes et des proprits individuelles.

Packages
Les packages dans ActionScript 3.0 sont mis en uvre avec des espaces de nom, mais ils ne sont pas synonymes. Lorsque vous dclarez un package, vous crez implicitement un type despace de nom spcial qui est sr dtre connu lors de la compilation. Les espaces de nom, lorsque vous les crez explicitement, ne sont pas ncessairement connus au moment de la compilation.

74

Syntaxe et langage ActionScript

Lexemple suivant utilise la directive package pour crer un simple package contenant une classe :
package samples { public class SampleCode { public var sampleGreeting:String; public function sampleFunction() { trace(sampleGreeting + " from sampleFunction()"); } } }

Le nom de la classe dans cet exemple est SampleCode. Etant donn que la classe se trouve lintrieur du package samples, le compilateur qualifie automatiquement le nom de classe lors de la compilation sous la forme de son nom qualifi : samples.SampleCode. Le compilateur qualifie galement les noms des proprits ou des mthodes, de faon ce que sampleGreeting et sampleFunction() deviennent respectivement samples.SampleCode.sampleGreeting et samples.SampleCode.sampleFunction(). Un grand nombre de dveloppeurs (notamment ceux ayant une exprience de programmation Java) placent uniquement des classes au niveau suprieur dun package. ActionScript 3.0, cependant, prend non seulement en charge des classes au niveau suprieur dun package, mais galement des variables, des fonctions et mme des instructions. Une utilisation avance de cette fonction consiste dfinir un espace de nom au niveau suprieur dun package de faon ce que toutes les classes contenues dans ce dernier puissent lutiliser. Il convient nanmoins de noter que seuls deux spcificateurs daccs, public et internal, sont autoriss au niveau suprieur dun package. Contrairement Java qui vous permet de dclarer des classes imbriques prives, ActionScript 3.0 ne prend en charge ni les classes imbriques, ni les classes prives. Nanmoins, les packages ActionScript 3.0 et les packages du langage de programmation Java prsentent dautres ressemblances. Comme vous pouvez lobserver dans lexemple prcdent, des rfrences de package entirement qualifies sont exprimes laide de loprateur point (.), comme dans Java. Vous pouvez utiliser des packages pour organiser votre code dans une structure hirarchique intuitive que dautres programmeurs peuvent utiliser. Ceci facilite le partage de code en vous permettant de crer votre propre package et de le partager avec dautres personnes, et dutiliser des packages crs par dautres personnes dans votre code.

Packages et espaces de nom

75

Lutilisation de packages vous permet galement de vrifier que les noms didentifiant que vous utilisez sont uniques et quils ne sont pas incompatibles avec dautres noms didentifiant. Pour certaines personnes, il sagit dailleurs de lavantage principal des packages. Par exemple, deux programmeurs qui souhaitent partager leur code peuvent chacun avoir cr une classe appele SampleCode. Sans packages, il y aurait un conflit de noms, et la seule faon de rsoudre le problme serait de renommer lune des classes. Mais avec des packages, vous pouvez viter le conflit de noms en plaant lune des classes (ou de prfrence les deux) dans des packages avec des noms uniques. Vous pouvez galement inclure des points intgrs dans le nom de votre package afin de crer des packages imbriqus. Ceci vous permet de crer une organisation hirarchique des packages. Le package flash.xml fourni par lAPI de Flash Player illustre trs bien ceci. Le package flash.xml est imbriqu dans le package Flash. Le package flash.xml contient le programme danalyse XML hrit utilis dans les versions prcdentes dActionScript. Il se trouve maintenant dans le package flash.xml car le nom de la classe XML hrite est incompatible avec celui de la nouvelle classe XML qui met en uvre lXML pour la fonctionnalit de la spcification ECMAScript (E4X) disponible dans ActionScript 3.0. Mme sil est judicieux de commencer par dplacer la classe XML hrite dans un package, la plupart des utilisateurs des classes XML hrites importent le package flash.xml, ce qui provoque le mme conflit de noms moins que vous utilisiez toujours le nom entirement qualifi de la classe XML hrite (flash.xml.XML). Pour viter cela, la classe XML hrite est maintenant appele XMLDocument, comme lindique lexemple suivant :
package { class class class } flash.xml XMLDocument {} XMLNode {} XMLSocket {}

La plus grande partie de lAPI de Flash Player est organise sous le package Flash. Par exemple, le package flash.display contient lAPI de la liste daffichage, et le package flash.events contient le nouveau modle dvnement.

76

Syntaxe et langage ActionScript

Cration de packages
ActionScript 3.0 vous permet dorganiser vos packages, classes et fichiers source avec une grande souplesse. Les versions prcdentes dActionScript autorisaient uniquement une classe par fichier source et exigeaient que le nom du fichier source corresponde au nom de la classe. ActionScript 3.0 vous permet dinclure plusieurs classes dans un fichier source, mais une seule classe dans chaque fichier peut tre utilise par le code externe ce fichier. En dautres termes, une seule classe dans chaque fichier peut tre dclare lintrieur dune dclaration de package. Vous devez dclarer toute classe supplmentaire lextrieur de votre dfinition de package pour que ces classes soient invisibles pour le code externe ce fichier source. Le nom de la classe dclare lintrieur de la dfinition de package doit correspondre au nom du fichier source. ActionScript 3.0 permet galement de dclarer des packages avec davantage de flexibilit. Dans les versions prcdentes dActionScript, les packages reprsentaient simplement des rpertoires dans lesquels vous placiez des fichiers source, et vous ne dclariez pas les packages avec linstruction package mais incluiez plutt le nom du package dans le nom de classe complet dans votre dclaration de classe. Mme si les packages continuent reprsenter des rpertoires dans ActionScript 3.0, leur contenu nest pas limit aux seules classes. Dans ActionScript 3.0, vous utilisez linstruction package pour dclarer un package, ce qui signifie que vous pouvez galement dclarer des variables, des fonctions et des espaces de nom au niveau suprieur dun package. Vous pouvez galement y inclure des instructions excutables. Si vous dclarez des variables, des fonctions ou des espaces de nom ce niveau, les seuls attributs disponibles sont public et internal, et une seule dclaration au niveau du package par fichier peut utiliser lattribut public, que cette dclaration soit une classe, une variable, une fonction ou un espace de nom. Les packages sont utiles pour organiser votre code et viter les conflits de noms. Vous ne devez pas confondre le concept de packages avec le concept distinct dhritage de classe. Deux classes se trouvant dans le mme package ont un espace de nom en commun mais elles ne sont pas ncessairement lies lune lautre. De mme, il se peut quun package imbriqu nait aucun lien smantique avec son package parent.

Packages et espaces de nom

77

Importation de packages
Si vous souhaitez utiliser une classe se trouvant lintrieur dun package, vous devez importer soit le package soit la classe en question. Ceci diffre dActionScript 2.0 o limportation de classes tait facultatif. Par exemple, revenons lexemple de classe SampleCode fourni prcdemment dans ce chapitre. Si la classe se trouve dans un package appel samples, vous devez utiliser lune des instructions dimportation suivantes avant dutiliser la classe SampleCode :
import samples.*;

ou
import samples.SampleCode;

En gnral, les instructions import doivent tre aussi spcifiques que possible. Si vous envisagez dutiliser uniquement la classe SampleCode issue du package samples, importez uniquement la classe SampleCode au lieu du package entier auquel elle appartient. Limportation des packages entiers peut provoquer des conflits de noms inattendus. Vous devez galement placer le code source qui dfinit le package ou la classe dans votre chemin de classe. Le chemin de classe est une liste dfinie par lutilisateur de chemins de rpertoire locaux qui dtermine lendroit o le compilateur recherche des classes et des packages imports. Le chemin de classe est parfois appel chemin de cration ou chemin source. Une fois que vous avez import correctement la classe ou le package, vous pouvez utiliser le nom entirement qualifi de la classe (samples.SampleCode) ou simplement le nom de la classe (SampleCode). Les noms entirement qualifis sont utiles lorsque des classes, des mthodes ou des proprits ayant le mme nom gnrent un code ambigu mais ils peuvent tre difficiles grer si vous les utilisez pour tous les identifiants. Par exemple, lutilisation du nom entirement qualifi gnre un code dtaill lorsque vous instanciez une instance de classe SampleCode :
var mySample:samples.SampleCode = new samples.SampleCode();

Plus les niveaux de packages imbriqus augmentent, moins votre code est lisible. Lorsque vous pensez que des identifiants ambigus ne sont pas un problme, vous pouvez rendre votre code plus lisible en utilisant des identifiants simples. Par exemple, linstanciation dune nouvelle instance de la classe SampleCode est beaucoup moins longue si vous utilisez uniquement lidentifiant de classe :
var mySample:SampleCode = new SampleCode();

Si vous tentez dutiliser des noms didentifiant sans importer au pralable la classe ou le package appropri, il est impossible pour le compilateur de trouver les dfinitions de classe. Dun autre ct, si vous importez un package ou une classe, toute tentative de dfinition dun nom qui provoque un conflit avec un nom import gnre une erreur.

78

Syntaxe et langage ActionScript

Lors de la cration dun package, le spcificateur daccs par dfaut pour tous les membres de ce package est internal, ce qui signifie que, par dfaut, les membres du package ne sont visibles que pour dautres membres de ce package. Si vous souhaitez quune classe soit disponible pour un code externe au package, vous devez la dclarer public. Par exemple, le package suivant contient deux classes, SampleCode et CodeFormatter :
// fichier SampleCode.as package samples { public class SampleCode {} } // fichier CodeFormatter.as package samples { class CodeFormatter {} }

La classe SampleCode est visible en dehors du package car elle est dclare comme classe public. La classe CodeFormatter, cependant, est visible uniquement dans le package samples. Si vous tentez daccder la classe CodeFormatter en dehors du package samples, vous gnrez une erreur, comme lindique lexemple suivant :
import samples.SampleCode; import samples.CodeFormatter; var mySample:SampleCode = new SampleCode(); // okay, classe public var myFormatter:CodeFormatter = new CodeFormatter(); // erreur

Si vous souhaitez que les deux classes soient disponibles en dehors du package, vous devez les dclarer public. Vous ne pouvez pas appliquer lattribut public la dclaration de package. Les noms entirement qualifis sont utiles pour rsoudre les conflits de noms pouvant se produire lors de lutilisation de packages. Un tel scnario peut se produire si vous importez deux packages qui dfinissent des classes ayant le mme identifiant. Par exemple, prenez en compte le package suivant, qui possde galement une classe appele SampleCode :
package langref.samples { public class SampleCode {} }

Si vous importez les deux classes, comme suit, vous avez un conflit de noms lorsque vous vous rfrez la classe SampleCode :
import samples.SampleCode; import langref.samples.SampleCode; var mySample:SampleCode = new SampleCode(); // conflit de noms

Packages et espaces de nom

79

Le compilateur na aucun moyen de savoir quelle classe SampleCode il doit utiliser. Pour rsoudre ce conflit, vous devez utiliser le nom entirement qualifi de chaque classe, comme suit :
var sample1:samples.SampleCode = new samples.SampleCode(); var sample2:langref.samples.SampleCode = new langref.samples.SampleCode();
REMARQUE 80

Les programmeurs ayant une exprience C++ confondent souvent linstruction import avec linstruction #include. La directive #include est ncessaire dans C++ car les compilateurs C++ traitent un fichier la fois et ne cherchent pas de dfinitions de classe dans dautres fichiers, moins quun fichier den-tte soit inclus explicitement. ActionScript 3.0 a une directive include, mais elle nest pas conue pour importer des classes et des packages. Pour importer des classes ou des packages dans ActionScript 3.0, vous devez utiliser linstruction import et placer le fichier source qui contient le package dans le chemin de classe.

Espaces de noms
Les espaces de nom vous permettent de contrler la visibilit des proprits et des mthodes que vous crez. Considrez les spcificateurs de contrle daccs public, private, protected, et internal comme des espaces de nom intgrs. Si ces spcificateurs de contrle daccs prdfinis ne rpondent pas vos besoins, vous pouvez crer vos propres espaces de nom. Si vous avez lhabitude dutiliser des espaces de nom XML, cette section ne vous fournira pas de nouvelles informations, bien que la syntaxe et les dtails de limplmentation dActionScript soient lgrement diffrents de ceux dXML. Si vous navez jamais travaill avec des espaces de nom, le concept est simple, mais limplmentation possde une terminologie particulire que vous devrez apprendre. Pour comprendre comment fonctionnent les espaces de nom, il convient de savoir que le nom dune proprit ou dune mthode contient deux parties : un identifiant et un espace de nom. Lidentifiant est ce que vous considrez gnralement comme un nom. Par exemple, les identifiants dans la dfinition de classe suivante sont sampleGreeting et sampleFunction():
class SampleCode { var sampleGreeting:String; function sampleFunction () { trace(sampleGreeting + " from sampleFunction()"); } }

Syntaxe et langage ActionScript

Lorsque les dfinitions ne sont pas prcdes dun attribut despace de nom, leurs noms sont qualifis par lespace de nom internal par dfaut, ce qui signifie quils sont visibles uniquement aux appelants du mme package. Si le compilateur est dfini sur le mode strict, il gnre un avertissement indiquant que lespace de nom internal sapplique tout identifiant sans attribut despace de nom. Pour vrifier quun identifiant est disponible partout, vous devez spcifiquement faire prcder le nom de lidentifiant de lattribut public. Dans lexemple de code prcdent, sampleGreeting et sampleFunction() ont une valeur despace de nom dinternal. Vous devez suivre trois tapes de base lorsque vous utilisez des espaces de nom. Premirement, vous devez dfinir lespace de nom laide du mot-cl namespace. Par exemple, le code suivant dfinit lespace de nom version1 :
namespace version1;

Deuximement, vous appliquez votre espace de nom en lutilisant la place dun spcificateur de contrle daccs dans une dclaration de mthode ou de proprit. Lexemple suivant place une fonction appele myFunction() dans lespace de nom version1 :
version1 function myFunction() {}

Troisimement, une fois que vous avez appliqu lespace de nom, vous pouvez le rfrencer laide de la directive use ou en qualifiant le nom dun identifiant avec un espace de nom. Lexemple suivant fait rfrence la fonction myFunction() laide de la directive use :
use namespace version1; myFunction();

Vous pouvez galement utiliser un nom qualifi pour rfrencer la fonction myFunction(), comme lindique lexemple suivant :
version1::myFunction();

Dfinition despaces de nom


Les espaces de nom contiennent une valeur, lURI (Uniform Resource Identifier), parfois appele nom despace de nom. Un URI vous permet de vrifier que votre dfinition despace de nom est unique. Vous crez un espace de nom en dclarant une dfinition despace de nom de deux faons diffrentes. Vous pouvez soit dfinir un espace de nom avec un URI explicite, comme vous dfiniriez un espace de nom XML, soit omettre lURI. Lexemple suivant indique comment un espace de nom peut tre dfini laide dun URI :
namespace flash_proxy = http://www.adobe.com/flash/proxy;

Packages et espaces de nom

81

LURI sert de chane didentification unique pour cet espace de nom. Si vous omettez lURI, comme dans lexemple suivant, le compilateur cre une chane didentification interne unique la place de lURI. Vous navez pas accs cette chane didentification interne.
namespace flash_proxy;

Une fois que vous avez dfini un espace de nom (avec ou sans URI), vous ne pouvez pas le redfinir dans le mme domaine. Une tentative de dfinition dun espace de nom ayant t dfini dans le mme domaine gnre une erreur du compilateur. Si un espace de nom est dfini dans un package ou une classe, il risque de ne pas tre visible au code externe ce package ou cette classe, moins que vous utilisez le spcificateur de contrle daccs appropri. Par exemple, le code suivant indique lespace de nom flash_proxy dfini dans le package flash.utils. Dans lexemple suivant, labsence de spcificateur de contrle daccs signifie que lespace de nom flash_proxy est visible uniquement au code dans le package flash.utils et non au code externe au package :
package flash.utils { namespace flash_proxy; }

Le code suivant utilise lattribut public pour rendre lespace de nom flash_proxy visible au code externe au package :
package flash.utils { public namespace flash_proxy; }

Application despaces de nom


Appliquer un espace de nom signifie placer une dfinition dans un espace de nom. Les dfinitions que vous pouvez placer dans des espaces de nom peuvent tre des fonctions, des variables et des constantes (vous ne pouvez pas placer une classe dans un espace de nom personnalis).

82

Syntaxe et langage ActionScript

Supposez, par exemple, que vous avez une fonction dclare laide de lespace de nom de contrle daccs public. Lutilisation de lattribut public dans une dfinition de fonction place la fonction dans lespace de nom public et rend la fonction visible tout le code. Une fois que vous avez dfini un espace de nom, vous pouvez lutiliser de la mme faon que vous utiliseriez lattribut public, et la dfinition est disponible au code pouvant rfrencer votre espace de nom personnalis. Par exemple, si vous dfinissez un espace de nom example1, vous pouvez ajouter une mthode appele myFunction() laide de example1 comme attribut, tel que lindique lexemple suivant :
namespace example1; class someClass { example1 myFunction() {} }

Dclarer la mthode myFunction() laide de lespace de nom example1 comme attribut signifie que la mthode appartient lespace de nom example1. Tenez compte des points suivants lorsque vous appliquez des espaces de nom :

Vous pouvez appliquer un espace de nom uniquement chaque dclaration. Il nexiste aucun moyen dappliquer un attribut despace de nom plusieurs dfinitions simultanment. En dautres termes, si vous souhaitez appliquer votre espace de nom dix fonctions diffrentes, vous devez ajouter votre espace de nom comme attribut chacune des dix dfinitions de fonction. Si vous appliquez un espace de nom, vous ne pouvez pas spcifier un spcificateur de contrle daccs car les espaces de nom et les spcificateurs de contrle daccs sexcluent mutuellement. En dautres termes, vous ne pouvez pas dclarer une fonction ou une proprit comme public, private, protected, ou internal si vous appliquez votre espace de nom.

Rfrence despaces de nom


Il est inutile de rfrencer explicitement un espace de nom lorsque vous utilisez une mthode ou une proprit dclare avec lun des espaces de nom de contrle daccs (public, private, protected et internal, par exemple). En effet, laccs ces espaces de nom spciaux dpend du contexte. Par exemple, les dfinitions places dans lespace de nom private sont automatiquement disponibles pour le code dans la mme classe. Pour les espaces de nom que vous dfinissez, cependant, le contexte ne compte pas. Pour utiliser une mthode ou une proprit que vous avez place dans un espace de nom personnalis, vous devez rfrencer lespace de nom.

Packages et espaces de nom

83

Vous pouvez rfrencer des espaces de nom avec la directive use namespace ou qualifier le nom avec lespace de nom laide du ponctuateur de qualificatif de nom (::). Le fait de rfrencer un espace de nom avec la directive use namespace ouvre lespace de nom, ce qui permet de lappliquer nimporte quel identifiant non qualifi. Par exemple, si vous avez dfini lespace de nom example1, vous pouvez accder aux noms dans cet espace de nom en utilisant use namespace example1 :
use namespace example1; myFunction();

Vous pouvez ouvrir plusieurs espaces de nom simultanment. Une fois que vous avez ouvert un espace de nom avec use namespace, il reste ouvert dans le bloc de code dans lequel il a t ouvert. Il nexiste aucun moyen pour fermer explicitement un espace de nom. Nanmoins, le fait davoir plusieurs espaces de nom ouverts augmente la probabilit que des conflits de noms se produisent. Si vous prfrez ne pas ouvrir despace de nom, vous pouvez viter la directive use namespace en qualifiant le nom de la proprit ou de la mthode avec lespace de nom et le ponctuateur de qualificatif de nom. Par exemple, le code suivant indique comment vous pouvez qualifier le nom myFunction() avec lespace de nom example1 :
example1::myFunction();

Utilisation despaces de nom


Vous pouvez trouver un exemple concret despace de nom utilis pour empcher les conflits de nom dans la classe flash.utils.Proxy qui fait partie de lAPI de Flash Player. La classe Proxy, qui remplace la proprit Object.__resolve dActionScript 2.0, vous permet dintercepter des rfrences vers des mthodes ou des proprits non dfinies avant quune erreur se produise. Toutes les mthodes de la classe Proxy se trouvent dans lespace de nom flash_proxy afin dempcher les conflits de noms. Pour mieux comprendre comment lespace de nom flash_proxy est utilis, vous devez savoir comment utiliser la classe Proxy. La fonctionnalit de la classe Proxy est disponible uniquement aux classes qui hritent delle. En dautres termes, si vous souhaitez utiliser les mthodes de la classe Proxy dun objet, la dfinition de classe de lobjet doit tendre la classe Proxy. Par exemple, si vous souhaitez intercepter des tentatives dappel dune mthode non dfinie, vous devez tendre la classe Proxy puis remplacer la mthode callProperty() de la classe Proxy.

84

Syntaxe et langage ActionScript

Limplmentation des espaces de nom est gnralement un processus en trois tapes (dfinition, application et rfrence dun espace de nom). Etant donn que vous nappelez jamais explicitement une mthode de la classe Proxy, cependant, lespace de nom flash_proxy est dfini et appliqu uniquement, jamais rfrenc. LAPI de Flash Player dfinit lespace de nom flash_proxy et lapplique dans la classe Proxy. Votre code doit uniquement appliquer lespace de nom flash_proxy des classes qui tendent la classe Proxy. Lespace de nom flash_proxy est dfini dans le package flash.utils dune manire semblable la suivante :
package flash.utils { public namespace flash_proxy; }

Lespace de nom est appliqu aux mthodes de la classe Proxy comme indiqu dans lextrait suivant issu de la classe Proxy :
public class Proxy { flash_proxy function callProperty(name:*, ... rest):* flash_proxy function deleteProperty(name:*):Boolean ... }

Comme lindique le code suivant, vous devez dabord importer la classe Proxy et lespace de nom flash_proxy. Vous devez ensuite dclarer votre classe de faon ce quelle tende la classe Proxy (vous devez galement ajouter lattribut dynamic si vous compilez en mode strict). Lorsque vous remplacez la mthode callProperty(), vous devez utiliser lespace de nom flash_proxy.
package { import flash.utils.Proxy; import flash.utils.flash_proxy; dynamic class MyProxy extends Proxy { flash_proxy override function callProperty(name:*, ...rest):* { trace("method call intercepted: " + name); } } }

Packages et espaces de nom

85

Si vous crez une instance de la classe MyProxy et appelez une mthode non dfinie (la mthode testing() appele dans lexemple suivant, par exemple), votre objet Proxy intercepte lappel de mthode et excute les instructions se trouvant dans la mthode callProperty() remplace (dans ce cas, une instruction trace() simple).
var mySample:MyProxy = new MyProxy(); mySample.testing(); // appel de mthode intercept : test

Le fait que les mthodes de la classe Proxy se trouvent dans lespace de nom flash_proxy prsente deux avantages. Premirement, le fait davoir un espace de nom spar rduit lencombrement dans linterface publique des classes qui tendent la classe Proxy (il existe environ douze mthodes dans la classe Proxy que vous pouvez remplacer. Elles ne sont pas conues pour tre appeles directement. Le fait de toutes les placer dans lespace de nom public peut prter confusion). Deuximement, le fait dutiliser lespace de nom flash_proxy vite les conflits de nom si votre sous-classe Proxy contient des mthodes dinstance avec des noms correspondant lune des mthodes de la classe Proxy. Par exemple, vous pouvez nommer lune de vos mthodes callProperty(). Le code suivant est acceptable car votre version de la mthode callProperty() se trouve dans un espace de nom diffrent :
dynamic class MyProxy extends Proxy { public function callProperty() {} flash_proxy override function callProperty(name:*, ...rest):* { trace("method call intercepted: " + name); } }

Vous pouvez galement utiliser des espaces de nom pour accder des mthodes ou des proprits autrement quavec les quatre spcificateurs de contrle daccs (public, private, internal et protected). Par exemple, vous pouvez avoir des mthodes dutilitaire parpilles sur plusieurs packages. Vous souhaitez que ces mthodes soient disponibles pour tous vos packages, mais vous ne souhaitez pas quelles soient publiques. Pour cela, vous pouvez crer un espace de nom et lutiliser comme spcificateur de contrle daccs spcial. Lexemple suivant utilise un espace de nom dfini par lutilisateur pour regrouper deux fonctions se trouvant dans diffrents packages. En les regroupant dans le mme espace de nom, vous pouvez rendre les deux fonctions visibles une classe ou un package au moyen dune seule instruction use namespace.

86

Syntaxe et langage ActionScript

Cet exemple utilise quatre fichiers pour dmontrer la technique. Tous les fichiers doivent se trouver dans votre chemin de classe. Le premier fichier, myInternal.as, sert dfinir lespace de nom myInternal. Etant donn que le fichier se trouve dans un package appel example, vous devez placer le fichier dans un dossier appel example. Lespace de nom est marqu comme public pour pouvoir tre import dans dautres packages.
// myInternal.as dans le dossier example package example { public namespace myInternal = "http://www.adobe.com/2006/actionscript/ examples"; }

Le deuxime et le troisime fichiers, Utility.as et Helper.as, dfinissent les classes qui contiennent des mthodes devant tre disponibles pour dautres packages. La classe Utility se trouve dans le package example.alpha, ce qui signifie que le fichier doit tre plac dans un dossier appel alpha qui est un sous-dossier du dossier example. La classe Helper se trouve dans le package example.beta, ce qui signifie que le fichier doit tre plac dans un dossier appel beta qui est galement un sous-dossier du dossier example. Ces deux packages, example.alpha et example.beta, doivent importer lespace de nom avant de lutiliser.
// Utility.as dans le dossier example/alpha package example.alpha { import example.myInternal; public class Utility { private static var _taskCounter:int = 0; public static function someTask() { _taskCounter++; } myInternal static function get taskCounter():int { return _taskCounter; } } }

Packages et espaces de nom

87

// Helper.as dans le dossier example/beta package example.beta { import example.myInternal; public class Helper { private static var _timeStamp:Date; public static function someTask() { _timeStamp = new Date(); } myInternal static function get lastCalled():Date { return _timeStamp; } } }

Le quatrime fichier, NamespaceUseCase.as, est la classe de lapplication principale et doit tre un frre pour le dossier example. Dans Adobe Flash CS3 Professional, cette classe serait utilise comme classe Document pour le FLA. La classe NamespaceUseCase importe galement lespace de nom myInternal et lutilise pour appeler deux mthodes statiques qui rsident dans les autres packages. Lexemple utilise des mthodes statiques pour simplifier le code uniquement. Les mthodes statiques et dinstance peuvent tre places dans lespace de nom myInternal.
// NamespaceUseCase.as package { import flash.display.MovieClip; import example.myInternal; import example.alpha.Utility; import example.beta.Helper;

// importation de lespace de nom // importation de la classe Utility // importation de la classe Helper

public class NamespaceUseCase extends MovieClip { public function NamespaceUseCase() { use namespace myInternal; Utility.someTask(); Utility.someTask(); trace(Utility.taskCounter); // 2 Helper.someTask(); trace(Helper.lastCalled); } } }

// [heure de dernier appel de someTask()]

88

Syntaxe et langage ActionScript

Variables
Les variables vous permettent de stocker des valeurs que vous utilisez dans votre programme. Pour dclarer une variable, vous devez utiliser linstruction var avec le nom de variable. Dans ActionScript 2.0, lutilisation de linstruction var est ncessaire uniquement si vous utilisez des annotations de type. Dans ActionScript 3.0, lutilisation de linstruction var est toujours ncessaire. Par exemple, la ligne dActionScript suivante dclare une variable appele i :
var i;

Si vous omettez linstruction var lors de la dclaration dune variable, vous obtenez une erreur de compilateur en mode strict et une erreur dexcution en mode standard. Par exemple, la ligne de code suivante provoque une erreur si la variable i na pas t dfinie prcdemment :
i; // erreur si i na pas t dfinie prcdemment

Vous devez associer une variable un type de donnes lorsque vous dclarez la variable. La dclaration dune variable sans dsigner son type est autorise mais provoque un avertissement du compilateur en mode strict. Vous dsignez le type dune variable en ajoutant le nom de variable avec deux-points (:), suivi par le type de variable. Par exemple, le code suivant dclare une variable i de type int :
var i:int;

Vous pouvez affecter une valeur une variable laide de loprateur daffectation (=). Par exemple, le code suivant dclare une variable i et lui affecte la valeur 20 :
var i:int; i = 20;

Il peut tre plus pratique daffecter une valeur une variable au moment o vous dclarez cette dernire, comme dans lexemple suivant :
var i:int = 20;

La technique daffectation dune valeur une variable au moment de sa dclaration est couramment utilise non seulement lors de laffectation de valeurs primitives (nombres entiers et chanes) mais galement lors de la cration dun tableau ou de linstanciation de linstance dune classe. Lexemple suivant illustre un tableau dclar auquel est affect une valeur laide dune ligne de code.
var numArray:Array = ["zero", "one", "two"];

Vous pouvez crer une instance dune classe laide de loprateur new. Lexemple suivant cre une instance dune classe appele CustomClass, et affecte une rfrence linstance de classe nouvellement cre sur la variable appele customItem :
var customItem:CustomClass = new CustomClass();

Variables

89

Si vous avez plusieurs variables dclarer, vous pouvez le faire sur une ligne de code laide de loprateur virgule (,) pour sparer les variables. Par exemple, le code suivant dclare trois variables sur une ligne de code :
var a:int, b:int, c:int;

Vous pouvez galement affecter des valeurs chacune des valeurs sur la mme ligne de code. Par exemple, le code suivant dclare trois variables (a, b, et c) et affecte une valeur chacune dentre elles :
var a:int = 10, b:int = 20, c:int = 30;

Bien que vous puissiez utiliser loprateur virgule pour regrouper des dclarations de variable dans une instruction, ceci risque de rendre votre code moins lisible.

Prsentation du domaine de variable


Le domaine dune variable est la partie de votre code dans laquelle une rfrence lexicale peut accder la variable. Une variable globale est une variable dfinie dans toutes les parties de votre code, alors quune variable locale est une variable dfinie dans une seule partie de votre code. Dans ActionScript 3.0, le domaine des variables est toujours limit la fonction ou la classe dans laquelle elles sont dclares. Une variable globale est une variable que vous dfinissez en dehors de toute dfinition de classe ou de fonction. Par exemple, le code suivant cre une variable globale strGlobal en la dclarant en dehors de toute fonction. Lexemple indique quune variable globale est disponible la fois lintrieur et lextrieur de la dfinition de fonction.
var strGlobal:String = "Global"; function scopeTest() { trace(strGlobal); // Globale } scopeTest(); trace(strGlobal); // Globale

Vous dclarez une variable locale en dclarant la variable lintrieur dune dfinition de fonction. La plus petite partie de code pour laquelle vous pouvez dfinir une variable locale est une dfinition de fonction. Une variable locale dclare dans une fonction existe uniquement dans cette fonction. Par exemple, si vous dclarez une variable nomme str2 dans une fonction appele localScope(), cette variable ne sera pas disponible en dehors de cette fonction.
function localScope() { var strLocal:String = "local"; } localScope(); trace(strLocal); // erreur car strLocal nest pas dfinie globalement
90 Syntaxe et langage ActionScript

Si le nom utilis pour votre variable locale est dj dclar en tant que variable globale, la dfinition locale masque la dfinition globale alors que la variable locale est dans le domaine. La variable globale persiste en dehors de la fonction. Par exemple, le code suivant cre une variable globale de type chane appele str1, puis une variable locale du mme nom dans la fonction scopeTest(). Linstruction trace place dans la fonction gnre la valeur locale de la variable, tandis que celle qui est place en dehors de la fonction gnre la valeur globale de la variable.
var str1:String = "Global"; function scopeTest () { var str1:String = "Local"; trace(str1); // Locale } scopeTest(); trace(str1); // Globale

Les variables ActionScript, contrairement aux variables dans C++ et Java, nont pas de domaine de niveau bloc. Un bloc de code est un groupe dinstructions plac entre une accolade douverture ( { ) et une accolade de fermeture ( } ). Dans certains langages de programmation tels que C++ et Java, les variables dclares dans un bloc de code ne sont pas disponibles en dehors de ce bloc de code. Cette restriction de domaine est appele domaine de niveau bloc et nexiste pas dans ActionScript. Si vous dclarez une variable lintrieur dun bloc de code, elle est disponible non seulement dans ce bloc de code mais galement dans dautres parties de la fonction laquelle le bloc de code appartient. Par exemple, la fonction suivante contient des variables dfinies dans diffrents domaines de bloc. Toutes les variables sont disponibles dans la fonction.
function blockTest (testArray:Array) { var numElements:int = testArray.length; if (numElements > 0) { var elemStr:String = "Element #"; for (var i:int = 0; i < numElements; i++) { var valueStr:String = i + ": " + testArray[i]; trace(elemStr + valueStr); } trace(elemStr, valueStr, i); // toutes toujours dfinies } trace(elemStr, valueStr, i); // toutes dfinies si numElements > 0 } blockTest(["Earth", "Moon", "Sun"]);

Variables

91

Une implication intressante de labsence de domaine de niveau bloc est que vous pouvez lire ou crire dans une variable avant de la dclarer, tant quelle est dclare avant que la fonction se termine. Ceci est d une technique appele hissage, qui signifie que le compilateur dplace toutes les dclarations de variable en haut de la fonction. Par exemple, le code suivant compile mme si la fonction trace() initiale pour la variable num se produit avant la dclaration de la variable num :
trace(num); // NaN var num:Number = 10; trace(num); // 10

Nanmoins, le compilateur ne hisse aucune instruction daffectation. Ceci explique pourquoi la fonction trace() initiale de num fournit NaN (pas un nombre), qui est la valeur par dfaut pour des variables du type de donnes Number. Cela signifie que vous pouvez affecter des valeurs des variables mme avant leur dclaration, comme indiqu dans lexemple suivant :
num = 5; trace(num); // 5 var num:Number = 10; trace(num); // 10

Valeurs par dfaut


Une valeur par dfaut est le contenu dune variable avant que vous dfinissiez sa valeur. Vous initialisez une variable lorsque vous lui affectez sa premire valeur. Si vous dclarez une variable sans dfinir sa valeur, cette variable est non initialise. La valeur dune variable non initialise dpend de son type de donnes. Le tableau suivant dcrit les valeurs par dfaut des variables, organises par type de donnes :
Type de donnes
Boolean int Number Object String uint Non dclar (quivalent lannotation de type *) Toutes les autres classes, y compris celles dfinies par lutilisateur.

Valeur par dfaut


false

0
NaN null null

0
undefined null

92

Syntaxe et langage ActionScript

Pour les variables de type Number, la valeur par dfaut est NaN (pas un nombre), qui est une valeur spciale dfinie par la norme IEEE-754 pour indiquer une valeur qui ne reprsente pas un nombre. Si vous dclarez une variable sans dclarer son type de donnes, le type de donnes par dfaut sapplique, ce qui signifie que la variable nest pas type. Si vous ninitialisez pas non plus de variable non type avec une valeur, sa valeur par dfaut est undefined.
*

Pour les types de donnes autres que Boolean, Number, int, et uint, la valeur par dfaut dune variable non initialise est null. Ceci sapplique toutes les classes dfinies par lAPI de Flash Player, ainsi quaux classes personnalises que vous crez. La valeur null nest pas une valeur valide pour des variables de type Boolean, Number, int, ou uint. Si vous tentez daffecter une valeur null une telle variable, la valeur est convertie la valeur par dfaut pour ce type de donnes. Pour les variables de type Object, vous pouvez affecter une valeur null. Si vous tentez daffecter la valeur undefined une variable de type Object, la valeur est convertie en null. Pour les variables de type Number, il existe une fonction de niveau suprieur spciale appele qui renvoie la valeur Boolean true si la variable nest pas un nombre, et false autrement.
isNaN()

Types de donnes
Un type de donnes dfinit un ensemble de valeurs. Par exemple, le type de donnes Boolean est lensemble de deux valeurs exactement : true et false. Outre le type de donnes Boolean, ActionScript 3.0 dfinit plusieurs autres types de donnes couramment utiliss tels que String, Number et Array. Vous pouvez dfinir vos types de donns en utilisant des classes ou des interfaces afin de dfinir un ensemble de valeurs personnalis. Toutes les valeurs dans ActionScript 3.0, quelles soient primitives ou complexes, sont des objets. Une valeur primitive est une valeur qui appartient lun des types de donnes suivants : Boolean, int, Number, String, et uint. Lutilisation de valeurs primitives est gnralement plus rapide que lutilisation de valeurs complexes car ActionScript stocke les valeurs primitives de faon permettre des optimisations de vitesse et de mmoire.
R E MA R Q U E

Pour les lecteurs intresss par les dtails techniques, ActionScript stocke les valeurs primitives en tant quobjets inaltrables. Le fait quelles soient stockes en tant quobjets inaltrables signifie que le transfert par rfrence est identique au transfert par valeur. Ceci rduit lutilisation de la mmoire et augmente la vitesse dexcution car les rfrences sont gnralement beaucoup plus petites que les valeurs elles-mmes.

Types de donnes

93

Une valeur complexe est une valeur qui nest pas une valeur primitive. Les types de donnes qui dfinissent des ensembles de valeurs complexes comprennent Array, Date, Error, Function, RegExp, XML, et XMLList. De nombreux langages de programmation font la distinction entre les valeurs primitives et leurs enveloppes. Java, par exemple, a une valeur primitive int et la classe java.lang.Integer qui lenveloppe. Les valeurs primitives de Java ne sont pas des objets, mais leurs enveloppes le sont, ce qui rend les valeurs primitives utiles pour certaines oprations et les enveloppes pour dautres. Dans ActionScript 3.0, les valeurs primitives et leurs enveloppes sont indiffrenciables, des fins pratiques. Toutes les valeurs, mme les valeurs primitives, sont des objets. Flash Player traite ces types primitifs comme des cas spciaux qui se comportent comme des objets nexigeant pas le temps normal associ la cration dobjets. Cela signifie que les deux lignes de code suivantes sont quivalentes :
var someInt:int = 3; var someInt:int = new int(3);

Tous les types de donnes primitifs et complexes rpertoris ci-dessus sont dfinis par les classes de base dActionScript 3.0. Les classes de base vous permettent de crer des objets laide de valeurs littrales au lieu dutiliser loprateur new. Par exemple, vous pouvez crer un tableau laide dune valeur littrale ou du constructeur de classe Array, comme suit :
var someArray:Array = [1, 2, 3]; // valeur littrale var someArray:Array = new Array(1,2,3); // constructeur Array

Vrification des types


La vrification des types peut tre effectue lors de la compilation ou de lexcution. Les langages typs statiquement (C++ et Java, par exemple) effectuent la vrification des types lors de la compilation. Les langages typs dynamiquement (Smalltalk et Python, par exemple) effectuent la vrification des types lors de lexcution. En tant que langage typ dynamiquement, ActionScript 3.0 effectue la vrification des types lors de lexcution mais galement lors de la compilation, avec un mode de compilateur spcial appel mode strict. En mode strict, la vrification des types a lieu la fois lors de la compilation et de lexcution, mais en mode standard, elle a lieu lors de lexcution. Les langages typs dynamiquement vous permettent de structurer votre code avec une grande souplesse, mais des erreurs de type risquent de se produire lors de lexcution. Les langages typs statiquement signalent des erreurs de type lors de la compilation mais des informations de type sont requises ce moment-l.

94

Syntaxe et langage ActionScript

Vrification des types lors de la compilation


La vrification des types lors de la compilation est souvent favorise dans les projets plus importants car au fur et mesure que la taille du projet augmente, la flexibilit du type de donnes devient gnralement moins importante que la capture derreurs de type aussitt que possible. Cest pourquoi le compilateur dActionScript dans Adobe Flash CS3 Professional et dans Adobe Flex Builder 2 est excut en mode strict, par dfaut. Pour que la vrification des types lors de la compilation soit excute, le compilateur doit connatre les informations de type de donnes pour les variables ou les expressions dans votre code. Pour dclarer explicitement un type de donnes pour une variable, ajoutez loprateur deux points (:) suivi par le type de donnes comme suffixe au nom de variable. Pour associer un type de donnes un paramtre, utilisez loprateur deux points suivi par le type de donnes. Par exemple, le code suivant ajoute des informations de type de donnes au paramtre xParam, et dclare une variable myParam avec un type de donnes explicite :
function runtimeTest(xParam:String) { trace(xParam); } var myParam:String = hello; runtimeTest(myParam);

En mode strict, le compilateur dActionScript signale des incompatibilits de type comme erreurs de compilateur. Par exemple, le code suivant dclare un paramtre de fonction xParam, de type Object, mais tente ensuite daffecter des valeurs de type String et Number ce paramtre. Ceci produit une erreur de compilateur en mode strict.
function dynamicTest(xParam:Object) { if (xParam is String) { var myStr:String = xParam; // erreur de compilateur en mode strict trace("String: " + myStr); } else if (xParam is Number) { var myNum:Number = xParam; // erreur de compilateur en mode strict trace("Number: " + myNum); } }

Types de donnes

95

Mme en mode strict, cependant, vous pouvez choisir dabandonner la vrification des types lors de la compilation en laissant la partie droite dune instruction daffectation non type. Vous pouvez marquer une variable ou une expression comme non type soit en omettant une annotation de type, soit laide de lannotation de type astrisque spciale (*). Par exemple, si le paramtre xParam dans lexemple prcdent est modifi de faon ne plus avoir dannotation de type, le code compile en mode strict :
function dynamicTest(xParam) { if (xParam is String) { var myStr:String = xParam; trace("String: " + myStr); } else if (xParam is Number) { var myNum:Number = xParam; trace("Number: " + myNum); } } dynamicTest(100) dynamicTest("one hundred");

Vrification des types lors de lexcution


La vrification des types lors de lexcution sapplique dans ActionScript 3.0 quel que soit le mode, strict ou standard. Imaginez la situation dans laquelle la valeur 3 est transmise en tant quinstruction une fonction qui attend un tableau. En mode strict, le compilateur gnre une erreur car la valeur 3 nest pas compatible avec le type de donnes Array. Si vous dsactivez le mode strict et excutez en mode standard, le compilateur ne signale pas lincompatibilit de type mais la vrification des types lors de lexcution effectue par Flash Player provoque une erreur dexcution. Lexemple suivant prsente une fonction appele typeTest() qui attend une instruction Array mais qui reoit une valeur de 3. Ceci provoque une erreur dexcution en mode standard car la valeur 3 nest pas un membre du type de donnes dclar (Array) du paramtre.
function typeTest(xParam:Array) { trace(xParam); } var myNum:Number = 3; typeTest(myNum); // erreur dexcution dans ActionScript 3.0 en mode standard

96

Syntaxe et langage ActionScript

Il se peut galement que vous obteniez une erreur de type lors de lexcution alors que vous tes en mode strict. Ceci est possible si vous utilisez le mode strict mais que vous abandonnez la vrification des types lors de la compilation laide dune variable non type. Lorsque vous utilisez une variable non type, vous nliminez pas la vrification des types mais la remettez plus tard, au moment de lexcution. Par exemple, si la variable myNum dans lexemple prcdent na pas de type de donnes dclar, le compilateur ne peut pas dtecter lincompatibilit de type, mais Flash Player gnre une erreur dexcution car il compare la valeur dexcution de myNum (dfinie sur 3 en raison de linstruction daffectation), avec le type de xParam (dfini sur le type de donnes Array).
function typeTest(xParam:Array) { trace(xParam); } var myNum = 3; typeTest(myNum); // erreur dexcution dans ActionScript 3.0

La vrification des types lors de lexcution permet galement dutiliser lhritage avec davantage de souplesse que la vrification lors de la compilation. En remettant la vrification des types au moment de lexcution, le mode standard vous permet de rfrencer des proprits dune sous-classe mme si vous effectuez un upcast. Un upcast a lieu lorsque vous utilisez une classe de base pour dclarer le type dune instance de classe mais une sous-classe pour linstancier. Par exemple, vous pouvez crer une classe appele ClassBase qui peut tre tendue (les classes avec lattribut final ne peuvent pas tre tendues) :
class ClassBase { }

Vous pouvez ensuite crer une sous-classe de ClassBase appele ClassExtender, qui possde une proprit nomme someString, comme suit :
class ClassExtender extends ClassBase { var someString:String; }

Vous pouvez utiliser les deux classes pour crer une instance de classe dclare laide du type de donnes ClassBase mais instancie avec le constructeur ClassExtender. Un upcast est considr comme une opration sre car la classe de base ne contient aucune proprit ni mthode ne se trouvant pas dans la sous-classe.
var myClass:ClassBase = new ClassExtender();

Types de donnes

97

Une sous-classe, nanmoins, ne contient aucune proprit ni mthode que sa classe de base ne contient pas. Par exemple, la classe ClassExtender contient la proprit someString qui nexiste pas dans la classe ClassBase. Dans ActionScript 3.0 en mode standard, vous pouvez rfrencer cette proprit laide de linstance myClass sans gnrer derreur dexcution, comme indiqu dans lexemple suivant :
var myClass:ClassBase = new ClassExtender(); myClass.someString = "hello"; // aucune erreur dans ActionScript 3.0 en mode standard

Loprateur is
Loprateur is (nouveau pour ActionScript 3.0), vous permet de tester si une variable ou une expression est membre dun type de donnes. Dans les versions prcdentes dActionScript, loprateur instanceof offrait cette fonctionnalit, mais dans ActionScript 3.0, loprateur instanceof ne doit pas tre utilis pour tester lappartenance un type de donnes. Loprateur is doit tre utilis la place de loprateur instanceof pour la vrification des types manuelle car lexpression x instanceof y vrifie simplement la chane de prototype de x pour voir si y existe (et dans ActionScript 3.0, la chane de prototype ne fournit pas une image complte de la hirarchie dhritage). Loprateur is examine sa hirarchie dhritage et peut tre utilis pour vrifier non seulement si un objet est une instance dune classe particulire mais galement si un objet est une instance dune classe qui met en oeuvre une interface particulire. Lexemple suivant cre une instance de la classe Sprite nomme mySprite et utilise loprateur is pour tester si mySprite est une instance des classes Sprite et DisplayObject, et si elle met en oeuvre linterface IEventDispatcher :
var mySprite:Sprite = new Sprite(); trace(mySprite is Sprite); trace(mySprite is DisplayObject); trace(mySprite is IEventDispatcher); // true // true // true

Loprateur is vrifie la hirarchie dhritage et signale correctement que mySprite est compatible avec les classes Sprite et DisplayObject (la classe Sprite est une sous-classe de la classe DisplayObject). Loprateur is vrifie galement si mySprite hrite dune classe qui met en oeuvre linterface IEventDispatcher. Etant donn que la classe Sprite hrite de la classe EventDispatcher, qui met en oeuvre linterface IEventDispatcher, loprateur is signale correctement que mySprite met en oeuvre la mme interface.

98

Syntaxe et langage ActionScript

Lexemple suivant prsente les mmes tests que lexemple prcdent, mais avec instanceof au lieu de loprateur is. Loprateur instanceof identifie correctement que mySprite est une instance de Sprite ou de DisplayObject, mais il renvoie false lorsquil est utilis pour tester si mySprite met en oeuvre linterface IEventDispatcher.
trace(mySprite instanceof Sprite); // true trace(mySprite instanceof DisplayObject); // true trace(mySprite instanceof IEventDispatcher); // false

Loprateur as
Loprateur as (nouveau dans ActionScript 3.0), vous permet galement de vrifier si une expression est membre dun type de donnes. Contrairement loprateur is, cependant, loprateur as ne renvoie pas de valeur boolenne. A la place, loprateur as renvoie la valeur de lexpression eu lieu de true, et null au lieu de false. Lexemple suivant indique les rsultats obtenus lors de lutilisation de loprateur as au lieu de loprateur is lors de la simple vrification quune instance Sprite est un membre des types de donnes DisplayObject, IEventDispatcher, et Number ou non.
var mySprite:Sprite = new Sprite(); trace(mySprite as Sprite); // [objet Sprite] trace(mySprite as DisplayObject); // [objet Sprite] trace(mySprite as IEventDispatcher); // [objet Sprite] trace(mySprite as Number); // null

Lorsque vous utilisez loprateur as, loprande droite doit tre un type de donnes. Vous obtenez une erreur si vous tentez dutiliser une expression autre quun type de donnes comme oprande droite.

Classes dynamiques
Une classe dynamique dfinit un objet qui peut tre modifi lors de lexcution en ajoutant ou en modifiant des proprits et des mthodes. Une classe qui nest pas dynamique (la classe String, par exemple), est une classe scelle. Vous ne pouvez pas ajouter de proprits ni de mthodes une classe scelle lors de lexcution. Vous crez des classes dynamiques en utilisant lattribut dynamic lorsque vous dclarez une classe. Par exemple, le code suivant cre une classe dynamique nomme Protean :
dynamic class Protean { private var privateGreeting:String = "hi"; public var publicGreeting:String = "hello"; function Protean() { trace("Protean instance created"); } }
Types de donnes 99

Si vous instanciez ensuite une instance de la classe Protean, vous pouvez lui ajouter des proprits ou des mthodes en dehors de la dfinition de classe. Par exemple, le code suivant cre une instance de la classe Protean et ajoute une proprit nomme aString et une autre appele aNumber linstance :
var myProtean:Protean = new Protean(); myProtean.aString = "testing"; myProtean.aNumber = 3; trace(myProtean.aString, myProtean.aNumber); // test 3

Les proprits que vous ajoutez une instance dune classe dynamique sont des entits dexcution. Par consquent, toute vrification des types est effectue lors de lexcution. Vous ne pouvez pas ajouter une annotation de type une proprit que vous ajoutez de cette faon. Vous pouvez galement ajouter une mthode linstance myProtean en dfinissant une fonction et en lassociant une proprit de linstance myProtean. Le code suivant dplace linstruction trace dans une mthode nomme traceProtean():
var myProtean:Protean = new Protean(); myProtean.aString = "testing"; myProtean.aNumber = 3; myProtean.traceProtean = function () { trace(this.aString, this.aNumber); }; myProtean.traceProtean(); // test 3

Cependant, les mthodes cres de cette manire nont pas accs des mthodes ou des proprits prives de la classe Protean. De plus, mme les rfrences des mthodes ou des proprits publiques de la classe Protean doivent tre qualifies avec le mot-cl this ou le nom de classe. Lexemple suivant prsente la mthode traceProtean() tentant daccder aux variables prives et publiques de la classe Protean.
myProtean.traceProtean = function () { trace(myProtean.privateGreeting); // non dfini trace(myProtean.publicGreeting); // bonjour }; myProtean.traceProtean();

100

Syntaxe et langage ActionScript

Descriptions des types de donnes


Les types de donnes primitifs peuvent tre Boolean, int, Null, Number, String, uint, et void. Les classes ActionScript essentielles dfinissent galement les types de donnes complexes suivants : Object, Array, Date, Error, Function, RegExp, XML, et XMLList.

Type de donnes Boolean


Le type boolen est compos de deux valeurs : true et false. Les variables du type boolen ne prennent en charge aucune autre valeur. La valeur par dfaut dune variable boolenne qui a t dclare mais non initialise est false.

Type de donnes int


Le type de donnes int est stock en interne en tant que nombre entier 32 bits et comprend lensemble des entiers allant de -2,147,483,648 (-231) 2,147,483,647 (231 - 1), compris. Les versions prcdentes dActionScript offraient uniquement le type de donnes Number, qui tait utilis la fois pour les nombres entiers et les nombres en virgule flottante. Dans ActionScript 3.0, vous avez maintenant accs des types machine de bas niveau pour les nombres entiers 32 bits signs et non signs. Si votre variable ne doit pas utiliser de nombres en virgule flottante, lutilisation du type de donnes int au lieu du type de donnes Number est plus rapide et plus efficace. Pour les valeurs entires en dehors de la plage des valeurs int minimum et maximum, utilisez le type de donnes Number, qui peut grer des valeurs positives et ngatives 9,007,199,254,740,992 (valeurs entires 53 bits). La valeur par dfaut pour des variables du type de donnes int est 0.

Type de donnes Null


Le type de donnes Null contient une seule valeur, null. Il sagit de la valeur par dfaut pour le type de donnes String et toutes les classes qui dfinissent des types de donnes complexes, y compris la classe Object. Aucun des autres types de donnes primitifs (Boolean, Number, int et uint) ne contient la valeur null. Flash Player convertit la valeur null en la valeur par dfaut approprie si vous tentez daffecter null des variables de type Boolean, Number, int, ou uint. Vous ne pouvez pas utiliser ce type de donns comme annotation de type.

Types de donnes

101

Type de donnes Number


Dans ActionScript 3.0, le type de donnes Number peut reprsenter des entiers, des entiers non signs et des nombres en virgule flottante. Nanmoins, pour optimiser les performances, utilisez le type de donnes Number uniquement pour des valeurs entires suprieures ce que les types int et uint 32 bits peuvent stocker ou pour des nombres en virgule flottante. Pour stocker un nombre en virgule flottante, vous devez y insrer une virgule. Si vous omettez la virgule, le nombre est stock comme nombre entier. Le type de donnes Number utilise le format deux dcimales (64 bits) conformment la norme IEEE 754. Cette norme dicte comment les nombres en virgule flottante sont stocks laide des 64 bits disponibles. Un bit est utilis pour dsigner si le nombre est positif ou ngatif. Onze bits sont utiliss pour lexposant, qui est stock comme base 2. Les 52 bits restants sont utiliss pour stocker le significande (galement appel mantisse), qui correspond au nombre lev la puissance indiqu par lexposant. En utilisant certains de ses bits pour stocker un exposant, le type de donnes Number peut stocker des nombres en virgule flottante beaucoup plus grands que sil utilisait tous ses bits pour le significande. Par exemple, si le type de donnes Number a utilis les 64 bits pour stocker le significande, il pourrait stocker un nombre aussi grand que 265 - 1. En utilisant 11 bits pour stocker un exposant, le type de donnes Number peut lever son significande une puissance de 21023. Les valeurs maximum et minimum que le type Number peut reprsenter sont stockes dans des proprits statiques de la classe Number appeles Number.MAX_VALUE et Number.MIN_VALUE.
Number.MAX_VALUE == 1.79769313486231e+308 Number.MIN_VALUE == 4.940656458412467e-324

Bien que cette plage de nombres soit norme, elle est dune grande prcision. Le type de donnes Number utilise 52 bits pour stocker le significande. Par consquent, les nombres ncessitant plus de 52 bits pour une reprsentation prcise (la fraction 1/3, par exemple), ne sont que des approximations. Si votre application exige une prcision absolue avec des nombres dcimaux, vous devez utiliser le logiciel qui met en oeuvre larithmtique flottante dcimale plutt que larithmtique flottante binaire. Lorsque vous stockez des valeurs entires avec le type de donnes Number, seuls les 52 bits du significande sont utiliss. Le type de donnes Number utilise ces 52 bits et un bit masqu spcial pour reprsenter des nombres entiers de -9,007,199,254,740,992 (-253) 9,007,199,254,740,992 (253).

102

Syntaxe et langage ActionScript

Flash Player utilise la valeur NaN non seulement comme valeur par dfaut pour des variables de type Number, mais galement comme rsultat de toute opration devant renvoyer un nombre mais ne le faisant pas. Par exemple, si vous tentez de calculer la racine carre dun nombre ngatif, le rsultat est NaN. Dautres valeurs Number spciales comprennent linfini positif et linfini ngatif.
REMARQUE

Le rsultat de la division par 0 nest que NaN si le diviseur est galement 0. La division par 0 produit infinity lorsque le dividende est positif ou -infinity lorsquil est ngatif.

Type de donnes String


Le type de donnes String reprsente une squence de caractres 16 bits. Les chanes sont stockes en interne sous forme de caractres Unicode, au format UTF-16. Les chanes sont des valeurs inaltrables, comme dans le langage de programmation Java. Toute opration effectue sur une valeur String renvoie une nouvelle instance de la chane. La valeur par dfaut dune variable dclare avec le type de donnes String est null. La valeur null nest pas identique la chane vide (""), mme si elles reprsentent toutes les deux labsence de caractres.

Type de donnes uint


Le type de donnes uint est stock en interne sous la forme dun entier non sign 32 bits et est constitu de lensemble dentiers compris entre 0 et 4,294,967,295 (232-1), inclus. Utilisez le type de donnes uint dans des situations spciales ncessitant des entiers non ngatifs. Par exemple, vous devez utiliser le type de donnes uint pour reprsenter les valeurs de couleur des pixels car le type de donnes int a un bit de signe interne non appropri pour la gestion des valeurs de couleur. Pour les valeurs dentiers suprieures la valeur uint maximale, utilisez le type de donnes Number qui peut grer des valeurs dentiers 53 bits. La valeur par dfaut pour des variables du type de donnes uint est 0.

Types de donnes

103

Type de donnes void


Le type de donnes void contient une seule valeur, undefined. Dans les versions prcdentes dActionScript, undefined tait la valeur par dfaut pour les instances de la classe Object. Dans ActionScript 3.0, la valeur par dfaut pour les instances Object est null. Si vous tentez daffecter la valeur undefined une instance de la classe Object, Flash Player convertit la valeur en null. Vous pouvez affecter uniquement une valeur de undefined des variables non types. Les variables non types sont des variables dpourvues de toute annotation de type, ou qui utilisent lastrisque (*) pour lannotation de type. Vous pouvez utiliser void uniquement comme annotation de type renvoy.

Type de donnes Object


Le type de donnes Object est dfini par la classe Object. La classe Object sert de classe de base pour toutes les dfinitions de classe dans ActionScript. La version dActionScript 3.0 du type de donnes Object diffre de celle des versions prcdentes de trois faons. Premirement, le type de donnes Object nest plus le type de donnes par dfaut affect aux variables sans annotation de type. Deuximement, le type de donnes Object ne comprend plus la valeur undefined, qui tait la valeur par dfaut des instances Object. Troisimement, dans ActionScript 3.0, la valeur par dfaut pour les instances de la classe Object est null. Dans les versions prcdentes dActionScript, une variable sans annotation de type a t affecte automatiquement au type de donnes Object. Ceci nest plus valable dans ActionScript 3.0, qui inclut maintenant la notion de variable parfaitement non type. Les variables sans annotation de type sont dsormais considres comme non types. Si vous souhaitez faire comprendre aux lecteurs de votre code que vous souhaitez laisser une variable non type, vous pouvez utiliser le nouvel astrisque (*) pour lannotation de type, ce qui revient omettre une annotation de type. Lexemple suivant prsente deux instructions quivalentes qui dclarent une variable non type x :
var x var x:*

Seules les variables non types peuvent contenir la valeur undefined. Si vous tentez daffecter la valeur undefined une variable ayant un type de donnes, Flash Player convertit la valeur undefined en la valeur par dfaut pour ce type de donnes. Pour des instances du type de donnes Object, la valeur par dfaut est null, ce qui signifie que Flash Player convertit la valeur undefined en null si vous tentez daffecter undefined une instance Object.

104

Syntaxe et langage ActionScript

Conversions de type
Une conversion de type a lieu lorsquune valeur est transforme en une valeur dun type de donnes diffrent. Les conversions de type peuvent tre implicites ou explicites. Les conversions implicites (ou coercition) sont parfois effectues par Flash Player lors de lexcution. Par exemple, si la valeur 2 est affecte une variable du type de donnes Boolean, Flash Player convertit la valeur 2 en la valeur boolenne true avant daffecter la valeur la variable. Les conversions explicites (ou association ont lieu lorsque votre code demande au compilateur de traiter une variable dun type de donnes comme si elle appartenait un type de donnes diffrent. Lorsque des valeurs primitives sont impliques, lassociation convertit les valeurs dun type de donnes en un autre. Pour associer un objet un autre type de donnes, vous mettez le nom de lobjet entre parenthses et le faites prcder du nom du nouveau type. Par exemple, le code suivant prend une valeur boolenne et lassocie un entier numrique :
var myBoolean:Boolean = true; var myINT:int = int(myBoolean); trace(myINT); // 1

Conversions implicites
Les conversions implicites ont lieu lors de lexcution dans plusieurs contextes :

Dans des instructions daffectation Lorsque des valeurs sont transmises en tant quarguments de fonction Lorsque des valeurs sont renvoyes partir de fonctions Dans les expressions utilisant certains oprateurs tels que loprateur daddition (+)

Pour les types dfinis par lutilisateur, les conversions implicites ont lieu lorsque la valeur convertir est une instance de la classe de destination ou dune classe qui drive de cette dernire. En cas dchec de la conversion implicite, une erreur se produit. Par exemple, le code suivant contient une conversion implicite ayant russi et une conversion implicite ayant chou :
class A {} class B extends A {} var objA:A = new A(); var objB:B = new B(); var arr:Array = new Array(); objA = objB; // Succs de la conversion. objB = arr; // Echec de la conversion.

Pour les types primitifs, les conversions implicites sont gres en appelant les mmes algorithmes de conversion internes appels par les fonctions de conversion explicite. La section suivante traite de ces conversions de type primitif dans les dtails.
Types de donnes 105

Conversions explicites
Les conversions explicites, ou association, sont utiles lorsque vous compilez en mode strict et que vous ne souhaitez pas quune incompatibilit de types gnre une erreur de compilation. Ceci peut se produire lorsque vous savez que la coercition convertira vos valeurs correctement lors de lexcution. Par exemple, lorsque vous utilisez des donnes reues dun formulaire, vous pouvez utiliser la coercition pour convertir certaines valeurs de chane en valeurs numriques. Le code suivant gnre une erreur de compilation mme si le code sexcute correctement en mode standard :
var quantityField:String = "3"; var quantity:int = quantityField; // erreur de compilation en mode strict

Si vous souhaitez continuer utiliser le mode strict, mais que vous souhaitez que la chane soit convertie en nombre entier, vous pouvez utiliser la conversion explicite, comme suit :
var quantityField:String = "3"; var quantity:int = int(quantityField); // Succs de la conversion // explicite.

Association int, uint, et Number


Vous pouvez associer tout type de donnes lun des trois types de nombre suivants : int, uint, et Number. Si Flash Player ne peut pas convertir le nombre, la valeur par dfaut 0 est affecte pour les types de donnes int et uint, et la valeur par dfaut NaN est affecte pour le type de donnes Number. Si vous convertissez une valeur boolenne en un nombre, true devient la valeur 1 et false devient la valeur 0.
var myBoolean:Boolean = true; var myUINT:uint = uint(myBoolean); var myINT:int = int(myBoolean); var myNum:Number = Number(myBoolean); trace(myUINT, myINT, myNum); // 1 1 1 myBoolean = false; myUINT = uint(myBoolean); myINT = int(myBoolean); myNum = Number(myBoolean); trace(myUINT, myINT, myNum); // 0 0 0

106

Syntaxe et langage ActionScript

Les valeurs de chane qui contiennent des chiffres uniquement peuvent tre converties en lun des types de nombre. Les types de nombre peuvent galement convertir des chanes ressemblant des nombres ngatifs ou des chanes reprsentant une valeur hexadcimale (par exemple, 0x1A). Le processus de conversion ignore les espaces blancs gauche ou droite dans la valeur de chane. Vous pouvez galement associer des chanes qui ressemblent des nombres en virgule flottante laide de Number(). Le fait dinclure une virgule fait que uint() et int() renvoient un entier avec les caractres suivant la virgule ayant t tronqus. Par exemple, les valeurs de chane suivantes peuvent tre associes des nombres :
trace(uint("5")); trace(uint("-5")); trace(uint(" 27 ")); trace(uint("3.7")); trace(int("3.7")); trace(int("0x1A")); trace(Number("3.7")); // // // // // // // 5 4294967291. Renvoi depuis MAX_VALUE 27 3 3 26 3.7

Les valeurs de chane qui contiennent des caractres non numriques renvoient 0 lors de lassociation int() ou uint() et NaN lors de lassociation Number(). Le processus de conversion ignore les espaces blancs gauche et droite mais renvoie 0 ou NaN si une chane a un espace blanc sparant deux nombres.
trace(uint("5a")); // 0 trace(uint("ten")); // 0 trace(uint("17 63")); // 0

Dans ActionScript 3.0, la fonction Number() ne prend plus en charge les nombres octaux, ou de base 8. Si vous fournissez une chane avec un zro gauche la fonction Number() dActionScript 2.0, le nombre est interprt comme un nombre octal et converti en son quivalent dcimal. Ceci ne sapplique pas la fonction Number() dans ActionScript 3.0, qui ignore le zro gauche. Par exemple, le code suivant gnre un rsultat diffrent lorsquil est compil laide de diffrentes versions dActionScript :
trace(Number("044")); // ActionScript 3.0 44 // ActionScript 2.0 36

Types de donnes

107

Lassociation nest pas ncessaire lorsquune valeur dun type numrique est affecte une variable dun type numrique diffrent. Mme en mode strict, les types numriques sont convertis de faon implicite en dautres types numriques. Ceci signifie que dans certains cas, des valeurs inattendues peuvent tre renvoyes lorsque la plage dun type est dpasse. Les exemples suivants compilent tous en mode strict, mme si certains gnrent des valeurs inattendues :
var myUInt:uint = -3; // Affectation de la variable int/Number la // variable uint trace(myUInt); // 4294967293 var myNum:Number = sampleUINT; // Affectation de la variable int/uint // la variable Number trace(myNum) // 4294967293 var myInt:int = uint.MAX_VALUE + 1; // Affectation de la variable Number // la variable uint trace(myInt); // 0 myInt = int.MAX_VALUE + 1; // Affectation de la variable uint/Number // la variable int trace(myInt); // -2147483648

Le tableau suivant rcapitule les rsultats de lassociation au type de donnes Number, int, ou uint partir dautres types de donnes.
Valeur ou type de donnes
Boolean Date
null

Rsultat de la conversion en Number, int ou uint


Si la valeur est true, 1 ; sinon, 0. La reprsentation interne de lobjet Date, qui est le nombre de millisecondes depuis le 1er janvier 1970, minuit, heure universelle. 0 Si linstance est null et convertie en Number, NaN ; sinon, 0. Un nombre si Flash Player peut convertir la chane en un nombre ; autrement, NaN si converti en Number ou 0 si converti en int ou uint. Si converti en Number, NaN ; si converti en int ou uint, 0.

Object String
undefined

108

Syntaxe et langage ActionScript

Association Boolean
Lassociation Boolean partir de nimporte quel type de donnes numriques (uint, int, et Number) donne false si la valeur numrique est 0, et true autrement. Pour le type de donnes Number, la valeur NaN donne galement false. Lexemple suivant indique les rsultats de lassociation des nombres -1, 0, et 1 :
var myNum:Number; for (myNum = -1; myNum<2; myNum++) { trace("Boolean(" + myNum +") is " + Boolean(myNum)); }

Le rsultat de lexemple indique que sur les trois nombres, seul 0 renvoie une valeur false :
Boolean(-1) is true Boolean(0) is false Boolean(1) is true

Lassociation Boolean partir dune valeur String renvoie false si la chane est null ou une chane vide (""). Sinon, elle renvoie true.
var str1:String; trace(Boolean(str1)); var str2:String = ""; trace(Boolean(str2)); // La chane non initialise est null. // false // chane vide // false

var str3:String = " "; // espace blanc uniquement trace(Boolean(str3)); // true

Lassociation Boolean partir dune instance de la classe Object renvoie false si linstance est null, et true autrement :
var myObj:Object; // Lobjet non initialis est null. trace(Boolean(myObj)); // false myObj = new Object(); // instanciation trace(Boolean(myObj)); // true

Types de donnes

109

Les variables boolennes bnficient dun traitement particulier en mode strict car vous pouvez affecter des valeurs de tout type de donnes une variable boolenne sans association. La coercition implicite de tous les types de donnes au type de donnes Boolean a lieu mme en mode strict. En dautres termes, contrairement la plupart de tous les autres types de donnes, lassociation Boolean nest pas ncessaire pour viter des erreurs en mode strict. Les exemples suivants compilent tous en mode strict et se comportent comme prvu lors de lexcution :
var myObj:Object = new Object(); var bool:Boolean = myObj; trace(bool); // true bool = "random string"; trace(bool); // true bool = new Array(); trace(bool); // true bool = NaN; trace(bool); // false // instanciation

Le tableau suivant rcapitule les rsultats de lassociation au type de donnes Boolean partir dautres types de donnes :
Valeur ou type de donnes
String
null

Rsultat de la conversion en Boolean


false si la valeur est null ou la chane vide (""); true autrement. false false si la valeur est NaN ou 0 ; true autrement. false si linstance est null ; true autrement.

Number, int ou uint Object

Association String
Lassociation au type de donnes String partir de nimporte quel type de donnes numrique renvoie une reprsentation sous forme de chane du nombre. Lassociation au type de donnes String partir dune valeur boolenne renvoie la chane "true" si la valeur est true, et renvoie la chane "false" si la valeur est false. Lassociation au type de donnes String partir dune instance de la classe Object renvoie la chane "null" si linstance est null. Autrement, lassociation au type String partir de la classe Object renvoie la chane "[object Object]".

110

Syntaxe et langage ActionScript

Lassociation String partir dune instance de la classe Array renvoie une chane comprenant une liste spare par des virgules de tous les lments du tableau. Par exemple, lassociation suivante au type de donnes String renvoie une chane contenant les trois lments du tableau :
var myArray:Array = ["primary", "secondary", "tertiary"]; trace(String(myArray)); // primaire,secondaire,tertiaire

Lassociation String partir dune instance de la classe Date renvoie une reprsentation sous forme de chane de la date que linstance contient. Par exemple, lexemple suivant renvoie une reprsentation sous forme de chane de linstance de la classe Date (le rsultat indiqu correspond lheure dt de la cte ouest des Etats-Unis) :
var myDate:Date = new Date(2005,6,1); trace(String(myDate)); // vendredi 1er juillet 00:00:00 GMT-0700 2005

Le tableau suivant rcapitule les rsultats de lassociation au type de donnes String partir dautres types de donnes.
Valeur ou type de donnes
Array Boolean Date
null

Rsultat de la conversion en chane


Une chane comprenant tous les lments de tableau.
"true" ou "false"

Une reprsentation sous forme de chane de lobjet Date.


"null"

Number, int ou uint Object

Une reprsentation sous forme de chane du nombre. Si linstance est null, "null" ; sinon, "[object Object]".

Syntaxe
La syntaxe dun langage dfinit un ensemble de rgles suivre lors de lcriture du code excutable.

Respect de la casse
ActionScript 3.0 est un langage qui fait la distinction entre les majuscules et les minuscules. Les identifiants qui diffrent au niveau de la casse uniquement sont considrs comme diffrents. Par exemple, le code suivant cr deux variables diffrentes :
var num1:int; var Num1:int;

Syntaxe

111

Syntaxe point
Loprateur point (.) permet daccder aux proprits et aux mthodes dun objet. La syntaxe point vous permet de vous rapporter une mthode ou une proprit de classe laide dun nom dinstance, suivi par loprateur point et le nom de la mthode ou de la proprit. Par exemple, considrez la dfinition de classe suivante :
class DotExample { public var prop1:String; public function method1():void {} }

La syntaxe point vous permet daccder la proprit prop1 et la mthode method1() laide du nom dinstance cr dans le code suivant :
var myDotEx:DotExample = new DotExample(); myDotEx.prop1 = hello; myDotEx.method1();

Vous pouvez utiliser la syntaxe point lorsque vous dfinissez des packages. Vous utilisez loprateur point pour rfrencer des packages imbriqus. Par exemple, la classe EventDispatcher se trouve dans un package appel events qui est imbriqu dans le package nomm flash. Vous pouvez rfrencer le package events laide de lexpression suivante :
flash.events

Vous pouvez galement rfrencer la classe EventDispatcher au moyen de cette expression :


flash.events.EventDispatcher

Syntaxe barre oblique


La syntaxe barre oblique nest pas prise en charge dans ActionScript 3.0. La syntaxe barre oblique tait utilise dans des versions prcdentes dActionScript pour indiquer le chemin dun clip ou dune variable.

112

Syntaxe et langage ActionScript

Littraux
Un littral est une valeur qui apparat directement dans votre code. Voici quelques exemples de littraux :
17 "hello" -3 9.4 null undefined true false

Les littraux peuvent galement tre regroups pour former des littraux composs. Les littraux de tableau sont placs entre crochets ([]) et utilisent la virgule pour sparer les lments du tableau. Un littral de tableau permet dinitialiser un tableau. Les exemples suivants prsentent deux tableaux initialiss par des littraux de tableau. Vous pouvez utiliser linstruction new et transmettre le littral compos sous forme de paramtre au constructeur de classe Array, ou affecter directement les valeurs littrales lors de linstanciation des instances des classes de base ActionScript : Object, Array, String, Number, int, uint, XML, XMLList et Boolean.
// Utilisation de linstruction new. var myStrings:Array = new Array(["alpha", "beta", "gamma"]); var myNums:Array = new Array([1,2,3,5,8]); // Affectation directe dun littral. var myStrings:Array = ["alpha", "beta", "gamma"]; var myNums:Array = [1,2,3,5,8];

Les littraux permettent galement dinitialiser un objet gnrique. Un objet gnrique est une instance de la classe Object. Les littraux dobjet sont placs entre accolades ({}) et utilisent la virgule pour sparer les proprits de lobjet. Chaque proprit est dclare avec le caractre deux-points (:), sparant le nom et la valeur de la proprit. Vous pouvez crer un objet gnrique via linstruction new et transmettre le littral dobjet sous forme de paramtre au constructeur de classe Object ou affecter directement le littral dobjet linstance dclare. Lexemple suivant cre un objet gnrique et linitialise avec trois proprits (propA, propB, et propC), chacune avec des valeurs dfinies sur 1, 2, et 3, respectivement :
// Utilisation de linstruction new. var myObject:Object = new Object({propA:1, propB:2, propC:3}); // Affectation directe dun littral. var myObject:Object = {propA:1, propB:2, propC:3};

Pour plus dinformations, voir Principes de base des chanes , la page 218, Principes de base des expressions rgulires , la page 306 et Initialisation de variables XML , la page 378.
Syntaxe 113

Points-virgules
Vous pouvez utiliser le point-virgule (;) la fin dune instruction. Si vous omettez ce caractre, le compilateur suppose que chaque ligne de code reprsente une instruction distincte. Etant donn que de nombreux programmeurs ont lhabitude dutiliser le pointvirgule pour marquer la fin dune instruction, vous pouvez faciliter la lecture de votre code en procdant de la sorte. Lajout dun point-virgule la fin dune instruction permet de placer plusieurs instructions sur une mme ligne, mais rend la lecture de votre code plus difficile.

Parenthses
Vous pouvez utiliser des parenthses (()) de trois faons dans ActionScript 3.0. Premirement, vous pouvez utiliser des parenthses pour modifier lordre des oprations dans une expression. Les oprations regroupes lintrieur de parenthses sont toujours excutes en premier lieu. Par exemple, vous pouvez utiliser des parenthses pour modifier lordre des oprations dans le code suivant :
trace(2 + 3 * 4); // 14 trace( (2 + 3) * 4); // 20

Deuximement, vous pouvez utiliser des parenthses avec loprateur virgule (,) pour valuer une srie dexpressions et renvoyer le rsultat de lexpression finale, comme indiqu dans lexemple suivant :
var a:int = 2; var b:int = 3; trace((a++, b++, a+b)); // 7

Troisimement, vous pouvez utiliser des parenthses pour transmettre un ou plusieurs paramtres des fonctions ou des mthodes, comme indiqu dans lexemple suivant, qui transmet une valeur String la fonction trace() :
trace("hello"); // bonjour

114

Syntaxe et langage ActionScript

Commentaires
Le code ActionScript 3.0 prend en charge deux types de commentaires : les commentaires dune ligne et les commentaires de plusieurs lignes. Ces mcanismes de commentaire sont semblables aux mcanismes de commentaire de C++ et Java. Le compilateur ignore le texte marqu comme commentaire. Les commentaires dune ligne commencent par deux barres obliques (//) et continuent jusqu la fin de la ligne. Par exemple, le code suivant contient un commentaire dune ligne :
var someNumber:Number = 3; // commentaire dune seule ligne

Les commentaires de plusieurs lignes commencent par une barre oblique et un astrisque (/*) et se terminent pas un astrisque et une barre oblique (*/).
/* Il sagit dun commentaire de plusieurs lignes qui peut stendre sur plus dune ligne de code. */

Mots-cls et mots rservs


Les mots rservs ne peuvent pas servir didentifiants dans votre code car leur utilisation est rserve ActionScript. Les mots rservs comprennent les mots lexicaux qui sont supprims de lespace de nom du programme par le compilateur. Le compilateur signale une erreur si vous utilisez un mot-cl lexical comme identifiant. Le tableau suivant rpertorie les mots lexicaux dActionScript 3.0.
as class delete false if instanceof native private super to use with break const do finally implements interface new protected switch true var case continue else for import internal null public this try void catch default extends function in is package return throw typeof while

Syntaxe

115

Il existe un petit ensemble de mots-cls, appels mots-cls syntaxiques qui peuvent servir didentifiants, mais qui possdent une signification spciale dans certains contextes. Le tableau suivant rpertorie les mots syntaxiques dActionScript 3.0.
each include override get dynamic static set final namespace native

Il existe galement plusieurs identifiants auxquels il est parfois fait rfrence sous le terme mots rservs pour une utilisation future. Ces identifiants ne sont pas rservs par ActionScript 3.0, mais certains dentre eux peuvent tre traits comme des mots-cls par des logiciels qui intgrent ActionScript 3.0. Vous pouvez utiliser un grand nombre de ces identifiants dans votre code, mais Adobe vous le dconseille car ils risquent dapparatre sous la forme de motscls dans une version ultrieure du langage.
abstract char export long throws virtual boolean debugger float prototype to volatile byte double goto short transient cast enum intrinsic synchronized type

Constantes
ActionScript 3.0 prend en charge linstruction const que vous pouvez utiliser pour crer des constantes. Les constantes sont des proprits dont la valeur est fixe et non modifiable. Vous pouvez affecter une valeur une constante une seule fois, et laffectation doit avoir lieu proximit de la dclaration de la constante. Par exemple, si une constante est dclare en tant que membre dune classe, vous pouvez lui affecter une valeur uniquement dans la dclaration ou dans le constructeur de classe.

116

Syntaxe et langage ActionScript

Le code suivant dclare deux constantes. La premire constante, MINIMUM, a une valeur affecte dans linstruction de dclaration. La seconde constante, MAXIMUM, a une valeur affecte dans le constructeur.
class A { public const MINIMUM:int = 0; public const MAXIMUM:int; public function A() { MAXIMUM = 10; } } var a:A = new A(); trace(a.MINIMUM); // 0 trace(a.MAXIMUM); // 10

Une erreur se produit si vous tentez daffecter une valeur initiale une constante de lune des deux faons. Par exemple, si vous tentez de dfinir la valeur initiale de MAXIMUM en dehors de la classe, une erreur dexcution se produit.
class A { public const MINIMUM:int = 0; public const MAXIMUM:int; } var a:A = new A(); a["MAXIMUM"] = 10; // erreur dexcution

LAPI de Flash Player API dfinit un grand nombre de constantes que vous pouvez utiliser. Par convention, les constantes dans ActionScript utilisent toutes des majuscules, avec des mots spars par le caractre de soulignement ( _ ). Par exemple, la dfinition de classe MouseEvent utilise cette convention dappellation pour ses constantes. Chacune dentre elles reprsente un vnement li une action de la souris :
package flash.events { public class MouseEvent extends Event { public static const CLICK:String public static const DOUBLE_CLICK:String public static const MOUSE_DOWN:String public static const MOUSE_MOVE:String ... } }

= = = =

"click"; "doubleClick"; "mouseDown"; "mouseMove";

Syntaxe

117

Oprateurs
Les oprateurs sont des fonctions spciales qui utilisent un ou plusieurs oprandes et renvoient une valeur. Un oprande est une valeur (gnralement un littral, une variable ou une expression) utilise par loprateur comme entre. Par exemple, dans le code suivant, les oprateurs daddition (+) et de multiplication (*) sont utiliss avec trois oprandes littraux (2, 3, et 4) pour renvoyer une valeur. Cette valeur est ensuite utilise par loprateur daffectation (=) pour attribuer la valeur renvoye, 14, la variable sumNumber.
var sumNumber:uint = 2 + 3 * 4; // uint = 14

Les oprateurs peuvent tre unaires, binaires ou ternaires. Un oprateur unaire utilise un oprande. Par exemple, loprateur dincrmentation (++) est un oprateur unaire car il utilise un seul oprande. Un oprateur binaire utilise deux oprandes. Par exemple, loprateur de division (/) utilise deux oprandes. Un oprateur ternaire utilise trois oprandes. Par exemple, loprateur conditionnel (?:) utilise trois oprandes. Certains oprateurs sont surchargs, ce qui signifie quils se comportent diffremment selon le type ou la quantit doprandes qui leur est transmis. Loprateur daddition (+) est un exemple doprateur surcharg qui se comporte diffremment selon le type de donnes des oprandes. Si les deux oprandes sont des nombres, loprateur daddition renvoie la somme des valeurs. Si les deux oprandes sont des chanes, loprateur daddition renvoie la concatnation des deux oprandes. Lexemple de code suivant indique comment loprateur se comporte diffremment selon les oprandes :
trace(5 + 5); // 10 trace("5" + "5"); // 55

Les oprateurs peuvent galement se comporter diffremment selon le nombre doprandes fourni. Loprateur de soustraction (-) est un oprateur la fois unaire et binaire. Lorsquil est fourni avec un seul oprande, loprateur de soustraction le nie et renvoie le rsultat. Lorsquil est fourni avec deux oprandes, loprateur de soustraction renvoie la diffrence entre les oprandes. Lexemple suivant prsente loprateur de soustraction utilis dabord comme oprateur unaire, puis comme oprateur binaire.
trace(-3); // -3 trace(7-2); // 5

118

Syntaxe et langage ActionScript

Priorit et associativit des oprateurs


La priorit et lassociativit des oprateurs dterminent leur ordre de traitement. Bien quil soit vident, pour ceux qui connaissent bien larithmtique, que le compilateur traite loprateur de multiplication (*) avant loprateur daddition (+), le compilateur a besoin dinstructions claires quant lordre appliquer aux oprateurs. Lensemble de ces instructions est appel ordre de priorit des oprateurs. ActionScript dfinit une priorit par dfaut que loprateur parenthses (()) permet de modifier. Par exemple, le code suivant modifie la priorit par dfaut dans lexemple prcdent pour forcer le compilateur traiter loprateur daddition avant loprateur de multiplication :
var sumNumber:uint = (2 + 3) * 4; // uint == 20

Il arrive que plusieurs oprateurs de mme priorit apparaissent dans la mme expression. Dans ce cas, le compilateur utilise les rgles dassociativit pour identifier le premier oprateur traiter. Tous les oprateurs binaires, sauf les oprateurs daffectation, sont associatifs gauche, ce qui signifie que les oprateurs de gauche sont traits avant ceux de droite. Les oprateurs daffectation et loprateur conditionnel (?:) sont associatifs droit, ce qui signifie que les oprateurs de droite sont traits avant ceux de gauche. Prenons par exemple les oprateurs infrieur (<) et suprieur (>), qui ont le mme ordre de priorit. Lorsque les deux oprateurs sont employs dans la mme expression, celui de gauche est trait en premier puisque tous deux sont associatifs gauche. Cela signifie que les deux instructions suivantes donnent le mme rsultat :
trace(3 > 2 < 1); // false trace((3 > 2) < 1); // false

Loprateur suprieur est trait en premier, ce qui donne une valeur true car loprande 3 est suprieur loprande 2. La valeur true est ensuite transmise loprateur infrieur , avec loprande 1. Le code suivant reprsente cet tat intermdiaire :
trace((true) < 1);

Loprateur Infrieur convertit la valeur true en la valeur numrique 1 et compare cette valeur numrique au second oprande 1 pour renvoyer la valeur false (la valeur nest pas infrieure 1).
trace(1 < 1); // false

Vous pouvez modifier lassociativit gauche par dfaut avec loprateur parenthses. Vous pouvez demander au compilateur de traiter loprateur infrieur en premier lieu en plaant cet oprateur et son oprande entre parenthses. Lexemple suivant utilise loprateur parenthses pour produire un rsultat diffrent en utilisant les mmes nombres que lexemple prcdent :
trace(3 > (2 < 1)); // true

Oprateurs

119

Loprateur Infrieur est trait en premier, ce qui donne une valeur false car loprande 2 nest pas infrieur loprande 1. La valeur false est ensuite transmise loprateur Suprieur , avec loprande 3. Le code suivant reprsente cet tat intermdiaire :
trace(3 > (false));

Loprateur Suprieur convertit la valeur false en la valeur numrique 0 et compare cette valeur numrique lautre oprande 3 pour renvoyer la valeur true (la valeur 3 est suprieure 0).
trace(3 > 0); // true

Le tableau suivant rpertorie les oprateurs pour ActionScript 3.0 par ordre de priorit dcroissant. Chaque ligne du tableau contient des oprateurs ayant la mme priorit. Chaque ligne doprateurs a une priorit suprieure la ligne situe au-dessous dans le tableau.
Groupe
Principal Suffixe Unaire De multiplication Dajout

Oprateurs
[] {x:y} () f(x) new x.y x[y] <></> @ :: .. x++ x-++x --x + - ~ ! delete typeof void * / % + -

Dcalage au niveau du << >> >>> bit Relationnel Egalit AND au niveau du bit XOR au niveau du bit OR au niveau du bit AND logique OR logique Conditionnelle Affectation Virgule
< > <= >= as in instanceof is == != === !== & ^ | && || ?: = *= /= %= += -= <<= >>= >>>= &= ^= |= ,

120

Syntaxe et langage ActionScript

Oprateurs principaux
Les oprateurs principaux comprennent ceux utiliss pour crer des littraux Array et Object, regrouper des expressions, appeler des fonctions, instancier des instances de classe et accder des proprits. Tous les oprateurs principaux, comme rpertoris dans le tableau suivant, ont la mme priorit. (E4X) apparat en regard des oprateurs qui font partie de la spcification E4X.
Oprateur
[] {x:y} () f(x) new x.y x[y] <></> @ :: ..

Opration effectue
Initialise un tableau Initialise un objet Regroupe des expressions Appelle une fonction Appelle un constructeur Accde une proprit Initialise un objet XMLList (E4X) Accde un attribut (E4X) Qualifie un nom (E4X) Accde un lment XML descendant (E4X)

Oprateurs de suffixe
Les oprateurs de suffixe prennent un oprateur et incrmentent ou dcrmentent sa valeur. Bien que ces oprateurs soient des oprateurs unaires, ils sont classs part du fait de leur priorit suprieure et de leur comportement particulier. Lorsque vous utilisez un oprateur de suffixe dans une expression plus grande, la valeur de lexpression est renvoye avant le traitement de cet oprateur. Par exemple, le code suivant montre comment la valeur de lexpression xNum++ est renvoye avant lincrmentation de la valeur :
var xNum:Number = 0; trace(xNum++); // 0 trace(xNum); // 1

Tous les oprateurs de suffixe, comme rpertoris dans le tableau suivant, ont la mme priorit :
Oprateur
++ --

Opration effectue
Incrmentation (suffixe) Dcrmentation (suffixe)

Oprateurs

121

Oprateurs unaires
Les oprateurs unaires prennent un oprande. Les oprateurs dincrmentation (++) et de dcrmentation (--) de ce groupe sont des oprateurs de prfixe, cest--dire quils apparaissent avant loprande dans une expression. Les oprateurs de prfixe diffrent de leur quivalent suffixe car lopration dincrmentation ou de dcrmentation est effectue avant le renvoi de la valeur de lexpression globale. Par exemple, le code suivant montre comment la valeur de lexpression ++xNum est renvoye avant lincrmentation de la valeur :
var xNum:Number = 0; trace(++xNum); // 1 trace(xNum); // 1

Tous les oprateurs unaires, comme rpertoris dans le tableau suivant, ont la mme priorit :
Oprateur
++ -+ ! ~ delete typeof void

Opration effectue
Incrmentation (prfixe) Dcrmentation (prfixe) Unaire + Unaire - (ngation) NOT logique NOT au niveau du bit Supprime une proprit Renvoie les informations de type Renvoie une valeur non dfinie

Oprateurs de multiplication
Les oprateurs de multiplication prennent deux oprandes et effectuent des multiplications, des divisions ou des calculs de modulo. Tous les oprateurs de multiplication, comme rpertoris dans le tableau suivant, ont la mme priorit :
Oprateur
* / %

Opration effectue
Multiplication Division Modulo

122

Syntaxe et langage ActionScript

Oprateurs dajout
Les oprateurs dajout prennent deux oprandes et effectuent des calculs daddition ou de soustraction. Tous les oprateurs dajout, comme rpertoris dans le tableau suivant, ont la mme priorit :
Oprateur
+ -

Opration effectue
Addition Soustraction

Oprateurs de dcalage au niveau du bit


Ces oprateurs prennent deux oprandes et dcalent les bits du premier selon la valeur spcifie dans le second. Tous les oprateurs de dcalage au niveau du bit, comme rpertoris dans le tableau suivant, ont la mme priorit :
Oprateur
<< >> >>>

Opration effectue
Dcalage gauche au niveau du bit Dcalage droit au niveau du bit Dcalage droit non sign au niveau du bit

Oprateurs relationnels
Les oprateurs relationnels prennent deux oprandes, comparent leur valeurs et renvoient une valeur boolenne. Tous les oprateurs relationnels, comme rpertoris dans le tableau suivant, ont la mme priorit :
Oprateur
< > <= >= as in instanceof is

Opration effectue
Infrieur Suprieur Infrieur ou gal Suprieur ou gal Vrifie le type de donnes Vrifie les proprits des objets Vrifie la chane prototype Vrifie le type de donnes

Oprateurs

123

Oprateurs dgalit
Les oprateurs dgalit prennent deux oprandes, comparent leur valeurs et renvoient une valeur boolenne. Tous les oprateurs dgalit, comme rpertoris dans le tableau suivant, ont la mme priorit :
Oprateur
== != === !==

Opration effectue
Egalit Ingalit Egalit stricte Ingalit stricte

Oprateurs logiques au niveau du bit


Ces oprateurs prennent deux oprandes et effectuent des oprations logiques au niveau des bits. La priorit de ces oprateurs diffre et ils sont prsents dans le tableau suivant par ordre dcroissant de priorit :
Oprateur
& ^ |

Opration effectue
AND au niveau du bit XOR au niveau du bit OR au niveau du bit

Oprateurs logiques
Les oprateurs logiques prennent deux oprandes et renvoient une valeur boolenne. La priorit de ces oprateurs diffre et ils sont prsents dans le tableau suivant par ordre dcroissant de priorit :
Oprateur
&& ||

Opration effectue
AND logique OR logique

124

Syntaxe et langage ActionScript

Oprateur conditionnel
Loprateur conditionnel est un oprateur ternaire, cest--dire quil prend trois oprandes. Il correspond une mthode abrge de lapplication de linstruction conditionnelle if..else.
Oprateur
?:

Opration effectue
Conditionnelle

Oprateurs daffectation
Les oprateurs daffectation prennent deux oprandes et affectent une valeur lun deux en fonction de la valeur de lautre. Tous les oprateurs daffectation, comme rpertoris dans le tableau suivant, ont la mme priorit :
Oprateur
= *= /= %= += -= <<= >>= >>>= &= ^= |=

Opration effectue
Affectation Affectation de multiplication Affectation de division Affectation modulo Affectation daddition Affectation de soustraction Affectation de dcalage gauche au niveau du bit Affectation de dcalage droit au niveau du bit Affectation de dcalage droit au niveau du bit non sign Affectation AND au niveau du bit Affectation XOR au niveau du bit Affectation OR au niveau du bit

Oprateurs

125

Instructions conditionnelles
ActionScript 3.0 fournit trois instructions conditionnelles de base que vous pouvez utiliser pour contrler le flux du programme.

if..else
Linstruction conditionnelle if..else permet de tester une condition, puis dexcuter un bloc de code lorsque cette condition est positive et den excuter un autre dans le cas contraire. Par exemple, le code suivant vrifie si la valeur de x est suprieure 20 et gnre une fonction trace() dans laffirmative ou une autre fonction trace() dans le cas contraire :
if (x > 20) { trace("x is > 20"); } else { trace("x is <= 20"); }

Si vous ne souhaitez pas excuter un autre bloc de code, vous pouvez utiliser linstruction if sans linstruction else.

if..else if
Linstruction conditionnelle if..else if permet de tester plusieurs conditions. Par exemple, le code suivant teste non seulement si la valeur de x est suprieure 20, mais galement si la valeur de x est ngative :
if (x > 20) { trace("x is > 20"); } else if (x < 0) { trace("x is negative"); }

Si une instruction if ou else est suivie dune seule instruction, elle na pas besoin dtre place entre accolades. Par exemple, le code suivant nutilise pas daccolades :
if (x > 0) trace("x else if (x trace("x else trace("x is positive); < 0) is negative"); is 0");

126

Syntaxe et langage ActionScript

Nanmoins, Adobe conseille de toujours utiliser des accolades car un comportement inattendu peut se produire si des instructions sont ajoutes ultrieurement une instruction conditionnelle sans accolades. Par exemple, dans le code suivant, la valeur de positiveNums augmente de 1 que la condition renvoie true ou non :
var x:int; var positiveNums:int = 0; if (x > 0) trace("x is positive"); positiveNums++; trace(positiveNums); // 1

switch
Linstruction switch est utile si vous avez plusieurs chemins dexcution sur la mme expression de condition. Elle offre une fonctionnalit semblable une longue srie dinstructions if..else if mais est un peu plus facile lire. Au lieu de tester une condition pour une valeur boolenne, linstruction switch value une expression et utilise le rsultat pour dterminer le bloc de code excuter. Les blocs de code commencent par une instruction case et se terminent par une instruction break. Par exemple, linstruction switch suivante imprime le jour de la semaine en fonction du numro du jour renvoy par la mthode Date.getDay() :
var someDate:Date = new Date(); var dayNum:uint = someDate.getDay(); switch(dayNum) { case 0: trace("Sunday"); break; case 1: trace("Monday"); break; case 2: trace("Tuesday"); break; case 3: trace("Wednesday"); break; case 4: trace("Thursday"); break; case 5: trace("Friday"); break;

Instructions conditionnelles

127

case 6: trace("Saturday"); break; default: trace("Out of range"); break; }

Boucle
Les instructions de bouclage vous permettent dexcuter un bloc de code spcifique de faon rpte laide dune srie de valeurs ou de variables. Adobe vous recommande de toujours placer le bloc de code entre accolades ({}). Bien que vous puissiez omettre les accolades si le bloc de code contient une seule instruction, cette pratique est dconseille pour la mme raison que celle qui sapplique aux instructions conditionnelles : elle augmente la probabilit que les instructions ajoutes ultrieurement soient exclues du bloc de code par inadvertance. Si vous ajoutez ultrieurement une instruction inclure dans le bloc de code mais que vous oubliez dajouter les accolades ncessaires, linstruction nest pas excute dans la boucle.

for
La boucle for vous permet de faire une itration sur une variable pour une plage de valeurs spcifique. Vous devez fournir trois expressions dans une instruction for : une variable dfinie sur une valeur initiale, une instruction conditionnelle qui dtermine le moment o la boucle prend fin et une expression qui modifie la valeur de la variable avec chaque boucle. Par exemple, le code suivant boucle cinq reprises. La valeur de la variable i commence 0 et prend fin 4, et le rsultat est constitu par les nombres compris entre 0 et 4, chacun sur sa propre ligne.
var i:int; for (i = 0; i < 5; i++) { trace(i); }

128

Syntaxe et langage ActionScript

for..in
La boucle for..in vous permet de faire une itration sur les proprits dun objet ou les lments dun tableau. Par exemple, utilisez une boucle for..in pour faire une itration sur les proprits dun objet gnrique (les proprits dun objet ntant pas conserves dans un ordre particulier, elles peuvent apparatre dans un ordre imprvisible) :
var myObj:Object = {x:20, y:30}; for (var i:String in myObj) { trace(i + ": " + myObj[i]); } // rsultat : // x: 20 // y: 30

Vous pouvez galement faire une itration sur les lments dun tableau :
var myArray:Array = ["one", "two", "three"]; for (var i:String in myArray) { trace(myArray[i]); } // rsultat : // un // deux // trois

Vous ne pouvez pas itrer sur les proprits dun objet lorsquil sagit dune instance de classe dfinie par lutilisateur, sauf si la classe est dynamique. Et mme dans ce dernier cas, vous ne pouvez faire ditration que sur les proprits ajoutes dynamiquement.

for each..in
La boucle for each..in vous permet de faire une itration sur les lments dune collection (balises dans un objet XML ou XMLList, valeurs des proprits dun objet ou lments dun tableau). Par exemple, comme le montre lextrait suivant, vous pouvez utiliser une boucle for each..in pour itrer sur les proprits dun objet gnrique, mais contrairement la boucle for..in, la variable ditrateur dans une boucle for each..in contient la valeur de la proprit au lieu de son nom :
var myObj:Object = {x:20, y:30}; for each (var num in myObj) { trace(num); } // rsultat : // 20 // 30

Boucle

129

Vous pouvez faire une itration sur un objet XML ou XMLList, comme lindique lexemple suivant :
var myXML:XML = <users> <fname>Jane</fname> <fname>Susan</fname> <fname>John</fname> </users>; for each (var item in myXML.fname) { trace(item); } /* rsultat Jane Susan John */

Vous pouvez galement faire une itration sur les lments dun tableau, comme lindique cet exemple :
var myArray:Array = ["one", "two", "three"]; for each (var item in myArray) { trace(item); } // rsultat : // un // deux // trois

Vous ne pouvez pas faire une itration sur les proprits dun objet si ce dernier est une instance dune classe scelle. Mme pour les instances de classes dynamiques, vous ne pouvez pas faire une itration sur des proprits fixes qui sont des proprits dfinies comme faisant partie dune dfinition de classe.

while
La boucle while est semblable une instruction if qui se rpte tant que la condition est true. Par exemple, le code suivant produit le mme rsultat que lexemple de boucle for :
var i:int = 0; while (i < 5) { trace(i); i++; }

130

Syntaxe et langage ActionScript

Lun des inconvnients que prsente la boucle while par rapport la boucle for est que les risques de boucles sans fin sont plus importants avec les boucles while. Par exemple, le code qui utilise la boucle for ne passe pas la compilation si vous omettez lexpression qui incrmente la variable du compteur, alors que le code qui utilise la boucle while est compil. Et sans lexpression qui incrmente i, la boucle se poursuit sans fin.

do..while
La boucle do..while est une boucle while qui garantit que le bloc de code est excut au moins une fois, car la condition est vrifie une fois que le bloc de code est excut. Le code suivant prsente un exemple simple de boucle do..while gnrant une sortie mme lorsque la condition nest pas remplie :
var i:int = 5; do { trace(i); i++; } while (i < 5); // rsultat : 5

Fonctions
Les fonctions sont des blocs de code qui effectuent des tches spcifiques et qui peuvent tre rutiliss dans votre programme. Il existe deux types de fonctions dans ActionScript 3.0 : les mthodes et les fonctions closures. Une fonction est appele mthode ou fonction closure selon le contexte dans lequel elle est dfinie. Une fonction est appele mthode si vous la dfinissez comme partie dune dfinition de classe ou lassociez linstance dun objet. Une fonction est appele fonction closure si elle est dfinie de lune ou lautre faon. Les fonctions ont toujours t trs importantes dans ActionScript. Dans ActionScript 1.0, par exemple, le mot-cl class nexistait pas. Par consquent, des classes ont t dfinies par des fonctions constructeurs. Mme si le mot-cl class a depuis t ajout au langage, une solide comprhension des fonctions reste importante si vous souhaitez bnficier de tous les avantages du langage. Ceci peut tre un dfi pour les programmeurs qui sattendent ce que les fonctions ActionScript se comportent de faon identique celles des langages tels que C++ ou Java. Mme si lappel et la dfinition des fonctions de base ne devraient pas constituer un dfi pour les programmeurs expriments, certaines des fonctions ActionScript les plus avances ncessitent une explication.

Fonctions

131

Concepts de fonction de base


Cette section dcrit les techniques dappel et de dfinition des fonctions de base.

Appel de fonctions
Vous appelez une fonction en utilisant son identifiant suivi par loprateur parenthses (()). Vous placez les paramtres de fonction que vous souhaitez envoyer la fonction entre parenthses laide de loprateur parenthses. Par exemple, la fonction trace() (qui est une fonction de niveau suprieur dans lAPI de Flash Player) est utilise dans ce manuel :
trace(Use trace to help debug your script);

Si vous appelez une fonction sans paramtres, vous devez utiliser une paire de parenthses vide. Par exemple, vous pouvez utiliser la mthode Math.random(), qui ne prend aucun paramtre, pour gnrer un nombre alatoire :
var randomNum:Number = Math.random();

Dfinition de vos fonctions


Il existe deux faons de dfinir une fonction dans ActionScript 3.0 : avec une instruction de fonction ou une expression de fonction. La technique que vous choisissez dpend du style de programmation que vous prfrez, plus statique ou dynamique. Dfinissez vos fonctions laide dinstructions de fonction si vous prfrez une programmation en mode strict, ou statique. Dfinissez vos fonctions laide dexpressions de fonction si vous en avez vraiment besoin. Les expressions de fonction sont utilises plus souvent dans la programmation en mode standard, ou dynamique.

Instructions de fonction
Les instructions de fonction reprsentent la technique privilgie pour dfinir des fonctions en mode strict. Une instruction de fonction commence par le mot-cl function, suivi de :

le nom de la fonction ; les paramtres, dans une liste spare par des virgules, place entre parenthses ; le corps de la fonction, cest--dire le code ActionScript excuter lorsque la fonction est invoque, plac entre accolades.

Par exemple, le code suivant cre une fonction qui dfinit un paramtre puis invoque la fonction laide de la chane "hello" comme valeur de paramtre :
function traceParameter(aParam:String) { trace(aParam); } traceParameter("hello"); // bonjour
132 Syntaxe et langage ActionScript

Expressions de fonction
La deuxime faon de dclarer une fonction est dutiliser une instruction daffectation avec une expression de fonction, parfois appele littral de fonction ou fonction anonyme. Il sagit dune mthode plus dtaille largement utilise dans les versions prcdentes dActionScript. Une instruction daffectation avec une expression de fonction commence par le mot-cl var, suivi de :

le nom de la fonction ; loprateur deux points (.) ; la classe Function pour indiquer le type de donnes ; loprateur daffectation (=) ; le mot-cl function ; les paramtres, dans une liste spare par des virgules, place entre parenthses ; le corps de la fonction, cest--dire le code ActionScript excuter lorsque la fonction est invoque, plac entre accolades.

Par exemple, le code suivant dclare la fonction traceParameter laide dune expression de fonction :
var traceParameter:Function = function (aParam:String) { trace(aParam); }; traceParameter("hello"); // bonjour

Vous remarquerez que vous ne spcifiez pas de nom de fonction, comme dans une instruction de fonction. Une autre diffrence importante entre les expressions de fonction et les instructions de fonction est quune expression de fonction est plus une expression quune instruction. Ceci signifie quune expression de fonction ne peut pas tre utilise seule, contrairement une instruction de fonction. Une expression de fonction peut tre utilise uniquement en tant que partie dune instruction, gnralement une instruction daffectation. Lexemple suivant reprsente une expression de fonction affecte un lment de tableau :
var traceArray:Array = new Array(); traceArray[0] = function (aParam:String) { trace(aParam); }; traceArray[0]("hello");

Fonctions

133

Choix dinstructions ou dexpressions


En rgle gnrale, utilisez une instruction de fonction, moins que des circonstances spcifiques exigent lutilisation dune expression. Les instructions de fonction sont moins dtailles et fournissent une exprience plus cohrente entre le mode strict et le mode standard que les expressions de fonction. Les instructions de fonction sont plus lisibles que les instructions daffectation qui contiennent des expressions de fonction. Les instructions de fonction rendent votre code plus concis ; elles prtent moins confusion que les expressions de fonction, qui exigent lutilisation des mots-cls var et function. Les instructions de fonction fournissent une exprience plus cohrente entre les deux modes de compilateur car vous pouvez utiliser la syntaxe point en mode strict et en mode standard pour appeler une mthode dclare laide dune instruction de fonction. Ceci ne sapplique pas ncessairement aux mthodes dclares avec une expression de fonction. Par exemple, le code suivant dfinit une classe appele Example avec deux mthodes : methodExpression(), qui est dclare avec une expression de fonction, et methodStatement(), qui est dclare avec une instruction de fonction. En mode strict, vous ne pouvez pas utiliser la syntaxe point pour invoquer la mthode methodExpression().
class Example { var methodExpression = function() {} function methodStatement() {} } var myEx:Example = new Example(); myEx.methodExpression(); // erreur en mode strict ; okay en mode standard myEx.methodStatement(); // okay en modes strict et standard

Les expressions de fonction sont plus adaptes la programmation cible sur un comportement dexcution ou dynamique. Si vous prfrez utiliser le mode strict mais que vous souhaitez galement appeler une mthode dclare avec une expression de fonction, vous pouvez utiliser lune des deux techniques. Premirement, vous pouvez appeler la mthode laide de loprateur crochets ([]) au lieu de loprateur point (.). Lappel de mthode suivant a lieu la fois en mode strict et en mode standard :
myExample["methodLiteral"]();

Deuximement, vous pouvez dclarer la classe entire comme classe dynamique. Mme si ceci vous permet dappeler la mthode laide de loprateur point, linconvnient est que vous sacrifiez une fonctionnalit de mode strict pour toutes les instances de cette classe. Par exemple, le compilateur ne gnre pas derreur si vous tentez daccder une proprit non dfinie sur une instance dune classe dynamique.

134

Syntaxe et langage ActionScript

Les expressions de fonction peuvent tre utiles dans certains cas. Les expressions de fonction sont couramment utilises pour des fonctions qui sont utilises une seule fois. Elles peuvent tre utilises galement pour associer une fonction une proprit de prototype. Pour plus dinformations, voir Lobjet prototype , la page 189. Il existe deux lgres diffrences entre les instructions de fonction et les expressions de fonction prendre en compte lorsque vous choisissez la technique utiliser. La premire diffrence rside dans le fait que les expressions de fonction nexistent pas indpendamment en tant quobjets en ce qui concerne la gestion de la mmoire et le nettoyage. En dautres termes, lorsque vous affectez une expression de fonction un autre objet (un lment de tableau ou une proprit dobjet, par exemple) vous crez lunique rfrence cette expression de fonction dans votre code. Si le tableau ou lobjet auquel est associe lexpression de fonction nest plus disponible, vous navez plus accs lexpression de fonction. Si le tableau ou lobjet est supprim, la mmoire que lexpression de fonction utilise peut tre nettoye, ce qui signifie que la mmoire peut tre rutilise dautres fins. Lexemple suivant indique que pour une expression de fonction, la fonction nest plus disponible une fois que la proprit laquelle lexpression est affecte est supprime. La classe Test est dynamique, ce qui signifie que vous pouvez ajouter une proprit appele functionExp qui contient une expression de fonction. La fonction functionExp() peut tre appele avec loprateur point, mais une fois que la proprit functionExp est supprime, la fonction nest plus accessible.
dynamic class Test {} var myTest:Test = new Test(); // expression de fonction myTest.functionExp = function () { trace("Function expression") }; myTest.functionExp(); // expression de fonction delete myTest.functionExp; myTest.functionExp(); // erreur

Si, dun autre ct, la fonction est dabord dfinie avec une instruction de fonction, elle existe comme son propre objet et continue exister, mme une fois que vous avez supprim la proprit laquelle elle est associe. Loprateur delete fonctionne uniquement sur les proprits dobjets, donc mme un appel supprimer la fonction stateFunc() ne fonctionne pas.
dynamic class Test {} var myTest:Test = new Test(); // instruction de fonction function stateFunc() { trace("Function statement") } myTest.statement = stateFunc; myTest.statement(); // Instruction de fonction delete myTest.statement; delete stateFunc; // pas deffet stateFunc(); // Instruction de fonction myTest.statement(); // erreur

Fonctions

135

La deuxime diffrence entre les instructions de fonction et les expressions de fonction rside dans le fait que les instructions de fonction existent dans le cadre dans lequel elles sont dfinies, notamment les instructions qui apparaissent avant linstruction de fonction. Les expressions de fonction, en revanche, sont dfinies uniquement pour les instructions ultrieures. Par exemple, le code suivant appelle la fonction scopeTest() avant quelle soit dfinie :
statementTest(); // statementTest function statementTest():void { trace("statementTest"); }

Les expressions de fonction ne sont pas disponibles avant dtre dfinies. Par consquent, le code suivant provoque une erreur dexcution :
expressionTest(); // erreur dexcution var expressionTest:Function = function () { trace("expressionTest"); }

Renvoi de valeurs des fonctions


Pour renvoyer une valeur de votre fonction, utilisez linstruction return suivie de lexpression ou de la valeur littrale que vous souhaitez renvoyer. Par exemple, le code suivant renvoie une expression reprsentant le paramtre :
function doubleNum(baseNum:int):int { return (baseNum * 2); }

Vous remarquerez que linstruction return termine la fonction, de faon ce que les instructions sous une instruction return ne soient pas excutes, comme suit :
function doubleNum(baseNum:int):int { return (baseNum * 2); trace("after return"); // Cette instruction trace nest pas excute. }

En mode strict, vous devez renvoyer une valeur du type appropri si vous choisissez de spcifier un type de renvoi. Par exemple, le code suivant gnre une erreur en mode strict car il ne renvoie pas de valeur valide :
function doubleNum(baseNum:int):int { trace("after return"); }

136

Syntaxe et langage ActionScript

Fonctions imbriques
Vous pouvez imbriquer des fonctions, ce qui signifie que vous pouvez dclarer des fonctions avec dautres fonctions. Une fonction imbrique est disponible uniquement dans sa fonction parent, moins quune rfrence la fonction soit transmise un code externe. Par exemple, le code suivant dclare deux fonctions imbriques lintrieur de la fonction getNameAndVersion() :
function getNameAndVersion():String { function getVersion():String { return "9"; } function getProductName():String { return "Flash Player"; } return (getProductName() + " " + getVersion()); } trace(getNameAndVersion()); // Flash Player 9

Lorsque des fonctions imbriques sont transmises un code externe, elles le sont en tant que fonctions closures, ce qui signifie que la fonction conserve les dfinitions se trouvant dans le domaine au moment de la dfinition de la fonction. Pour plus dinformations, voir Fonctions closures , la page 145.

Paramtres de fonction
ActionScript 3.0 permet dexploiter des paramtres de fonction qui peuvent sembler nouveaux pour les programmeurs qui dcouvrent le langage. Bien que la majorit des programmeurs devrait matriser le transfert de paramtres par valeur ou par rfrence, lobjet arguments et le ... paramtre (rest) peut tre nouveau pour un grand nombre dentre vous.

Fonctions

137

Transfert darguments par valeur ou par rfrence


Dans de nombreux langages de programmation, il est important de comprendre la diffrence entre le transfert darguments par valeur ou par rfrence car elle peut affecter la faon dont le code est conu. Transfrer par valeur signifie que la valeur de largument est copie dans une variable locale pour tre utilise dans la fonction. Transfrer par rfrence signifie que seule une rfrence largument est transmise, au lieu de la valeur relle. Aucune copie de largument rel nest effectue. A la place, une rfrence la variable transfre en tant quargument est cre et affecte une variable locale pour tre utilise dans la fonction. En tant que rfrence une variable en dehors de la fonction, la variable locale vous permet de modifier la valeur de la variable dorigine. Dans ActionScript 3.0, tous les arguments sont transfrs par rfrence car toutes les valeurs sont stockes en tant quobjets. Nanmoins, les objets qui appartiennent aux types de donnes primitifs (Boolean, Number, int, uint, et String) possdent des oprateurs spciaux qui font quils se comportent comme sils taient transfrs par valeur. Par exemple, le code suivant cre une fonction appele passPrimitives() qui dfinit deux paramtres appels xParam et yParam de type int. Ces paramtres sont identiques aux variables locales dclares dans le corps de la fonction passPrimitives(). Lorsque la fonction est appele avec les arguments xValue et yValue, les paramtres xParam et yParam sont initialiss avec des rfrences aux objets int reprsents par xValue et yValue. Les arguments se comportent comme sils taient transfrs par valeur car ils sont primitifs. Bien que xParam et yParam contiennent initialement des rfrences aux objets xValue et yValue uniquement, toute modification apporte aux variables dans le corps de fonction gnre de nouvelles copies des valeurs dans la mmoire.
function passPrimitives(xParam:int, yParam:int):void { xParam++; yParam++; trace(xParam, yParam); } var xValue:int = 10; var yValue:int = 15; trace(xValue, yValue); // 10 15 passPrimitives(xValue, yValue); // 11 16 trace(xValue, yValue); // 10 15

Dans la fonction passPrimitives(), les valeurs de xParam et yParam sont incrmentes, mais ceci naffecte pas les valeurs de Value et yValue, comme indiqu dans la dernire instruction trace. Ceci sapplique mme si les paramtres portent les mmes noms que les variables, xValue et yValue, car les xValue et yValue se trouvant dans la fonction pointeraient vers de nouveaux emplacements dans la mmoire qui existent indpendamment des variables du mme nom en dehors de la fonction.
138 Syntaxe et langage ActionScript

Tous les autres objets (cest--dire les objets qui nappartiennent pas aux types de donnes primitifs) sont toujours transfrs par rfrence. Ceci vous permet de modifier la valeur de la variable dorigine. Par exemple, le code suivant cre un objet appel objVar avec deux proprits, x et y. Lobjet est transfr en tant quargument la fonction passByRef(). Etant donn que lobjet nest pas un type primitif, non seulement il est transfr par rfrence mais il reste galement une rfrence. Ceci signifie que les changements effectus sur les paramtres dans la fonction affectent les proprits dobjet en dehors de la fonction.
function passByRef(objParam:Object):void { objParam.x++; objParam.y++; trace(objParam.x, objParam.y); } var objVar:Object = {x:10, y:15}; trace(objVar.x, objVar.y); // 10 15 passByRef(objVar); // 11 16 trace(objVar.x, objVar.y); // 11 16

Le paramtre objParam rfrence le mme objet que la variable globale objVar. Comme vous pouvez le constater dans les instructions trace de lexemple, les modifications apportes au proprits x et y de lobjet objParam sont visibles dans lobjet objVar.

Valeurs de paramtre par dfaut


Dans ActionScript 3.0, il est prsent possible de dclarer des valeurs de paramtre par dfaut pour une fonction. Si un appel une fonction avec des valeurs de paramtre par dfaut omet un paramtre avec des valeurs par dfaut, la valeur spcifie dans la dfinition de fonction pour ce paramtre est utilise. Tous les paramtres avec des valeurs par dfaut doivent tre placs la fin de la liste des paramtres. Les valeurs affectes comme valeurs par dfaut doivent tre des constantes de compilation. Lexistence dune valeur par dfaut pour un paramtre le rend facultatif. Un paramtre sans valeur par dfaut est considr comme un paramtre obligatoire. Par exemple, le code suivant cre une fonction avec trois paramtres, dont deux possdent des valeurs par dfaut. Lorsque la fonction est appele avec un seul paramtre, les valeurs par dfaut pour les paramtres sont utilises.
function defaultValues(x:int, y:int = 3, z:int = 5):void { trace(x, y, z); } defaultValues(1); // 1 3 5

Fonctions

139

Lobjet arguments
Lorsque les paramtres sont transfrs une fonction, vous pouvez utiliser lobjet arguments pour accder aux informations concernant les paramtres transfrs votre fonction. Voici certains aspects importants de lobjet arguments :

Lobjet arguments est un tableau qui comprend tous les paramtres transfrs la fonction. La proprit arguments.length indique le nombre de paramtres transmis la fonction. La proprit arguments.callee fournit une rfrence la fonction elle-mme, ce qui est utile pour les appels rcursifs des expressions de fonction.
Lobjet arguments nest pas disponible si un paramtre est appel arguments ou si vous utilisez le paramtre ... paramtre (rest).

ActionScript 3.0 permet aux appels de fonction dinclure plus de paramtres que ceux dfinis dans la dfinition de fonction mais gnre une erreur de compilateur en mode strict si le nombre de paramtres est infrieur au nombre de paramtres obligatoires. Vous pouvez utiliser laspect de tableau de lobjet arguments pour accder aux paramtres transfrs la fonction, que ces paramtres soient dfinis ou non dans la dfinition de fonction. Lexemple suivant utilise le tableau arguments et la proprit arguments.length pour suivre tous les paramtres transfrs la fonction traceArgArray() :
function traceArgArray(x:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // // // // rsultat : 1 2 3

140

REMARQUE

Syntaxe et langage ActionScript

La proprit arguments.callee est souvent utilise dans des fonctions anonymes pour crer une rcursivit. Vous pouvez lutiliser pour ajouter de la flexibilit votre code. Si le nom de la fonction rcursive change pendant votre cycle de dveloppement, il est inutile de modifier lappel rcursif dans le corps de votre fonction si vous utilisez arguments.callee au lieu du nom de fonction. La proprit arguments.callee est utilise dans lexpression de fonction suivante pour activer la rcursivit :
var factorial:Function = function (x:uint) { if(x == 0) { return 1; } else { return (x * arguments.callee(x - 1)); } } trace(factorial(5)); // 120

Si vous utilisez le paramtre ... (rest) dans votre dclaration de fonction, lobjet arguments nest pas disponible. Vous devez accder aux paramtres laide des noms de paramtre que vous avez dclars. Nutilisez pas la chane "arguments" comme nom de paramtre car elle masque lobjet arguments. Par exemple, si la fonction traceArgArray() est rcrite de faon ce quun paramtre arguments soit ajout, les rfrences arguments dans le corps de la fonction se rfrent au paramtre plutt qu lobjet arguments. Le code suivant donne le rsultat :
function traceArgArray(x:int, arguments:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // aucun rsultat

Lobjet arguments dans les versions prcdentes dActionScript contenait galement une proprit appele caller, qui est une rfrence la fonction qui appelait la fonction actuelle. La proprit caller nexiste pas dans ActionScript 3.0, mais si vous avez besoin dune rfrence la fonction dappel, vous pouvez modifier la fonction dappel de faon ce quelle transfre un paramtre supplmentaire qui en soit une rfrence.

Fonctions

141

Le paramtre ... (rest)


ActionScript 3.0 prsente une nouvelle dclaration de paramtre appele le paramtre ... (rest). Ce paramtre vous permet de spcifier un paramtre de tableau qui accepte nimporte quel nombre darguments spars par des virgules. Veillez ne pas inclure un mot rserv dans le nom du paramtre. Cette dclaration de paramtre doit tre le dernier paramtre spcifi. Ce paramtre rend lobjet arguments non disponible. Bien que le paramtre ... (rest) offre la mme fonctionnalit que le tableau arguments et la proprit arguments.length, il ne fournit pas la mme fonctionnalit que arguments.callee. Vrifiez que vous navez pas besoin dutiliser arguments.callee avant dutiliser le paramtre ... (rest). Lexemple suivant rcrit la fonction traceArgArray() laide du paramtre ... (rest) au lieu de lobjet arguments :
function traceArgArray(... args):void { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // // // // rsultat : 1 2 3

Le paramtre ... (rest) peut galement tre utilis avec dautres paramtres, partir du moment o il est le dernier paramtre de la liste. Lexemple suivant modifie la fonction traceArgArray() de faon ce que son premier paramtre, x, soit de type int, et que le second utilise le paramtre ... (rest). Le rsultat ignore la premire valeur car le premier paramtre ne fait plus partie du tableau cr par le paramtre ... (rest).
function traceArgArray(x: int, ... args) { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // rsultat : // 2 // 3

142

Syntaxe et langage ActionScript

Fonctions comme objets


Dans ActionScript 3.0, les fonctions sont des objets. Lorsque vous crez une fonction, vous crez un objet qui peut non seulement tre transfr en tant que paramtre une autre fonction, mais qui a galement des proprits et des mthodes qui lui sont associes. Les fonctions transfres en tant quarguments une autre fonction sont transmises par rfrence et non par valeur. Lorsque vous transfrez une fonction en tant quargument, vous utilisez un seul identifiant et non loprateur parenthses que vous utilisez pour appeler la mthode. Par exemple, le code suivant transfre une fonction appele clickListener() en tant quargument la mthode addEventListener() :
addEventListener(MouseEvent.CLICK, clickListener);

La mthode Array.sort() dfinit galement un paramtre qui accepte une fonction. Pour consulter un exemple de fonction de tri personnalise transfre en tant quargument la fonction Array.sort(), voir Tri dun tableau , la page 246. Mme si cela peut sembler trange pour les programmeurs dcouvrant ActionScript, les fonctions peuvent avoir des proprits et des mthodes, comme les objets. Chaque fonction a en ralit une proprit en lecture seule appele length qui stocke le nombre de paramtres dfinis pour la fonction. Ceci est diffrent de la proprit arguments.length qui indique le nombre darguments envoys la fonction. Dans ActionScript, le nombre darguments envoys une fonction peut dpasser le nombre de paramtres dfinis pour cette dernire. Lexemple suivant (qui compile uniquement en mode standard car le mode strict exige une correspondance exacte entre le nombre darguments transfrs et le nombre de paramtres dfinis) indique la diffrence entre les deux proprits :
function traceLength(x:uint, y:uint):void { trace("arguments received: " + arguments.length); trace("arguments expected: " + traceLength.length); } traceLength(3, 5, 7, 11); /* rsultat : arguments reus : 4 arguments attendus : 2 */

Fonctions

143

Vous pouvez dfinir vos proprits en dehors du corps de votre fonction. Les proprits de fonction peuvent servir de proprits quasi statiques vous permettant de sauvegarder ltat dune variable lie la fonction. Par exemple, vous pouvez suivre le nombre de fois quune fonction particulire est appele. Une telle fonctionnalit peut tre utile si vous crivez un jeu et souhaitez suivre le nombre de fois quun utilisateur se sert dune certaine commande (vous pouvez galement utiliser une proprit de classe statique). Le code suivant cre une proprit de fonction en dehors de la dclaration de fonction et incrmente la proprit chaque fois que la fonction est appele :
someFunction.counter = 0; function someFunction():void { someFunction.counter++; } someFunction(); someFunction(); trace(someFunction.counter); // 2

Domaine de la fonction
Le domaine dune fonction dtermine non seulement lendroit o cette fonction peut tre appele dans un programme, mais galement les dfinitions auxquelles la fonction peut accder. Les mmes rgles de domaine qui sappliquent aux identifiants de variable sappliquent aux identifiants de fonction. Une fonction dclare dans le domaine global est disponible travers votre code. Par exemple, ActionScript 3.0 contient des fonctions globales (isNaN() et parseInt(), par exemple) disponibles nimporte o dans votre code. Une fonction imbrique (une fonction dclare dans une autre fonction) peut tre utilise nimporte o dans la fonction dans laquelle elle a t dclare.

144

Syntaxe et langage ActionScript

La chane de domaine
Chaque fois quune fonction commence une excution, des objets et des proprits sont crs. Premirement, un objet spcial appel objet dactivation est cr. Il stocke les paramtres et les variables locales ou fonctions dclares dans le corps de la fonction. Vous ne pouvez pas accder directement lobjet dactivation car il sagit dun mcanisme interne. Deuximement, une chane de domaine est cre. Elle contient une liste ordonne dobjets que Flash Player vrifie, la recherche de dclarations didentifiant. Chaque fonction qui excute a une chane de domaine stocke dans une proprit interne. Dans le cas dune fonction imbrique, la chane de domaine commence avec son objet dactivation, suivi par lobjet dactivation de sa fonction parent. La chane continue de cette faon jusqu ce que lobjet global soit atteint. Lobjet global est cr lorsquun programme ActionScript commence, et contient toutes les fonctions et les variables globales.

Fonctions closures
Une fonction closure est un objet qui contient un instantan dune fonction et de son environnement lexical. Lenvironnement lexical dune fonction comprend toutes les variables, proprits, mthodes et les objets dans la chane de domaine de la fonction, ainsi que leurs valeurs. Les fonctions closures sont cres chaque fois quune fonction est excute part dun objet ou dune classe. Le fait que les fonctions closures conservent le domaine dans lequel elles ont t dfinies cre des rsultats intressants lorsquune fonction est transfre en tant quargument ou valeur de renvoi dans un domaine diffrent. Par exemple, le code suivant cr deux fonctions : foo(), qui renvoie une fonction imbrique appele rectArea() qui calcule la surface dun rectangle, et bar(), qui appelle foo() et stocke la fonction closure renvoye dans une variable nomme myProduct. Mme si la fonction bar() dfinit sa propre variable locale x (avec une valeur de 2), lorsque la fonction closure myProduct() est appele, elle conserve la variable x (avec une valeur de 40) dfinie dans la fonction foo(). La fonction bar() renvoie par consquent la valeur 160 au lieu de 8.
function foo():Function { var x:int = 40; function rectArea(y:int):int // fonction closure dfinie { return x * y } return rectArea; }

Fonctions

145

function bar():void { var x:int = 2; var y:int = 4; var myProduct:Function = foo(); trace(myProduct(4)); // fonction closure appele } bar(); // 160

Les mthodes se comportent de la mme faon car elles conservent galement les informations concernant lenvironnement lexical dans lequel elles ont t cres. Cette caractristique nest pas visible lorsquune mthode est extraite de son instance, ce qui cre une mthode lie. La diffrence principale entre une fonction closure et une mthode lie est que la valeur du mot-cl this dans une mthode lie se rfre toujours linstance laquelle elle tait associe lorigine, alors que dans une fonction closure, la valeur du mot-cl this peut changer. Pour plus dinformations, voir Les mthodes lies , la page 165.

146

Syntaxe et langage ActionScript

CHAPITRE 4

Programmation oriente objet en ActionScript


Ce chapitre dcrit les lments du langage ActionScript qui prennent en charge la programmation oriente objet (POO). Il ne dcrit pas les principes gnraux de la POO tels que la conception des objets, labstraction, lencapsulation, lhritage et le polymorphisme. Ce chapitre porte sur lapplication de ces principes en ActionScript 3.0. Dans la mesure o ActionScript dcoule dun langage de script, la prise en charge de la programmation oriente objet est facultative en ActionScript 3.0. Les programmeurs peuvent ainsi choisir lapproche qui leur convient le mieux, en fonction de la porte et de la complexit de chaque projet. Pour les petites tches, il peut tre prfrable dutiliser ActionScript suivant le paradigme de la programmation par procdures. Pour les projets importants, lapplication des principes de la POO permettra de rendre le code plus facile lire, grer et tendre.

Sommaire
Principes de la programmation oriente objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Hritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 Rubriques avances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Exemple : GeometricShapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

147

Principes de la programmation oriente objet


Introduction la programmation oriente objet
La programmation oriente objet est une technique dorganisation du code dun programme en le groupant en objets les objets tant ici des lments individuels comportant des informations (valeurs de donnes) et des fonctionnalits. Lapproche oriente objet permet de regrouper des lments particuliers dinformations (par exemple, les informations dun enregistrement musical : titre de lalbum, titre de la piste ou nom de lartiste) avec des fonctionnalits ou des actions communes associes ces informations (comme lajout de la piste une liste de lecture, ou la lecture de tous les enregistrement de cet artiste). Ces lments sont combins en un seul, lobjet (par exemple, un Album ou une piste ). La possibilit de regrouper ainsi ces valeurs et ces fonctions offre divers avantages. Ainsi, il est possible de ne suivre quune seule variable au lieu de plusieurs, dorganiser ensemble des fonctionnalits apparentes, et de structurer le programme dune manire beaucoup plus proche du fonctionnement humain.

Tches courantes en programmation oriente objet


En pratique, la programmation oriente objet se dcompose en deux parties. La premire partie est lensemble des stratgies et des techniques de conception dun programme (cest pourquoi elle est frquemment appele conception oriente objet). Ce vaste sujet ne sera pas abord dans le prsent chapitre. Lautre partie de la programmation oriente objet est lensemble des structures de programmation qui sont disponibles dans un langage donn pour faciliter la construction dun programme selon une approche oriente objet. Ce chapitre aborde les tches suivantes, qui sont frquentes en POO :

Dfinition des classes Cration de proprits, mthodes et accesseurs de lecture et de dfinition (mthodes accesseurs) Contrle de laccs aux classes, proprits, mthodes et accesseurs Cration de proprits et de mthodes statiques Cration de structures dnumration Dfinition et utilisation dinterfaces Utilisation de lhritage, y compris lors de la redfinition des lments des classes

148

Programmation oriente objet en ActionScript

Concepts et termes importants


La liste de rfrence suivante numre les termes importants que vous rencontrerez dans ce chapitre :

Attribut : caractristiques affecte un lment dune classe (une proprit ou une mthode) dans la dfinition de cette classe. Les attributs sont couramment utiliss pour dfinir le niveau daccs cette proprit ou cette mthode par du code situ dans dautres parties du programme. Par exemple, private et public sont des attributs. Une mthode prive ne peut tre appele que par le code rsidant dans sa classe, alors quune mthode publique peut tre appele par du code rsidant nimporte o dans le programme. Classe : dfinition de la structure et du comportement des objets dun certain type (lquivalent dun modle ou dune matrice pour les objets de ce type de donnes). Hirarchie des classes : structure de plusieurs classes apparentes, qui indique quelles classes hritent de fonctionnalits des autres classes. Constructeur : mthode spciale pouvant tre dfinie dans une classe et qui est appele lors de la cration dune instance de cette classe. Un constructeur est frquemment utilis pour spcifier des valeurs par dfaut ou effectuer des oprations de configuration pour lobjet. Type de donnes : type dinformations qui peut tre stock dans une variable particulire. En gnral, type de donnes a le mme sens que classe. Oprateur point : en ActionScript et dans de nombreux autres langages de programmation, le signe point (.) indique quun nom rfre un lment enfant (proprit ou mthode) dun objet. Par exemple, dans lexpression monObjet.maProprit, loprateur point indique que le terme maProprit fait rfrence une valeur qui est un lment de lobjet monObjet. numration : ensemble de valeurs constantes apparentes, regroupes pour des raisons pratiques sous forme de proprits dune mme classe. Hritage : mcanisme de la programmation oriente objet qui permet la dfinition dune classe de comporter toutes les fonctionnalits de la dfinition dune autre classe (en gnral, en y ajoutant de nouvelles fonctionnalits). Instance : objet rel cr dans le cadre dun programme. Espace de nom : essentiellement, attribut personnalis qui autorise plus de contrle pour dfinir le code qui est autoris accder un autre code.

Principes de la programmation oriente objet

149

Utilisation des exemples des chapitres


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Etant donn que les exemples de code de ce chapitre traitent principalement de la dfinition et de la manipulation des types de donnes, le test des exemples impliquera la cration dune instance de la classe dfinie, la manipulation de cette instance laide de ses proprits ou de ses mthodes et laffichage des valeurs des proprits de cette instance. Pour afficher ces valeurs, crivez des valeurs dans une instance de champ texte sur la scne, ou utilisez la fonction trace() pour imprimer des valeurs sur le panneau Sortie. Ces techniques sont dcrites dans la section Test des exemples de code contenus dans un chapitre , la page 67.

Classes
Une classe est une reprsentation abstraite dun objet. Une classe conserve des informations sur les types de donnes contenues par un objet et sur les comportements possibles de cet objet. Lutilit de ce niveau dabstraction peut ne pas tre vidente dans le cas de petits scripts ne contenant que quelques objets destins interagir les uns avec les autres. Toutefois, mesure que le programme crot en ampleur et que le nombre dobjets grer augmente, vous dcouvrirez probablement que les classes autorisent un meilleur contrle sur la cration des objets et sur leurs interactions. Ds la premire version dActionScript, les programmeurs en ActionScript pouvaient utiliser des objets Function pour crer des lments ressemblant des classes. ActionScript 2.0 a ensuite ajout une prise en charge formelle des classes, avec des mots-cls tels que class et extends. ActionScript 3.0 prserve la prise en charge des mots-cls introduits avec ActionScript 2.0, tout en ajoutant de nouvelles possibilits, par exemple un meilleur contrle daccs avec les attributs protected et internal, et un meilleur contrle de lhritage avec les mots-cls final et override. Si vous avez dj cr des classes dans des langages de programmation tels que Java, C++ ou C#, vous ne serez pas dpayss par ActionScript. ActionScript partage avec ces langages de nombreux mots-cls et noms dattributs, par exemple class, extends et public, qui sont prsents dans les sections suivantes.
R E M AR QU E 150

Dans ce chapitre, le terme proprit dsigne tout membre dun objet ou dune classe (variables, constantes et mthodes). De plus, bien que les termes classe et statique soient frquemment utiliss de faon interchangeable, nous ferons une distinction entre ces termes dans ce chapitre. Par exemple, dans le prsent chapitre, lexpression proprits de classe dsigne tous les membres dune classe, et non pas seulement ses membres statiques.

Programmation oriente objet en ActionScript

Dfinitions de classe
En ActionScript 3.0, les dfinitions de classe utilisent la mme syntaxe quen ActionScript 2.0. La syntaxe correcte dune dfinition de classe utilise le mot-cl class suivi du nom de la classe. Le corps de la dfinition de classe est insr entre des accolades ({}) aprs le nom de la classe. Par exemple, le code suivant cre une classe nomme Shape et contenant une seule variable, nomme visible :
public class Shape { var visible:Boolean = true; }

Notez que la syntaxe est diffrente dans le cas des dfinitions de classe faisant partie dun paquet. En ActionScript 2.0, si une classe fait partie dun paquet, le nom de ce dernier doit figurer dans la dclaration de classe. Comme linstruction package a t introduite en ActionScript 3.0, le nom du paquet doit figurer dans la dclaration de paquet et non pas dans la dclaration de classe. Par exemple, les dclarations de classe suivantes montrent comment dfinir la classe BitmapData, qui fait partie du paquet flash.display, respectivement en ActionScript 2.0 et en ActionScript 3.0 :
// ActionScript 2.0 class flash.display.BitmapData {} // ActionScript 3.0 package flash.display { public class BitmapData {} }

Attributs de classe
ActionScript 3.0 permet de modifier les dfinitions de classe laide de lun des quatre attributs suivants :
Attribut
dynamic final internal (par dfaut) public

Dfinition
Permet dajouter des proprits aux instances lors de lexcution. Ne doit pas tre tendue par une autre classe. Visible pour les rfrences partir du paquet actuel. Visible pour les rfrences partir de nimporte quel point du code.

Classes

151

Pour chacun de ces attributs, lexception de internal, vous devez inclure lattribut explicitement pour obtenir le comportement qui lui est associ. Par exemple, faute dinclure lattribut dynamic lors de la dfinition dune classe, vous ne pourrez pas ajouter des proprits une instance dune classe lors de son excution. Pour affecter explicitement un attribut, placez-le au dbut de la dfinition de la classe, comme dans le code ci-dessous :
dynamic class Shape {}

Notez que cette liste ne comprend pas lattribut nomm abstract. En effet, les classes abstraites ne sont pas prises en charge en ActionScript 3.0. Notez galement que cette liste ne comprend pas non plus les attributs private et protected. Ces attributs nont de sens qu lintrieur dune dfinition de classe et ne peuvent pas tre appliqus aux classes elles-mmes. Si vous ne souhaitez pas quune classe soit visible lextrieur de son paquet, placez cette classe dans un paquet et affectez-lui lattribut internal. Vous pouvez aussi omettre les attributs internal et public. Dans ce cas, le compilateur ajoutera automatiquement lattribut internal. Si vous ne souhaitez pas quune classe soit visible lextrieur du fichier source dans lequel elle est dfinie, placez-la la fin de ce fichier source, aprs laccolade de fin de la dfinition de paquet.

Corps de la classe
Le corps de la dfinition de classe, qui est insr entre des accolades, permet de dfinir les variables, constantes et mthodes de la classe. Lexemple suivant montre la dclaration de la classe Accessibility dans lAPI dAdobe Flash Player :
public final class Accessibility { public static function get active():Boolean; public static function updateProperties():void; }

Il est galement possible de dfinir un espace de nom dans le corps dune classe. Lexemple suivant montre la dfinition dun espace de nom dans le corps dune classe et son utilisation comme attribut dune mthode de cette classe :
public class SampleClass { public namespace sampleNamespace; sampleNamespace function doSomething():void; }

152

Programmation oriente objet en ActionScript

ActionScript 3.0 permet dinclure dans le corps dune classe non seulement les dfinitions, mais aussi des instructions. Les instructions qui figurent dans le corps dune classe, mais hors dune dfinition de mthode, sont excutes une seule fois, lors de la premire apparition de la dfinition de classe et de la cration de lobjet class qui lui est associ. Lexemple suivant comporte un appel une fonction externe, hello(), et une instruction trace qui affiche un message de confirmation lors de la dfinition de la classe :
function hello():String { trace("hola"); } class SampleClass { hello(); trace("class created"); } // affichage lorsque la classe est cre. hola class created

Contrairement aux versions antrieures dActionScript, en ActionScript 3.0 il est permis de dfinir une proprit static et une proprit dinstance ayant le mme nom dans le corps de la mme classe. Par exemple, le code suivant dclare une variable statique message et une variable dinstance ayant le mme nom :
class StaticTest { static var message:String = "static variable"; var message:String = "instance variable"; } // dans le script var myST:StaticTest = new StaticTest(); trace(StaticTest.message); // rsultat : variable statique trace(myST.message); // rsultat : variable de linstance

Classes

153

Attributs de proprit de classe


Dans le cadre du modle dobjet ActionScript, le terme proprit reprsente tout ce qui peut tre membre dune classe : variables, constantes et mthodes. Ce terme nest pas utilis dans le mme sens dans le manuel Rfrence du langage et des composants ActionScript 3.0, o il est utilis avec un sens plus troit et ne dsigne alors que les membres dune classe qui soit sont des variables, soit sont dfinis par une mthode de lecture/dfinition. En ActionScript 3.0, un jeu dattributs peut tre utilis avec nimporte quelle proprit dune classe. Le tableau suivant prsente ce jeu dattributs.
Attribut
internal (par dfaut) private protected

Dfinition
Visible pour les rfrences partir du paquet actuel. Visible pour les rfrences partir de la mme classe. Visible pour les rfrences partir de la mme classe et des classes drives. Visible pour les rfrences partir de nimporte quel point du code. Spcifie quune proprit appartient la classe, et non pas aux instances de celle-ci. Nom despace de nom dfini par lutilisateur.

public

static

UserDefinedNamespace

Attributs despace de nom pour le contrle daccs


ActionScript 3.0 comporte quatre attributs spciaux qui contrlent laccs aux proprits dfinies dans une classe : public, private, protected et internal. Avec lattribut public, une proprit est visible de nimporte quel point du script. Par exemple, si vous souhaitez quune mthode soit disponible pour du code externe au paquet, vous devez la dclarer avec lattribut public. Ceci est vrai pour toutes les proprits, quelles soient dclares laide des mots-cls var, const ou function. Avec lattribut private, une proprit nest visible qu partir de la classe o cette proprit est dfinie. Ce comportement est diffrent de celui de lattribut private en ActionScript 2.0, o une sous-classe pouvait accder une proprit dclare private dune super-classe. Le comportement lors de lexcution prsente un autre changement important. En ActionScript 2.0, la restriction daccs introduite par le mot-cl private ne portait que sur la compilation, et il tait facile de la contourner lors de lexcution. Ce nest plus le cas en ActionScript 3.0. Les proprits marques comme private sont indisponibles aussi bien lexcution qu la compilation.

154

Programmation oriente objet en ActionScript

Par exemple, le code ci-dessous cre une classe simple nomme PrivateExample avec une variable ayant lattribut private, puis tente daccder cette variable partir de lextrieur de cette classe. En ActionScript 2.0, laccs cette variable tait interdit lors de la compilation, mais il tait facile de contourner cette restriction laide de loprateur daccs aux proprits ([]), qui recherche celles-ci lors de lexcution, et non pas lors de la compilation.
class PrivateExample { private var privVar:String = "private variable"; } var myExample:PrivateExample = new PrivateExample(); trace(myExample.privVar); // erreur de compilation en mode strict trace(myExample["privVar"]); // ActionScript 2.0 autorise laccs, mais ActionScript 3.0 dclenche // une erreur dexcution.

En ActionScript 3.0, toute tentative daccder une proprit private laide de loprateur point (myExample.privVar) dclenche une erreur de compilation en mode strict. Sinon, lerreur est signale lors de lexcution, tout comme lors de lutilisation de loprateur daccs aux proprits (myExample["privVar"]). Le tableau suivant prsente les divers rsultats dune tentative daccs une proprit dclare comme prive, appartenant une classe scelle (non dynamique) :
Mode strict
oprateur point (.) oprateur crochets ([]) erreur de compilation erreur dexcution

Mode standard
erreur dexcution erreur dexcution

Dans les classes dclares avec lattribut dynamic, une tentative daccder une variable private ne provoquera pas derreur dexcution. Cette variable ne sera simplement pas visible, si bien que Flash Player renverra la valeur undefined. Une erreur de compilation se produit toutefois si vous utilisez loprateur point en mode strict. Lexemple suivant est identique lexemple prcdent, si ce nest que cette fois la classe PrivateExample est dclare comme classe dynamique :
dynamic class PrivateExample { private var privVar:String = "private variable"; } var myExample:PrivateExample = new PrivateExample(); trace(myExample.privVar); // erreur de compilation en mode strict trace(myExample["privVar"]); // rsultat : undefined

Classes

155

En gnral, lorsque du code extrieur une classe tente daccder une proprit dclare comme private, les classes dynamiques renvoient la valeur undefined au lieu de gnrer une erreur. Le tableau suivant montre quune erreur nest gnre que lorsque loprateur point est utilis pour accder une proprit prive en mode strict :
Mode strict
oprateur point (.) oprateur crochets ([]) erreur de compilation
undefined

Mode standard
undefined undefined

Avec lattribut protected, qui apparat avec ActionScript 3.0, une proprit nest visible qu partir de sa propre classe ou dune sous-classe de celle-ci. Autrement dit, une proprit dclare protected nest disponible qu partir de sa propre classe ou des classes qui lui sont infrieures dans sa hirarchie dhritage, que la sous-classe se trouve dans le mme paquet ou dans un autre. Pour les programmeurs familiers dActionScript 2.0, cette fonctionnalit est similaire lattribut private en ActionScript 2.0. En ActionScript 3.0, lattribut protected est galement similaire lattribut protected en Java, la diffrence prs que la version Java autorise galement laccs partir du mme paquet. Lattribut protected est utile pour crer une variable ou une mthode ncessaire aux sous-classes, mais qui ne doit pas tre visible partir du code extrieur la hirarchie dhritage. Avec lattribut internal, qui apparat avec ActionScript 3.0, une proprit nest visible qu partir de son propre paquet. Cest lattribut par dfaut du code contenu par un paquet, et il sapplique toute proprit nayant pas lun des attributs suivants :

public private protected

un espace de nom dfini par lutilisateur

Lattribut internal est similaire au contrle daccs par dfaut en Java, bien que dans ce dernier langage ce niveau daccs ne porte pas de nom explicite et ne puisse tre obtenu quen omettant de dclarer un autre modificateur daccs. Avec lattribut internal, qui apparat avec ActionScript 3.0, il est possible de signifier explicitement votre intention de ne rendre une proprit visible qu partir de son propre paquet.

156

Programmation oriente objet en ActionScript

Attribut static
Lattribut static, qui peut tre utilis avec les proprits dclares laide des mots-cls var, const ou function, il est possible daffecter une proprit la classe elle-mme, plutt qu ses instances. Le code externe cette classe doit appeler les proprits statiques laide du nom de la classe, et non pas partir du nom dune instance. Les sous-classes nhritent pas des proprits statiques, ces dernires font partie de leur chane de porte. En dautres termes, dans le corps dune sous-classe, une mthode ou une variable statique ne peuvent pas tre utilises sans rfrencer la classer dans laquelle elles ont t dfinies. Pour plus dinformations, consultez la section Proprits statiques non hrites , la page 180.

Attributs despace de nom dfinis par lutilisateur


la place des attributs de contrle daccs prdfinis, vous pouvez crer un espace de nom personnalis pour lutiliser comme attribut. Un seul attribut despace de nom peut tre utilis par dfinition, et il est impossible dutiliser un attribut despace de nom en combinaison avec lun des attributs de contrle daccs (public, private, protected, internal). Pour plus dinformations sur lutilisation des espaces de nom, consultez la section Espaces de noms , la page 80.

Les variables
Pour dclarer une variable, utilisez les mots-cls var ou const. La valeur des variables dclares laide du mot-cl var peut tre modifie plusieurs reprises pendant lexcution du script. Les variables dclares laide du mot-cl const sont appeles des constantes, et leur valeur est dfinie lors de leur cration. Une erreur se produit si vous tentez daffecter une nouvelle valeur une constante initialise. Pour plus dinformations, consultez la section Constantes , la page 116.

Classes

157

Les variables statiques


Les variables statiques sont dclares laide du mot-cl static et de linstruction var ou const. Les variables statiques sont affectes une classe, plutt qu une instance de classe. Elles permettent de stocker et renvoyer des informations propres une classe entire dobjets. Par exemple, une variable statique permet denregistrer le nombre de fois o une classe a t instancie, ou le nombre maximal dinstances autorises pour une classe. Lexemple ci-dessous cre une variable totalCount qui permet denregistrer le nombre total dinstanciations dune classe, et une constante MAX_NUM dont la valeur est le nombre maximal dinstanciations autorises. Les variables totalCount et MAX_NUM sont statiques car elles contiennent des valeurs qui sappliquent la classe elle-mme, plutt qu une instance particulire.
class StaticVars { public static var totalCount:int = 0; public static const MAX_NUM:uint = 16; }

Tout code externe la classe StaticVars et ses sous-classes ne peut rfrencer les proprits totalCount et MAX_NUM que par le biais de la classe elle-mme. Par exemple, le code suivant fonctionne :
trace(StaticVars.totalCount); // rsultat : 0 trace(StaticVars.MAX_NUM); // rsultat : 16

Comme il est impossible daccder des variables statiques via une instance de la classe, le code suivant renvoie des erreurs :
var myStaticVars:StaticVars = new StaticVars(); trace(myStaticVars.totalCount); // Erreur trace(myStaticVars.MAX_NUM); // Erreur

Les variables qui sont dclares laide des mots-cls static et const doivent tre initialises au moment de la dclaration de la constante, tout comme la classe StaticVars le fait pour MAX_NUM. Il est impossible daffecter une valeur MAX_NUM partir du constructeur ou dune mthode dune instance. Le code suivant gnrera une erreur, car ce nest pas une faon valide dinitialiser une constante statique :
// !! Cest une erreur dinitialiser une constant statique de cette faon class StaticVars2 { public static const UNIQUESORT:uint; function initializeStatic():void { UNIQUESORT = 16; } }

158

Programmation oriente objet en ActionScript

Variables dinstance
Les variables dinstance sont des proprits dclares laide des mots-cls var et const mais sans le mot-cl static. Les variables dinstance, qui sont affectes des instances de classe plutt qu la classe elle-mme, sont utiles pour conserver des valeurs spcifiques une instance. Par exemple, la classe Array dispose dune proprit dinstance nomme length qui conserve le nombre dlments du tableau appartenant une instance particulire de la classe Array. Quelles soient dclares avec le mot-cl var ou const, les variables dinstance ne peuvent pas tre redfinies dans une sous-classe. Il est toutefois possible dobtenir un effet similaire la redfinition de variables, en redfinissant des mthodes de lecture et de dfinition. Pour plus dinformations, consultez la section Les mthodes accesseurs de lecture et de dfinition , la page 163.

Les mthodes
Les mthodes sont des fonctions associes la dfinition dune classe. Lorsquune instance de la classe est cre, une mthode est lie cette instance. Contrairement aux fonctions dclares hors dune classe, les mthodes ne peuvent pas tre utilises en dehors de linstance laquelle elles sont affectes. Pour dclarer une mthode, utilisez le mot-cl function. Vous pouvez utiliser une instruction function comme ci-dessous :
public function sampleFunction():String {}

Vous pouvez aussi utiliser une variable laquelle vous affecterez ensuite une expression de fonction, comme ci-dessous :
public var sampleFunction:Function = function () {}

Dans la plupart des cas, il est prfrable dutiliser une instruction function au lieu dune expression de fonction pour les raisons suivantes :

Les instructions function sont plus concises et plus faciles lire. Les instructions function permettent dutiliser les mots-cls override et final. Pour plus dinformations, consultez la section Redfinition des mthodes , la page 178. Les instructions function crent une liaison plus robuste entre lidentifiant (le nom de la fonction) et le code dans le corps de la mthode. La valeur dune variable pouvant tre modifie laide dune opration daffectation, le lien entre une variable et son expression de fonction peut tre rompu tout moment. Bien quil soit possible de rsoudre ce problme en dclarant la variable avec const au lieu de var, cette technique nest pas recommande car elle rend le code difficilement lisible et empche dutiliser les mots-cls override et final.

Il existe toutefois un cas dans lequel une expression de fonction doit tre utilise : si vous choisissez daffecter une fonction lobjet prototype. Pour plus dinformations, consultez la section Lobjet prototype , la page 189.

Classes

159

Les mthodes constructeur


Les mthodes constructeur, parfois appeles simplement constructeurs, sont des fonctions qui portent le nom de la classe dans laquelle elles sont dfinies. Tout code figurant dans une mthode constructeur est execut lorsquune instance de la classe est cre laide du mot-cl new. Par exemple, le code suivant dfinit une classe simple nomme Example et contenant une seule proprit, nomme status : La valeur initiale de la variable status est fixe dans la fonction constructeur.
class Example { public var status:String; public function Example() { status = "initialized"; } } var myExample:Example = new Example(); trace(myExample.status); // rsultat : initialisation

Les mthodes constructeur sont obligatoirement publiques, mais lattribut public est facultatif. Il est impossible dutiliser lun des autres spcificateurs de contrle daccs (private, protected ou internal) avec un constructeur. De mme, il est impossible dutiliser avec un constructeur un espace de nom dfini par lutilisateur. Un constructeur peut appeler explicitement le constructeur de sa super-classe directe, laide de linstruction super(). Si le constructeur de la super-classe nest pas explicitement appel, le compilateur insre automatiquement un appel avant la premire instruction dans le corps du constructeur. Vous pouvez aussi appeler des mthodes de la super-classe laide du prfixe super en rfrence la super-classe. Si vous choisissez dutiliser la fois super() et super dans le corps du mme constructeur, veillez appeler dabord super(). Sinon, la rfrence super ne fonctionnera pas comme prvu. Le constructeur super() doit galement tre appel avant toute instruction throw ou return.

160

Programmation oriente objet en ActionScript

Lexemple suivant montre ce qui se produit si vous tentez dutiliser la rfrence super avant davoir appel le constructeur super(). Une nouvelle classe, ExampleEx, tend la classe Example. Le constructeur ExampleEx tente daccder la variable dtat dfinie dans sa superclasse, mais avant un appel super(). Linstruction trace() du constructeur ExampleEx produit la valeur null car la variable status nest pas disponible tant que le constructeur super() na pas t excut.
class ExampleEx extends Example { public function ExampleEx() { trace(super.status); super(); } } var mySample:ExampleEx = new ExampleEx(); // rsultat : null

Bien quil soit permis dutiliser linstruction return dans un constructeur, il nest pas possible de lui faire renvoyer une valeur. Autrement dit, aucune expression ou valeur ne peut tre associe linstruction return. En consquence, les constructeurs ne peuvent pas renvoyer de valeurs, ce qui signifie quaucun type de valeur renvoye ne peut tre spcifi. Si vous ne dfinissez pas de mthode constructeur dans votre classe, le compilateur cre automatiquement un constructeur vide. Si votre classe tend une autre classe, le compilateur insre un appel super() dans le constructeur quil gnre.

Les mthodes statiques


Les mthodes statiques, galement appeles parfois mthodes de classe, sont dclares avec le motcl static. Les mthodes statiques sont affectes une classe, plutt qu une instance de classe. Elles permettent dencapsuler des fonctionnalits qui ont une porte plus tendue que ltat dune instance individuelle. Comme les mthodes statiques sont affectes une classe en tant que telle, elles ne sont accessibles que via une classe, et non pas par une instance de la classe. Les mthodes statiques permettent dencapsuler des fonctionnalits qui ne sont pas limites la modification dtat des instances de classe. Ainsi, une mthode doit tre statique si elle offre des fonctionnalits qui naffectent pas directement la valeur dune instance de classe. Par exemple, la classe Date possde une mthode statique nomme parse(), qui reoit une chane et la convertit en nombre. Cette mthode est statique parce quelle naffecte pas une instance individuelle de sa classe. La mthode parse() reoit une chane reprsentant une valeur de date, lanalyse et renvoie un nombre dans un format compatible avec la reprsentation interne dun objet Date. Cette mthode nest pas une mthode dinstance, puisquil ny aurait aucun intrt lappliquer une instance de la classe Date.

Classes

161

Comparons la mthode statique parse() lune des mthodes dinstance de la classe Date, telle que getMonth(). La mthode getMonth() est une mthode dinstance parce quelle agit directement sur la valeur dune instance en rcuprant un composant spcifique, le mois, dune instance de Date. Dans la mesure o les mthodes statiques ne sont pas lies des instances individuelles, il nest pas possible dutiliser les mots-cls this ou super dans le corps dune mthode statique. Les rfrences this et super nont de signification que dans le contexte dune mthode dinstance. linverse dautres langages de programmation bass sur des classes, en ActionScript 3.0 les mthodes statiques ne sont pas hrites. Pour plus dinformations, consultez la section Proprits statiques non hrites , la page 180.

Les mthodes dinstance


Les mthodes dinstance sont dclares sans le mot-cl static. Les mthodes dinstance, qui sont affectes aux instances dune classe et non pas la classe elle-mme, permettent dimplmenter des fonctionnalits qui affectent des instances individuelles dune classe. Par exemple, la classe Array contient une mthode dinstance nomme sort(), qui opre directement sur les instances dArray. Dans le corps dune mthode dinstance, les variables statiques et dinstance sont de mme porte, ce qui signifie que les variables dfinies dans la mme classe peuvent tre rfrences laide dun identificateur simple. Par exemple, la classe suivante, CustomArray, tend la classe Array. La classe CustomArray dfinit une variable statique nomme arrayCountTotal et destine contenir le nombre total dinstances de la classe, une variable dinstance nomme arrayNumber qui enregistre lordre dans lequel les instances ont t cres, et une mthode dinstance nomme getPosition() qui renvoie les valeurs de ces variables.
public class CustomArray extends Array { public static var arrayCountTotal:int = 0; public var arrayNumber:int; public function CustomArray() { arrayNumber = ++arrayCountTotal; } public function getArrayPosition():String { return ("Array " + arrayNumber + " of " + arrayCountTotal); } }

162

Programmation oriente objet en ActionScript

Pour faire rfrence la variable statique arrayCountTotal, du code externe cette classe doit passer par lobjet class (CustomArray.arrayCountTotal), mais le code qui rside dans le corps de la mthode getPosition() peut directement faire rfrence la variable statique arrayCountTotal. Cest galement le cas pour les variables statiques des super-classes. Bien que les proprits statiques ne soient pas hrites en ActionScript 3.0, les proprits statiques des super-classes sont dans la porte. Par exemple, la classe Array possde quelques variables statiques, dont lune est une constante nomme DESCENDING. Le code qui rside dans une sous-classe dArray peut faire rfrence la constante statique DESCENDING laide dun identificateur simple :
public class CustomArray extends Array { public function testStatic():void { trace(DESCENDING); // rsultat : 2 } }

Dans le corps dune mthode dinstance, la valeur de la rfrence this est une rfrence linstance laquelle la mthode est affecte. Le code suivant montre que la rfrence this pointe sur linstance qui contient la mthode :
class ThisTest { function thisValue():ThisTest { return this; } } var myTest:ThisTest = new ThisTest(); trace(myTest.thisValue() == myTest); // rsultat : true

Il est possible de contrler lhritage des mthodes dinstance laide des mots-cls override et final. Vous pouvez utiliser lattribut override pour redfinir une mthode hrite, et lattribut final pour empcher les sous-classes de redfinir une mthode. Pour plus dinformations, consultez la section Redfinition des mthodes , la page 178.

Les mthodes accesseurs de lecture et de dfinition


Les mthodes accesseurs de lecture et de dfinition, galement appeles getters et setters, permettent dadhrer aux principes de programmation du masquage et de lencapsulation dinformations tout en offrant une interface de programmation demploi facile pour vos classes. Les fonctions de lecture et de dfinition (get et set) permettent de garder prives les proprits dune classe, tout en permettant lutilisateur de cette classe daccder ces proprits comme sils accdaient une variable de classe au lieu dappeler une mthode de classe.

Classes

163

Lavantage de cette approche est quelle permet dviter les traditionnelles fonctions accesseurs aux noms peu maniables, telles que getPropertyName() et setPropertyName(). Leur autre avantage est quelles vitent davoir deux fonctions exposes publiquement pour chaque proprit accessible en lecture et en criture. Dans lexemple suivant, la classe nomme GetSet possde des fonctions accesseurs de lecture et de dfinition nommes publicAccess() qui permettent daccder la variable prive privateProperty :
class GetSet { private var privateProperty:String; public function get publicAccess():String { return privateProperty; } public function set publicAccess(setValue:String):void { privateProperty = setValue; } }

Si vous tentez daccder la proprit privateProperty directement, une erreur se produira :


var myGetSet:GetSet = new GetSet(); trace(myGetSet.privateProperty); // erreur

Par contre, si vous utilisez la classe GetSet, vous ferez appel quelque chose qui semble tre une proprit nomme publicAccess, mais il sagira en ralit dune paire de fonctions accesseurs de lecture et de dfinition oprant sur la proprit prive nomme privateProperty. Lexemple suivant instancie la classe GetSet, puis dfinit la valeur de la proprit privateProperty laide de laccesseur public nomme publicAccess :
var myGetSet:GetSet = new GetSet(); trace(myGetSet.publicAccess); // rsultat : null myGetSet.publicAccess = "hello"; trace(myGetSet.publicAccess); // rsultat : hello

Les fonctions de lecture et de dfinition permettent galement de forcer des proprits hrites dune super-classe, ce qui nest pas possible avec des variables rgulires membres de classes. Les variables membres de classes qui sont dclares avec le mot-cl var ne peuvent pas tre forces dans une sous-classe. Toutefois, cette restriction ne concerne pas les proprits cres laide des fonctions de lecture et de dfinition. Vous pouvez utiliser lattribut override sur des fonctions de lecture et de dfinition hrites dune super-classe.

164

Programmation oriente objet en ActionScript

Les mthodes lies


Une mthode lie, parfois appele fermeture de mthode, est tout simplement une mthode extraite de son instance. On peut citer comme exemple les mthodes passes en arguments une fonction ou renvoyes comme valeurs par une fonction. La mthode lie, qui est une nouveaut dActionScript 3.0, est semblable une fermeture de fonction dans la mesure o elle conserve son environnement lexical, mme aprs avoir t extraite de son instance. Toutefois, la diffrence entre une mthode lie et une fermeture de fonction rside dans le fait que la rfrence this dune mthode lie reste lie linstance qui implmente cette mthode. Autrement dit, la rfrence this dune mthode lie pointe toujours sur lobjet original qui a implment la mthode. Pour les fermetures de fonction, la rfrence this est gnrique, ce qui signifie quelle pointe sur lobjet auquel est associe la fonction lorsquelle est appele. Il est important de comprendre les mthodes lies pour utiliser le mot-cl this bon escient. Noubliez pas que this reprsente une rfrence lobjet parent dune mthode. La plupart des programmeurs en ActionScript sattendent ce que le mot-cl this rfre toujours lobjet ou la classe qui contient la dfinition dune mthode. Ce nest pas toujours le cas sans mthode lie. Par exemple, dans les versions prcdentes dActionScript, la rfrence this ne pointait pas toujours sur linstance qui implmentait la mthode. En ActionScript 2.0, lorsque les mthodes sont extraites dune instance, non seulement la rfrence this nest pas lie linstance originale, mais les variables et les mthodes de la classe de cette instance ne sont pas disponibles. Toutefois, ce problme nexiste plus avec ActionScript 3.0, car les mthodes lies sont automatiquement cres lorsque la mthode est passe en paramtre. Avec les mthodes lies, le mot-cl this rfrence toujours lobjet ou la classe dans laquelle la mthode est dfinie. Le code suivant dfinit une classe nomme ThisTest, qui contient une mthode nomme foo() dfinissant la mthode lie, et une mthode nomme bar() qui renvoie cette mthode lie. Le code extrieur la classe cre une instance de la classe ThisTest, appelle la mthode bar() et enregistre la valeur renvoyer dans la variable myFunc.
class ThisTest { private var num:Number = 3; function foo():void dfinition de la mthode lie { trace("foo's this: " + this); trace("num: " + num); } function bar():Function { return foo; //renvoi de la mthode lie } }

Classes

165

var myTest:ThisTest = new ThisTest(); var myFunc:Function = myTest.bar(); trace(this); // rsultat : [object global] myFunc(); /* Sortie : foos this: [object ThisTest] output: num: 3 */

Les deux dernires lignes de code montrent que la rfrence this dans la mthode lie foo() pointe encore sur une instance de la classe ThisTest, bien que la rfrence this de la ligne prcdente pointe sur lobjet global. De plus, la mthode lie stocke dans la variable myFunc peut encore accder aux variables membres de la classe ThisTest. Si ce code est excut en ActionScript 2.0, les rfrences this seront identiques et la variable num sera undefined. Les gestionnaires dvnement sont un domaine dans lequel lajout des mthodes lies est le plus notable, car la mthode addEventListener() ncessite de passer une fonction ou une mthode en argument. Pour plus dinformations, consultez la section Fonction dcouteur dfinie comme mthode de classe , la page 353.

Les numrations et les classes


Les numrations sont des types de donnes que vous pouvez crer pour encapsuler un petit ensemble de valeur. Contrairement C++ avec le mot-cl enum et Java avec linterface dnumration, ActionScript 3.0 ne dispose pas dun mcanisme dnumration spcifique. Il est toutefois possible de crer des numrations laide de classes et de constantes statiques. Par exemple, la classe PrintJob de lAPI de Flash Player utilise une numration nomme PrintJobOrientation pour enregistrer les ensembles de valeurs des modes "landscape" et "portrait", comme le montre le code ci-dessous :
public final class PrintJobOrientation { public static const LANDSCAPE:String = "landscape"; public static const PORTRAIT:String = "portrait"; }

166

Programmation oriente objet en ActionScript

Par convention, une classe dnumration est dclare avec lattribut final, car il nest pas ncessaire dtendre cette classe. Cette classe tant compose uniquement de membres statiques, il nest pas possible den crer des instances. En effet, les valeurs de lnumration sont accdes directement via lobjet classe, comme le montre lextrait de code suivant :
var pj:PrintJob = new PrintJob(); if(pj.start()) { if (pj.orientation == PrintJobOrientation.PORTRAIT) { ... } ... }

Toutes les classes dnumration de lAPI de Flash Player contiennent uniquement des variables de type String, int ou uint. Lavantage de lutilisation dnumrations au lieu de chanes littrales ou de nombres est que les fautes de frappe sont plus faciles dtecter avec les numrations. Si vous faites une erreur dans le nom dune numration, le compilateur ActionScript gnre une erreur. Si vous utilisez des valeurs littrales, le compilateur acceptera un nom mal pel ou un chiffre erron. Dans lexemple ci-dessus, le compilateur gnre une erreur si le nom de la constante dnumration est incorrect, comme dans lextrait suivant :
if (pj.orientation == PrintJobOrientation.PORTRAI) // erreur de // compilation.

Toutefois, le compilateur ne gnre pas derreur si vous faites une faute de frappe dans le nom dune chane littrale :
if (pj.orientation == "portrai") // pas derreur de compilation.

Une autre technique de cration dnumrations consiste crer une classe spare avec des proprits statiques pour lnumration. Toutefois, cette technique est diffrente dans la mesure o chacune des proprits statiques contient une instance de la classe au lieu dune valeur chane ou dun entier. Par exemple, le code suivant cre une classe dnumration pour les jours de la semaine :
public final class Day { public static const MONDAY:Day = new Day(); public static const TUESDAY:Day = new Day(); public static const WEDNESDAY:Day = new Day(); public static const THURSDAY:Day = new Day(); public static const FRIDAY:Day = new Day(); public static const SATURDAY:Day = new Day(); public static const SUNDAY:Day = new Day(); }

Classes

167

Cette technique nest pas utilise par lAPI de Flash Player, mais de nombreux dveloppeurs prfrent le meilleur type de vrification quelle autorise. Par exemple, une mthode qui renvoie une valeur dnumration peut restreindre la valeur renvoye au type de donnes de lnumration. Le code suivant illustre non seulement une fonction qui renvoie un jour de la semaine, mais aussi un appel de fonction qui utilise le type numration comme annotation de type :
function getDay():Day { var date:Date = new Date(); var retDay:Day; switch (date.day) { case 0: retDay = Day.MONDAY; break; case 1: retDay = Day.TUESDAY; break; case 2: retDay = Day.WEDNESDAY; break; case 3: retDay = Day.THURSDAY; break; case 4: retDay = Day.FRIDAY; break; case 5: retDay = Day.SATURDAY; break; case 6: retDay = Day.SUNDAY; break; } return retDay; } var dayOfWeek:Day = getDay();

Il est possible damliorer la classe Day afin quelle associe un entier chaque jour de la semaine, et comporte une mthode toString() renvoyant une reprsentation du jour sous forme de chane. Il est conseill de crer cette amlioration comme exercice.

168

Programmation oriente objet en ActionScript

Les classes des lments incorpors


ActionScript 3.0 utilise des classes spciales, appeles classes des lments incorpors, pour reprsenter les lments incorpors. Un lment incorpor est un lment (son, image ou police) qui est incorpor au fichier SWF lors de la compilation. Contrairement au chargement dynamique, lincorporation des lments les rend disponibles immdiatement lors de lexcution, mais cette mthode augmente la taille des fichiers SWF.

Utilisation de classes dlments incorpors avec Flash


Pour incorporer un lement, placez-le dabord dans la bibliothque dun fichier FLA. Utilisez ensuite la proprit de liaison de llment pour fournir un nom la classe de llment incorpor. Sil nexiste pas de classe de ce nom dans le chemin de classe indiqu, une classe est automatiquement cre. Vous pouvez alors crer une instance de la classe dlments incorpors et utiliser les proprits et mthodes dfinies ou hrites par cette classe. Par exemple, le code suivant permet de lire un son intgr li une classe dlments incorpors nomme PianoMusic :
var piano:PianoMusic = new PianoMusic(); var sndChannel:SoundChannel = piano.play();

Interfaces
Une interface est une collection de dclarations de mthodes qui autorise les communications entre des objets diffrents. Par exemple, lAPI de Flash Player dfinit linterface IEventDispatcher, qui contient les dclarations des mthodes quune classe peut utiliser pour grer les objets vnements. Linterface IEventDispatcher tablit une technique standard permettant aux objets de schanger les vnements. Le code suivant reprsente la dfinition de linterface IEventDispatcher :
public interface IEventDispatcher { function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean = false):void; function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void; function dispatchEvent(event:Event):Boolean; function hasEventListener(type:String):Boolean; function willTrigger(type:String):Boolean; }

Interfaces

169

Les interfaces sont bases sur la distinction entre linterface dune mthode et limplmentation de celle-ci. Linterface dune mthode comprend toutes les informations ncessaires pour appeler cette mthode (le nom de la mthode, lensemble des paramtres quelle reoit et le type de donnes quelle renvoie). Limplmentation dune mthode comprend non seulement les informations de linterface, mais aussi les instructions excutables qui caractrisent le comportement de la mthode. La dfinition dune interface ne contient que les interfaces de la mthode, et toute classe qui implmente linterface doit donc dfinir les implmentations de la mthode. Dans lAPI de Flash Player, la classe EventDispatcher implmente linterface IEventDispatcher en dfinissant toutes les mthodes de linterface IEventDispatcher et en ajoutant le corps de chacune de ces mthodes. Le code suivant est extrait de la dfinition de la classe EventDispatcher :
public class EventDispatcher implements IEventDispatcher { function dispatchEvent(event:Event):Boolean { /* instructions dimplmentation */ } ... }

Linterface IEventDispatcher fait office de protocole utilis par les instances dEventDispatcher pour traiter les objets vnements et les passer aux autres objets qui ont galement implment linterface IEventDispatcher. Il est aussi possible de dcrire une interface en disant quelle dfinit un type de donnes, au mme titre quune classe. En consquence, une interface peut tre utilise comme annotation de type, tout comme une classe. En tant que type de donnes, une interface peut galement tre utilise avec des oprateurs, par exemple les oprateurs is et as, qui ncessitent un type de donnes. Toutefois, linverse dune classe, il nest pas possible dinstancier une interface. Cest en raison de cette distinction que de nombreux programmeurs voient les interfaces comme des types de donnes abstraites et les classes comme des types de donnes concrtes.

170

Programmation oriente objet en ActionScript

La dfinition dune interface


La structure de la dfinition dune interface est similaire celle de la dfinition dune classe, ceci prs quune interface ne peut pas contenir les corps des mthodes. Les interfaces ne peuvent pas comporter des variables ou des constantes, mais elles peuvent contenir des mthodes de lecture et de dfinition. Pour dfinir une interface, on utilise le mot-cl interface. Par exemple, linterface IExternalizable fait partie du paquet flash.utils de lAPI de Flash Player API. Linterface IExternalizable dfinit un protocole de srialisation dun objet (conversion dun objet dans un format adapt lenregistrement sur un priphrique ou la transmission en rseau).
public interface IExternalizable { function writeExternal(output:IDataOutput):void; function readExternal(input:IDataInput):void; }

Notez que linterface IExternalizable est dclare avec le modificateur daccs public. Les dfinitions dinterfaces ne peuvent tre modifies qu laide des spcificateur de contrle daccs public et internal. Dans une dfinition dinterface, les dclarations de mthodes ne peuvent pas comporter de spcificateur de contrle daccs. LAPI de Flash Player respecte la convention de nom selon laquelle les noms des interfaces dbutent par un I majuscule, mais vous pouvez utiliser tout identificateur autoris comme nom dinterface. Les dfinitions dinterfaces sont souvent places au niveau suprieur dun paquet. Les dfinitions dinterfaces ne peuvent pas tre places dans une dfinition de classe ou dans une autre dfinition dinterface. Une interface peut tendre une ou plusieurs autres interfaces. Par exemple, linterface IExample tend linterface IExternalizable :
public interface IExample extends IExternalizable { function extra():void; }

Toute classe qui implmente linterface IExample doit comporter non seulement les implmentations de la mthode extra(), mais aussi celles des mthodes writeExternal() et readExternal() hrites de linterface IExternalizable.

Interfaces

171

Implmentation dune interface dans une classe


La classe est le seul lment du langage ActionScript 3.0 qui puisse implmenter une interface. Pour implmenter une ou plusieurs interfaces, on utilise le mot-cl implements dans une dclaration de classe. Lexemple suivant dfinit deux interfaces, IAlpha et IBeta, ainsi quune classe, Alpha, qui les implmente toutes deux :
interface IAlpha { function foo(str:String):String; } interface IBeta { function bar():void; } class Alpha implements IAlpha, IBeta { public function foo(param:String):String {} public function bar():void {} }

Dans une classe qui implmente une interface, les mthodes implmentes doivent :

utiliser lidentificateur de contrle daccs public, utiliser le mme nom que la mthode de linterface, avoir le mme nombre de paramtres, chacun tant du type de donnes correspondant au type de donnes du paramtre quivalent dans la mthode de linterface, utiliser le mme type de retour.

Vous disposez toutefois dune certaines flexibilit pour le nom des paramtres des mthodes que vous implmentez. Bien que le nombre et le type de donnes des paramtres de la mthode implmente doivent correspondre ceux de la mthode de linterface, il nest pas obligatoire que les noms des paramtres soient identiques. Par exemple, dans lexemple cidessus, le paramtre de la mthode Alpha.foo() est nomm param :
public function foo(param:String):String {}

Par contre, le paramtre correspondant est nomm str dans la mthode de linterface IAlpha.foo() :
function foo(str:String):String;

172

Programmation oriente objet en ActionScript

Les valeurs par dfaut des paramtres offrent galement une certaine flexibilit. La dfinition dune interface peut comporter des dclarations de fonctions avec des valeurs par dfaut pour les paramtres. Une mthode implmentant lune de ces dclarations de fonction doit disposer dune valeur par dfaut pour le ou les paramtres, et cette valeur doit tre du mme type de donnes que celle qui est spcifie dans la dfinition de linterface, mais ce nest pas forcment le cas pour la valeur relle. Par exemple, le code suivant dfinit une interface contenant une mthode dont le paramtre a la valeur 3 par dfaut :
interface IGamma { function doSomething(param:int = 3):void; }

La dfinition de classe suivante implmente linterface Igamma, mais utilise une autre valeur par dfaut pour le paramtre :
class Gamma implements IGamma { public function doSomething(param:int = 4):void {} }

Cette flexibilit est due au fait que les rgles dimplmentation dune interface sont spcifiquement conues afin dassurer une compatibilit des types de donnes, et il nest pas ncessaire, pour ce faire, dexiger des noms et des valeurs par dfaut identiques pour les paramtres.

Hritage
Lhritage est une forme de rutilisation du code qui permet aux programmeurs de dvelopper de nouvelles classes partir de classes existantes. Les classes existantes sont alors frquemment appeles classes de base ou super-classes, alors que les nouvelles classes sont gnralement appeles sous-classes. Lun des principaux avantages de lhritage est quil permet de rutiliser le code dune classe de base sans modifier le code existant. De plus, lhritage ne ncessite pas de modifier les modes dinteraction des autres classes avec la classe de base. Plutt que de modifier une classe existante, qui est peut-tre soigneusement teste et dj utilise, lhritage permet de traiter cette classe comme un module intgr qui peut tre tendu laide de proprits et de mthodes supplmentaires. Cest pourquoi on utilise le mot-cl extends pour indiquer quune classe hrite dune autre classe.

Hritage

173

Lhritage permet galement de tirer parti du polymorphisme du code. Le polymorphisme est la possibilit dutiliser un nom de mthode unique pour une mthode qui se comporte diffremment en fonction des types de donnes quelle reoit. Par exemple, supposons une classe de base nomme Shape, avec deux sous-classes nommes Circle et Square. La classe Shape dfinit une mthode nomme area(), qui renvoie la surface de Shape. Si vous avez implment le polymorphisme, vous pouvez appeler la mthode area() pour les objets de type Circle ou Square et lui faire excuter le calcul correct. Lhritage autorise le polymorphisme en permettant aux sous-classes dhriter et redfinir, ou override les mthodes de la classe de base. Dans lexemple suivant, la mthode area() est redfinie par les classes Circle et Square :
class Shape { public function area():Number { return NaN; } } class Circle extends Shape { private var radius:Number = 1; override public function area():Number { return (Math.PI * (radius * radius)); } } class Square extends Shape { private var side:Number = 1; override public function area():Number { return (side * side); } } var cir:Circle = new Circle(); trace(cir.area()); // rsultat : 3.141592653589793 var sq:Square = new Square(); trace(sq.area()); // rsultat : 1

174

Programmation oriente objet en ActionScript

Dans la mesure o chaque classe dfinit un type de donnes, lutilisation de lhritage cre une relation spciale entre une classe de base et une classe qui ltend. Une sous-classe possde obligatoirement toutes les proprits de sa classe de base, ce qui signifie quil est toujours possible de substituer une instance dune sous-classe une instance de la classe de base. Par exemple, si une mthode dfinit un paramtre du type Shape, il est parfaitement autoris de lui passer un argument du type Circle, car Circle tend Shape, comme on le voit ci-dessous :
function draw(shapeToDraw:Shape) {} var myCircle:Circle = new Circle(); draw(myCircle);

Proprits et hritage des instances


Quelle soit dfinie laide du mot-cl function, var ou const, une proprit dune instance est hrite par toutes les sous-classes tant que cette proprit nest pas dclare avec lattribut private dans la classe de base. Par exemple, la classe Event de lAPI de Flash Player possde de nombreuses sous-classes qui hritent de proprits communes tous les objets vnements. Pour certains types dvnements, la classe Event contient toutes les proprits ncessaires pour dfinir lvnement. Ces types dvnements ne ncessitent pas de proprits dinstance au-del de celles qui sont dfinies dans la classe Event. Lvnement complete, qui est dclench lorsque des donnes ont t charges avec succs, et lvnement connect, qui se produit lorsquune connexion rseau a t tablie, sont des exemples de ce type dvnement. Lexemple suivant est extrait de la classe Event. Il montre certaines proprits et mthodes dont les sous-classes hritent. tant hrites, ces proprits sont accessibles par une instance de nimporte quelle sous-classe.
public class Event { public function get type():String; public function get bubbles():Boolean; ... public public public public ... } function function function function stopPropagation():void {} stopImmediatePropagation():void {} preventDefault():void {} isDefaultPrevented():Boolean {}

Hritage

175

Dautres types dvnements ncessitent des proprits uniques qui ne sont pas disponibles dans la classe Event. Ces vnements sont dfinis laide de sous-classes de la classe Event, ce qui permet dajouter de nouvelles proprits celles de cette classe Event. La classe MouseEvent est un exemple de sous-classe de ce type. Elle ajoute des proprits uniques aux vnements associs un mouvement ou un clic de souris, tels que les vnements mouseMove et click. Lexemple suivant est extrait de la classe MouseEvent. Il montre la dfinition des proprits inhrente la sous-classe parce quabsentes de la classe de base.
public class MouseEvent extends Event { public static const CLICK:String = "click"; public static const MOUSE_MOVE:String = "mouseMove"; ... public function get stageX():Number {} public function get stageY():Number {} ... }

Contrle daccs et hritage


Si une proprit est dclare avec le mot-cl public, elle est visible de nimporte quel point du code. Cela signifie que contrairement aux mots-cls private, protected et internal, le mot-cl public nintroduit aucune restriction sur lhritage des proprits. Si une proprit est dclare avec le mot-cl private, elle nest visible qu partir de la classe qui la dfinit, autrement dit les sous-classes nen hritent pas. Ce comportement est diffrent de celui des versions antrieures dActionScript, o le mot-cl private se comportait plutt comme le mot-cl protected en ActionScript 3.0. Le mot-cl protected indique quune proprit est visible non seulement partir de la classe qui la dfinit, mais aussi partir de toutes les sous-classes de celle-ci. Contrairement au motcl protected en Java, en ActionScript 3.0 le mot-cl protected ne rend pas une proprit visible partir de toutes les autres classes du mme paquet. En ActionScript 3.0, seules les sous-classes peuvent accder une proprit dclare avec le mot-cl protected. De plus, une proprit protge est visible partir dune sous-classe mme si celle-ci ne se trouve pas dans le mme paquet que sa classe de base. Pour limiter la visibilit dune proprit au paquet dans lequel elle est dfinie, vous pouvez soit utiliser le mot-cl internal, soit nutiliser aucun spcificateur de contrle daccs. Le spcificateur de contrle daccs internal est appliqu par dfaut si vous nen indiquez aucun. Seule une sous-classe rsidant dans le mme paquet pourra hriter dune proprit marque comme internal.

176

Programmation oriente objet en ActionScript

Lexemple suivant montre comment chaque spcificateur de contrle daccs affecte lhritage dans et au-del des paquets. Le code ci-dessous dfinit une classe principale dapplication nomme AccessControl et deux autres classes, Base et Extender. La classe Base se trouve dans un paquet nomm foo et la classe Extender, qui est une sous-classe de la classe Base, dans un paquet nomm bar. La classe AccessControl nimporte que la classe Extender et cre une instance de celle-ci qui tente daccder une variable nomme str, dfinie dans la classe Base. La variable str est dclare comme public, si bien que le code est compil et excut comme ci-dessous :
// Base.as dans un dossier nomm foo package foo { public class Base { public var str:String = "hello"; // cette ligne change public } } // Extender.as dans un dossier nomm bar package bar { import foo.Base; public class Extender extends Base { public function getString():String { return str; } } } // classe principale de lapplication dans le fichier ProtectedExample.as import flash.display.MovieClip; import bar.Extender; public class AccessControl extends MovieClip { public function AccessControl() { var myExt:Extender = new Extender(); trace(myExt.testString); // erreur si str nest pas publique trace(myExt.getString()); // erreur si str est prive ou interne } } }

Pour voir leffet des autres spcificateurs de contrle daccs lors de la compilation et de lexcution de cet exemple, changez le spcificateur de contrle daccs de str en private, protected ou internal aprs avoir supprim ou mis en commentaire la ligne suivante dans la classe AccessControl :
trace(myExt.testString); // erreur si str nest pas publique

Hritage

177

Redfinition des variables impossible


Les proprits dclares laide des mots-cls var ou const sont hrites mais ne peuvent pas tre redfinies. Redfinir, ou forcer, une proprit au sens de override signifie redfinir cette proprit dans une sous-classe. Les mthodes (cest dire les proprits dclares avec le motcl function) sont le seul type de proprit quil est possible de redfinir. Bien quil soit impossible de redfinir une variable dinstance, vous pouvez obtenir le mme rsultat en crant des mthodes de lecture et de dfinition pour cette variable dinstance et en forant ces mthodes. Pour plus dinformations, consultez la section Redfinition des mthodes de lecture et de dfinition , la page 180.

Redfinition des mthodes


Redfinir, ou forcer, une mthode au sens de override signifie redfinir le comportement dune mthode hrite. Les mthodes statiques ne sont pas hrites et ne peuvent donc pas tre redfinies. Toutefois, les sous-classes hritent des mthodes dinstance et il est donc possible de redfinir celles-ci sous rserve de deux conditions :

la mthode dinstance ne doit pas tre dclare avec le mot-cl final dans la classe de base. Lorsquil est utilis avec une mthode dinstance, le mot-cl final indique que le programmeur veut empcher les sous-classes de redfinir cette mthode. la mthode dinstance ne doit pas tre dclare avec le spcificateur de contrle daccs private dans la classe de base. Si une mthode est marque comme private dans la classe de base, il nest pas ncessaire dutiliser le mot-cl override lors de la dfinition dune mthode portant le mme nom dans la sous-classe, puisque la mthode de la classe de base nest pas visible partir de la sous-classe.

Pour redfinir une mthode dinstance correspondant ces critres, la dfinition de la mthode dans la sous-classe doit utiliser le mot-cl override et correspondre comme dfini ci-dessous la version de cette mthode dans la super-classe :

la mthode de redfinition doit avoir le mme niveau de contrle daccs que celle de la classe de base. Les mthodes dfinies comme internes doivent avoir le mme niveau de contrle daccs que celles qui nont pas de spcificateur de contrle daccs. la mthode de redfinition doit avoir le mme nombre de paramtres que celle de la classe de base. les paramtres de la mthode de redfinition doivent avoir les mmes annotations de type de donnes que ceux de la mthode de la classe de base. la mthode de redfinition doit avoir le mme type de renvoi que celle de la classe de base.

Toutefois, il nest pas ncessaire que les noms des paramtres de la mthode de redfinition correspondent ceux des paramtres de la classe de base, tant que le nombre de paramtres et leurs types de donnes correspondent.

178

Programmation oriente objet en ActionScript

Linstruction super
Il arrive frquemment que les programmeurs souhaitent complter le comportement de la mthode de super-classe quils redfinissent, plutt que remplacer ce comportement. Il est donc ncessaire de disposer dun mcanisme permettant une mthode dune sous-classe dappeler sa mthode mre dans la super-classe. Ce mcanisme est assur par linstruction super, qui contient une rfrence la super-classe immdiate. Lexemple suivant dfinit une classe nomme Base, qui contient la mthode thanks(), et une sous-classe de Base nomme Extender, qui redfinit la mthode thanks(). La mthode Extender.thanks() utilise linstruction super pour appeler Base.thanks().
package { import flash.display.MovieClip; public class SuperExample extends MovieClip { public function SuperExample() { var myExt:Extender = new Extender() trace(myExt.thanks()); // rsultat : Mahalo nui loa } } } class Base { public function thanks():String { return "Mahalo"; } } class Extender extends Base { override public function thanks():String { return super.thanks() + " nui loa"; } }

Hritage

179

Redfinition des mthodes de lecture et de dfinition


Bien quil soit impossible de redfinir les variables dfinies dans une super-classe, il est possible de redfinir les mthodes de lecture et de dfinition. Par exemple, le code suivant redfinit une mthode de lecture appele currentLabel, dfinie dans la classe MovieClip de lAPI de Flash Player.
package { import flash.display.MovieClip; public class OverrideExample extends MovieClip { public function OverrideExample() { trace(currentLabel) } override public function get currentLabel():String { var str:String = "Override: "; str += super.currentLabel; return str; } } }

Le rsultat de linstruction trace() dans le constructeur de la classe OverrideExample est Override: null, ce qui montre que cet exemple a russi redfinir la proprit hrite currentLabel.

Proprits statiques non hrites


Les sous-classes nhritent pas des proprits statiques. Ces dernires ne sont donc pas accessibles via une instance dune sous-classe. Une proprit statique nest accessible que par le biais de lobjet classe dans lequel elle est dfinie. Par exemple, le code suivant dfinit une classe de base nomme Base et une sous-classe nomme Extender, qui tend la classe Base. Une variable statique nomme test est dfinie dans la classe Base. Le code de lextrait ci-dessous ne peut tre compil en mode strict et gnre une erreur dexcution en mode standard.
package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); trace(myExt.test); // Erreur } } }

180

Programmation oriente objet en ActionScript

class Base { public static var test:String = "static"; } class Extender extends Base { }

La seule faon daccder la variable statique test est via lobjet classe, comme le montre le code suivant :
Base.test;

Il est toutefois permis de dfinir une proprit dinstance ayant le mme nom quune proprit statique. Cette proprit dinstance peut tre dfinie dans la mme classe que la proprit statique, ou dans une sous-classe. Par exemple, la classe Base de lexemple prcdent peut comporter une proprit dinstance nomme test. Le code suivant peut tre compil et excut normalement, car la classe Extender hrite de la proprit dinstance. Ce code peut aussi tre compil et excut normalement si la dfinition de la variable dinstance test est dplace (mais non copie) dans la classe Extender.
package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); trace(myExt.test); // rsultat : instance } } } class Base { public static var test:String = "static"; public var test:String = "instance"; } class Extender extends Base {}

Hritage

181

Les proprits statiques et la chane de porte


Bien que les proprits statiques ne soient pas hrites, elles figurent dans la chane de porte de la classe qui les dfinit et de toute sous-classe de celle-ci. Cest pourquoi on dit que les proprits statiques sont dans la porte de la classe dans laquelle elles sont dfinies et des sousclasses de celle-ci. Cela signifie quune proprit statique est directement accessible partir du corps de la classe qui la dfinit et de toute sous-classe de celle-ci. Lexemple suivant modifie les classes dfinies dans lexemple prcdent pour montrer que la variable statique test, dfinie dans la classe Base, est dans la porte de la classe Extender. Autrement dit, la classe Extender peut accder la variable statique test sans quil soit ncessaire de faire prcder le nom de celle-ci du nom de la classe qui dfinit test.
package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); } } } class Base { public static var test:String = "static"; } class Extender extends Base { public function Extender() { trace(test); // rsultat : static } }

182

Programmation oriente objet en ActionScript

Si une proprit dinstance est dfinie avec le mme nom quune proprit statique de la mme classe ou dune super-classe, la proprit dinstance est prioritaire dans la chane de porte. On dit alors que la proprit dinstance fait de lombre la proprit statique, ce qui signifie que la valeur de la proprit dinstance est utilise la place de celle de la proprit statique. Par exemple, le code suivant montre que si la classe Extender dfinit une variable dinstance nomme test, linstruction trace() utilise la valeur de la variable dinstance au lieu de celle de la variable statique.
package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); } } } class Base { public static var test:String = "static"; } class Extender extends Base { public var test:String = "instance"; public function Extender() { trace(test); // rsultat : instance } }

Hritage

183

Rubriques avances
Cette section dbute par un bref historique dActionScript et de la programmation oriente objet, puis se poursuit par une prsentation du modle dobjet dActionScript 3.0 et de la faon dont il permet la nouvelle machine virtuelle dActionScript (AVM2, ActionScript Virtual Machine 2) dtre nettement plus rapide que les versions antrieures de Flash Player, bases sur la premire version de la machine virtuelle dActionScript, AVM1.

Historique de la prise en charge de la programmation oriente objet en ActionScript


ActionScript 3.0 est une volution des versions antrieures dActionScript, cest pourquoi il peut tre utile de comprendre lvolution du modle dobjet en ActionScript. ActionScript tait lorigine un simple mcanisme de script pour les premires versions de Flash. Les programmeurs Flash ont alors commenc dvelopper des applications de plus en plus complexes avec ActionScript. En rponse aux besoins de ces programmeurs, le langage de chaque nouvelle version a connu des ajouts destins faciliter la cration dapplications complexes.

ActionScript 1.0
ActionScript 1.0 est le langage utilis dans les versions 6 et antrieures de Flash Player. Mme ce stade prcoce de dveloppement, le modle dobjet dActionScript tait bas sur le concept de lobjet comme type fondamental de donnes. Un objet ActionScript est un type de donnes composite dot dun groupe de proprits. Dans le contexte dun modle dobjet, le terme proprits dsigne tout ce qui est affect un objet (variables, fonctions ou mthodes). Bien que cette premire gnration dActionScript ne prenne pas en charge la dfinition de classes avec le mot-cl class, elle permet de dfinir une classe laide dun type spcial dobjet appel objet prototype. Au lieu dutiliser un mot-cl class pour crer une dfinition de classe abstraite qui sera ensuite instancie en objets concrets ( linstar des langages reposant sur des classes, comme Java ou C++), les langages bass sur le prototypage, tel quActionScript 1.0, utilisent un objet existant comme modle (ou prototype) dautres objets. Alors que les objets des langages bass sur la notion de classes peuvent pointer sur une classe qui leur sert de modle, les objets des langages bass sur la notion de prototypes pointent sur un autre objet, leur prototype, qui leur sert de modle.

184

Programmation oriente objet en ActionScript

Pour crer une classe en ActionScript 1.0, il est ncessaire de dfinir une fonction constructeur pour cette classe. En ActionScript, les fonctions sont des objets rels et non pas de simples dfinitions abstraites. La fonction constructeur sert alors dobjet prototype pour les instances de cette classe. Le code suivant cre une classe nomme Shape et dfinit une proprit nomme visible, qui a la valeur true par dfaut :
//classe de base function Shape() {} // cration dune proprit nomme visible. Shape.prototype.visible = true;

Cette fonction constructeur dfinit une classe Shape qui va tre instancie laide de loprateur new, comme suit :
myShape = new Shape();

Just as the Shape() constructor function object serves as the prototype for instances of the Shape class, it can also serve as the prototype for subclasses of Shapethat is, other classes that extend the Shape class. La cration dune classe qui est une sous-classe de la classe Shape est un processus en deux tapes. Dabord, crer la classe en dfinissant une fonction constructeur pour cette classe :
// classe enfant function Circle(id, radius) { this.id = id; this.radius = radius; }

Ensuite, utiliser loprateur new pour dclarer que la classe Shape est le prototype de la classe Circle. Par dfaut, toute nouvelle classe cre utilise la classe Object comme prototype, si bien que Circle.prototype contient alors un objet gnrique (une instance de la classe Object). Pour spcifier que le prototype de Circle est Shape et non pas Object, utilisez le code suivant pour changer la valeur de Circle.prototype afin quelle contienne un objet Shape et non plus un objet gnrique :
// faire de Circle une sous-classe de Shape. Circle.prototype = new Shape();

Rubriques avances

185

La classe Shape et la classe Circle sont maintenant lies par une relation dhritage communment appele chanage du prototype. Le diagramme reprsente la relation au sein dun chanage de prototype :
Object.prototype

Shape.prototype

Circle.prototype

La classe de base, la fin de chaque chanage de prototype, est la classe Object. La classe Object contient une proprit statique nomme Object.prototype qui pointe sur lobjet prototype de base pour tous les objets crs en ActionScript 1.0. Dans notre exemple de chanage de prototype, lobjet suivant est lobjet Shape. En effet, la proprit Shape.prototype na jamais t explicitement dfinie, si bien quelle contient encore un objet gnrique (une instance de la classe Object). Le lien final de ce chanage est la classe Circle, qui est lie son prototype, la classe Shape (la proprit Circle.prototype contient un objet Shape). Si nous crons une instance de la classe Circle, comme dans lexemple ci-dessous, linstance hrite du chanage de prototype de la classe Circle :
//crer une instance de la classe Circle. myCircle = new Circle();

Vous vous souvenez sans doute que nous avons cr une proprit nomme visible comme membre de la classe Shape. Dans notre exemple, la proprit visible nexiste pas comme partie de lobjet myCircle, mais uniquement comme membre de lobjet Shape, et pourtant la ligne de code suivit produit true :
trace(myCircle.visible); // rsultat : true

En remontant le chanage du prototype, Flash Player est en mesure de vrifier que lobjet myCircle hrite de la proprit visible. Lorsque ce code est excut, Flash Player recherche dabord dans les proprits de lobjet myCircle une proprit nomme visible, mais ne la trouve pas. Flash Player recherche alors dans lobjet Circle.prototype, mais ne trouve toujours pas de proprit nomme visible. En continuant remonter le chanage du prototype, Flash Player trouve enfin la proprit visible, dfinie dans lobjet Shape.prototype, et affiche la valeur de cette proprit. Pour des raisons de simplicit, cette section omet un grand nombre de dtails et de complexits du chanage de prototype, puisquil sagit simplement de vous aider comprendre le modle dobjet en ActionScript 3.0.
186 Programmation oriente objet en ActionScript

ActionScript 2.0
Avec ActionScript 2.0 ont t introduits de nouveaux mots-cls tels que class, extends, public et private, qui permettaient de dfinir des classes selon une mthode familire toute personne connaissant les langages bass sur des classes, comme Java et C++. Il est important de comprendre que le mcanisme sous-jacent dhritage na pas chang entre ActionScript 1.0 et ActionScript 2.0. La nouveaut dActionScript 2.0 consistait simplement en une nouvelle syntaxe pour la dfinition des classes. Le chanage du prototype fonctionne de la mme faon dans ces deux versions du langage. La nouvelle syntaxe introduite par ActionScript 2.0 est reprsente dans lexemple ci-dessous. Elle permet de dfinir des classes dune faon que la plupart des programmeurs considrent comme plus intuitive :
//classe de base class Shape { var visible:Boolean = true; }

Notez quActionScript 2.0 a galement introduit les annotations de type destines une vrification des types la compilation. Elles permettent de dclarer que la proprit visible de lexemple prcdent ne doit contenir quune valeur boolenne. Le nouveau mot-cl extends simplifie lui aussi le processus de cration dune sous-classe. Dans lexemple suivant, ce qui ncessitait deux tapes en ActionScript 1.0 est accompli en une seule tape, laide du mot-cl extends :
// classe enfant class Circle extends Shape { var id:Number; var radius:Number; function Circle(id, radius) { this.id = id; this.radius = radius; } }

Le constructeur est maintenant dclar dans le cadre de la dfinition de classe, et les proprits id et radius de la classe doivent elles aussi tre dclares explicitement. ActionScript 2.0 a galement ajout la prise en charge de la dfinition des interfaces, qui permet de rendre plus sophistiqus des programmes orients objet laide de protocoles formellement dfinis pour la communication entre les objets.

Rubriques avances

187

Lobjet de classe en ActionScript 3.0


Un paradigme courant en programmation oriente objet, en particulier avec Java et C++, fait appel des classes pour dfinir des types dobjets. Les langages de programmation qui adoptent ce paradigme ont aussi tendance utiliser des classes pour construire des instances du type de donnes dfini par la classe. ActionScript utilise des classes pour ces deux buts, mais ses origines de langage bas sur des prototypes lui confrent une caractristique intressante. Pour chaque dfinition de classe, ActionScript cre un objet de classe spcial qui autorise le partage du comportement et de ltat. Pour de nombreux programmeurs en ActionScript, toutefois, cette distinction naura aucune implication pratique sur le codage. En effet, ActionScript 3.0 est conu de telle sorte quil est possible de crer des applications sophistiques orientes objet sans utiliser, et sans mme comprendre, ces objets de classe spciaux. Cette section tudie en dtail les problmes que rencontreront les programmeurs avancs qui souhaitent tirer parti des objets de classe. Le diagramme suivant montre la structure dun objet de classe reprsentant une classe simple nomme A, dfinie par linstruction class A {}:

Class.prototype
CA

Object.prototype

delegate

delegate constructor

type

prototype
A

traits

Chaque rectangle du diagramme reprsente un objet. Chaque objet du diagramme est marqu dun caractre en indice A pour signaler quil appartient la classe A. Lobjet de classe (CA) contient des rfrences un certain nombre dautres objets importants. Lobjet traits des instances (TA) enregistre les proprits des instances qui sont dfinies dans une dfinition de classe. Un objet traits de la classe (TCA) reprsente le type interne de la classe et enregistre les proprits statiques dfinies par la classe (le caractre C en indice signifie classe ). Lobjet prototype (PA) fait toujours rfrence lobjet de classe auquel il tait attach lorigine via la proprit constructeur.

188

Programmation oriente objet en ActionScript

Lobjet traits
Lobjet traits est une nouveaut dActionScript 3.0 qui a t implmentes pour des raisons de performances. Dans les versions prcdentes dActionScript, la recherche dun nom pouvait ncessiter beaucoup de temps pendant que Flash Player remontait le chanage du prototype. En ActionScript 3.0, la recherche dun nom est beaucoup plus rapide et efficace, car les proprits hrites sont copies des super-classes dans lobjet traits des sous-classes. Lobjet traits nest pas directement accessible par code, mais sa prsence se manifeste par lamlioration des performances et de lutilisation mmoire. Lobjet traits fournit la machine virtuelle AVM2 des informations dtailles sur la disposition et le contenu dune classe. Ces informations permettent AVM2 de rduire nettement le temps dexcution, car elle peut frquemment gnrer des instructions machine directes pour accder des proprits ou appeler des mthodes directement, sans effectuer au pralable une longue recherche de nom. Grce lobjet traits, lespace occup en mmoire par un objet peut tre nettement moins importante quavec les versions antrieures dActionScript. Par exemple, si une classe est scelle (cest--dire si cette classe nest pas dclare comme dynamique), une instance de la classe ne ncessite pas de recherche par calcul dadresse pour les proprits ajoutes dynamiquement, et il lui suffit dun pointeur sur lobjet traits et de quelques emplacements pour les proprits fixes dfinies dans la classe. En consquence, pour un objet qui ncessitait 100 octets en mmoire avec ActionScript 2.0, 20 octets suffiront avec ActionScript 3.0.
REMARQUE

Lobjet traits est un lment dimplmentation interne et il nest pas garanti quil ne changera pas, ou mme quil ne disparatra pas, dans les versions futures dActionScript.

Lobjet prototype
En ActionScript, chaque objet de classe possde une proprit nomme prototype, qui est une rfrence lobjet prototype de cette classe. Lobjet prototype est un hritage des premires versions dActionScript, bases sur des prototypes. Pour plus dinformations, consultez la section ActionScript 1.0 , la page 184. La proprit prototype est en lecture seule et ne peut donc pas tre modifie pour pointer sur dautres objets. linverse, dans les anciennes versions dActionScript, la proprit prototype pouvait tre raffecte pour pointer sur une autre classe. Bien que la proprit prototype soit en lecture seule, ce nest pas le cas de lobjet prototype quelle rfrence. De nouvelles proprits peuvent donc tre ajoutes lobjet prototype. Les proprits ajoutes lobjet prototype sont partages avec toutes les autres instances de la classe.

Rubriques avances

189

Le chanage de prototype, qui tait le seul mcanisme dhritage des versions antrieures dActionScript, na plus quun rle secondaire en ActionScript 3.0. Le principal mcanisme dhritage, lhritage des proprits fixes, est gr de faon interne par lobjet traits. Une proprit fixe est une variable ou une mthode dfinie dans le cadre dune dfinition de classe. Lhritage des proprits fixes est galement appel hritage des classes, car cest le mcanisme dhritage qui est associ aux mots-cls class, extends et override. Le chanage de prototype reprsente un autre mcanisme dhritage qui est plus dynamique que lhritage des proprits fixes. Il est possible dajouter des proprits lobjet prototype dune classe non seulement dans le cadre de la dfinition de classe, mais aussi lors de lexcution, via la proprit prototype de lobjet de classe. Notez toutefois que si le compilateur est en mode strict, il peut tre impossible daccder aux proprits ajoutes un objet prototype, sauf si vous dclarez une classe avec le mot-cl dynamic. La classe Object est un bon exemple dune classe dont plusieurs proprits sont attaches lobjet prototype. Les mthodes toString() et valueOf() de la classe Object sont en fait des fonctions affectes des proprits de lobjet prototype de la classe Object. Voici un exemple de laspect thorique de la dclaration de ces mthodes (limplmentation relle est lgrement diffrente en raison des dtails pratiques dimplmentation) :
public dynamic class Object { prototype.toString = function() { //instructions }; prototype.valueOf = function() { //instructions }; }

Comme nous lavons dj mentionn, il est possible dattacher une proprit lobjet prototype dune classe en-dehors de la dfinition de cette classe. Par exemple, la mthode toString() peut galement tre dfinie hors de la dfinition de la classe Object, comme suit :
Object.prototype.toString = function() { //instructions };

190

Programmation oriente objet en ActionScript

Toutefois, contrairement lhritage des proprits fixes, lhritage du prototype ne ncessite pas le mot-cl override pour redfinir une mthode dune sous-classe. Par exemple, pour redfinir la mthode valueOf() dans une sous-classe de la classe Object, trois options sont possibles. Premirement, vous pouvez dfinir une mthode valueOf() dans lobjet prototype de la sous-classe, lintrieur de la dfinition de classe. Le code suivant cre une sous-classe dObject nomme Foo, et redfinit la mthode valueOf() dans la dfinition de classe de lobjet prototype de Foo. Chaque classe hritant de la classe Object, il nest pas ncessaire dutiliser le mot-cl extends.
dynamic class Foo { prototype.valueOf = function() { return "Instance of Foo"; }; }

Deuximement, vous pouvez dfinir une mthode valueOf() dans lobjet prototype de Foo en-dehors de la dfinition de classe, comme le montre le code ci-dessous :
Foo.prototype.valueOf = function() { return "Instance of Foo"; };

Troisimement, vous pouvez dfinir une proprit fixe nomme valueOf() dans la classe Foo. Cette technique diffre des prcdentes dans la mesure o elle mle lhritage des proprits fixes et lhritage du prototype. Pour redfinir valueOf() partir dune sous-classe de Foo, il est ncessaire dutiliser le mot-cl override. Le code ci-dessous montre valueOf() dfinie comme proprit fixe dans Foo :
class Foo { function valueOf():String { return "Instance of Foo"; } }

Rubriques avances

191

Lespace de nom dActionScript 3


Lexistence de deux mcanismes dhritage spars, lhritage des proprits fixes et lhritage du prototype, provoque un intressant problme de compatibilit par rapport aux proprits et mthodes des classe de base. La compatibilit avec les spcifications prliminaires du langage ECMAScript, dition 4, ncessite dutiliser lhritage de prototype, si bien que les proprits et mthodes dune classe de base sont dfinies dans lobjet prototype de cette classe. Mais par ailleurs, la compatibilit avec lAPI de Flash Player ncessite dutiliser lhritage des proprits fixes, si bien que les proprits et mthodes dune classe de base sont dfinies dans la dfinition de classe, laide des mots-cls const, var et function. De plus, lutilisation des proprits fixes au lieu des versions du prototype est susceptible de permettre une nette amlioration des performances lexcution. Pour rsoudre ce problme, ActionScript 3.0 utilise les deux mcanismes dhritage (proprits fixes et prototype) pour les classes de base. Chaque classe de base contient deux jeux de proprits et de mthodes. Un jeu est dfini dans lobjet prototype pour assurer la compatibilit avec les spcifications dECMAScript, et lautre jeu est dfini avec les proprits fixes et lespace de nom dAS3, pour assurer la compatibilit avec lAPI de Flash Player. Lespace de nom dAS3 reprsente un mcanisme fort pratique pour choisir entre les deux jeux de proprits et de mthodes. Si vous nutilisez pas lespace de nom dAS3, une instance dune classe de base hrite des proprits et des mthodes dfinies dans lobjet prototype de cette classe de base. Si par contre vous utilisez lespace de nom dAS3, une instance dune classe de base hrite des versions dAS3, car les proprits fixes sont toujours prfres aux proprits du prototype. En dautres termes, lorsquune proprit fixe est disponible, elle est toujours utilise la place dune proprit du prototype ayant le mme nom. Il est possible dutiliser slectivement la version de lespace de nom dAS3 dune proprit ou dune mthode, en la qualifiant laide de lespace de nom dAS3. Par exemple, le code cidessous utilise la version AS3 de la mthode Array.pop() :
var nums:Array = new Array(1, 2, 3); nums.AS3::pop(); trace(nums); // rsultat : 1,2

Vous pouvez aussi faire appel la directive use namespace pour ouvrir lespace de nom dAS3 pour toutes les dfinitions figurant dans un bloc de code. Par exemple, le code ci-dessous utilise la directive use namespace pour ouvrir lespace de nom dAS3 pour les mthodes pop() et push():
use namespace AS3; var nums:Array = new Array(1, 2, 3); nums.pop(); nums.push(5); trace(nums) // rsultat : 1,2,5

192

Programmation oriente objet en ActionScript

ActionScript 3.0 comporte aussi des options de compilation pour chaque jeu de proprits, ce qui permet dappliquer lespace de nom dAS3 au programme entier. Loption de compilation -as3 reprsente lespace de nom dAS3, et loption de compilation -es reprsente loption dhritage du prototype (es signifie ECMAScript). Pour ouvrir lespace de nom dAS3 pour tout le programme, mettez loption de compilation -as3 sur true et loption de compilation -es sur false. Pour utiliser les versions du prototype, mettez les options de compilation sur les valeurs opposes. Les options de compilation par dfaut pour Adobe Flex Builder 2 et Adobe Flash CS3 Professional sont -as3 = true et -es = false. Si vous prvoyez dtendre lune des classes de base et de redfinir des mthodes, vous devez comprendre comment lespace de nom dAS3 affecte la faon de dclarer une mthode redfinie. Si vous utilisez lespace de nom dAS3, toute redfinition dune mthode dune classe de base doit galement utiliser lespace de nom dAS3, ainsi que lattribut override. Si vous nutilisez pas lespace de nom dAS3 et voulez redfinir une mthode dune classe de base dans une sous-classe, vous ne devez utiliser ni lespace de nom dAS3 dans cette redfinition, ni lattribut override.

Exemple : GeometricShapes
Lexemple dapplication GeometricShapes montre comment il est possible dappliquer un certain nombre de concepts et fonctionnalits orients objet laide dActionScript 3.0, en particulier :

Dfinition des classes lextension des classes le polymorphisme et le mot-cl override la dfinition, lextension et limplmentation des interfaces.

Cet exemple comprend aussi une mthode de factorisation qui cre des instances de classes, montrant ainsi comment dclarer une valeur de retour comme instance dune interface et utiliser lobjet ainsi renvoy de manire gnrique.

Exemple : GeometricShapes

193

Pour obtenir les fichiers de cet exemple dapplication, consultez la page www.adobe.com/go/ learn_programmingAS3samples_flash_fr. Les fichiers de lapplication GeometricShapes se trouvent dans le dossier Samples/GeometricShapes. Cette application se compose des fichiers suivants :
Fichier
GeometricShapes.mxml ou GeometricShapes.fla com/example/programmingas3/ geometricshapes/IGeometricShape.as com/example/programmingas3/ geometricshapes/IPolygon.as

Description
Le fichier dapplication principal pour Flash (FLA) ou Flex (MXML) Interface de base dfinissant les mthodes qui doivent tre implmentes par toutes les classes de lapplication GeometricShapes. Interface dfinissant les mthodes qui doivent tre implmentes par les classes de lapplication GeometricShapes qui comportent plusieurs cts. Type de forme gomtrique dont les cts sont de longueur gale et positionns symtriquement autour du centre de la forme. Type de forme gomtrique qui dfinit un cercle. Sous-classe de RegularPolygon, dfinissant un triangle quilatral. Sous-classe de RegularPolygon, dfinissant un rectangle dont les quatre cts sont gaux. Classe contenant une mthode de factorisation pour crer des formes partir dun type et dune taille de forme.

com/example/programmingas3/ geometricshapes/RegularPolygon.as com/example/programmingas3/ geometricshapes/Circle.as com/example/programmingas3/ geometricshapes/EquilateralTriangle.as com/example/programmingas3/ geometricshapes/Square.as com/example/programmingas3/ geometricshapes/ GeometricShapeFactory.as

194

Programmation oriente objet en ActionScript

Dfinition des classes de GeometricShapes


Lapplication GeometricShapes permet de spcifier un type de forme gomtrique et la taille de cette dernire. Elle renvoie alors la description de la forme, sa surface et son primtre. Linterface utilisateur de lapplication est triviale : elle se compose de quelques contrles permettant de slectionner le type de forme, de dfinir la taille et dafficher la description. De fait, la partie intressante de cette application est la face cache de liceberg : la structure des classes et des interfaces elles-mmes. Cette application traite des formes gomtriques, mais elle ne les affiche pas graphiquement. Elle reprsente une petite bibliothque de classes et dinterfaces qui seront rutilises dans un autre chapitre, dans la section Exemple : SpriteArranger , la page 451. Lexemple SpriteArranger affiche les formes graphiquement et permet lutilisateur de les manipuler, partir de la structure de classes fournie ici, dans lapplication GeometricShapes. Les classes et interfaces qui dfinissent les formes gomtriques de cet exemple sont reprsentes dans le diagramme ci-dessous, en notation UML (Unified Modeling Language) :
GeometricShapes Example Classes << interface >> IGeometricShape +getArea (): Number +describe (): Strin

<< interface >> IPolygon +getPerimeter (): Number +getSumOfAngles (): Number

Circle +diameter:Number
+Circle () : Circle +getArea () : Number +describe () : String +getCircumference () : Number

RegularPolygon
+numSides : int +sideLength : Number
+RegularPolygon (): RegularPolygon +getSumOfAngles (): Number +getPerimeter (): Number +getArea (): Number +describe (): String

EquilateralTriangle
+EquilateralTriangle (): EquilateralTriangle +getArea (): Number +describe (): String

Square +Square (): Square +getArea (): Number +describe (): String

Exemple : GeometricShapes

195

Dfinition dun comportement commun laide dinterfaces


Cette application GeometricShapes gre trois types de formes : cercles, carrs et triangles quilatraux. La structure des classes de GeometricShapes commence par une interface trs simple, IGeometricShape, qui liste des mthodes communes aux trois types de formes :
package com.example.programmingas3.geometricshapes { public interface IGeometricShape { function getArea():Number; function describe():String; } }

Linterface dfinit deux mthodes : la mthode getArea(), qui calcule et renvoie la surface de la forme, et la mthode describe(), qui assemble une description textuelle des proprits de la forme. Nous voulons aussi connatre le primtre de chaque forme. Toutefois, le primtre dun cercle est appel circonfrence et il est calcul de faon particulire, si bien que le comportement diverge de ceux dun triangle ou dun carr. Il existe cependant assez de similitudes entre les triangles, les carrs et les autres polygones pour quil soit logique de dfinir une nouvelle classe dinterface pour eux : IPolygon. Linterface IPolygon est galement plutt simple, comme on le voit :
package com.example.programmingas3.geometricshapes { public interface IPolygon extends IGeometricShape { function getPerimeter():Number; function getSumOfAngles():Number; } }

Cette interface dfinit deux mthodes communes tous les polygones : la mthode getPerimeter(), qui mesure la longueur combine de tous les cts, et la mthode getSumOfAngles() qui additionne tous les angles intrieurs. Linterface IPolygon tend linterface IGeometricShape, si bien que toute classe qui implmente linterface IPolygon doit dclarer les quatre mthodes les deux de linterface IGeometricShape, et les deux de linterface IPolygon.

196

Programmation oriente objet en ActionScript

Dfinition des classes de formes


Ds que vous avez une vue claire des mthodes communes chaque type de forme, vous pouvez dfinir les classes de formes elles-mmes. En ce qui concerne le nombre de mthodes implmenter, la forme la plus simple est la classe Circle :
package com.example.programmingas3.geometricshapes { public class Circle implements IGeometricShape { public var diameter:Number; public function Circle(diam:Number = 100):void { this.diameter = diam; } public function getArea():Number { // The formula is Pi * radius * radius. var radius:Number = diameter / 2; return Math.PI * radius * radius; } public function getCircumference():Number { // The formula is Pi * diameter. return Math.PI * diameter; } public function describe():String { var desc:String = "This shape is a Circle.\n"; desc += "Its diameter is " + diameter + " pixels.\n"; desc += "Its area is " + getArea() + ".\n"; desc += "Its circumference is " + getCircumference() + ".\n"; return desc; } } }

La classe Circle implmente linterface IGeometricShape, elle doit donc comporter du code pour les mthodes getArea() et describe(). De plus, elle dfinit la mthode getCircumference(), qui est unique la classe Circle. La classe Circle dclare aussi une proprit, diameter, qui napparatra pas dans les autres classes, ddies aux polygones.

Exemple : GeometricShapes

197

Les deux autres types de formes, les carrs et les triangles quilatraux, ont dautres points communs : ils ont tous deux des cts de longueurs gales, et il existe des formules communes pour calculer leurs primtre et la somme de leurs angles intrieurs. En fait, ces formules communes sappliquent tout autre polygone rgulier que vous tes susceptible de dfinir par la suite. La classe RegularPolygon sera la super-classe de la classe Square et de la classe EquilateralTriangle. Une super-classe permet de dfinir en un seul point des mthodes communes, il nest donc pas ncessaire de les dfinir sparment dans chaque sous-classe. Voici le code de la classe RegularPolygon :
package com.example.programmingas3.geometricshapes { public class RegularPolygon implements IPolygon { public var numSides:int; public var sideLength:Number; public function RegularPolygon(len:Number = 100, sides:int = 3):void { this.sideLength = len; this.numSides = sides; } public function getArea():Number { // This method should be overridden in subclasses. return 0; } public function getPerimeter():Number { return sideLength * numSides; } public function getSumOfAngles():Number { if (numSides >= 3) { return ((numSides - 2) * 180); } else { return 0; } }

198

Programmation oriente objet en ActionScript

public function describe():String { var desc:String = "Each side is " + sideLength + " pixels long.\n"; desc += "Its area is " + getArea() + " pixels square.\n"; desc += "Its perimeter is " + getPerimeter() + " pixels long.\n"; desc += "The sum of all interior angles in this shape is " + getSumOfAngles() + " degrees.\n"; return desc; } } }

La classe RegularPolygon dclare dabord deux proprits qui sont communes tous les polygones rguliers : la longueur de chaque ct (la proprit sideLength) et le nombre de faces (la proprit numSides). La classe RegularPolygon implmente linterface IPolygon et dclare les quatre mthodes de linterface IPolygon. Elle implmente deux dentre elles, les mthodes getPerimeter() et getSumOfAngles() laide de formules communes. La formule de la mthode getArea() tant diffrente dune forme lautre, la version de la mthode dans la classe de base ne peut pas comporter une logique commune dont hriteraient les mthodes des sous-classes. Elle renvoie donc simplement une valeur par dfaut de 0 pour indiquer que la surface na pas t calcule. Pour calculer correctement la surface de chaque forme, les sous-classes de la classe RegularPolygon devront redfinir elles-mmes la mthode getArea(). Le code de la classe EquilateralTriangle, ci-dessous, montre comment la mthode getArea() est redfinie :
package com.example.programmingas3.geometricshapes { public class EquilateralTriangle extends RegularPolygon { public function EquilateralTriangle(len:Number = 100):void { super(len, 3); } public override function getArea():Number { // The formula is ((sideLength squared) * (square root of 3)) / 4. return ( (this.sideLength * this.sideLength) * Math.sqrt(3) ) / 4; }

Exemple : GeometricShapes

199

public override function describe():String { /* starts with the name of the shape, then delegates the rest of the description work to the RegularPolygon superclass */ var desc:String = "This shape is an equilateral Triangle.\n"; desc += super.describe(); return desc; } } }

Le mot-cl override indique que la mthode EquilateralTriangle.getArea() redfinit volontairement la mthode getArea() de la super-classe RegularPolygon. Lorsque la mthode EquilateralTriangle.getArea() est appele, elle calcule la surface laide de la formule du code prcdent, et le code de la mthode RegularPolygon.getArea() nest jamais excut. Par contre, la classe EquilateralTriangle ne dfinit pas sa propre version de la mthode
getPerimeter(). Lorsque la mthode EquilateralTriangle.getPerimeter() est appele,

lappel remonte la chane dhritage et excute le code de la mthode getPerimeter() de la super-classe RegularPolygon. Le constructeur EquilateralTriangle() utilise linstruction super() pour invoquer explicitement le constructeur RegularPolygon() de sa super-classe. Si les deux constructeurs avaient le mme ensemble de paramtres, il serait possible domettre compltement le constructeur EquilateralTriangle, et il suffirait dexcuter le constructeur RegularPolygon(). Toutefois, le constructeur RegularPolygon() ncessite un paramtre supplmentaire, numSides. Le constructeur EquilateralTriangle() appelle donc super(len, 3) qui passe le paramtre en entre len et la valeur 3 pour indiquer que le nombre de cts du triangle est 3. La mthode describe() utilise galement linstruction super(), mais de faon diffrente, afin dinvoquer la version de la mthode describe() dans la super-classe RegularPolygon. La mthode EquilateralTriangle.describe() dfinit dabord la variable de chane desc qui affiche le type de forme. Elle obtient ensuite les rsultats de la mthode RegularPolygon.describe() en appelant super.describe(), et ajoute ces rsultats la fin de la chane desc. La classe Square ne sera pas dcrite en dtail ici, mais elle est similaire la classe EquilateralTriangle, avec un constructeur et ses propres implmentations des mthodes getArea() et describe().

200

Programmation oriente objet en ActionScript

Le polymorphisme et la mthode de factorisation


Il est possible dutiliser de diverses faons intressantes un ensemble de classes utilisant bon escient les interfaces et lhritage. Par exemple, toutes les classes de formes dcrites jusquici implmentent linterface IGeometricShape ou tendent une super-classe qui se charge de cette implmentation. Si lon dfinit une variable comme tant une instance de IGeometricShape, il nest donc pas ncessaire, pour appeler sa mthode describe(), de savoir si cest une instance de la classe Circle ou de la classe Square. Le code suivant illustre cette situation :
var myShape:IGeometricShape = new Circle(100); trace(myShape.describe());

Lorsque myShape.describe() est appele, elle excute la mthode Circle.describe(), car bien que la variable soit dfinie comme une instance de linterface IGeometricShape, Circle est sa classe sous-jacente. Cet exemple illustre le principe du polymorphisme : le mme appel une mthode provoquera lexcution dun code diffrent, selon la classe de lobjet dont la mthode est appele. Lapplication GeometricShapes applique ce type de polymorphisme bas sur linterface laide dune version simplifie dun modle de conception appel mthode de factorisation . Lexpression mthode de factorisation fait rfrence une fonction qui renvoie un objet dont le type de donnes sous-jacent ou le contenu diffrent selon le contexte. La classe GeometricShapeFactory reprsente ici dfinit une mthode de factorisation nomme createShape():
package com.example.programmingas3.geometricshapes { public class GeometricShapeFactory { public static var currentShape:IGeometricShape; public static function createShape(shapeName:String, len:Number):IGeometricShape { switch (shapeName) { case "Triangle": return new EquilateralTriangle(len); case "Square": return new Square(len);

Exemple : GeometricShapes

201

case "Circle": return new Circle(len); } return null; } public static function describeShape(shapeType:String, shapeSize:Number):String { GeometricShapeFactory.currentShape = GeometricShapeFactory.createShape(shapeType, shapeSize); return GeometricShapeFactory.currentShape.describe(); } } }

La mthode de factorisation createShape() laisse aux constructeurs de la sous-classe de la forme le soin de dfinir les dtails des instances quils crent, tout en renvoyant les nouveaux objets comme instances de IgeometricShape, ce qui permet lapplication de les traiter de faon plus gnrale. La mthode describeShape() de lexemple prcdent montre comment une application peut utiliser la mthode de factorisation pour obtenir une rfrence gnrique un objet spcifique. Lapplication peut obtenir la description dun objet Circle nouvellement cr en procdant comme suit :
GeometricShapeFactory.describeShape(Circle, 100);

La mthode describeShape() appelle alors la mthode de factorisation createShape() avec les mmes paramtres, en mettant le nouvel objet Circle dans une variable statique nomme currentShape, dont le type a t dfini comme objet de IGeometricShape. La mthode describe() est ensuite appele pour lobjet currentShape, et cet appel est automatiquement rsolu pour excuter la mthode Circle.describe(), qui renvoie une description dtaille du cercle.

202

Programmation oriente objet en ActionScript

Amlioration de lapplication dexemple


La puissance des interfaces et de lhritage devient vidente ds quil sagit de modifier lapplication. Supposons que nous voulions ajouter une nouvelle forme, un pentagone, cette application. Il suffit de crer une nouvelle classe, Pentagon, qui tend la classe RegularPolygon et dfinit ses propres versions des mthodes getArea() et describe(). Une nouvelle option Pentagon est ensuite ajoute dans linterface utilisateur de lapplication. Cest tout. La classe Pentagon obtiendra automatiquement, par hritage, les fonctionnalits des mthode getPerimeter() et getSumOfAngles() de la classe RegularPolygon. Et puisquelle hrite dune classe qui implmente linterface IGeometricShape, une instance de Pentagon sera galement traite comme une instance de IGeometricShape. Autrement dit, il nest pas ncessaire de modifier lune des mthodes de la classe GeometricShapeFactory, ce qui rend beaucoup plus facile lajout ultrieur de nouveaux types de forme. titre dexercice, il est conseill dajouter une classe Pentagon lexemple Geometric Shapes, afin de constater quel point les interfaces et lhritage facilitent le processus dajout de nouvelles fonctionnalits une application.

Exemple : GeometricShapes

203

204

Programmation oriente objet en ActionScript

CHAPITRE 5

Utilisation des dates et heures


Si la ponctualit ne fait pas tout, elle nen est pas moins un facteur cl des applications logicielles. ActionScript 3.0 propose diffrentes mthodes de gestion des dates calendaires, des heures et des intervalles temporels. Deux classes principales assurent lessentiel de la fonctionnalit temporelle : la classe Date et la nouvelle classe Timer du package flash.utils.

Contenu
Principes de base des dates et des heures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 Gestion des dates calendaires et des heures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Contrle des intervalles temporels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 Exemple : une horloge analogique simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Principes de base des dates et des heures


Introduction lutilisation des dates et des heures
Les dates et les heures constituent un type dinformations courant utilis dans les programmes ActionScript. Par exemple, vous pouvez, entre autres, connatre la date du jour ou calculer combien de temps un utilisateur passe sur un cran particulier. Dans ActionScript, vous pouvez utiliser la classe Date pour reprsenter un moment unique dans le temps, y compris des informations de date et dheure. Une instance Date contient des valeurs pour les units de date et dheure individuelles (anne, mois, date, jour de la semaine, heure, minutes, secondes, millisecondes et fuseau horaire, par exemple). Pour des utilisations plus avances, ActionScript comprend galement la classe Timer que vous pouvez utiliser pour effectuer des actions aprs un certain dlai ou des intervalles rpts.

205

Tches de date et dheure courantes


Ce chapitre dcrit les tches courantes suivantes qui utilisent des informations de date et dheure :

Utilisation des objets Date Obtention de la date et de lheure actuelles Accs des units de date et dheure individuelles (jours, annes, heures, minutes, etc.) Excution doprations arithmtiques sur les dates et les heures Conversion entre plusieurs fuseaux horaires Excutions dactions rptes Excution dactions aprs un dlai dfini

Concepts et termes importants


La liste de rfrence suivante contient les termes importants que vous rencontrerez dans ce chapitre :

Heure UTC : heure universellele fuseau horaire de rfrence d heure zro . Tous les autres fuseaux horaires sont dfinis sous la forme de nombre dheures par rapport (avant ou aprs) lheure universelle.

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Etant donn que le code de ce chapitre traite essentiellement des objets Date, le test des exemples implique laffichage des valeurs des variables utilises dans les exemples, soit en les crivant dans une occurrence de champ texte sur la scne, soit en utilisant la fonction trace() pour imprimer des valeurs dans le panneau Sortie. Ces techniques sont dcrites en dtail dans Test des exemples de code contenus dans un chapitre , la page 67.

Gestion des dates calendaires et des heures


Dans ActionScript 3.0, toutes les fonctions de gestion des dates calendaires et des heures se concentrent autour de la classe de niveau suprieur Date. Cette classe contient des mthodes et des proprits qui vous permettent de manier les dates et les heures soit selon le modle universel coordonn (UTC, Universal Time Coordinated), soit selon le fuseau horaire considr. LUTC est une dfinition normalise du temps qui correspond essentiellement lheure du mridien de Greenwich (GMT, Greenwich Mean Time).

206

Utilisation des dates et heures

Cration dobjets Date


La classe Date compte lune des mthodes constructeur les plus polyvalentes de toutes les classes de base. Vous pouvez linvoquer de quatre manires diffrentes. Primo, si aucun paramtre nest fourni, le constructeur Date() renvoie un objet Date contenant la date et lheure locale actuelle de votre fuseau horaire. Voici un exemple :
var now:Date = new Date();

Secundo, si un paramtre numrique unique est fourni, le constructeur Date() le considre comme le nombre de millisecondes coules depuis le 1er janvier 1970 et renvoie lobjet Date correspondant. Notez que la valeur en millisecondes que vous transmettez est considre comme le nombre de millisecondes depuis le 1er janvier 1970 en temps UTC. Toutefois, lobjet Date affiche des valeurs dans votre fuseau horaire local, sauf si vous utilisez des mthodes UTC uniquement pour les extraire et les afficher. Si vous crez un nouvel objet Date laide du paramtre en millisecondes, veillez tenir compte du dcalage horaire entre votre fuseau local et le temps UTC. Les instructions ci-aprs crent un objet Date dfini minuit le 1er janvier 1970 en temps UTC :
var millisecondsPerDay:int = 1000 * 60 * 60 * 24; // tablit un objet Date un jour aprs la date de dpart du 1/1/1970 var startTime:Date = new Date(millisecondsPerDay);

Tertio, vous pouvez transmettre plusieurs paramtres numriques au constructeur Date(). Celui-ci les traite respectivement comme la date, le mois, le jour, les heures, les minutes, les secondes et les millisecondes, et renvoie un objet Date correspondant. Les paramtres entrs sont considrs comme correspondant lheure locale plutt quau temps UTC. Les instructions suivantes tablissent un objet Date dfini minuit le 1er janvier 2000, dans le fuseau horaire local :
var millenium:Date = new Date(2000, 0, 1, 0, 0, 0, 0);

Quarto, vous pouvez transmettre un paramtre numrique unique au constructeur Date(). Celui-ci essaiera danalyser cette chane en composants de date et heure, et de renvoyer un objet Date correspondant. Si vous choisissez cette approche, il est recommand dinclure le constructeur Date() dans un bloc try..catch afin dintercepter toute erreur danalyse. Le constructeur Date() accepte plusieurs formats de chanes, comme indiqu dans le Rfrence du langage et des composants ActionScript 3.0. Linstruction suivante initialise un nouvel objet Date laide dune valeur chane :
var nextDay:Date = new Date(Mon May 1 2006 11:30:00 AM);

Si le constructeur Date() ne peut analyser le paramtre chane, il ne dclenche pas dexception. Cependant, lobjet Date rsultant contiendra une valeur date incorrecte.

Gestion des dates calendaires et des heures

207

Obtention des valeurs dunits temporelles


Vous pouvez extraire les valeurs de plusieurs units temporelles au sein de lobjet Date grce des proprits ou des mthodes de la classe Date. Chacune des proprits suivantes fournit la valeur dune unit temporelle de lobjet Date :

La proprit fullYear La proprit month au format numrique : de 0 pour janvier 11 pour dcembre La proprit date, qui correspond au numro calendaire du jour du mois, de 1 31 La proprit day, qui correspond au jour de la semaine au format numrique, 0 reprsentant dimanche La proprit hours, de 0 23 La proprit minutes La proprit seconds La proprit milliseconds

La classe Date offre en fait plusieurs manires dobtenir ces valeurs. Vous pouvez par exemple obtenir la valeur month de lobjet Date de quatre manires :

La proprit month La mthode getMonth() La proprit monthUTC La mthode getMonthUTC()

Ces quatre solutions sont dune efficacit quivalente, vous pouvez donc adopter celle qui convient le mieux votre application. Les proprits rpertories ci-dessus reprsentent toutes des composants de la valeur date totale. Par exemple, la proprit milliseconds ne sera jamais suprieure 999, puisque si elle atteint 1000, la valeur seconds augmente de 1, la proprit milliseconds se remet zro. Si vous voulez obtenir la valeur de lobjet Date en millisecondes depuis le 1er janvier 1970 (UTC), vous pouvez utiliser la mthode getTime(). La mthode setTime(), quant elle, vous permet de modifier la valeur dun objet Date existant en millisecondes depuis le 1er janvier 1970 (UTC).

Oprations arithmtiques sur la date et lheure


La classe Date permet dadditionner et de soustraire des dates et heures. Les valeurs Date sont conserves en interne sous forme de millisecondes. Il est donc ncessaire de convertir les autres valeurs en millisecondes avant de les ajouter ou de les soustraire aux objets Date.

208

Utilisation des dates et heures

Si votre application doit effectuer de nombreuses oprations arithmtiques sur les dates et heures, il peut savrer utile de crer des constantes qui conservent les valeurs dunits temporelles courantes en millisecondes, comme illustr ci-aprs :
public static const millisecondsPerMinute:int = 1000 * 60; public static const millisecondsPerHour:int = 1000 * 60 * 60; public static const millisecondsPerDay:int = 1000 * 60 * 60 * 24;

Il devient alors simple deffectuer des oprations arithmtiques laide des units temporelles standard. Le code ci-aprs dcale la valeur date dune heure par rapport lheure actuelle laide des mthodes getTime() et setTime() :
var oneHourFromNow:Date = new Date(); oneHourFromNow.setTime(oneHourFromNow.getTime() + millisecondsPerHour);

Une autre manire de dfinir une valeur date consiste crer un nouvel objet Date laide dun seul paramtre en millisecondes. Par exemple, le code suivant ajoute 30 jours une date pour en calculer une autre :
// Dfinit la date de facturation par rapport la date courante. var invoiceDate:Date = new Date(); // ajoute 30 jours pour obtenir la date dchance var dueDate:Date = new Date(invoiceDate.getTime() + (30 * millisecondsPerDay));

Ensuite, la constante millisecondsPerDay est multiplie par 30 pour reprsenter la priode de 30 jours et le rsultat est ajout la valeur invoiceDate afin de dfinir la valeur dueDate.

Conversion entre plusieurs fuseaux horaires


Les oprations arithmtiques sur les dates et heures sont particulirement pratiques lorsque vous devez convertir des dates dun fuseau horaire un autre. Tel est le rle de la mthode getTimezoneOffset(), qui renvoie la valeur (en minutes) de dcalage entre le fuseau horaire de lobjet Date et le temps UTC. La valeur renvoye sexprime en minutes parce que tous les fuseaux horaires ne correspondent pas une heure ; certains sont dcals dune demi-heure par rapport aux fuseaux voisins. Lexemple suivant utilise le dcalage de fuseau horaire pour convertir une date partir de lheure locale en temps UTC. La conversion seffectue tout dabord par calcul de la valeur du fuseau horaire en millisecondes, puis par ajustement de la valeur Date selon ce montant :
// Cre une date selon lheure locale. var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM"); // Convertit la date en temps UTC par ajout ou soustraction du dcalage // de fuseau horaire. var offsetMilliseconds:Number = nextDay.getTimezoneOffset() * 60 * 1000; nextDay.setTime(nextDay.getTime() + offsetMilliseconds);

Gestion des dates calendaires et des heures

209

Contrle des intervalles temporels


Lorsque vous dveloppez des applications laide de Adobe Flash CS3 Professional, vous avez accs au scnario, qui fournit une progression constante, image par image, au sein de votre application. Toutefois, dans un projet purement ActionScript, vous devez compter sur dautres mcanismes temporels.

Boucles ou minuteurs ?
Dans certains langages de programmation, vous devez mettre au point des motifs temporels laide dinstructions en boucle telles que for ou do..while. Les instructions en boucle sexcutent en gnral aussi vite que la machine locale le permet, ce qui signifie que lapplication sera plus rapide sur certaines machines que sur dautres. Si votre application doit bnficier dun intervalle temporel cohrent, vous devez lassocier un calendrier ou une horloge rels. Bien des applications, telles que les jeux, les animations, les contrleurs en temps rel, ncessitent des mcanismes de dcompte temporel qui soient cohrents dune machine lautre. La classe Timer dActionScript 3.0 offre une solution performante dans ce domaine. Grce au modle dvnements ActionScript 3.0, la classe Timer distribue des vnements Timer ds quun intervalle spcifi est atteint.

La classe Timer
Pour la gestion des fonctions temporelles dans ActionScript 3.0, il est recommand dutiliser la classe Timer (flash.utils.Timer), qui permet de distribuer des vnements ds quun intervalle est atteint. Pour lancer une horloge, vous devez dabord crer une instance de la classe Timer et lui indiquer quelle frquence elle doit gnrer un vnement Timer et combien de fois elle doit le faire avant de sarrter. Par exemple, le code suivant cre une instance Timer qui distribue un vnement toutes les secondes pendant 60 secondes :
var oneMinuteTimer:Timer = new Timer(1000, 60);

Lobjet Timer distribue un objet TimerEvent chaque fois que lintervalle donn est atteint. Le type dvnement de lobjet TimerEvent est timer (dfini par la constante TimerEvent.TIMER). Un objet TimerEvent contient les mmes proprits que lobjet standard Event.

210

Utilisation des dates et heures

Si linstance Timer prvoit un nombre fixe dintervalles, elle distribue galement un vnement timerComplete (dfini par la constante TimerEvent.TIMER_COMPLETE) lorsquelle atteint lintervalle final. Voici un court exemple dapplication illustrant la classe Timer en action :
package { import flash.display.Sprite; import flash.events.TimerEvent; import flash.utils.Timer; public class ShortTimer extends Sprite { public function ShortTimer() { // Cre un nouvel objet Timer de cinq secondes. var minuteTimer:Timer = new Timer(1000, 5); // Dsigne les couteurs destins aux vnements dintervalle // et de fin. minuteTimer.addEventListener(TimerEvent.TIMER, onTick); minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); // Lance le dcompte du minuteur. minuteTimer.start(); } public function onTick(event:TimerEvent):void { // Affiche le nombre dcompt jusquici. // La cible de cet vnement est linstance Timer elle-mme trace("tick " + event.target.currentCount); } public function onTimerComplete(event:TimerEvent):void { trace("Time's Up!"); } } }

Lorsque la classe ShortTimer est cre, elle gnre une instance Timer qui marque chaque seconde pendant cinq secondes. Elle ajoute ensuite deux couteurs au minuteur : lun coute chaque tic de lhorloge et lautre attends lvnement timerComplete. Elle lance ensuite le dcompte du minuteur et partir de l, la mthode onTick() sexcute toutes les secondes.

Contrle des intervalles temporels

211

La mthode onTick() affiche simplement le nombre actuel de tics. Aprs cinq secondes, la mthode onTimerComplete() sexcute et vous avertit que le temps est coul. Si vous excutez cet exemple, vous devriez voir les lignes suivantes safficher dans votre console ou fentre de suivi raison dune ligne par seconde :
tick 1 tick 2 tick 3 tick 4 tick 5 Time's Up!

Fonctions temporelles du package flash.utils


ActionScript 3.0 contient plusieurs fonctions temporelles semblables celles qui taient disponibles dans ActionScript 2.0. Fournies au niveau package dans flash.utils, ces fonctions fonctionnent de la mme manire que dans ActionScript 2.0.
Fonction
clearInterval(id:uint):void clearTimeout(id:uint):void getTimer():int

Description
Annule un appel setInterval() spcifi. Annule un appel setTimeout() spcifi. Renvoie le nombre de millisecondes qui se sont coules depuis linitialisation dAdobe Flash Player. Excute une fonction frquence rgulire (intervalle exprim en millisecondes). Excute une fonction spcifie aprs un dlai donn (exprim en millisecondes).

setInterval(closure:Function, delay:Number, ... arguments):uint setTimeout(closure:Function, delay:Number, ... arguments):uint

Ces fonctions demeurent dans ActionScript 3.0 afin dassurer la compatibilit avec les versions antrieures. Adobe ne recommande pas leur utilisation dans les nouvelles applications ActionScript 3.0. Il est en gnral plus simple et plus efficace dutiliser la classe Timer.

212

Utilisation des dates et heures

Exemple : une horloge analogique simple


Cet exemple dhorloge analogique simple illustre deux des concepts de date et heure tudis dans ce chapitre :

Obtention de la date et de lheure actuelle et extraction des valeurs heures, minutes et secondes Utilisation dune horloge pour fixer le rythme dune application

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers dapplication SimpleClock se trouvent dans le dossier Samples/SimpleClock. Lapplication se compose des fichiers suivants :
Fichier
SimpleClockApp.mxml ou SimpleClockApp.fla com/example/programmingas3/ simpleclock/SimpleClock.as com/example/programmingas3/ simpleclock/AnalogClockFace.as

Description
Le fichier dapplication principal dans Flash (FLA) ou Flex (MXML). Fichier dapplication principal. Dessine un cadran dhorloge rond et les aiguilles des heures, des minutes et des secondes en fonction de lheure.

Dfinition de la classe SimpleClock


Si lexemple dhorloge est simple, il est toujours judicieux de bien organiser les applications de manire faciliter leur extension future. Dans ce but, lapplication SimpleClock utilise la classe SimpleClock pour grer les tches de dmarrage et de mesure temporelle. Elle se sert ensuite dune autre classe, AnalogClockFace, pour laffichage rel de lheure. Voici le code qui dfinit et initialise la classe SimpleClock (vous remarquerez que dans la version Flash, SimpleClock tend la classe Sprite la place) :
public class SimpleClock extends UIComponent { /** * Le composant daffichage de lheure. */ private var face:AnalogClockFace; /** * Lhorloge qui marque le rythme de lapplication. */ private var ticker:Timer;

Exemple : une horloge analogique simple

213

La classe possde deux proprits importantes :


La proprit face, qui correspond une instance de la classe AnalogClockFace La proprit ticker, qui est une instance de la classe Timer

La classe SimpleClock utilise un constructeur par dfaut. La mthode initClock() se charge de la vritable configuration, en crant le cadran et en lanant le dcompte de linstance Timer.

Cration du cadran
Les lignes suivantes du code SimpleClock crent le cadran utilis pour afficher lheure :
/** * Dfinit une instance SimpleClock. */ public function initClock(faceSize:Number = 200) { // Cre le cadran et lajoute la liste daffichage face = new AnalogClockFace(Math.max(20, faceSize)); face.init(); addChild(face); // Dessine laffichage initial de lhorloge face.draw();

La taille de lhorloge peut tre transmise la mthode initClock(). Si aucune valeur faceSize nest transmise, la taille par dfaut de 200 pixels est utilise. Ensuite, lapplication initialise le cadran et lajoute la liste daffichage laide de la mthode hrite de la classe DisplayObject. Elle appelle enfin la mthode AnalogClockFace.draw() pour afficher une fois le cadran, qui indique lheure actuelle.
addChild()

Lancement du minuteur
Une fois le cadran cr, la mthode initClock() dfinit le minuteur :
// Cre un minuteur qui dclenche un vnement toutes les secondes. ticker = new Timer(1000); // Dsigne la mthode onTick() pour la gestion des vnements Timer. ticker.addEventListener(TimerEvent.TIMER, onTick); // Lance le dcompte de lhorloge. ticker.start();

214

Utilisation des dates et heures

Cette mthode commence par instancier une instance Timer qui va distribuer un vnement par seconde (toutes les 1000 millisecondes). Comme le constructeur Timer() ne reoit pas de second paramtre repeatCount, lhorloge se reproduit indfiniment. La mthode SimpleClock.onTick() sexcute une fois par seconde aprs rception de lvnement timer :
public function onTick(event:TimerEvent):void { // Met jour laffichage de lhorloge face.draw(); }

La mthode AnalogClockFace.draw() dessine simplement le cadran de lhorloge et des aiguilles.

Affichage de lheure actuelle


La plupart du code de la classe AnalogClockFace implique la dfinition des lments daffichage du cadran. Lors de son initialisation, AnalogClockFace dessine un contour circulaire, place des libells numriques pour chaque heure, puis cre trois objets Shape, un pour laiguille des heures, un pour celle des minutes et un pour laiguille des secondes de lhorloge. Lorsque lapplication SimpleClock sexcute, elle appelle la mthode AnalogClockFace.draw() toutes les secondes, comme suit :
/** * Appel effectu par le conteneur parent lors du dessin de laffichage. */ public override function draw():void { // Stocke la date et lheure actuelle dans une variable dinstance currentTime = new Date(); showTime(currentTime); }

Exemple : une horloge analogique simple

215

Cette mthode enregistre lheure actuelle dans une variable, pour que lheure ne puisse changer pendant le dessin des aiguilles de lhorloge. Elle appelle ensuite la mthode showTime() pour afficher les aiguilles, comme illustr ci-aprs :
/** * Affiche la date et lheure indique sur une horloge analogique des plus classiques. */ public function showTime(time:Date):void { // Obtient les valeurs temporelles var seconds:uint = time.getSeconds(); var minutes:uint = time.getMinutes(); var hours:uint = time.getHours(); // Multiplie par 6 pour obtenir les degrs this.secondHand.rotation = 180 + (seconds * 6); this.minuteHand.rotation = 180 + (minutes * 6); // Multiplie par 30 pour obtenir les degrs de base, puis // ajoute 29,5 degrs (59 * 0.5) // pour tenir compte des minutes. this.hourHand.rotation = 180 + (hours * 30) + (minutes * 0.5); }

Tout dabord, cette mthode extrait les valeurs des heures, des minutes et des secondes pour lheure actuelle. Elle utilise ensuite ces valeurs pour calculer langle de chaque aiguille. Comme laiguille des secondes effectue une rotation complte en 60 secondes, elle tourne de 6 degrs par seconde (360/60). Laiguille des minutes pivote selon le mme angle chaque minute. Laiguille des heures se met jour toutes les minutes galement et doit donc progresser chaque minute. Elle tourne de 30 degrs toutes les heures (360/12), mais pivote galement dun demi-degr toutes les minutes (30 degrs diviss par 60 minutes).

216

Utilisation des dates et heures

CHAPITRE 6

Utilisation des chanes


La classe String contient des mthodes qui permettent de manipuler des chanes de texte. Les chanes sutilisent avec de nombreux objets. Les mthodes dcrites dans le prsent chapitre sont utiles pour manipuler des chanes dans des objets tels que TextField, StaticText, XML, ContextMenu, et FileReference. Les chanes sont des squences de caractres. ActionScript 3.0 prend en charge les caractres ASCII et Unicode.

Sommaire
Principes de base des chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Cration de chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 La proprit length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Utilisation de caractres dans des chanes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .222 Comparaison de chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .223 Rcupration des reprsentations de chane dautres objets. . . . . . . . . . . . . . . . . .223 Concatnation de chanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .224 Recherche de sous-chanes et de motifs dans des chanes . . . . . . . . . . . . . . . . . . .225 Conversion de la casse dans des chanes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 Exemple : ASCII art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231

217

Principes de base des chanes


Introduction lutilisation des chanes
Pour les programmeurs, une chane est un texte, une suite de lettres, chiffres ou autres caractres qui se suivent et forment une unit reprsente par une valeur. Par exemple, la ligne de code suivante cre une variable ayant le type de donnes String (chane) et affecte une valeur de chane littrale cette variable :
var albumName:String = "Three for the money";

Comme le montre cet exemple, ActionScript permet de dlimiter une valeur chane en enfermant du texte entre des guillemets droits doubles ou simples. Voici dautres exemples de chanes :
"Hello" "555-7649" "http://www.adobe.com/"

Lorsque vous manipulez un fragment de texte en ActionScript, vous utilisez une valeur chane. La classe String dActionScript est le type de donnes qui permet de travailler avec du texte. Des instances de chanes sont frquemment utilises pour des proprits, des paramtres de mthodes, etc., dans de nombreuses autres classes en ActionScript.

Tches courantes de manipulation des chanes de texte


Voici quelques tches courantes relatives aux chanes de texte qui sont prsentes dans ce chapitre :

Cration dobjets String Utilisation de caractres spciaux (sauts de ligne, tabulations et caractres absents du clavier) Mesure de la longueur des chanes Sparation de caractres individuels au sein dune chane Concatnation de chanes Comparaison de chanes Recherche, extraction et remplacement de parties dune chane Mise en majuscule ou minuscule de chanes entires

218

Utilisation des chanes

Concepts importants et terminologie


La liste de rfrence suivante numre les termes importants que vous rencontrerez dans ce chapitre :

ASCII : systme de codage permettant de reprsenter du texte sous forme de caractres et symboles dans les programmes informatiques. Le systme ASCII gre les 26 lettres de lalphabet latin, plus un nombre limit de caractres supplmentaires. Caractre : unit de base dun texte (lettre ou symbole). Concatnation : ajout bout bout de plusieurs valeurs de chane pour en crer une nouvelle. Chane vide : chane qui ne contient rien : ni texte, ni espace, ni autre caractre, reprsente par "". Une chane vide nest pas la mme chose quune variable ayant une valeur nulle (null) : celle-ci est une variable laquelle aucune instance de lobjet String nest affecte, alors quune chane vide est une instance dont la valeur ne contient aucun caractre. Chane : valeur textuelle (squence de caractres). Littral chane : valeur chane crite explicitement en code, sous forme dune valeur texte encadre par des guillemets droits simples ou doubles. Sous-chane : dfinit une chane qui est une partie dune autre chane. Unicode : systme standardis de codage permettant de reprsenter du texte sous forme de caractres et symboles dans les programmes informatiques. Le systme Unicode permet dutiliser la totalit des caractres de toutes les langues crites existantes.

Utilisation des exemples des chapitres


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Les exemples de code de ce chapitre portant essentiellement sur la manipulation de texte, il est ncessaire de voir les valeurs des variables utilises dans ces exemples pour tester ces derniers, en transmettant ces valeurs soit une instance de champ texte sur la scne, soit au panneau de sortie en utilisant la fonction trace(). Ces techniques sont dcrites dans la section Test des exemples de code contenus dans un chapitre , la page 67.

Principes de base des chanes

219

Cration de chanes
La classe String sert reprsenter des donnes de chane (textuelles) en ActionScript 3.0. Les chanes ActionScript 3.0 prennent en charge les caractres ASCII et Unicode. La meilleure faon de crer une chane est dutiliser un littral de chane. Pour dclarer un littral de chane, utilisez les guillemets droits doubles (") ou les guillemets droits simples (). Par exemple, les deux chanes suivantes sont quivalentes :
var str1:String = "hello"; var str2:String = 'hello';

Vous pouvez galement dclarer une chane laide de loprateur new, comme suit :
var str1:String = new String("hello"); var str2:String = new String(str1); var str3:String = new String(); // str3 == ""

Les deux chanes suivantes sont quivalentes :


var str1:String = "hello"; var str2:String = new String("hello");

Pour utiliser des guillemets droits simples () dans un littral chane dlimit par des guillemets droits simples (), utilisez le caractre dchappement (\). De mme, pour utiliser des guillemets droits doubles () dans un littral chane dlimit par des guillemets droits doubles (), utilisez le caractre dchappement (\). Les deux chanes suivantes sont quivalentes :
var str1:String = "That's \"A-OK\""; var str2:String = 'That\'s "A-OK"';

Vous pouvez utiliser des guillemets simples ou des guillemets doubles en fonction de ceux qui existent dans un littral chane, comme dans lexemple suivant :
var str1:String = "ActionScript <span class='heavy'>3.0</span>"; var str2:String = '<item id="155">banana</item>';

Nous vous rappelons quActionScript fait la distinction entre les guillemets simples droits () et les guillemets simples gauches ou droits ( ou ). Il en est de mme pour les guillemets doubles. Utilisez des guillemets droits pour dlimiter des littraux de chane. Lorsque vous collez du texte dans ActionScript depuis une autre source, utilisez les caractres corrects.

220

Utilisation des chanes

Comme indiqu dans le tableau suivant, vous pouvez utiliser le caractre dchappement (\) pour dfinir dautres caractres dans des littraux chane :
Squence dchappement
\b \f \n \r \t \unnnn

Caractre
Retour arrire Changement de page Nouvelle ligne Retour chariot Tabulation Le caractre Unicode ayant le code de caractre spcifi par le nombre hexadcimal nnnn ; par exemple, \u263a est le caractre smiley. Le caractre ASCII dont le code est spcifi par le nombre hexadcimal nn. Guillemet droit simple Guillemet droit double Barre oblique inverse

\xnn

\ \" \\

La proprit length
Chaque chane possde une proprit length correspondant au nombre de caractres quelle contient :
var str:String = "Adobe"; trace(str.length); // rsultat : 5

Une chane vide et une chane null ont toutes deux une longueur de 0, comme lindique lexemple suivant :
var str1:String = new String(); trace(str1.length); // rsultat : 0 str2:String = ''; trace(str2.length);

// rsultat : 0

La proprit length

221

Utilisation de caractres dans des chanes


Chaque caractre dune chane possde une position dindex dans la chane (un entier). La position dindex du premier caractre est 0. Par exemple, dans la chane suivante, le caractre y occupe la position 0 et le caractre w occupe la position 5 :
"yellow"

Vous pouvez examiner des caractres individuels diffrentes positions dune chane laide de la mthode charAt() et de la mthode charCodeAt(), comme dans lexemple suivant :
var str:String = "hello world!"; for (var:i = 0; i < str.length; i++) { trace(str.charAt(i), "-", str.charCodeAt(i)); }

Lorsque vous excutez ce code, vous obtenez le rsultat suivant :


h e l l o w o r l d ! 104 101 108 108 111 32 119 111 114 108 100 33

Vous pouvez galement utiliser les codes de caractre pour dfinir une chane laide de la mthode fromCharCode(), comme lindique lexemple suivant :
var myStr:String = String.fromCharCode(104,101,108,108,111,32,119,111,114,108,100,33); // Dfinition de myStr comme "hello world!"

222

Utilisation des chanes

Comparaison de chanes
Vous pouvez utiliser les oprateurs suivants pour comparer des chanes : <, <=, !=, ==, =>, et >. Vous pouvez utiliser ces oprateurs avec des instructions conditionnelles (if et while, par exemple) comme lindique lexemple suivant :
var str1:String = "Apple"; var str2:String = "apple"; if (str1 < str2) { trace("A < a, B < b, C < c, ..."); }

Lorsque vous utilisez ces oprateurs avec des chanes, ActionScript considre la valeur du code de chaque caractre dans la chane, en comparant les caractres de gauche droite, comme indiqu ci-dessous :
trace("A" < "B"); // true trace("A" < "a"); // true trace("Ab" < "az"); // true trace("abc" < "abza"); // true

Utilisez les oprateurs == et != pour comparer des chanes entre elles et pour comparer des chanes avec dautres types dobjets, comme lindique lexemple suivant :
var str1:String = "1"; var str1b:String = "1"; var str2:String = "2"; trace(str1 == str1b); // true trace(str1 == str2); // false var total:uint = 1; trace(str1 == total); // true

Rcupration des reprsentations de chane dautres objets


Vous pouvez obtenir une reprsentation de chane de nimporte quel type dobjet. Tous les objets disposent en effet dune mthode toString() :
var n:Number = 99.47; var str:String = n.toString(); // str == "99.47"

Lorsque vous utilisez loprateur de concatnation + avec une combinaison dobjet String et dobjets qui ne sont pas des chanes, vous navez pas besoin dutiliser la mthode toString(). Pour plus dinformations sur la concatnation, consultez la section suivante. La fonction globale String() renvoie la mme valeur pour un objet donn que la valeur renvoye par lobjet appelant la mthode toString().
Rcupration des reprsentations de chane dautres objets 223

Concatnation de chanes
La concatnation de chanes consiste prendre deux chanes et les combiner en une seule chane de faon squentielle. Par exemple, vous pouvez utiliser loprateur + pour concatner deux chanes :
var str1:String = "green"; var str2:String = "ish"; var str3:String = str1 + str2; // str3 == "greenish"

Vous pouvez galement utiliser loprateur += pour obtenir le mme rsultat, comme dans lexemple suivant :
var str:String = "green"; str += "ish"; // str == "greenish"

En outre, la classe String comprend une mthode concat(), utilisable comme suit :
var str1:String = "Bonjour"; var str2:String = "from"; var str3:String = "Paris"; var str4:String = str1.concat(" ", str2, " ", str3); // str4 == "Bonjour from Paris"

Si vous utilisez loprateur + (ou loprateur +=) avec un objet String et un objet qui nest pas une chane, ActionScript convertit automatiquement ce dernier en un objet String afin dvaluer lexpression, comme indiqu dans lexemple :
var str:String = "Area = "; var area:Number = Math.PI * Math.pow(3, 2); str = str + area; // str == "Area = 28.274333882308138"

Nanmoins, vous pouvez utiliser des parenthses pour le regroupement afin de fournir un contexte loprateur +, comme indiqu dans lexemple suivant :
trace("Total: $" + 4.55 + 1.45); // rsultat : Total : $4.551.45 trace("Total: $" + (4.55 + 1.45)); // rsultat : Total : $6

224

Utilisation des chanes

Recherche de sous-chanes et de motifs dans des chanes


Les sous-chanes sont des caractres conscutifs lintrieur dune chane. Par exemple, la chane "abc" possde les sous-chanes suivantes : "", "a", "ab", "abc", "b", "bc", "c". Vous pouvez utiliser des mthodes ActionScript pour localiser les sous-chanes dune chane. Les modles sont dfinis en ActionScript par des chanes ou par des expressions rgulires. Par exemple, lexpression rgulire suivante dfinit un modle spcifiqueles lettres A, B, et C suivies dun chiffre (les barres de fraction sont des dlimiteurs dexpression rgulire) :
/ABC\d/

ActionScript comporte des mthodes servant rechercher des motifs dans des chanes et remplacer les correspondances trouves par des sous-chanes de substitution. Ces mthodes sont dcrites dans les sections suivantes. Les expressions rgulires peuvent dfinir des modles compliqus. Pour plus dinformations, consultez la section Chapitre 9, Utilisation dexpressions rgulires , la page 305.

Recherche dune sous-chane par la position dun caractre


Les mthodes substr() et substring() sont identiques. Elles renvoient toutes les deux une sous-chane dune chane. Elles prennent deux paramtres. Dans les deux mthodes, le premier paramtre est la position du caractre initial dans la chane concerne. Toutefois, dans la mthode substr(), le deuxime paramtre est la longueur de la sous-chane renvoyer, alors que dans la mthode substring(), le deuxime paramtre est la position du caractre final de la sous-chane (qui ne figure pas dans la chane renvoye). Cet exemple illustre la diffrence entre ces deux mthodes :
var str:String = "Hello from Paris, Texas!!!"; trace(str.substr(11,15)); // rsultat : Paris, Texas!!! trace(str.substring(11,15)); // rsultat : Pari

Recherche de sous-chanes et de motifs dans des chanes

225

La mthode slice() fonctionne de la mme faon que la mthode substring(). Lorsque deux nombres entiers non ngatifs sont passs en paramtres, son fonctionnement est identique. Nanmoins, la mthode slice() peut recevoir des entiers ngatifs comme paramtres. Dans ce cas, la position des caractres est compte partir de la fin de la chane, comme dans lexemple suivant :
var str:String = "Hello from Paris, Texas!!!"; trace(str.slice(11,15)); // rsultat : Pari trace(str.slice(-3,-1)); // rsultat : !! trace(str.slice(-3,26)); // rsultat : !!! trace(str.slice(-3,str.length)); // rsultat : !!! trace(str.slice(-8,-3)); // rsultat : Texas

Vous pouvez associer des entiers positifs et ngatifs comme paramtres de la mthode slice().

Recherche de la position des caractres dune souschane correspondante


Vous pouvez utiliser les mthodes indexOf() et lastIndexOf() pour localiser des souschanes correspondantes au sein dune chane, comme dans lexemple suivant :
var str:String = "The moon, the stars, the sea, the land"; trace(str.indexOf("the")); // rsultat : 10

La mthode indexOf() est sensible la casse. Vous pouvez spcifier un deuxime paramtre pour indiquer la position de lindex dans la chane partir de laquelle commencer la recherche, comme suit :
var str:String = "The moon, the stars, the sea, the land" trace(str.indexOf("the", 11)); // rsultat : 21

La mthode lastIndexOf() trouve la dernire occurrence dune sous-chane dans la chane :


var str:String = "The moon, the stars, the sea, the land" trace(str.lastIndexOf("the")); // rsultat : 30

Si vous incluez un deuxime paramtre avec la mthode lastIndexOf(), la recherche est effectue lenvers partir de cette position dindex dans la chane (de droite gauche) :
var str:String = "The moon, the stars, the sea, the land" trace(str.lastIndexOf("the", 29)); // rsultat : 21

226

Utilisation des chanes

Cration dun tableau de sous-chanes segment par un dlimiteur


Vous pouvez utiliser la mthode split() pour crer un tableau de sous-chanes divis en fonction dun caractre dlimiteur. Par exemple, vous pouvez segmenter une chane spare par des virgules ou des tabulations en plusieurs chanes. Lexemple suivant indique comment diviser un tableau en sous-chanes avec le caractre esperluette (&) comme dlimiteur :
var queryStr:String = "first=joe&last=cheng&title=manager&StartDate=3/6/ 65"; var params:Array = queryStr.split("&", 2); // params == ["first=joe","last=cheng"]

Le deuxime paramtre de la mthode split() (qui est facultatif ) dfinit la taille maximale du tableau renvoy. Vous pouvez galement utiliser une expression rgulire comme caractre dlimiteur :
var str:String = "Give me\t5." var a:Array = str.split(/\s+/); // a == ["Give","me","5."]

Pour plus dinformations, voir Chapitre 9, Utilisation dexpressions rgulires , la page 305 et Rfrence du langage et des composants ActionScript 3.0.

Recherche de modles dans des chanes et remplacement de sous-chanes


La classe String comprend les mthodes suivantes pour utiliser des modles dans des chanes :

Utilisez les mthodes match() et search() pour localiser des sous-chanes qui correspondent un modle. Utilisez la mthode replace() pour rechercher des sous-chanes qui correspondent un modle et les remplacer par une sous-chane spcifie.

Ces mthodes sont dcrites dans les sections suivantes. Vous pouvez utiliser des chanes ou des expressions rgulires pour dfinir des modles utiliss dans ces mthodes. Pour plus dinformations sur les expressions rgulires, voir Chapitre 9, Utilisation dexpressions rgulires , la page 305.

Recherche de sous-chanes et de motifs dans des chanes

227

Recherche de sous-chanes correspondantes


La mthode search() renvoie la position de lindex de la premire sous-chane qui correspond un modle donn, comme illustr dans cet exemple :
var str:String = "The more the merrier."; // (Cette recherche est sensible la casse.) trace(str.search("the")); // rsultat : 9

Vous pouvez galement utiliser des expressions rgulires pour dfinir le modle pour lequel tablir une correspondance, comme illustr dans cet exemple :
var pattern:RegExp = /the/i; var str:String = "The more the merrier."; trace(str.search(pattern)); // 0

Le rsultat de la mthode trace() est 0, car le premier caractre dans la chane est la position de lindex 0. Lindicateur i est dfini dans lexpression rgulire. Par consquent, la recherche nest pas sensible la casse. La mthode search() trouve une seule correspondance et renvoie sa position dindex de dbut, mme si lindicateur g (global) est dfini dans lexpression rgulire. Lexemple suivant prsente une expression rgulire plus complique qui correspond une chane dans des guillemets doubles :
var pattern:RegExp = /"[^"]*"/; var str:String = "The \"more\" the merrier."; trace(str.search(pattern)); // rsultat : 4 str = "The \"more the merrier."; trace(str.search(pattern)); // rsultat : -1 // (Indique aucune correspondance, car il nexiste aucun guillemet // double de fermeture.)

La mthode match() fonctionne de faon identique. Elle recherche une sous-chane correspondante. Nanmoins, lorsque vous utilisez lindicateur global dans un modle dexpression rgulire (comme dans lexemple suivant), match() renvoie un tableau de souschanes correspondantes :
var str:String = "bob@example.com, omar@example.org"; var pattern:RegExp = /\w*@\w*\.[org|com]+/g; var results:Array = str.match(pattern);

Le tableau results est dfini comme suit :


["bob@example.com","omar@example.org"]

Pour plus dinformations sur les expressions rgulires, voir Chapitre 9, Utilisation dexpressions rgulires , la page 305.

228

Utilisation des chanes

Remplacement de sous-chanes mises en correspondance


Vous pouvez utiliser la mthode replace() pour rechercher un modle spcifi dans une chane et remplacer les correspondances par la chane de remplacement spcifie, comme illustr dans lexemple suivant :
var str:String = "She sells seashells by the seashore."; var pattern:RegExp = /sh/gi; trace(str.replace(pattern, "sch")); //sche sells seaschells by the seaschore.

Dans cet exemple, les chanes mises en correspondance ne sont pas sensibles la casse car lindicateur i (ignoreCase) est dfini dans lexpression rgulire, et plusieurs correspondances sont remplaces car lindicateur g (global) est dfini. Pour plus dinformations, consultez la section Chapitre 9, Utilisation dexpressions rgulires , la page 305. Vous pouvez inclure les codes de remplacement $ suivants dans la chane de remplacement. Le texte de remplacement indiqu dans le tableau suivant est insr la place du code de remplacement $ :
Code $
$$ $& $`

Texte de remplacement
$ La sous-chane correspondante. La partie de la chane qui prcde la sous-chane correspondante. Ce code utilise les guillemets simples droits gauches (`) et non les guillemets simples droits () ni les guillemets simples anglais gauches (). La partie de la chane qui suit la sous-chane correspondante. Ce code utilise les guillemets simples droits (). Le nime groupe entre parenthses correspondant captur, o n est un chiffre compris entre 1 et 9 et $n nest pas suivi dune dcimale. Le nnime groupe entre parenthses correspondant captur, o nn est un nombre dcimal deux chiffres compris entre 01 et 99. Si la nnime capture nest pas dfinie, le texte de remplacement est une chane vide.

$n
$nn

Lexemple suivant illustre lutilisation des codes de remplacement $2 et $1, qui reprsentent le premier et le deuxime groupes capturs correspondants :
var str:String = "flip-flop"; var pattern:RegExp = /(\w+)-(\w+)/g; trace(str.replace(pattern, "$2-$1")); // flop-flip

Recherche de sous-chanes et de motifs dans des chanes

229

Vous pouvez galement utiliser une fonction comme deuxime paramtre de la mthode replace(). Le texte correspondant est remplac par la valeur renvoye de la fonction.
var str:String = "Now only $9.95!"; var price:RegExp = /\$([\d,]+.\d+)+/i; trace(str.replace(price, usdToEuro)); function usdToEuro(matchedSubstring:String, capturedMatch1:String, index:int, str:String):String { var usd:String = capturedMatch1; usd = usd.replace(",", ""); var exchangeRate:Number = 0.853690; var euro:Number = usd * exchangeRate; const euroSymbol:String = String.fromCharCode(8364); return euro.toFixed(2) + " " + euroSymbol; }

Lorsque vous utilisez une fonction comme deuxime paramtre de la mthode replace(), les arguments suivants sont transmis la fonction :

La partie correspondante de la chane. Tout groupe entre parenthses captur correspondant. Le nombre darguments transmis de cette faon varie selon le nombre de correspondances entre parenthses. Pour dterminer ce dernier, vrifiez arguments.length - 3 dans le code de la fonction. La position dindex dans la chane o dbute la correspondance. La chane complte.

Conversion de la casse dans des chanes


Comme illustr dans lexemple suivant, la mthode toLowerCase() et la mthode toUpperCase() convertissent les caractres alphabtiques dans la chane en minuscules et en majuscules, respectivement :
var str:String = "Dr. Bob Roberts, #9." trace(str.toLowerCase()); // dr. bob roberts, #9. trace(str.toUpperCase()); // DR. BOB ROBERTS, #9.

Une fois que ces mthodes sont excutes, la chane source reste inchange. Pour transformer la chane source, utilisez le code suivant :
str = str.toUpperCase();

Ces mthodes fonctionnent avec des caractres tendus, pas simplement az et AZ :


var str:String = "Jos Bara"; trace(str.toUpperCase(), str.toLowerCase()); // JOS BARA jos bara

230

Utilisation des chanes

Exemple : ASCII art


Cet exemple ASCII Art reprsente diffrentes faons dutiliser la classe String dans ActionScript 3.0, notamment :

La mthode split() de la classe String est utilise pour extraire des valeurs dune chane spare par des caractres (informations dimage dans un fichier texte spar par des tabulations). Plusieurs techniques de manipulation de chanes, y compris split(), la concatnation et lextraction dune partie de la chane laide de substring() et de substr(), sont utilises pour mettre la premire lettre de chaque mot dans les titres dimage en majuscule. La mthode getCharAt() est utilise pour obtenir un seul caractre partir dune chane (pour dterminer le caractre ASCII correspondant une valeur bitmap dchelle de gris). La concatnation de chane est utilise pour construire la reprsentation ASCII art dune image, un caractre la fois.

Le terme ASCII art fait rfrence des reprsentations textuelles dune image dans lesquelles une grille de polices de caractres espacement constant (caractres Courier New, par exemple) trace limage. Limage suivante est un exemple dASCII art produit par lapplication :

La version ASCII art du graphique est illustre droite.

Exemple : ASCII art

231

Pour obtenir les fichiers de cet exemple dapplication, consultez la page www.adobe.com/go/ learn_programmingAS3samples_flash_fr. Les fichiers dapplication ASCIIArt se trouvent dans le dossier Samples/AsciiArt. Lapplication se compose des fichiers suivants :
Fichier
AsciiArtApp.mxml ou AsciiArtApp.fla com/example/programmingas3/asciiArt/ AsciiArtBuilder.as

Description
Fichier dapplication principal en FLA pour Flash ou en MXML pour Flex La classe qui fournit la fonctionnalit principale de lapplication, notamment lextraction de mtadonnes dimage dun fichier de texte, le chargement des images et la gestion du processus de conversion dimage en texte. Une classe qui fournit la mthode parseBitmapData() pour convertir des donnes dimage dans une version String. Une classe qui reprsente une image bitmap charge. Une classe reprsentant des mtadonnes pour une image ASCII art (titre, URL de fichier image, etc.). Un dossier contenant des images utilises par lapplication. Un fichier de texte spar par des tabulations et contenant des informations sur les images charger par lapplication.

com/example/programmingas3/asciiArt/ BitmapToAsciiConverter.as com/example/programmingas3/asciiArt/ Image.as com/example/programmingas3/asciiArt/ ImageInfo.as image/ txt/ImageData.txt

Extraction de valeurs spares par des tabulations


Cet exemple utilise le stockage spar de donnes dapplication par rapport lapplication ; de cette faon, si les donnes changent (par exemple, si une autre image est ajoute ou que le titre dune image change), il est inutile de recrer le fichier SWF. Dans ce cas, les mtadonnes dimage, y compris le titre de limage, lURL du fichier dimage rel et certaines valeurs utilises pour manipuler limage, sont stocks dans un fichier de texte (le fichier txt/ ImageData.txt dans le projet). Le contenu du fichier de texte est le suivant :
FILENAMETITLEWHITE_THRESHHOLDBLACK_THRESHHOLD FruitBasket.jpgPear, apple, orange, and bananad810 Banana.jpgA picture of a bananaC820 Orange.jpgorangeFF20 Apple.jpgpicture of an apple6E10

232

Utilisation des chanes

Le fichier utilise un format spar par des tabulations spcifique. La premire ligne est une ligne den-tte. Les lignes restantes contiennent les donnes suivantes pour chaque bitmap charger :

Le nom de fichier du bitmap. Le nom daffichage du bitmap. Les valeurs de seuil du blanc et les valeurs de seuil du noir pour les bitmaps. Il sagit de valeurs hexadcimales en dessous desquelles un pixel doit tre considr comme totalement blanc ou totalement noir.

Ds que lapplication dmarre, la classe AsciiArtBuilder se charge et analyse le contenu du fichier de texte afin de crer la pile dimages quelle chargera. Pour cela, elle utilise le code suivant de la mthode parseImageInfo() de la classe AsciiArtBuilder :
var lines:Array = _imageInfoLoader.data.split("\n"); var numLines:uint = lines.length; for (var i:uint = 1; i < numLines; i++) { var imageInfoRaw:String = lines[i]; ... if (imageInfoRaw.length > 0) { // Cration dun enregistrement dinformations dimage et ajout // au tableau des informations dimage. var imageInfo:ImageInfo = new ImageInfo(); // Division de la ligne actuelle en valeurs (spare par des // tabulations (\t)) et extraction des proprits individuelles : var imageProperties:Array = imageInfoRaw.split("\t"); imageInfo.fileName = imageProperties[0]; imageInfo.title = normalizeTitle(imageProperties[1]); imageInfo.whiteThreshold = parseInt(imageProperties[2], 16); imageInfo.blackThreshold = parseInt(imageProperties[3], 16); result.push(imageInfo); } }

Le contenu entier du fichier de texte se trouve dans une seule instance String, la proprit _imageInfoLoader.data. Vous pouvez utiliser la mthode split() avec le caractre de nouvelle ligne ("\n") comme paramtre pour diviser linstance String en un tableau (lines) dont les lments sont les lignes individuelles du fichier de texte. Le code utilise ensuite une boucle pour travailler avec chacune des lignes (except la premire car elle contient uniquement des en-ttes). A lintrieur de la boucle, la mthode split() est de nouveau utilise pour diviser le contenu de la ligne en un ensemble de valeurs (lobjet Array appel imageProperties). Le paramtre utilis avec la mthode split() dans ce cas est le caractre de tabulation ("\t") car les valeurs dans chaque ligne sont dlimites par des tabulations.

Exemple : ASCII art

233

Utilisation de mthodes String pour normaliser des titres dimage


Dans cette application, tous les titres dimage sont affichs laide dun format standard, avec la premire lettre de chaque mot en majuscule (except quelques mots qui ne sont gnralement pas en majuscule dans des titres anglais). Au lieu de considrer que le fichier de texte contient des titres formats correctement, lapplication formate les titres lors de leur extraction du fichier de texte. Dans la liste de code prcdente, lors de lextraction de valeurs de mtadonnes dimage individuelles, la ligne de code suivante est utilise :
imageInfo.title = normalizeTitle(imageProperties[1]);

Dans ce code, le titre de limage issu du fichier de texte est transfr au moyen de la mthode normalizeTitle() avant dtre stock dans lobjet ImageInfo :
private function normalizeTitle(title:String):String { var words:Array = title.split(" "); var len:uint = words.length; for (var i:uint; i < len; i++) { words[i] = capitalizeFirstLetter(words[i]); } return words.join(" "); }

Cette mthode utilise la mthode split() pour diviser le titre en deux mots (spars par le caractre despacement), transfre chaque mot au moyen de la mthode capitalizeFirstLetter() puis utilise join() de la classe Array pour combiner de nouveau les mots en une chane unique.

234

Utilisation des chanes

Comme son nom lindique, la mthode capitalizeFirstLetter() met la premire lettre de chaque mot en majuscule :
/** * Met la premire lettre dun mot en majuscule, moins quil sagisse d * ensemble de mots qui ne sont normalement pas en majuscules en anglais. */ private function capitalizeFirstLetter(word:String):String { switch (word) { case "and": case "the": case "in": case "an": case "or": case "at": case "of": case "a": // Ne pas modifier ces mots. break; default: // Pour tous les autres mots, mettre le premier caractre // en majuscule. var firstLetter:String = word.substr(0, 1); firstLetter = firstLetter.toUpperCase(); var otherLetters:String = word.substring(1); word = firstLetter + otherLetters; } return word; }

En anglais, le premier caractre de chaque mot dun titre nest pas en majuscule sil sagit dun des mots suivants : and, the, in, an, or, at, of, ou a (il sagit dune version simplifie des rgles). Pour excuter cette logique, le code utilise dabord une instruction switch pour vrifier si le mot est lun des mots ne devant pas tre en majuscule. Si cest le cas, le code sort de linstruction switch. Si le mot doit tre en majuscule, la procdure comprend plusieurs tapes :
1.

La premire lettre du mot est extraite laide de substr(0, 1), qui extraie une sous-chane commenant par le caractre au niveau de lindex 0 (la premire lettre dans la chane, comme indiqu par le premier paramtre 0). La sous-chane contiendra un caractre (indiqu par le deuxime paramtre 1). Ce caractre est mis en majuscule laide de la mthode toUpperCase().

2.

Exemple : ASCII art

235

3.

Les caractres restants du mot dorigine sont extraits laide de substring(1), qui extraie une sous-chane commenant lindex 1 (la deuxime lettre) jusqu la fin de la chane (indiqu en laissant le deuxime paramtre de la mthode substring()). Le dernier mot est cr en combinant la premire lettre mise en majuscule et les lettres restantes en utilisant la concatnation de chane : firstLetter + otherLetters.

4.

Gnration du texte ASCII art


La classe BitmapToAsciiConverter permet de convertir une image bitmap en sa reprsentation de texte ASCII. Cette procdure est effectue par la mthode parseBitmapData(), partiellement reprsente ici :
var result:String = ""; // Boucle sur les lignes de pixels de haut en bas : for (var y:uint = 0; y < _data.height; y += verticalResolution) { // Dans chaque ligne, boucle sur les pixels de gauche droite : for (var x:uint = 0; x < _data.width; x += horizontalResolution) { ... // Conversion des valeurs de gris dans la plage 0-255 en une valeur // comprise entre 0 et 64 (car il sagit du nombre de nuances de // gris dans le jeu de caractres disponibles) : index = Math.floor(grayVal / 4); result += palette.charAt(index); } result += "\n"; } return result;

236

Utilisation des chanes

Ce code dfinit dabord une instance String nomme result qui sera utilise pour crer la version ASCII art de limage bitmap. Il effectue ensuite une boucle sur les pixels de limage bitmap source. Il utilise plusieurs techniques de manipulation des couleurs (non dcrites ici) pour convertir le rouge, le vert et le bleu dun pixel en une valeur dchelle de gris (un nombre entre 0 et 255). Le code divise ensuite cette valeur par 4 (comme indiqu) pour la convertir en une valeur dans lchelle 0-63, qui est stocke dans la variable index. (Lchelle 0-63 est utilise car la palette des caractres ASCII disponibles utilise par cette application contient 64 valeurs.) La palette des caractres est dfinie en tant quinstance String dans la classe BitmapToAsciiConverter :
// Les caractres sont ordonns du plus fonc au plus clair, de faon // ce que leur position (index) dans la chane corresponde une valeur // de couleur relative (0 = noir). private static const palette:String = "@#$%&8BMW*mwqpdbkhaoQ0OZXYUJCLtfjzxnuvcr[]{}1()|/?Il!i><+_~-;,. ";

Etant donn que la variable index dfinit le caractre ASCII dans la palette qui correspond au pixel actuel dans limage bitmap, ce caractre est rcupr de la palette String laide de la mthode charAt(). Il est ensuite ajout linstance String result au moyen de loprateur daffectation de concatnation (+=). En outre, la fin de chaque ligne de pixels, un caractre de nouvelle ligne est concatn la fin de linstance String result afin que la ligne renvoyer cre une ligne de pixels de caractres.

Exemple : ASCII art

237

238

Utilisation des chanes

CHAPITRE 7

Utilisation de tableaux
Les tableaux vous permettent de stocker plusieurs valeurs dans une seule structure de donnes. Vous pouvez utiliser des tableaux indexs simples qui stockent des valeurs laide dindex dentiers ordinaux fixes ou des tableaux associatifs complexes qui stockent des valeurs laide de cls arbitraires. Les tableaux peuvent galement tre multidimensionnels et contenir des lments tant eux-mmes des tableaux. Ce chapitre dcrit comment crer et manipuler diffrents types de tableaux.

Contenu
Principes de base des tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .239 Tableaux indexs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .242 Tableaux associatifs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 Tableaux multidimensionnels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .256 Clonage de tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .258 Rubriques avances :. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 Exemple : PlayList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .265

Principes de base des tableaux


Introduction lutilisation de tableaux
Vous aurez souvent besoin en programmation dutiliser un ensemble dlments plutt quun seul objet ; par exemple, dans une application de lecteur de musique, vous pouvez avoir une liste de morceaux en attente de lecture. Vous ne souhaitez pas crer une variable spare pour chaque morceau de cette liste. Il serait prfrable de rassembler tous les objets Song et de les utiliser sous forme de groupe.

239

Un tableau est un lment de programmation qui agit comme conteneur pour un ensemble dlments (une liste de morceaux, par exemple). La plupart du temps, tous les lments dun tableau sont des instances de la mme classe, mais ceci nest pas obligatoire dans ActionScript. Les lments individuels dun tableau sont les lments du tableau. Un tableau peut tre compar un tiroir classeur pour des variables. Les variables peuvent tre ajoutes en tant qulments au tableau, comme vous placez un dossier dans le tiroir classeur. Une fois que le tiroir contient plusieurs fichiers, vous pouvez utiliser le tableau comme une variable unique (comme si vous transportiez le tiroir entier un autre endroit) ; vous pouvez utiliser les variables en tant que groupe (comme si vous recherchiez des informations dans les dossiers en les parcourant un un) ; ou vous pouvez y accder individuellement (comme si vous ouvriez le tiroir et slectionniez un seul dossier). Par exemple, imaginez que vous crez une application de lecteur de musique dans laquelle un utilisateur peut slectionner plusieurs morceaux et les ajouter une liste de lecture. Dans votre code ActionScript, vous pouvez avoir une mthode addSongsToPlaylist() qui accepte un seul tableau comme paramtre. Peu importe le nombre de morceaux ajouter la liste (quelques-unes, un grand nombre, ou mme une seule), vous devez appeler la mthode addSongsToPlaylist() une seule fois, en lui transmettant le tableau contenant les objets Song. Dans la mthode addSongsToPlaylist(), vous pouvez utiliser une boucle pour parcourir les lments (morceaux) du tableau un par un et les ajouter la liste de lecture. Le type de tableau ActionScript le plus courant est le tableau index dans lequel chaque lment est stock dans un emplacement numrot (appel index) auquel vous accdez laide du numro (adresse). La classe Array est utilise pour reprsenter un tableau index. Les tableaux indexs rpondent la plupart des besoins en programmation. Un tableau multidimensionnel est un tableau index dont les lments sont des tableaux indexs (qui contiennent leur tour dautres lments). Son utilisation est spciale. Le tableau associatif est un autre type de tableau. Il utilise une chane key au lieu dun index numrique pour identifier des lments individuels. Pour finir, pour les utilisateurs avancs, ActionScript 3.0 inclut galement la classe Dictionary, qui reprsente un dictionnaireun tableau qui vous permet dutiliser nimporte quel type dobjet comme cl pour faire une distinction entre des lments.

240

Utilisation de tableaux

Tches de tableau courantes


Les activits courantes suivantes dutilisation de tableaux sont dcrites dans ce chapitre :

Cration de tableaux indexs Ajout et suppression dlments de tableau Tri dlments de tableau Extraction de portions dun tableau Utilisation de tableaux associatifs et de dictionnaires Utilisation de tableaux multidimensionnels Copie dlments de tableau Cration dune sous-classe de tableau

Concepts et termes importants


La liste de rfrence suivante contient les termes importants que vous rencontrerez dans ce chapitre :

Tableau : un objet qui sert de conteneur pour regrouper plusieurs objets. Tableau associatif : un tableau qui utilise des cls de chane pour identifier des lments individuels. Dictionnaire : un tableau dont les lments sont constitus de paires dobjets appeles cl et valeur. La cl est utilise la place dun index numrique pour identifier un seul lment. Elment : un lment unique dans un tableau. Index : l adresse numrique utilise pour identifier un lment unique dans un tableau index. Tableau index : le type de tableau standard qui stocke chaque lment dans un lment numrot et utilise le numro (index) pour identifier des lments individuels. Cl : la chane ou objet utilis pour identifier un seul lment dans un tableau associatif ou un dictionnaire. Tableau multidimensionnel : un tableau contenant des lments qui sont des tableaux plutt que des valeurs uniques.

Principes de base des tableaux

241

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Tous les codes de ce chapitre comprennent lappel de la fonction trace(). Pour tester les codes de ce chapitre :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code dans le panneau Script. Excutez le programme en slectionnant Contrle > Tester lanimation. Les rsultats de la fonction trace() saffichent dans le panneau Sortie.

Ceci ainsi que dautres techniques de test des codes sont dcrits en dtail dans Test des exemples de code contenus dans un chapitre , la page 67.

Tableaux indexs
Les tableaux indexs stockent une srie dune ou de plusieurs valeurs organises de faon ce que vous puissiez accder chaque valeur laide dune valeur dentier non sign. Le premier index correspond toujours au nombre 0. Lindex est ensuite incrment dune unit pour chaque lment ajout conscutivement au tableau. Comme lindique le code suivant, vous pouvez crer un tableau index en appelant le constructeur de classe Array ou en initialisant le tableau avec un littral de tableau :
// Utilisation du constructeur Array. var myArray:Array = new Array(); myArray.push("one"); myArray.push("two"); myArray.push("three"); trace(myArray); // rsultat : un,deux,trois // Utilisation du littral Array. var myArray:Array = ["one", "two", "three"]; trace(myArray); // rsultat : un,deux,trois

La classe Array contient galement des proprits et des mthodes qui permettent de modifier des tableaux indexs. Ces proprits et mthodes sappliquent de faon quasi exclusive aux tableaux indexs plutt quaux tableaux associatifs. Les tableaux indexs utilisent un entier 32 bits non sign pour le numro dindex. La taille maximale dun tableau index est 232 - 1 ou 4,294,967,295. Si vous tentez de crer un tableau plus grand que la taille maximale, une erreur dexcution se produit.

242

Utilisation de tableaux

Un lment de tableau peut comporter une valeur de nimporte quel type de donnes. ActionScript 3.0 ne prend pas en charge le concept de tableaux typs, ce qui signifie que vous ne pouvez pas indiquer que tous les lments dun tableau appartiennent un type de donnes particulier. Cette section explique dabord comment crer puis comment modifier des tableaux indexs en utilisant la classe Array. Les mthodes qui permettent de modifier des tableaux sont regroupes en trois catgories : comment insrer des lment, comment supprimer des lments et comment trier des tableaux. Un dernier groupe de mthodes considre un tableau existant comme en lecture seule ; ces mthodes interrogent simplement des tableaux. Au lieu de modifier un tableau existant, les mthodes de requte renvoient toutes un nouveau tableau. La section se termine par une discussion sur lextension de la classe Array.

Cration de tableaux
Vous pouvez utiliser la fonction de constructeur Array de trois faons diffrentes. Premirement, si vous appelez le constructeur sans arguments, vous obtenez un tableau vide. Vous pouvez utiliser la proprit length de la classe Array pour vrifier que le tableau ne contient aucun lment. Par exemple, le code suivant appelle le constructeur Array sans arguments :
var names:Array = new Array(); trace(names.length); // rsultat : 0

Deuximement, si vous utilisez un nombre comme unique paramtre pour le constructeur Array, un tableau de cette longueur est cr, avec chaque valeur dlment dfinie sur undefined. Largument doit tre un entier non sign compris entre les valeurs 0 et 4,294,967,295. Par exemple, le code suivant appelle le constructeur Array avec un seul argument numrique :
var names:Array = new Array(3); trace(names.length); // rsultat : 3 trace(names[0]); // rsultat : undefined trace(names[1]); // rsultat : undefined trace(names[2]); // rsultat : undefined

Troisimement, si vous appelez le constructeur et transmettez une liste dlments comme paramtres, un tableau est cr avec des lments correspondant chacun des paramtres. Le code suivant transmet trois arguments au constructeur Array :
var names:Array = new Array("John", "Jane", "David"); trace(names.length); // rsultat : 3 trace(names[0]); // rsultat : John trace(names[1]); // rsultat : Jane trace(names[2]); // rsultat : David

Tableaux indexs

243

Vous pouvez galement crer des tableaux avec des littraux de tableau ou des littraux dobjet. Un littral de tableau peut tre affect directement une variable de tableau, comme illustr dans lexemple suivant :
var names:Array = ["John", "Jane", "David"];

Insertion dlments de tableau


Trois mthodes de la classe Array push(), unshift(), et splice()vous permettent dinsrer des lments dans un tableau. La mthode push() ajoute un ou plusieurs lments la fin dun tableau. Ainsi, le dernier lment insr dans le tableau laide de la mthode push() aura le numro dindex le plus lev. La mthode unshift() insre un ou plusieurs lments au dbut dun tableau, qui est toujours au numro dindex 0. La mthode splice() insre des lments au niveau dun index spcifi dans le tableau. Lexemple suivant illustre les trois mthodes. Un tableau appel planets est cr pour trier les noms des plantes par ordre de proximit par rapport au soleil. Premirement, la mthode push() est appele pour ajouter llment initial, Mars. Deuximement, la mthode unshift() est appele pour insrer llment Mercury. Pour finir, la mthode splice() est appele pour insrer les lments Venus et Earth aprs Mercury, mais avant Mars. Le premier lment envoy splice(), lentier 1, indique linsertion de dbuter lindex 1. Le deuxime argument envoy splice(), lentier 0, indique quaucun lment ne doit tre supprim. Pour finir, les troisime et quatrime arguments envoys splice(), Venus et Earth, sont les lments insrer.
var planets:Array = new Array(); planets.push("Mars"); // contenu du tableau : Mars planets.unshift("Mercury"); // contenu du tableau : Mercury,Mars planets.splice(1, 0, "Venus", "Earth"); trace(planets); // contenu du tableau : Mercury,Venus,Earth,Mars

Les mthodes push() et unshift() renvoient toutes les deux un entier non sign qui reprsente la longueur du tableau modifi. La mthode splice() renvoie un tableau vide lorsquelle est utilise pour insrer des lments, ce qui semble trange mais comprhensible en raison de sa versatilit. Vous pouvez utiliser la mthode splice() non seulement pour insrer des lments dans un tableau, mais galement pour en supprimer. Lorsque vous lutilisez pour supprimer des lments, la mthode splice() renvoie un tableau contenant les lments supprims.

244

Utilisation de tableaux

Suppression des lments dun tableau


Trois des mthodes de la classe Array pop(), shift(), et splice()vous permettent de supprimer des lments dun tableau. La mthode pop() supprime un lment de la fin du tableau. En dautres termes, elle supprime llment au niveau du numro dindex le plus lev. La mthode shift() supprime un lment du dbut du tableau, ce qui signifie quelle supprime toujours llment au numro dindex 0. La mthode splice(), qui peut galement tre utilise pour insrer des lments, supprime un nombre arbitraire dlments en commenant au numro dindex indiqu par le premier argument envoy la mthode. Lexemple suivant utilise les trois mthodes pour supprimer des lments dun tableau. Un tableau nomm oceans est cr pour stocker les noms des ocans. Certains noms dans le tableau sont des noms de lacs plutt que des noms docans. Ils doivent donc tre supprims. Premirement, la mthode splice() est utilise pour supprimer les lments Aral et Superior, et insrer les lments Atlantic et Indian. Le premier argument envoy splice(), lentier 2, indique que lopration doit commencer par le troisime lment dans la liste, qui est lindex 2. Le deuxime argument, 2, indique que deux lments doivent tre supprims. Les arguments restants, Atlantic et Indian, sont des valeurs insrer lindex 2. Deuximement, la mthode pop() est utilise pour supprimer le dernier lment dans le tableau, Huron. Et troisimement, la mthode shift() est utilise pour supprimer le premier lment dans le tableau, Victoria.
var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"]; oceans.splice(2, 2, "Arctic", "Atlantic"); // remplace Aral et Superior oceans.pop(); // supprime Huron oceans.shift(); // supprime Victoria trace(oceans); // rsultat : Pacific,Arctic,Atlantic,Indian

Les mthodes pop() et shift() renvoient toutes les deux llment qui a t supprim. Le type de donnes de la valeur renvoye est Object car les tableaux peuvent contenir des valeurs de nimporte quel type de donnes. La mthode splice() renvoie un tableau contenant les valeurs supprimes. Vous pouvez modifier lexemple du tableau oceans de faon ce que lappel splice() affecte le tableau une nouvelle variable de tableau, comme illustr dans lexemple suivant :
var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic"); trace(lakes); // rsultat : Aral,Superior

Tableaux indexs

245

Il se peut que vous rencontriez un code qui utilise loprateur delete sur un lment de tableau. Loprateur delete dfinit la valeur dun lment de tableau sur undefined, mais il ne supprime pas llment du tableau. Par exemple, le code suivant utilise loprateur delete sur le troisime lment dans le tableau oceans, mais la longueur du tableau demeure 5 :
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"]; delete oceans[2]; trace(oceans); // rsultat : Arctic,Pacific,,Indian,Atlantic trace(oceans[2]); // rsultat : undefined trace(oceans.length); // rsultat : 5

Vous pouvez tronquer un tableau laide dune proprit de tableau length Si vous dfinissez la proprit length dun tableau sur une longueur infrieure la longueur actuelle du tableau, ce dernier est tronqu : tous les lments stocks aux numros dindex suprieurs la nouvelle valeur de length moins 1 sont supprims. Par exemple, si le tableau oceans a t tri de faon ce que toutes les entres valides se trouvent au dbut du tableau, vous pouvez utiliser la proprit length pour supprimer les entres la fin du tableau, comme illustr dans le code suivant :
var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"]; oceans.length = 2; trace(oceans); // rsultat : Arctic,Pacific

Tri dun tableau


Il existe trois mthodesreverse(), sort(), et sortOn()qui vous permettent de modifier lordre dun tableau, soit en triant, soit en inversant lordre. Toutes ces mthodes modifient le tableau existant. La mthode reverse() modifie lordre du tableau de telle sorte que le dernier lment devient le premier lment, le pnultime le second, etc. La mthode sort() vous permet de trier un tableau de diffrentes faons, et mme de crer des algorithmes de tri personnaliss. La mthode sortOn() vous permet de trier un tableau dobjets index ayant une ou plusieurs proprits en commun qui peuvent tre utilises comme cls de tri. La mthode reverse() ne prend aucun paramtre et ne renvoie aucune valeur mais vous permet de faire basculer lordre de votre tableau de son tat actuel lordre inverse. Lexemple suivant inverse lordre des ocans rpertoris dans le tableau oceans :
var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"]; oceans.reverse(); trace(oceans); // rsultat : Pacific,Indian,Atlantic,Arctic

246

Utilisation de tableaux

La mthode sort() rorganise les lments dans un tableau laide de lordre de tri par dfaut. Lordre de tri par dfaut a les caractristiques suivantes :

Le tri est sensible la casse, ce qui signifie que les majuscules prcdent les minuscules. Par exemple, la lettre D prcde la lettre b. Le tri est croissant, ce qui signifie que les codes de caractre bas (A, par exemple) prcdent les codes de caractre levs (B, par exemple). Le tri place les valeurs identiques les unes ct des autres mais sans ordre particulier. Le tri est bas sur des chanes, ce qui signifie que les lments sont convertis en chanes avant dtre compars (par exemple, 10 prcde 3 car la chane "1" a un code de caractre infrieur celui de la chane "3").

Vous pouvez trier votre tableau en ignorant la casse, ou par ordre dcroissant. Vous pouvez galement trier les nombres de votre tableau par ordre numrique plutt que par ordre alphabtique. La mthode sort() a un paramtre options qui vous permet de modifier chaque caractristique de lordre de tri par dfaut. Les options sont dfinies par un ensemble de constantes statiques dans la classe Array, comme indiqu dans la liste suivante :

Array.CASEINSENSITIVE : Cette option permet dignorer la casse lors du tri. Par exemple, la lettre minuscule b prcde la lettre majuscule D. Array.DESCENDING : Cette option inverse le tri croissant par dfaut. Par exemple, la lettre B prcde la lettre A. Array.UNIQUESORT :

Cette option permet darrter le tri si deux valeurs identiques sont

repres.

Array.NUMERIC :

Cette option permet deffectuer un tri numrique, de faon ce que 3

prcde 10. Lexemple suivant met en vidence certaines de ces options. Un tableau nomm poets est cr. Il est tri laide de plusieurs options diffrentes.
var poets:Array = ["Blake", "cummings", "Angelou", "Dante"]; poets.sort(); // tri par dfaut trace(poets); // rsultat : Angelou,Blake,Dante,cummings poets.sort(Array.CASEINSENSITIVE); trace(poets); // rsultat : Angelou,Blake,cummings,Dante poets.sort(Array.DESCENDING); trace(poets); // rsultat : cummings,Dante,Blake,Angelou poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // utilisation de deux options trace(poets); // rsultat : Dante,cummings,Blake,Angelou

Tableaux indexs

247

Vous pouvez galement crire votre fonction de tri personnalise et la transmettre comme paramtre la mthode sort(). Par exemple, si vous avez une liste de noms dans laquelle chaque lment de liste contient le nom entier dune personne mais que vous souhaitez trier la liste par nom de famille, vous devez utiliser une fonction de tri personnalis pour analyser chaque lment et utiliser le nom de famille dans la fonction de tri. Le code suivant indique comment procder avec une fonction personnalise utilise comme paramtre pour la mthode Array.sort() :
var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones"); function orderLastName(a, b):int { var lastName:RegExp = /\b\S+$/; var name1 = a.match(lastName); var name2 = b.match(lastName); if (name1 < name2) { return -1; } else if (name1 > name2) { return 1; } else { return 0; } } trace(names); // rsultat : John Q. Smith,Jane Doe,Mike Jones names.sort(orderLastName); trace(names); // rsultat : Jane Doe,Mike Jones,John Q. Smith

La fonction de tri personnalis orderLastName() utilise une expression rgulire pour extraire le nom de famille de chaque lment utiliser pour lopration de comparaison. Lidentifiant de fonction orderLastName est utilis comme paramtre lors de lappel la mthode sort() sur le tableau names. La fonction de tri accepte deux paramtres, a et b, car elle fonctionne sur deux lments de tableau la fois. La valeur renvoye de la fonction de tri indique comment les lments doivent tre tris :

Une valeur renvoye de -1 indique que le premier paramtre, a, prcde le second paramtre, b. Une valeur renvoye de 1 indique que le second paramtre, ab, prcde le premier, a. Une valeur renvoye de 0 indique que les lments ont une prcdence de tri quivalente.

248

Utilisation de tableaux

La mthode sortOn() est conue pour des tableaux indexs avec des lments contenant des objets. Ces objets doivent avoir au moins une proprit en commun pouvant tre utilise comme cl de tri. Lutilisation de la mthode sortOn() pour des tableaux dautres types provoque des rsultats inattendus. Lexemple suivant modifie le tableau poets de faon ce que chaque lment soit un objet au lieu dune chane. Chaque objet contient la fois le nom de famille du pote et sa date de naissance.
var poets:Array = new Array(); poets.push({name:"Angelou", born:"1928"}); poets.push({name:"Blake", born:"1757"}); poets.push({name:"cummings", born:"1894"}); poets.push({name:"Dante", born:"1265"}); poets.push({name:"Wang", born:"701"});

Vous pouvez utiliser la mthode sortOn() pour trier le tableau par la proprit born. La mthode sortOn() dfinit deux paramtres, fieldName et options. Largument fieldName doit tre spcifi en tant que chane. Dans lexemple suivant, la mthode sortOn() est appele avec deux arguments, "born" et Array.NUMERIC. Largument Array.NUMERIC est utilis pour vrifier que le tri est effectu par ordre numrique plutt que par ordre alphabtique. Ceci est utile mme lorsque tous les nombres ont le mme nombre de chiffres car vous tes certain que le tri se fera comme prvu si un nombre comportant un nombre infrieur ou suprieur de chiffres est ensuite ajout au tableau.
poets.sortOn("born", Array.NUMERIC); for (var i:int = 0; i < poets.length; ++i) { trace(poets[i].name, poets[i].born); } /* rsultat : Wang 701 Dante 1265 Blake 1757 cummings 1894 Angelou 1928 */

Gnralement, les mthodes sort() et sortOn() modifient un tableau. Si vous souhaitez trier un tableau sans modifier le tableau existant, transmettez la constante Array.RETURNINDEXEDARRAY avec le paramtre options. Cette option indique aux mthodes de renvoyer un nouveau tableau qui reflte le tri et laisse le tableau dorigine inchang. Le tableau renvoy par les mthodes est un tableau simple de numros dindex qui reflte le nouvel ordre de tri et ne contient aucun lment du tableau dorigine. Par exemple, pour trier le tableau poets par anne de naissance sans le modifier, incluez la constante Array.RETURNINDEXEDARRAY dans largument transmis pour le paramtre options.

Tableaux indexs

249

Lexemple suivant stocke les informations dindex renvoyes dans un tableau nomm indices et utilise le tableau indices avec le tableau poets inchang pour trier les potes par ordre danne de naissance :
var indices:Array; indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY); for (var i:int = 0; i < indices.length; ++i) { var index:int = indices[i]; trace(poets[index].name, poets[index].born); } /* rsultat : Wang 701 Dante 1265 Blake 1757 cummings 1894 Angelou 1928 */

Interrogation dun tableau


Les quatre mthodes restantes de la classe Array classconcat(), join(), slice(), toString()interrogent le tableau mais ne le modifient pas. Les mthodes concat() et slice() renvoient toutes les deux de nouveaux tableaux, alors que les mthodes join() et toString() renvoient des chanes. La mthode concat() prend un nouveau tableau ou une liste dlments comme arguments et le/la combine avec le tableau existant pour crer un tableau. La mthode slice() a deux paramtres nomms startIndex et endIndex, et renvoie un nouveau tableau contenant une copie des lments dcoups du tableau existant. La dcoupe commence avec llment startIndex et se termine avec llment juste avant endIndex. Llment endIndex nest pas compris dans la valeur renvoye. Lexemple suivant utilise concat() et slice() pour crer des tableaux laide dlments dautres tableaux :
var array1:Array = ["alpha", "beta"]; var array2:Array = array1.concat("gamma", "delta"); trace(array2); // rsultat : alpha,beta,gamma,delta var array3:Array = array1.concat(array2); trace(array3); // rsultat : alpha,beta,alpha,beta,gamma,delta var array4:Array = array3.slice(2,5); trace(array4); // rsultat : alpha,beta,gamma

250

Utilisation de tableaux

Vous pouvez utiliser les mthodes join() et toString() pour interroger le tableau et renvoyer son contenu sous la forme dune chane. Si aucun paramtre nest utilis pour la mthode join(), les deux mthodes se comportent de faon identique : elles renvoient une chane contenant une liste de tous les lments du tableau spare par des virgules. La mthode join(), contrairement la mthode toString(), accepte un paramtre nomm delimiter, qui permet de choisir le symbole utiliser comme sparateur entre chaque lment de la chane renvoye. Lexemple suivant cre un tableau nomm rivers et appelle la fois join() et toString() pour renvoyer les valeurs dans le tableau sous la forme dune chane. La mthode toString() est utilise pour renvoyer des valeurs spares par une virgule (riverCSV), alors que la mthode join() est utilise pour renvoyer des valeurs spares par le caractre +.
var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"]; var riverCSV:String = rivers.toString(); trace(riverCSV); // rsultat : Nile,Amazon,Yangtze,Mississippi var riverPSV:String = rivers.join("+"); trace(riverPSV); // rsultat : Nile+Amazon+Yangtze+Mississippi

Il existe un problme avec la mthode join() : tous les tableaux imbriqus sont toujours renvoys avec des valeurs spares par des virgules, quel que soit le sparateur que vous spcifiez pour les lments de tableau principaux, comme illustr dans lexemple suivant :
var nested:Array = ["b","c","d"]; var letters:Array = ["a",nested,"e"]; var joined:String = letters.join("+"); trace(joined); // rsultat : a+b,c,d+e

Tableaux associatifs
Les tableaux associatifs, parfois appels hachages ou mappages, utilisent des cls au lieu dun index numrique pour organiser des valeurs stockes. Chaque cl dans un tableau associatif est une chane unique qui est utilise pour accder une valeur stocke. Un tableau associatif est une instance de la classe Object, ce qui signifie que chaque cl correspond un nom de proprit. Les tableaux associatifs sont des collections non tries de paires de cls et de valeurs. Votre code ne doit pas sattendre ce que les cls dun tel tableau se prsentent dans un ordre prcis. ActionScript 3.0 prsente un type avanc de tableau associatif appel dictionnaire. Les dictionnaires, qui sont des instances de la classe Dictionary dans le package flash.utils, utilisent des cls de nimporte quel type de donnes mais qui sont gnralement des instances de la classe Object. En dautres termes, les cls de dictionnaire ne sont pas limites des valeurs de type String. Cette section dcrit comment crer des tableaux associatifs qui utilisent des chanes pour les cls et comment utiliser la classe Dictionary.

Tableaux associatifs

251

Tableaux associatifs avec cls de chane


Deux mthodes permettent de crer des tableaux associatifs dans ActionScript 3.0. La premire mthode consiste utiliser le constructeur Object, qui vous permet dinitialiser votre tableau avec un littral dobjet. Une instance de la classe Object, galement appele objet gnrique, prsente le mme fonctionnement quun tableau associatif. Chaque nom de proprit de lobjet gnrique devient la cl qui permet daccder une valeur stocke. Lexemple suivant cre un tableau associatif appel monitorInfo, laide dun littral dobjet pour initialiser le tableau avec deux paires de cls et de valeurs :
var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"}; trace(monitorInfo["type"], monitorInfo["resolution"]); // rsultat : Ecran plat 1600 x 1200

Si vous navez pas besoin dinitialiser le tableau lors de la dclaration, vous pouvez utiliser le constructeur Object pour crer le tableau, comme suit :
var monitorInfo:Object = new Object();

Une fois que le tableau est cr laide dun littral dobjet ou du constructeur de la classe Object, vous pouvez ajouter de nouvelles valeurs laide de loprateur crochets ([]) ou de loprateur point (.). Lexemple suivant ajoute deux nouvelles valeurs monitorArray :
monitorInfo["aspect ratio"] = "16:10"; // forme incorrecte, ne pas utiliser // despaces monitorInfo.colors = "16.7 million"; trace(monitorInfo["aspect ratio"], monitorInfo.colors); // rsultat : 16:10 16.7 million

La cl appele aspect ratio contient un caractre despace. Cela est possible dans le cas de loprateur crochets, mais avec loprateur point, une erreur se produit. Lutilisation despace dans le nom de vos cls nest donc pas conseille. Le second moyen pour crer un tableau associatif consiste utiliser le constructeur Array, puis loprateur crochets ([]) ou point (.) pour ajouter des paires de cls et de valeurs au tableau. Si vous dclarez votre tableau associatif comme tant de type Array, vous ne pouvez pas utiliser de littral dobjet pour linitialiser. Ce code cre un tableau associatif appel monitorInfo laide du constructeur Array et ajoute les cls appeles type et resolution, avec leurs valeurs :
var monitorInfo:Array = new Array(); monitorInfo["type"] = "Flat Panel"; monitorInfo["resolution"] = "1600 x 1200"; trace(monitorInfo["type"], monitorInfo["resolution"]); // rsultat : Flat Panel 1600 x 1200

Lutilisation du constructeur Array pour crer un tableau associatif ne prsente aucun avantage. Vous ne pouvez pas utiliser la proprit Array.length ou une mthode de la classe Array avec des tableaux associatifs, mme si vous utilisez le constructeur Array ou le type de donnes Array. Il est prfrable dutiliser le constructeur Array pour crer des tableaux indexs.
252 Utilisation de tableaux

Tableaux associatifs avec cls dobjet


Vous pouvez utiliser la classe Dictionary pour crer un tableau associatif qui utilise des objets pour les cls au lieu de chanes. Ces tableaux sont parfois appels dictionnaires, hachages ou mappages. Par exemple, supposez que vous avez une application qui dtermine lemplacement dun objet Sprite selon son association avec un conteneur spcifique. Vous pouvez utiliser un objet Dictionary pour mapper chaque objet Sprite un conteneur. Le code suivant cre trois instances de la classe Sprite qui servent de cls pour lobjet Dictionary. Une valeur de GroupA ou GroupB est affecte chaque cl. Les valeurs peuvent tre de nimporte quel type de donnes, mais dans cet exemple, GroupA et GroupB sont des instances de la classe Object. Vous pouvez ensuite accder la valeur associe chaque cl avec loprateur daccs la proprit ([]), comme illustr dans le code suivant :
import flash.display.Sprite; import flash.utils.Dictionary; var groupMap:Dictionary = new Dictionary(); // objets utiliser comme cls var spr1:Sprite = new Sprite(); var spr2:Sprite = new Sprite(); var spr3:Sprite = new Sprite(); // objets utiliser comme valeurs var groupA:Object = new Object(); var groupB:Object = new Object(); // Cration de groupMap[spr1] groupMap[spr2] groupMap[spr3] paires cl/valeur dans le dictionnaire. = groupA; = groupB; = groupB;

if (groupMap[spr1] == groupA) { trace("spr1 is in groupA"); } if (groupMap[spr2] == groupB) { trace("spr2 is in groupB"); } if (groupMap[spr3] == groupB) { trace("spr3 is in groupB"); }

Tableaux associatifs

253

Itration avec des cls dobjet


Vous pouvez parcourir en boucle le contenu dun objet Dictionary avec une boucle for..in ou for each..in. Une boucle for..in vous permet deffectuer une itration base sur les cls, tandis quune boucle for each..in vous permet deffectuer une itration base sur les valeurs associes chaque cl. Utilisez la boucle for..in pour accder directement aux cls dun objet Dictionary. Vous pouvez galement accder aux valeurs de lobjet Dictionary avec loprateur daccs la proprit ([]). Le code suivant utilise lexemple prcdent du dictionnaire groupMap pour indiquer comment parcourir en boucle un objet Dictionary avec la boucle for..in :
for (var key:Object in groupMap) { trace(key, groupMap[key]); } /* rsultat : [object Sprite] [object Object] [object Sprite] [object Object] [object Sprite] [object Object] */

Utilisez la boucle for each..in pour accder directement aux valeurs dun objet Dictionary. Le code suivant utilise galement le dictionnaire groupMap pour indiquer comment parcourir en boucle un objet Dictionary avec la boucle for each..in :
for each (var item:Object in groupMap) { trace(item); } /* rsultat : [object Object] [object Object] [object Object] */

254

Utilisation de tableaux

Cls dobjet et gestion de la mmoire


Adobe Flash Player utilise un systme de nettoyage permettant de rcuprer la mmoire qui nest plus utilise. Lorsque aucune rfrence ne pointe vers un objet, ce dernier peut tre nettoy et la mmoire rcupre au prochain nettoyage. Par exemple, le code suivant cre un objet et lui affecte une rfrence la variable myObject :
var myObject:Object = new Object();

Tant que des rfrences lobjet existent, le systme de nettoyage ne rcupre pas la mmoire que lobjet occupe. Si la valeur de myObject est modifie et quelle pointe vers un autre objet ou quelle est dfinie sur null, la mmoire occupe par lobjet dorigine peut tre nettoye. Nanmoins, aucune autre rfrence lobjet dorigine ne doit exister. Si vous utilisez myObject comme cl dans un objet Dictionary, vous crez une autre rfrence lobjet dorigine. Par exemple, le code suivant cre deux rfrences un objetla variable myObject et la cl dans lobjet myMap :
import flash.utils.Dictionary; var myObject:Object = new Object(); var myMap:Dictionary = new Dictionary(); myMap[myObject] = "foo";

Pour que lobjet rfrenc par myObject puisse tre nettoy, vous devez supprimer toutes ses rfrences. Dans ce cas, vous devez modifier la valeur de myObject et supprimer la cl myObject de myMap, comme indiqu dans le code suivant :
myObject = null; delete myMap[myObject];

Vous pouvez galement utiliser le paramtre useWeakReference du constructeur Dictionary pour que toutes les cls de dictionnaire deviennent des rfrences faibles. Le systme de nettoyage ignore les rfrences faibles. Par consquent, un objet nayant que des rfrences faibles peut tre nettoy. Par exemple, dans le code suivant, vous navez pas besoin de supprimer la cl myObject de myMap pour que lobjet puisse tre nettoy :
import flash.utils.Dictionary; var myObject:Object = new Object(); var myMap:Dictionary = new Dictionary(true); myMap[myObject] = "foo"; myObject = null; // Faire en sorte que lobjet puisse tre nettoy.

Tableaux associatifs

255

Tableaux multidimensionnels
Les tableaux multidimensionnels contiennent dautres tableaux comme lments. Prenons par exemple une liste de tches stocke sous forme de tableau index de chanes :
var tasks:Array = ["wash dishes", "take out trash"];

Pour stocker une liste de tches distincte pour chaque jour de la semaine, vous pouvez crer un tableau multidimensionnel avec un lment pour chaque jour. Chaque lment contient son tour un tableau index (semblable au tableau tasks) qui stocke la liste des tches. Vous pouvez utiliser nimporte quelle combinaison de tableaux indexs ou associatifs dans des tableaux multidimensionnels. Les exemples des sections suivantes utilisent soit deux tableaux indexs soit un tableau associatif de tableaux indexs. Vous pouvez essayer les autres combinaisons pour vous exercer.

Deux tableaux indexs


Lorsque vous utilisez deux tableaux indexs, vous pouvez visualiser le rsultat sous forme de tableau ou de feuille de calcul. Les lments du premier tableau reprsentent les lignes alors que les lments du second tableau reprsentent les colonnes. Par exemple, le tableau multidimensionnel suivant utilise deux tableaux indexs pour suivre des listes de tches pour chaque jour de la semaine. Le premier tableau, masterTaskList, est cr laide du constructeur de classe Array. Chaque lment du tableau reprsente un jour de la semaine, avec lindex 0 reprsentant lundi et lindex 6 dimanche. Ces lments peuvent tre considrs comme les lignes du tableau. Vous pouvez crer la liste de tches de chaque jour en affectant un littral de tableau chacun des sept lments que vous crez dans le tableau masterTaskList. Les littraux de tableau reprsentent les colonnes du tableau.
var masterTaskList:Array = new Array(); masterTaskList[0] = ["wash dishes", "take out trash"]; masterTaskList[1] = ["wash dishes", "pay bills"]; masterTaskList[2] = ["wash dishes", "dentist", "wash dog"]; masterTaskList[3] = ["wash dishes"]; masterTaskList[4] = ["wash dishes", "clean house"]; masterTaskList[5] = ["wash dishes", "wash car", "pay rent"]; masterTaskList[6] = ["mow lawn", "fix chair"];

Vous pouvez accder des lments individuels sur les listes de tches laide de la notation crochets. Le premier groupe de crochets reprsente le jour de la semaine et le second la liste de tches pour ce jour. Par exemple, pour rcuprer la seconde tche de la liste du mercredi, utilisez dabord lindex 2 pour mercredi puis utilisez lindex 1 pour la seconde tche dans la liste.
trace(masterTaskList[2][1]); // rsultat : dentiste

256

Utilisation de tableaux

Pour rcuprer la premire tche de la liste du dimanche, utilisez lindex 6 pour dimanche et lindex 0 pour la premire tche sur la liste.
trace(masterTaskList[6][0]); // rsultat : tondre le gazon

Tableau associatif avec un tableau index


Pour faciliter laccs aux tableaux, vous pouvez utiliser un tableau associatif pour les jours de la semaine et un tableau index pour les listes de tche. Les tableaux associatifs vous permettent dutiliser une syntaxe point lorsque vous vous rfrez un jour particulier de la semaine, mais ncessitent un traitement dexcution supplmentaire pour accder chaque lment du tableau associatif. Lexemple suivant utilise un tableau associatif comme base dune liste de tches, avec une paire de cls et de valeurs pour chaque jour de la semaine :
var masterTaskList:Object = new Object(); masterTaskList["Monday"] = ["wash dishes", "take out trash"]; masterTaskList["Tuesday"] = ["wash dishes", "pay bills"]; masterTaskList["Wednesday"] = ["wash dishes", "dentist", "wash dog"]; masterTaskList["Thursday"] = ["wash dishes"]; masterTaskList["Friday"] = ["wash dishes", "clean house"]; masterTaskList["Saturday"] = ["wash dishes", "wash car", "pay rent"]; masterTaskList["Sunday"] = ["mow lawn", "fix chair"];

La syntaxe point rend le code plus lisible car elle vite dutiliser plusieurs groupes de crochets.
trace(masterTaskList.Wednesday[1]); // rsultat : dentiste trace(masterTaskList.Sunday[0]); // rsultat : tondre le gazon

Vous pouvez parcourir en boucle la liste des tches en utilisant une boucle for..in, mais vous devez utiliser la notation crochets au lieu de la syntaxe point pour accder la valeur associe chaque cl. Etant donn que masterTaskList est un tableau associatif, les lments ne sont pas ncessairement rcuprs dans lordre que vous attendez, comme lindique lexemple suivant :
for (var day:String in masterTaskList) { trace(day + ": " + masterTaskList[day]) } /* output: Sunday: mow lawn,fix chair Wednesday: wash dishes,dentist,wash dog Friday: wash dishes,clean house Thursday: wash dishes Monday: wash dishes,take out trash Saturday: wash dishes,wash car,pay rent Tuesday: wash dishes,pay bills */

Tableaux multidimensionnels

257

Clonage de tableaux
La classe Array ne possde aucune mthode intgre pour effectuer des copies de tableaux. Vous pouvez crer une copie simple dun tableau en appelant la mthode concat() ou slice() sans arguments. Dans une copie simple, si le tableau dorigine a des lments qui sont des objets, seules les rfrences aux objets sont copies (et non les objets). La copie pointe vers les mmes objets que loriginal. Tout changement effectu sur les objets apparat dans les deux tableaux. Dans une copie en profondeur, les objets se trouvant dans le tableau dorigine sont copis galement de faon ce que le nouveau tableau ne pointe pas vers les mmes objets que le tableau dorigine. La copie en profondeur exige plus dune ligne de code, ce qui requiert gnralement la cration dune fonction. Une telle fonction peut tre cre comme fonction dutilitaire globale ou comme mthode dune sous-classe Array. Lexemple suivant dfinit une fonction appele clone() qui effectue une copie en profondeur. Lalgorithme est issu dune technique de programmation Java courante. La fonction cre une copie en profondeur en srialisant le tableau en une instance de la classe ByteArray puis en relisant le tableau dans un nouveau tableau. Cette fonction accepte un objet de faon ce quil puisse tre utilis la fois avec des tableaux indexs et des tableaux associatifs, comme indiqu dans le code suivant :
import flash.utils.ByteArray; function clone(source:Object):* { var myBA:ByteArray = new ByteArray(); myBA.writeObject(source); myBA.position = 0; return(myBA.readObject()); }

258

Utilisation de tableaux

Rubriques avances :
Extension de la classe Array
La classe Array est lune des classes de base non finale, cest--dire que vous pouvez crer votre sous-classe dArray. Cette section dcrit comment crer une sous-classe dArray et dcrit les problmes pouvant se poser pendant le processus. Comme mentionn prcdemment, les tableaux dans ActionScript ne sont pas typs, mais vous pouvez crer une sous-classe dArray qui accepte des lments dun seul type de donnes. Lexemple fourni dans les sections suivantes dfinit une sous-classe Array nomme TypedArray qui limite ses lments des valeurs du type de donnes indiqu dans le premier paramtre. La classe TypedArray est prsente comme un exemple de la faon dont la classe Array est tendue et risque de ne pas tre adapte des fins de production pour diffrentes raisons. Premirement, la vrification du type a lieu lors de lexcution plutt que de la compilation. Deuximement, lorsquune mthode TypedArray rencontre une incompatibilit, elle est ignore et aucune exception nest renvoye, mme si vous pouvez facilement modifier les mthodes pour renvoyer des exceptions. Troisimement, la classe ne peut pas empcher lutilisation de loprateur daccs au tableau pour insrer des valeurs de nimporte quel type dans le tableau. Quatrimement, le style de codage privilgie la simplicit par rapport loptimisation des performances.

Dclaration de la sous-classe
Utilisez le mot-cl extends pour indiquer quune classe est une sous-classe dArray. Une sousclasse dArray doit utiliser lattribut dynamic, comme la classe Array. Autrement, votre sousclasse ne fonctionne pas correctement.

Rubriques avances :

259

Le code suivant reprsente la dfinition de la classe TypedArray, qui comporte une constante contenant le type de donnes, une mthode de constructeur et les quatre mthodes permettant dajouter des lments au tableau. Le code pour chaque mthode est omis dans cet exemple, mais il est dcrit de faon dtaille dans les sections qui suivent :
public dynamic class TypedArray extends Array { private const dataType:Class; public function TypedArray(...args) {} AS3 override function concat(...args):Array {} AS3 override function push(...args):uint {} AS3 override function splice(...args) {} AS3 override function unshift(...args):uint {} }

Les quatre mthodes de remplacement utilisent lespace de nom AS3 au lieu de lattribut public car cet exemple suppose que loption -as3 du compilateur est dfinie sur true et loption -es du compilateur sur false. Il sagit des paramtres par dfaut pour Adobe Flex Builder 2 et Adobe Flash CS3 Professional. Pour plus dinformations, voir Lespace de nom dActionScript 3 , la page 192.
C ON S E I L 260

Si vous tes un dveloppeur expriment et que vous prfrez utiliser lhritage de prototype, vous pouvez apporter deux changements mineurs la classe TypedArray afin quelle compile avec loption -es du compilateur dfinie sur true. Commencez par supprimer toutes les occurrences de lattribut override et remplacez lespace de nom AS3 par lattribut public. Remplacez ensuite Array.prototype pour les quatre occurrences de super.

Constructeur TypedArray
Le constructeur de sous-classe pose un dfi intressant car il doit accepter une liste darguments de longueur arbitraire. Il sagit de savoir comment transfrer les arguments au superconstructeur pour crer le tableau. Si vous transmettez la liste des arguments sous forme dun tableau, le superconstructeur le considre comme un seul argument de type Array et le tableau rsultant a toujours une longueur d1 lment. Le transfert de listes darguments se fait gnralement au moyen de la mthode Function.apply(), qui prend un tableau darguments comme second paramtre mais le convertit en une liste darguments lors de lexcution de la fonction. Malheureusement, vous ne pouvez pas utiliser la mthode Function.apply() avec des constructeurs.

Utilisation de tableaux

La seule solution est de recrer la logique du constructeur Array dans le constructeur TypedArray. Le code suivant indique lalgorithme utilis dans le constructeur de classe Array, que vous pouvez rutiliser dans votre constructeur de sous-classe Array :
public dynamic class Array { public function Array(...args) { var n:uint = args.length if (n == 1 && (args[0] is Number)) { var dlen:Number = args[0]; var ulen:uint = dlen; if (ulen != dlen) { throw new RangeError("Array index is not a 32-bit unsigned integer ("+dlen+")"); } length = ulen; } else { length = n; for (var i:int=0; i < n; i++) { this[i] = args[i] } } } }

Rubriques avances :

261

Le constructeur TypedArray partage une grande partie du code du constructeur Array, avec seulement quatre changements apports au code. Premirement, la liste des paramtres comprend un nouveau paramtre obligatoire de type Class qui permet dindiquer le type de donnes du tableau. Deuximement, le type de donnes transmis au constructeur est affect la variable dataType. Troisimement, dans linstruction else, la valeur de la proprit length est affecte aprs la boucle for de faon ce que length comprenne uniquement des arguments du type correct. Quatrimement, le corps de la boucle for utilise la version de remplacement de la mthode push() de faon ce que seuls des arguments du type de donnes correct soient ajouts au tableau. Lexemple suivant prsente la fonction constructeur TypedArray :
public dynamic class TypedArray extends Array { private var dataType:Class; public function TypedArray(typeParam:Class, ...args) { dataType = typeParam; var n:uint = args.length if (n == 1 && (args[0] is Number)) { var dlen:Number = args[0]; var ulen:uint = dlen if (ulen != dlen) { throw new RangeError("Array index is not a 32-bit unsigned integer ("+dlen+")") } length = ulen; } else { for (var i:int=0; i < n; i++) { // vrification du type effectue dans push() this.push(args[i]) } length = this.length; } } }

262

Utilisation de tableaux

Mthodes de remplacement TypedArray


La classe TypedArray remplace les quatre mthodes de la classe Array qui permettent dajouter des lments un tableau. Dans chaque cas, la mthode de remplacement ajoute une vrification du type qui empche dajouter des lments qui ne sont pas du type de donnes correct. Chaque mthode appelle ensuite sa version de superclasse. La mthode push() parcourt en boucle la liste des arguments avec une boucle for..in et effectue une vrification du type sur chaque argument. Les arguments qui ne sont pas de type correct sont supprims du tableau args avec la mthode splice(). Une fois que la boucle for..in se termine, le tableau args contient des valeurs de type dataType uniquement. La version de superclasse de push() est ensuite appele avec le tableau args mis jour, comme indiqu dans le code suivant :
AS3 override function push(...args):uint { for (var i:* in args) { if (!(args[i] is dataType)) { args.splice(i,1); } } return (super.push.apply(this, args)); }

La mthode concat() cre un TypedArray temporaire appel passArgs pour stocker les arguments soumis la vrification de type. Ceci permet de rutiliser le code de vrification de type qui existe dans la mthode push(). Une boucle for..in effectue une itration sur le tableau args et appelle push() sur chaque argument. Etant donn que passArgs est typ sous la forme TypedArray, la version TypedArray de push() est excute. La mthode concat() appelle ensuite sa version de superclasse, comme indiqu dans le code suivant :
AS3 override function concat(...args):Array { var passArgs:TypedArray = new TypedArray(dataType); for (var i:* in args) { // vrification du type effectue dans push() passArgs.push(args[i]); } return (super.concat.apply(this, passArgs)); }

Rubriques avances :

263

La mthode splice() prend une liste darguments arbitraire, mais les deux premiers arguments se rfrent toujours un numro dindex et au nombre dlments supprimer. Cest pourquoi la mthode de remplacement splice() effectue la vrification de type uniquement pour les lments du tableau args dans les positions dindex 2 ou suprieures. Il est intressant de noter que dans le code, il semble y avoir un appel rcursif splice() lintrieur de la boucle for, mais en ralit, ce nest pas le cas car args est de type Array et non de type TypedArray, ce qui signifie que lappel args.splice() est un appel la version de superclasse de la mthode. Une fois que la boucle for..in se termine, le tableau args contient des valeurs du type correct uniquement dans les positions dindex 2 ou suprieures, et splice() appelle sa version de superclasse, comme indiqu dans le code suivant :
AS3 override function splice(...args):* { if (args.length > 2) { for (var i:int=2; i< args.length; i++) { if (!(args[i] is dataType)) { args.splice(i,1); } } } return (super.splice.apply(this, args)); }

La mthode unshift(), qui ajoute des lments au dbut dun tableau, accepte une liste darguments arbitraire galement. La mthode de remplacement unshift() utilise un algorithme trs semblable celui utilis par la mthode push(), comme indiqu dans le code suivant :
AS3 override function unshift(...args):uint { for (var i:* in args) { if (!(args[i] is dataType)) { args.splice(i,1); } } return (super.unshift.apply(this, args)); } }

264

Utilisation de tableaux

Exemple : PlayList
Lexemple PlayList prsente les techniques dutilisation des tableaux, dans le contexte dune application de lecture musicale qui gre une liste de chansons. Ces techniques sont les suivantes :

Cration dun tableau index Ajout dlments un tableau index Tri dun tableau dobjets en fonction de diffrentes proprits, laide doptions de tri diffrentes Conversion dun tableau en une chane spare par des caractres

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers dapplication PlayList se trouvent dans le dossier Samples/PlayList. Lapplication se compose des fichiers suivants :
Fichier
PlayList.mxml ou PlayList.fla com/example/programmingas3/playlist/ Song.as com/example/programmingas3/playlist/ SortProperty.as

Description
Le fichier dapplication principal dans Flash (FLA) ou Flex (MXML). Objet de valeur reprsentant des informations sur une seule chanson. Les lments grs par la classe PlayList sont des instances Song. Pseudo-numration dont les valeurs disponibles reprsentent les proprits de la classe Song en fonction desquelles une liste dobjets Song peut tre trie.

Exemple : PlayList

265

Prsentation de la classe PlayList


La classe PlayList gre un ensemble dobjets Song. Elle a des mthodes publiques qui permettent dajouter une chanson la liste de lecture (la mthode addSong()) et de trier les chansons dans la liste (la mthode sortList()). En outre, la classe comprend une proprit daccesseur en lecture seule, songList, qui permet daccder au groupe de chansons dans la liste de lecture. En interne, la classe PlayList conserve une trace de ses chansons laide dune variable Array prive :
public class PlayList { private var _songs:Array; private var _currentSort:SortProperty = null; private var _needToSort:Boolean = false; ... }

En plus de la variable Array _songs utilise par la classe PlayList pour conserver une trace de sa liste de chansons, deux autres variables prives vrifient si la liste doit tre trie (_needToSort) et contrlent la proprit sur laquelle est bas le tri de la liste de chansons un moment donn (_currentSort). Comme avec tous les objets, lorsque vous avez dclar une instance Array, vous navez effectu que la moiti du travail consistant crer un tableau. Avant daccder des mthodes ou des proprits dune instance Array, cette dernire doit tre instancie dans le constructeur de la classe PlayList.
public function PlayList() { this._songs = new Array(); // Dfinition du tri initial. this.sortList(SortProperty.TITLE); }

La premire ligne du constructeur instancie la variable _songs pour quelle puisse tre utilise. En outre, la mthode sortList() est appele pour dfinir la proprit de tri initiale.

266

Utilisation de tableaux

Ajout dune chanson la liste


Lorsquun utilisateur ajoute une nouvelle chanson dans lapplication, le code dans le formulaire de saisie des donnes appelle la mthode addSong() de la classe PlayList.
/** * Ajout dune chanson la liste de lecture. */ public function addSong(song:Song):void { this._songs.push(song); this._needToSort = true; }

A lintrieur de addSong(), la mthode push() du tableau _songs est appele. Ceci permet dajouter lobjet Song transmis addSong() en tant que nouvel lment dans ce tableau. Avec la mthode push(), le nouvel lment est ajout la fin du tableau, indpendamment du tri appliqu prcdemment. Ceci signifie quune fois que la mthode push() a t appele, la liste des chansons risque de ne plus tre trie correctement. Par consquent, la variable _needToSort est dfinie sur true. Thoriquement, la mthode sortList() pourrait tre appele immdiatement afin dviter de vrifier si la liste est trie ou non un moment donn. En pratique, cependant, la liste des chansons na pas besoin dtre trie jusquau moment prcdant immdiatement sa rcupration. En retardant lopration de tri, lapplication neffectue pas de tri inutile si, par exemple, plusieurs chansons sont ajoutes la liste avant sa rcupration.

Tri de la liste de chansons


Etant donn que les instances Song gres par la liste de lecture sont des objets complexes, les utilisateurs de lapplication peuvent trier la liste de lecture en fonction de diffrentes proprits (titre de la chanson ou anne de publication, par exemple). Dans lapplication PlayList, le tri de la liste des chansons seffectue en trois tapes : identification de la proprit sur laquelle est bas le tri de la liste, indication des options de tri utiliser lors du tri en fonction de cette proprit et excution du tri.

Exemple : PlayList

267

Proprits de tri
Un objet Song conserve la trace de plusieurs proprits, notamment le titre de la chanson, lartiste, lanne de publication, le nom du fichier et un ensemble de genres slectionn par lutilisateur auquel la chanson appartient. Seules les trois premires proprits sont pratiques pour le tri. Dans un souci de commodit pour les dveloppeurs, lexemple inclut la classe SortProperty, qui agit comme une numration avec des valeurs reprsentant les proprits disponibles pour le tri.
public static const TITLE:SortProperty = new SortProperty("title"); public static const ARTIST:SortProperty = new SortProperty("artist"); public static const YEAR:SortProperty = new SortProperty("year");

La classe SortProperty contient trois classes, TITLE, ARTIST et YEAR. Chacune delles stocke une chane comportant le nom de la proprit de la classe Song pouvant tre utilise pour le tri. Chaque fois quune proprit de tri est indique dans le reste du code, le membre de lnumration est utilis. Par exemple, dans le constructeur PlayList, la liste est trie initialement en appelant la mthode sortList(), comme suit :
// Dfinition du tri initial. this.sortList(SortProperty.TITLE);

Etant donn que la proprit de tri est spcifie sous la forme SortProperty.TITLE, les chansons sont tries par titre.

Tri par proprit et dfinition doptions de tri


La classe PlayList trie la liste de chansons dans la mthode sortList(), comme suit :
/** * Tri de la liste de chansons en fonction de la proprit spcifie. */ public function sortList(sortProperty:SortProperty):void { ... var sortOptions:uint; switch (sortProperty) { case SortProperty.TITLE: sortOptions = Array.CASEINSENSITIVE; break; case SortProperty.ARTIST: sortOptions = Array.CASEINSENSITIVE; break; case SortProperty.YEAR: sortOptions = Array.NUMERIC; break; }

268

Utilisation de tableaux

// Tri des donnes. this._songs.sortOn(sortProperty.propertyName, sortOptions); // Enregistrement de la proprit de tri actuelle. this._currentSort = sortProperty; // Enregistrement du fait que la liste est trie. this._needToSort = false; }

Lors du tri par titre ou par artiste, il est prfrable deffectuer un tri par ordre alphabtique. En revanche, lors du tri par anne, il est plus logique deffectuer un tri numrique. Linstruction switch sert dfinir loption de tri approprie, stocke dans la variable sortOptions, en fonction de la valeur indique dans le paramtre sortProperty. Ici encore, les membres de lnumration nomms sont utiliss pour faire la diffrence entre les proprits, plutt que les valeurs absolues. Une fois que vous avez dtermin la proprit et les options de tri, le tableau _songs est tri en appelant sa mthode sortOn(), en transmettant ces deux valeurs comme paramtres. La proprit de tri est enregistre et la liste des chansons est trie.

Combinaison dlments de tableau en une chane spare par des caractres


Cet exemple utilise non seulement un tableau pour conserver la liste des chansons dans la classe PlayList mais galement des tableaux dans la classe Song pour grer la liste des genres auxquels une chanson appartient. Prenez en compte ce fragment de code issu de la dfinition de la classe Song :
private var _genres:String; public function Song(title:String, artist:String, year:uint, filename:String, genres:Array) { ... // Les genres sont transmis sous la forme dun tableau // mais ils sont stocks sous la forme dune chane spare // par des points-virgules. this._genres = genres.join(";"); }

Exemple : PlayList

269

Lors de la cration dune instance Song, le paramtre genres utilis pour spcifier le genre (ou les genres) auquel la chanson appartient est dfini comme instance Array. Ainsi, vous pouvez regrouper plusieurs genres en une seule variable qui peut tre transmise au constructeur. Nanmoins, la classe Song conserve, en interne, les genres dans la variable prive _genres sous la forme dune instance String spare par des points-virgules. Le paramtre Array est converti en une chane spare par des points-virgules en appelant sa mthode join() avec la valeur de chane littrale ";" comme sparateur spcifi. De la mme faon, les accesseurs genres permettent de dfinir ou de rcuprer des genres sous la forme dun tableau :
public function get genres():Array { // Les genres sont stocks sous la forme dune chane spare par // des points-virgules, et doivent donc tre transforms en un tableau // pour tre de nouveau transfrs. return this._genres.split(";"); } public function set genres(value:Array):void { // Les genres sont transmis sous la forme dun tableau, // mais ils sont stocks sous la forme dune chane spare // par des points-virgules. this._genres = value.join(";"); }

Laccesseur genres set se comporte exactement comme le constructeur ; il accepte un tableau et appelle la mthode join() pour la convertir en une chane spare par des points-virgules. Laccesseur get effectue lopration inverse : la mthode split() de la variable _genres est appele. Elle divise la chane en un tableau de valeurs utilisant le sparateur spcifi (la valeur de chane littrale ";" comme prcdemment).

270

Utilisation de tableaux

CHAPITRE 8

Gestion des erreurs


Grer une erreur signifie insrer une logique dans votre application permettant de rpondre une erreur ou de la rparer lors de la compilation ou de lexcution dune application. Lorsque votre application gre des erreurs, quelque chose se produit en rponse lerreur. Dans certaines situations, il se peut en revanche quune erreur soit ignore (chec silencieux) et quaucune rponse ne soit fournie. La gestion des erreurs, lorsquelle est utilise correctement, protge votre application et ses utilisateurs contre un comportement inattendu. Cependant, la gestion des erreurs est une catgorie large qui englobe la rponse de nombreux types derreurs gnres lors de la compilation ou de lexcution. Ce chapitre se concentre sur la gestion des erreurs lors de lexcution, les diffrents types derreurs pouvant tre gnrs et les avantages que prsente le nouveau systme de gestion des erreurs dans ActionScript 3.0. Il explique galement comment mettre en oeuvre vos stratgies de gestion des erreurs personnalises pour vos applications.

Contenu
Principes de base de la gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Types derreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 Gestion des erreurs dans ActionScript 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 Utilisation de la version de dbogage de Flash Player . . . . . . . . . . . . . . . . . . . . . . . 280 Gestion des erreurs synchrones dans une application. . . . . . . . . . . . . . . . . . . . . . . . 281 Cration de classes derreur personnalises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286 Rponse des vnements derreurs et au statut . . . . . . . . . . . . . . . . . . . . . . . . . . .288 Comparaison des classes Error. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .292 Exemple : Application CustomErrors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .298

271

Principes de base de la gestion des erreurs


Introduction la gestion des erreurs
Une erreur dexcution est une erreur qui se produit dans votre code ActionScript et qui empche le contenu ActionScript de sexcuter dans Flash Player. Pour vous assurer que votre code ActionScript sexcute correctement, vous devez crire le code dans lapplication qui gre lerreur, la rpare, la contourne ou informe au moins lutilisateur quelle a eu lieu. Ce processus est appel gestion des erreurs. La gestion des erreurs est une catgorie large qui englobe la rponse de nombreux types derreurs gnres lors de la compilation ou de lexcution. Les erreurs qui se produisent lors de la compilation sont souvent plus faciles identifier - vous devez les corriger pour terminer la cration dun fichier SWF. Ce chapitre ne traite pas des erreurs de compilation ; pour plus dinformations sur lcriture de code dpourvu derreurs de compilation, voir Chapitre 3, Syntaxe et langage ActionScript , la page 71 et Chapitre 4, Programmation oriente objet en ActionScript , la page 147. Ce chapitre se concentre sur les erreurs dexcution. Les erreurs dexcution peuvent tre difficiles dtecter car elles se produisent lorsque le code erron est excut. Si un segment de votre programme possde plusieurs branches de code, comme une instruction if..then..else, vous devez tester chaque condition possible, avec toutes les valeurs dentre possibles que les utilisateurs rels peuvent utiliser, de faon confirmer que votre code ne contient aucune erreur. Les erreurs dexcution peuvent tre classes en deux catgories : les erreurs de programme sont des erreurs dans votre code ActionScript (spcification du type de donnes incorrect pour un paramtre de mthode, par exemple) ; les erreurs logiques sont des erreurs dans la logique (le contrle des donnes et la manipulation des valeurs) de votre programme (utilisation de la formule incorrecte pour calculer les taux dintrt dans une application bancaire, par exemple). Encore une fois, ces deux types derreurs peuvent souvent tre dtectes et corriges lavance en testant votre application. Il serait idal didentifier et de supprimer toutes les erreurs de votre application avant de la mettre la disposition des utilisateurs finaux. Cependant, toutes les erreurs ne peuvent pas tre prvues ni vites. Par exemple, supposez que votre application ActionScript charge des informations depuis un site Web particulier qui se trouve hors de votre contrle. Si ce site Web nest pas disponible, la partie de votre application qui dpend de ces donnes externes ne se comportera pas correctement. Laspect le plus important de la gestion des erreurs implique une prparation pour ces cas inconnus ainsi que leur gestion afin de permettre aux utilisateurs de continuer utiliser votre application, ou au moins de recevoir un message derreur amical expliquant la raison du problme.

272

Gestion des erreurs

Les erreurs dexcution sont reprsentes de deux faons dans ActionScript :

Classes Error : de nombreuses erreurs ont une classe Erreur qui leur est associe. Lorsquune erreur se produit, Flash Player cre une instance de la classe Error spcifique associe cette erreur. Votre code peut utiliser les informations contenues dans cet objet erreur pour donner une rponse approprie lerreur. Evnements derreur : parfois, une erreur se produit lorsque Flash Player devrait normalement dclencher un vnement. Dans ces cas, Flash Player dclenche un vnement derreur la place. A linstar dautres vnements, chaque vnement derreur possde une classe qui lui est associ, et Flash Player transmet une instance de cette classe aux mthodes qui sont enregistres auprs de lvnement derreur.

Pour dterminer si une mthode particulire peut dclencher une erreur ou un vnement derreur, voir lentre de la mthode dans la Rfrence du langage et des composants ActionScript 3.0.

Tches de gestion des erreurs courantes


Voici des tches lies des erreurs courantes que vous effectuez avec votre code :

Ecriture de code pour grer des erreurs Test, capture et renvoi derreurs Dfinition de votre classe derreur Rponse des vnements derreurs et de statut

Concepts et termes importants


La liste de rfrence suivante contient les termes importants que vous rencontrerez dans ce chapitre :

Asynchrone : une commande de programme telle quun appel de mthode qui ne fournit pas un rsultat immdiat mais qui donne un rsultat (ou erreur) sous la forme dun vnement. Capturer : lorsquune exception (une erreur dexcution) se produit et que votre code la dcouvre, ce dernier la capture. Une fois quune exception est capture, Flash Player arrte dindiquer dautre code ActionScript que lexception sest produite. Version de dbogage : une version spciale de Flash Player qui contient du code permettant dinformer les utilisateurs lorsque des erreurs dexcution se produisent. Dans la version standard de Flash Player (celle que la plupart des utilisateurs possdent), les erreurs qui ne sont pas gres par votre code ActionScript sont ignores par Flash Player. Dans la version de dbogage (qui est incluse avec Adobe Flash CS3 Professional et Adobe Flex), un message davertissement apparat lorsquune erreur non gre se produit.

Principes de base de la gestion des erreurs

273

Exception : une erreur qui se produit lorsquun programme est excut et que lenvironnement dexcution (Flash Player) ne peut pas rsoudre. Renvoyer : lorsque votre code capture une exception, Flash Player ne signale plus lexception aucun autre objet. Sil est important pour dautres objets que lexception leur soit signale, votre code doit renvoyer lexception pour recommencer le processus de notification. Synchrone : une commande de programme (un appel de mthode, par exemple) qui fournit un rsultat immdiat (ou qui renvoie immdiatement une erreur), ce qui signifie que la rponse peut tre utilise dans le mme bloc de code. Envoyer : le fait de signaler Flash Player (et par consquent, dautre objets et au code ActionScript) quune erreur sest produite sappelle envoyer une erreur.

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Tous les codes de ce chapitre comprennent lappel de la fonction trace(). Pour tester les codes de ce chapitre :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code dans le panneau Script. Excutez le programme en slectionnant Contrle > Tester lanimation. Les rsultats des fonctions trace() des codes saffichent dans le panneau Sortie.

Certains des prochains codes sont plus complexes et sont crits sous la forme dune classe. Pour tester ces exemples :
1. 2.

Crez un document Flash vide et enregistrez-le sur votre ordinateur. Crez un nouveau fichier ActionScript et enregistrez-le dans le mme rpertoire que le document Flash. Le nom du fichier doit correspondre au nom de la classe du code. Par exemple, si le code dfinit une classe ErrorTest, enregistrez le fichier ActionScript sous le nom ErrorTest.as. Copiez le code dans le fichier ActionScript et enregistrez le fichier. Dans le document Flash, cliquez sur une partie vide de la scne ou de lespace de travail pour activer linspecteur des proprits du document. Dans linspecteur des proprits, dans le champ Classe du document, saisissez le nom de la classe ActionScript que vous avez copie du texte.

3. 4.

5.

274

Gestion des erreurs

6.

Excutez le programme en slectionnant Contrle > Tester lanimation Les rsultats de lexemple saffichent dans le panneau Sortie (si lexemple utilise la fonction trace()) ou dans un champ texte cr par lexemple de code.

Ces techniques de test des exemples de code sont dcrites de faon plus dtaille dans Test des exemples de code contenus dans un chapitre , la page 67.

Types derreurs
Lorsque vous dveloppez et excutez des applications, vous rencontrez diffrents types derreurs et de termes. La liste suivante prsente les principaux termes et types derreurs :

Erreurs de compilation : gnres par le compilateur ActionScript lors de la compilation du code. Les erreurs de compilation ont lieu lorsque des problmes de syntaxe dans votre code empchent de crer votre application. Erreurs dexcution : gnres lorsque vous excutez votre application aprs lavoir compile. Les erreurs dexcution sont gnres lorsquun fichier SWF est lu dans Adobe Flash Player 9. Dans la plupart des cas, vous pouvez grer ces erreurs lorsquelles se produisent, en les signalant lutilisateur et en faisant en sorte que lexcution de votre application continue. Sil sagit dune erreur grave (impossibilit de se connecter un site Web distant ou de charger des donnes), vous pouvez utiliser la gestion des erreurs pour mettre fin votre application en douceur. Erreurs synchrones : gnres lorsquune fonction est appelepar exemple, lorsque vous tentez dutiliser une mthode spcifique et que largument que vous lui transmettez nest pas valide, par consquent, Flash Player renvoie une exception. La plupart des erreurs ont lieu de faon synchrone (au moment de lexcution dune instruction) et le flux de contrle passe immdiatement linstruction catch la plus applicable.
browse()

Par exemple, lextrait de code suivant renvoie une erreur dexcution car la mthode nest pas appele avant que le programme tente de charger un fichier :

var fileRef:FileReference = new FileReference(); try { fileRef.upload("http://www.yourdomain.com/fileupload.cfm"); } catch (error:IllegalOperationError) { trace(error); // Error #2037: Fonctions appeles dans un ordre incorrect, ou appel // prcdent impossible. }

Types derreurs

275

Dans ce cas, une erreur dexcution est renvoye de faon synchrone car Flash Player a dtermin que la mthode browse() na pas t appele avant la tentative de chargement du fichier. Pour de plus amples informations sur la gestions des erreurs synchrones, voir Gestion des erreurs synchrones dans une application , la page 281.

Erreurs asynchrones : gnres diffrents moments lors de lexcution. Elles provoquent des vnements et sont interceptes par des couteurs dvnements. Une opration asynchrone est une opration dans laquelle une fonction lance une opration mais nattend pas quelle se termine. Vous pouvez crer un couteur dvnement derreur pour attendre que lapplication ou lutilisateur tente une opration, et si cette dernire choue, vous interceptez lerreur avec un couteur dvnement et rpondez lvnement derreur. Ensuite, lcouteur dvnement appelle une fonction de gestionnaire dvnements pour rpondre lvnement derreur de faon utile. Par exemple, le gestionnaire dvnements peut lancer une bote de dialogue qui invite lutilisateur rsoudre lerreur. Reprenez lexemple derreur synchrone lors du chargement dun fichier prsent prcdemment. Si vous russissez appeler la mthode browse() avant de lancer le chargement dun fichier, Flash Player distribue plusieurs vnements. Par exemple, au dmarrage dun chargement, lvnement open est distribu. A la fin du chargement, lvnement complete est distribu. Etant donn que la gestion dvnements est asynchrone (cest--dire quelle na pas lieu des moments prdfinis, connus et spcifiques), vous devez utiliser la mthode addEventListener() pour dtecter ces vnements spcifiques, comme lindique le code suivant :
var fileRef:FileReference = new FileReference(); fileRef.addEventListener(Event.SELECT, selectHandler); fileRef.addEventListener(Event.OPEN, openHandler); fileRef.addEventListener(Event.COMPLETE, completeHandler); fileRef.browse(); function selectHandler(event:Event):void { trace("...select..."); var request:URLRequest = new URLRequest("http://www.yourdomain.com/ fileupload.cfm"); request.method = URLRequestMethod.POST; event.target.upload(request.url); } function openHandler(event:Event):void { trace("...open..."); } function completeHandler(event:Event):void { trace("...complete..."); }

276

Gestion des erreurs

Pour de plus amples informations sur la gestions des erreurs asynchrones, voir Rponse des vnements derreurs et au statut , la page 288.

Exceptions non interceptes : renvoyes sans logique correspondante (comme une instructioncatch) pour y rpondre. Si votre application renvoie une erreur, et quaucune instruction catch ni gestionnaire dvnements appropri nest trouv au niveau actuel ou suprieur pour grer lerreur, cette dernire est considre comme une exception non intercepte. Lors de lexcution, Flash Player ignore les erreurs non interceptes et tente de poursuivre la lecture si lerreur narrte pas le fichier SWF actuel, car les utilisateurs ne peuvent pas ncessairement rsoudre une erreur eux-mme. Le fait dignorer une erreur non intercepte est appel chec silencieux et peut compliquer le dbogage des applications. La version de dbogage de Flash Player rpond une erreur non intercepte en terminant le script courant et en affichant lerreur non intercepte dans le rsultat de linstruction trace ou en enregistrant le message derreur dans un fichier journal. Si lobjet dexception est une instance de la classe Error ou lune de ses sous-classes, la mthode getStackTrace() est appele, et les informations de trace de pile sont galement affiches dans le rsultat de linstruction trace ou dans un fichier journal. Pour de plus amples informations sur lutilisation de la version de dbogage de Flash Player, voir Utilisation de la version de dbogage de Flash Player , la page 280.

Gestion des erreurs dans ActionScript 3.0


Etant donn que de nombreuses applications peuvent tre excutes sans crer de logique pour grer les erreurs, les dveloppeurs sont tents de retarder la cration de la gestion des erreurs dans leurs applications. Nanmoins, sans gestion des erreurs, une application risque de sinterrompre facilement ou de poser des problmes lutilisateur si quelque chose ne fonctionne pas comme prvu. ActionScript 2.0 possde une classe Error qui vous permet de crer une logique dans des fonctions personnalises afin de renvoyer une exception avec un message spcifique. Etant donn que la gestion des erreurs est cruciale pour rendre une application conviviale, ActionScript 3.0 inclut une architecture tendue pour intercepter les erreurs.
R E M AR QU E

La Rfrence du langage et des composants ActionScript 3.0 documente les exceptions renvoyes par de nombreuses mthodes mais risque de ne pas inclure toutes les exceptions possibles pour chaque mthode. Une mthode peut renvoyer une exception pour des erreurs de syntaxe ou dautres problmes qui ne sont pas signals explicitement dans la description de la mthode, mme lorsque cette dernire rpertorie les exceptions quune mthode renvoie.

Gestion des erreurs dans ActionScript 3.0

277

Elments de gestion des erreurs ActionScript 3.0


ActionScript 3.0 comprend de nombreux outils permettant de grer les erreurs, notamment :

Classes Error. Conformment la spcification de langage ECMAScript (ECMA-262), version 4, ActionScript 3.0 comprend une large gamme de classes Error afin dlargir le domaine des situations pouvant produire des objets derreur. Chaque classe Error permet aux applications de grer et de rpondre des conditions derreur spcifiques, quelles soient lies des erreurs systme (comme une condition MemoryError), des erreurs de codage (comme une condition ArgumentError), des erreurs de rseau et de communication (comme une condition URIError), ou dautres situations. Pour plus dinformations sur chaque classe, voir Comparaison des classes Error , la page 292. Moins dchecs silencieux. Dans les versions prcdentes de Flash Player, les erreurs taient gnres et signales uniquement si vous utilisiez explicitement linstruction throw. Pour Flash Player 9, les proprits et les mthodes ActionScript natives renvoient des erreurs qui vous permettent de grer ces exceptions de faon plus efficace lorsquelles se produisent, puis de ragir individuellement chaque exception. Messages derreur clairs affichs lors du dbogage. Lorsque vous utilisez la version de dbogage de Flash Player, les situations ou le code problmatiques gnrent des messages derreur dtaills qui vous aident identifier les raisons de lchec dun bloc de code particulier. Ceci permet de rparer les erreurs de faon plus efficace. Pour plus dinformations, voir Utilisation de la version de dbogage de Flash Player , la page 280. Les erreurs prcises permettent dafficher des messages derreur clairs pour les utilisateurs lors de lexcution. Dans les versions prcdentes de Flash Player, la mthode FileReference.upload() renvoyait une valeur boolenne de false en cas dchec de lappel upload(), indiquant lune des cinq erreurs possibles. Si une erreur se produit lorsque vous appelez la mthode upload() dans ActionScript 3.0, vous pouvez renvoyer lune des quatre erreurs spcifiques afin dafficher des messages derreur plus prcis pour les utilisateurs finaux. Gestion des erreurs affine. Des erreurs distinctes sont renvoyes pour de nombreuses situations courantes. Par exemple, dans ActionScript 2.0, avant quun objet FileReference soit renseign, la proprit name a la valeur null (par consquent, avant dutiliser ou dafficher la proprit name, vous devez vrifier que la valeur est dfinie et quelle nest pas null). Dans ActionScript 3.0, si vous tentez daccder la proprit name avant quelle soit renseigne, Flash Player renvoie une erreur IllegalOperationError qui vous indique que la valeur na pas t dfinie. Vous pouvez utiliser des blocs try..catch..finally pour grer lerreur. Pour plus dinformations, voir Utilisation dinstructions try..catch..finally , la page 281.

278

Gestion des erreurs

Aucun problme srieux de performance. Lutilisation des blocs try..catch..finally pour grer des erreurs ne ncessite pas de ressources supplmentaires compar aux versions prcdentes dActionScript. Une classe ErrorEvent qui vous permet de crer des couteurs pour des vnements derreurs asynchrones spcifiques. Pour plus dinformations, voir Rponse des vnements derreurs et au statut , la page 288.

Stratgies de gestion des erreurs


Tant que votre application ne rencontre pas de condition problmatique, vous pouvez continuer lexcuter sans crer de logique de gestion des erreurs dans votre code. En revanche, si vous ne grez pas derreurs de faon active et que votre application rencontre un problme, vos utilisateurs ignoreront toujours la raison de son chec. Vous disposez de diffrentes faons pour aborder la gestion des erreurs dans votre application. La liste suivante rsume les trois principales options permettant de grer des erreurs :

Utilisez des instructions try..catch..finally. Elles interceptent les erreurs synchrones lorsquelles se produisent. Vous pouvez imbriquer vos instructions dans une hirarchie pour intercepter des exceptions diffrents niveaux dexcution du code. Pour plus dinformations, voir Utilisation dinstructions try..catch..finally , la page 281. Crez vos objets derreur personnaliss. Vous pouvez utiliser la classe Error pour crer vos objets derreur personnaliss afin de suivre des oprations spcifiques dans votre application qui ne sont pas couvertes par des types derreur intgrs. Vous pouvez ensuite utiliser des instructions try..catch..finally sur vos objets derreur personnaliss. Pour plus dinformations, voir Cration de classes derreur personnalises , la page 286. Ecrivez des gestionnaires et des couteurs dvnements pour rpondre des vnements derreur. Cette stratgie vous permet de crer des gestionnaires derreurs globaux pour grer des vnements identiques sans dupliquer beaucoup de code dans des blocs try..catch..finally. Il est galement plus probable que vous interceptiez des erreurs asynchrones laide de cette approche. Pour plus dinformations, voir Rponse des vnements derreurs et au statut , la page 288.

Gestion des erreurs dans ActionScript 3.0

279

Utilisation de la version de dbogage de Flash Player


Adobe offre une dition spciale de Flash Player aux dveloppeurs pour les aider dans leurs tches de dbogage. Vous obtenez une copie de la version de dbogage de Flash Player lorsque vous installez Adobe Flash CS3 ou Adobe Flex Builder 2. Il existe une grande diffrence dans la faon dont la version de dbogage et la version de Flash Player mise sur le march signalent les erreurs. La version de dbogage indique le type derreur (Error, IOError, ou EOFError gnrique), le numro de lerreur et un message derreur sous une forme lisible par une personne. La version mise sur le march indique uniquement le type derreur et son numro. Par exemple, considrez le code suivant :
try { tf.text = myByteArray.readBoolean(); } catch (error:EOFError) { tf.text = error.toString(); }

Si la mthode readBoolean() a renvoy une erreur EOFError dans la version de dbogage de Flash Player, le message suivant saffiche dans le champ texte tf : EOFError: Error #2030: End of file was encountered. Le mme code dans une version de Flash Player mise sur le march afficherait le texte suivant : EOFError: Error #2030. Il nexiste pas de chanes de message derreur afin de rduire au minimum les ressources et la taille de Flash Player dans la version mise sur le march. Vous pouvez consulter le numro derreur dans la documentation (les annexes de Rfrence du langage et des composants ActionScript 3.0) pour lassocier un message derreur. Vous pouvez galement reproduire lerreur laide de la version de dbogage de Flash Player pour visualiser le message entier.

280

Gestion des erreurs

Gestion des erreurs synchrones dans une application


La gestion des erreurs la plus courante est la logique de gestion des erreurs synchrones, o vous insrez des instructions dans votre code pour intercepter des erreurs synchrones lors de lexcution. Ce type de gestion des erreurs permet votre application de reprer des erreurs dexcution et de les rsoudre lorsque des fonctions chouent. La logique permettant dintercepter une erreur synchrone comprend des instructions try..catch..finally qui tentent une opration au sens littral, interceptent les rponses aux erreurs de Flash Player, et excutent dautres oprations pour grer celle qui a chou.

Utilisation dinstructions try..catch..finally


Lorsque vous grez des erreurs dexcution synchrones, utilisez les instructions try..catch..finally pour intercepter des erreurs. Lorsquune erreur dexcution se produit, Flash Player renvoie une exception, ce qui signifie quil suspend lexcution normale et cre un objet spcial de type Error. Lobjet Error est ensuite renvoy au premier bloc catch disponible. Linstruction try regroupe les instructions pouvant crer des erreurs. Vous utilisez toujours linstruction catch avec une instruction try. Si une erreur est dtecte dans lune des instructions du bloc try, les instructions catch associes cette instruction try sont excutes. Linstruction finally regroupe les instructions excutes, quune erreur se produise ou non dans le bloc try. Sil ny a aucune erreur, les instructions du bloc finally sont excutes une fois que les instructions du bloc try lont t. Sil y a une erreur, linstruction catch approprie est excute en premier lieu, suivi des instructions du bloc finally.
try..catch..finally try { // code qui pourrait renvoyer une erreur } catch (err:Error) { // code ragissant lerreur } finally { // Code excut, quune erreur soit renvoye ou non. Ce code peut // nettoyer aprs lerreur, ou faire en sorte que lexcution // de lapplication continue. }

Le code suivant dmontre la syntaxe permettant dutiliser les instructions :

Gestion des erreurs synchrones dans une application

281

Chaque instruction catch identifie un type dexception spcifique quelle gre. Linstruction catch peut spcifier uniquement des classes derreur qui sont des sous-classes de la classe Error. Chaque instruction catch est vrifie dans lordre. Seule la premire instruction catch qui correspond au type derreur renvoy est excute. En dautres termes, si vous vrifiez dabord la classe Error de niveau suprieur, seule la classe Error de niveau suprieur correspond. Le code suivant illustre ce point :
try { throw new ArgumentError("I am an ArgumentError"); } catch (error:Error) { trace("<Error> " + error.message); } catch (error:ArgumentError) { trace("<ArgumentError> " + error.message); }

Le code prcdent affiche le rsultat suivant :


<Error> I am an ArgumentError

Si vous souhaitez intercepter correctement lerreur ArgumentError, vous devez vrifier que les types derreur les plus spcifiques sont rpertoris en premier, et les types derreur les plus gnriques ensuite, comme lindique le code suivant :
try { throw new ArgumentError("I am an ArgumentError"); } catch (error:ArgumentError) { trace("<ArgumentError> " + error.message); } catch (error:Error) { trace("<Error> " + error.message); }

282

Gestion des erreurs

Plusieurs mthodes et proprits dans lAPI de Flash Player renvoient des erreurs dexcution si elles en rencontrent lors de leur excution. Par exemple, la mthode close() dans la classe Sound renvoie une erreur IOError si la mthode ne parvient pas fermer le flux audio, comme indiqu dans le code suivant :
var mySound:Sound = new Sound(); try { mySound.close(); } catch (error:IOError) { // Error #2029: This URLStream object does not have an open stream. }

Au fur et mesure que vous vous familiariserez avec la Rfrence du langage et des composants ActionScript 3.0, vous identifierez les mthodes qui renvoient des exceptions, comme dtaill dans la description de chaque mthode.

Linstruction throw
Flash Player renvoie des exceptions lorsquil rencontre des erreurs dans votre application lors de lexcution. En outre, vous pouvez renvoyer des exceptions de faon explicite laide de linstruction throw. Lorsque vous le faites, Adobe vous conseille de renvoyer des instances de la classe Error ou de ses sous-classes. Le code suivant dmontre une instruction throw qui renvoie une instance de la classe Error, MyErr, et appelle une fonction, myFunction() en rponse au renvoi de lerreur :
var MyError:Error = new Error("Encountered an error with the numUsers value", 99); var numUsers:uint = 0; try { if (numUsers == 0) { trace("numUsers equals 0"); } } catch (error:uint) { throw MyError; // Interception derreurs dentiers non signs. } catch (error:int) { throw MyError; // Interception derreurs dentiers. }

Gestion des erreurs synchrones dans une application

283

catch (error:Number) { throw MyError; // Interception derreurs de nombres. } catch (error:*) { throw MyError; // Interception dautres erreurs. } finally { myFunction(); // Excution du nettoyage ncessaire ici. }

Les instructions catch sont classes de faon ce que les types de donnes les plus spcifiques apparaissent en premier. Si linstruction catch pour le type de donnes Number est rpertorie en premier, ni linstruction catch pour le type de donnes uint ni linstruction catch pour le type de donnes int nest excute.
REMARQUE 284

Dans le langage de programmation Java, chaque fonction qui peut renvoyer une exception doit dclarer ce fait en rpertoriant les classes dexception quelle peut renvoyer dans une clause throws associe la dclaration de la fonction. ActionScript nexige pas que vous dclariez les exceptions pouvant tre renvoyes par une fonction.

Affichage dun message derreur simple


Lun des avantages majeurs du nouveau modle dvnement derreur et dexception est quil vous permet dinformer les utilisateurs du moment o une action choue et de la raison de cet chec. Votre rle consiste crire le code pour afficher le message et offrir des options en rponse. Le code suivant reprsente une instruction try..catch simple pour afficher lerreur dans un champ texte :
package { import flash.display.Sprite; import flash.text.TextField; public class SimpleError extends Sprite { public var employee:XML = <EmpCode> <costCenter>1234</costCenter> <costCenter>1-234</costCenter> </EmpCode>;

Gestion des erreurs

public function SimpleError() { try { if (employee.costCenter.length() != 1) { throw new Error("Error, employee must have exactly one cost center assigned."); } } catch (error:Error) { var errorMessage:TextField = new TextField(); errorMessage.autoSize = TextFieldAutoSize.LEFT; errorMessage.textColor = 0xFF0000; errorMessage.text = error.message; addChild(errorMessage); } } } }

En utilisant un plus grand nombre de classes derreur et derreurs de compilateur intgres, ActionScript 3.0 fournit de plus amples informations sur les raisons de lchec dune action que les versions prcdentes. Ceci vous permet de crer des applications plus stables avec une meilleure gestion des erreurs.

Renvoi des erreurs


Lorsque vous crez des applications, il peut souvent arriver que vous deviez renvoyer une erreur si vous ne parvenez pas la grer correctement. Par exemple, le code suivant reprsente un bloc try..catch imbriqu, qui renvoie une erreur ApplicationError personnalise si le bloc catch ne parvient pas grer lerreur :
try { try { trace("<< try >>"); throw new ArgumentError("some error which will be rethrown"); } catch (error:ApplicationError) { trace("<< catch >> " + error); trace("<< throw >>"); throw error; }

Gestion des erreurs synchrones dans une application

285

catch (error:Error) { trace("<< Error >> " + error); } } catch (error:ApplicationError) { trace("<< catch >> " + error); }

Le rsultat issu du fragment de code prcdent serait le suivant :


<< << << << try >> catch >> ApplicationError: some error which will be rethrown throw >> catch >> ApplicationError: some error which will be rethrown

Le bloc try imbriqu renvoie une erreur ApplicationError personnalise qui est intercepte par le bloc catch suivant. Ce bloc catch imbriqu peut tenter de grer lerreur, et si la tentative choue, renvoyer lobjet ApplicationError au bloc try..catch.

Cration de classes derreur personnalises


Vous pouvez tendre lune des classes Error standard pour crer vos classes derreur spcialises dans ActionScript. Vous pouvez crer vos classes derreur pour les motifs suivants :

Identifier des erreurs ou des groupes derreurs spcifiques uniques pour votre application. Par exemple, vous pouvez grer diffremment les erreurs renvoyes par votre code, en plus de celles interceptes par Flash Player. Vous pouvez crer une sous-classe de la classe Error pour suivre le nouveau type de donnes derreur dans les blocs try..catch.

Fournir des fonctionnalits daffichage derreurs exceptionnelles pour les erreurs gnres par votre application. Par exemple, vous pouvez crer une mthode toString() qui formate vos messages derreur dune certaine faon. Vous pouvez galement dfinir une mthode lookupErrorString() qui prend un code derreur et rcupre le message adquat en fonction du langage que lutilisateur prfre.

286

Gestion des erreurs

Une classe derreur spcialise doit tendre la classe Error dActionScript de base. Voici un exemple dune classe AppError spcialise qui tend la classe Error :
public class AppError extends Error { public function AppError(message:String, errorID:int) { super(message, errorID); } }

Lexemple suivant illustre lutilisation dune classe AppError dans votre projet :
try { throw new AppError("Encountered Custom AppError", 29); } catch (error:AppError) { trace(error.errorID + ": " + error.message) }
REMARQUE

Si vous souhaitez remplacer la mthode Error.toString() dans votre sous-classe, vous devez lui fournir un paramtre ...(reste). La spcification de langage ECMAScript (ECMA-262), version 3 dfinit la mthode Error.toString() de cette faon, et ActionScript 3.0 la dfinit de la mme manire pour la compatibilit ascendante avec cette spcification. Par consquent, lorsque vous remplacez la mthode Error.toString() vous devez faire correspondre les paramtres exactement. Vous ne pouvez pas transmettre de paramtres votre mthode toString() lors de lexcution car ils sont ignors.

Cration de classes derreur personnalises

287

Rponse des vnements derreurs et au statut


Lune des amliorations majeures apportes la gestion des erreurs dans ActionScript 3.0 est la prise en charge de la gestion des vnements derreur pour rpondre des erreurs dexcution asynchrones. (Voir Types derreurs , la page 275 pour consulter la dfinition des erreurs asynchrones.) Vous pouvez crer des couteurs dvnements et des gestionnaires dvnements pour rpondre aux vnements derreurs. De nombreuses classes distribuent des vnements derreurs de la mme faon que dautres vnements. Par exemple, une instance de la classe XMLSocket distribue normalement trois types dvnements : Event.CLOSE, Event.CONNECT, et DataEvent.DATA. Nanmoins, lorsquun problme a lieu, la classe XMLSocket peut distribuer IOErrorEvent.IOError ou SecurityErrorEvent.SECURITY_ERROR. Pour de plus amples informations sur les couteurs dvnements et les gestionnaires dvnements, voir Chapitre 10, Gestion dvnements , la page 335. Les vnements derreurs peuvent tre classs en deux catgories :

Evnements derreurs qui tendent la classe ErrorEvent La classe flash.events.ErrorEvent contient les proprits et les mthodes permettant de grer les erreurs dexcution de Flash Player lies des oprations de rseau et de communication. Les classes AsyncErrorEvent, IOErrorEvent et SecurityErrorEvent tendent la classe ErrorEvent. Si vous utilisez la version de dbogage de Flash Player, une bote de dialogue vous informe, lors de lexcution, de la prsence dvnements derreurs sans fonctions dcouteur rencontrs par le lecteur.

Evnements derreurs bass sur le statut Les vnements bass sur le statut sont lis aux proprits netStatus et status des classes de communication et de rseau. Si Flash Player rencontre un problme lors de la lecture ou de lcriture des donnes, la valeur des proprits netStatus.info.level ou status.level (selon lobjet de classe que vous utilisez) est dfinie sur la valeur "error". Vous rpondez cette erreur en vrifiant que la proprit level contient la valeur "error" dans votre fonction de gestionnaire dvnements.

288

Gestion des erreurs

Utilisation dvnements derreurs


La classe ErrorEvent et ses sous-classes contiennent des types derreurs pour grer les erreurs distribues par Flash Player lors de la lecture ou de lcriture des donnes. Lexemple suivant utilise une instruction try..catch et des gestionnaires dvnements pour afficher les erreurs dtectes lors de la tentative de lecture dun fichier local. Vous pouvez ajouter un code de gestion plus labor pour permettre lutilisateur de grer lerreur automatiquement aux endroits indiqus par le commentaire entrez votre code ici :
package { import import import import import import import import

flash.display.Sprite; flash.errors.IOError; flash.events.IOErrorEvent; flash.events.TextEvent; flash.media.Sound; flash.media.SoundChannel; flash.net.URLRequest; flash.text.TextField;

public class LinkEventExample extends Sprite { private var myMP3:Sound; public function LinkEventExample() { myMP3 = new Sound(); var list:TextField = new TextField(); list.autoSize = TextFieldAutoSize.LEFT; list.multiline = true; list.htmlText = "<a href=\"event:track1.mp3\">Track 1</a><br>"; list.htmlText += "<a href=\"event:track2.mp3\">Track 2</a><br>"; addEventListener(TextEvent.LINK, linkHandler); addChild(list); } private function playMP3(mp3:String):void { try { myMP3.load(new URLRequest(mp3)); myMP3.play(); } catch (err:Error) { trace(err.message); // entrez votre code ici } myMP3.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); }

Rponse des vnements derreurs et au statut

289

private function linkHandler(linkEvent:TextEvent):void { playMP3(linkEvent.text); // entrez votre code ici } private function errorHandler(errorEvent:IOErrorEvent):void { trace(errorEvent.text); // entrez votre code ici } } }

Utilisation dvnements de changement de statut


Flash Player change dynamiquement la valeur des proprits netStatus.info.level ou status.level pour les classes qui prennent en charge la proprit level. Les classes qui ont la proprit netStatus.info.level sont NetConnection, NetStream et SharedObject. Les classes qui ont la proprit status.level sont HTTPStatusEvent, Camera, Microphone et LocalConnection. Vous pouvez crire une fonction de gestionnaire pour rpondre au changement de valeur level et suivre les erreurs de communication. Lexemple suivant utilise une fonction netStatusHandler() pour tester la valeur de la proprit level. Si la proprit level indique quune erreur a t rencontre, le code suit le message Video stream failed .
package { import import import import import import

flash.display.Sprite; flash.events.NetStatusEvent; flash.events.SecurityErrorEvent; flash.media.Video; flash.net.NetConnection; flash.net.NetStream;

public class VideoExample extends Sprite { private var videoUrl:String = "Video.flv"; private var connection:NetConnection; private var stream:NetStream;

290

Gestion des erreurs

public function VideoExample() { connection = new NetConnection(); connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); connection.connect(null); } private function netStatusHandler(event:NetStatusEvent):void { if (event.info.level = "error") { trace("Video stream failed") } else { connectStream(); } } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function connectStream():void { var stream:NetStream = new NetStream(connection); var video:Video = new Video(); video.attachNetStream(stream); stream.play(videoUrl); addChild(video); } } }

Rponse des vnements derreurs et au statut

291

Comparaison des classes Error


ActionScript fournit de nombreuses classes Error prdfinies. Flash Player utilise un grand nombre de ces classes mais vous pouvez galement utiliser les mmes classes Error dans votre code. Il existe deux principaux types de classes Error dans ActionScript 3.0 : les classes Error de base dActionScript et les classes Error du package flash.error. Les classes Error de base sont dfinies par la spcification de langage ECMAScript (ECMA-262), version 4. Le package flash.error contient des classes supplmentaires permettant le dbogage et le dveloppement de lapplication ActionScript 3.0.

Classes Error de base ECMAScript


Les classes Error de base ECMAScript comprennent les classes Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError et URIError. Chacune de ces classes se trouve dans lespace de nom de niveau suprieur.
Nom de classe
Error

Description
Vous pouvez utiliser la classe Error pour renvoyer des exceptions. Il sagit de la classe de base pour les autres classes dexception dfinies dans ECMAScript : EvalError, RangeError, ReferenceError, SyntaxError, TypeError et URIError. Une exception EvalError est renvoye si des paramtres sont transmis au constructeur de la classe Function ou si le code utilisateur appelle la fonction eval().

Remarques
La classe Error sert de classe de base pour toutes les erreurs dexcution renvoyes par Flash Player. Elle est recommande pour toutes les classes derreur personnalises.

EvalError

Dans ActionScript 3.0, la prise en charge de la fonction eval() a t supprime et les tentatives dutilisation de la fonction provoquent le renvoi dune erreur. Les versions prcdentes de Flash Player utilisaient la fonction eval() pour accder des variables, des proprits, des objets ou des clips par nom.

292

Gestion des erreurs

Nom de classe
RangeError

Description

Remarques

Une exception RangeError est Par exemple, une exception RangeError renvoye si une valeur numrique est renvoye par la classe Timer si un excde la plage acceptable. retard est ngatif ou non fini. Elle peut galement tre renvoye si vous tentez dajouter un objet daffichage une profondeur non valide. Les exceptions pour des variables non dfinies pointent vers des bogues ventuels afin damliorer la qualit du logiciel. Cependant, si vous navez pas lhabitude dinitialiser vos variables, ce nouveau comportement dActionScript risque dexiger des changements dans vos habitudes de codage.

ReferenceError Une exception ReferenceError est renvoye lorsque vous tentez dutiliser une rfrence une proprit non dfinie pour un objet scell (non dynamique). Les versions du compilateur ActionScript antrieures ActionScript 3.0 ne renvoyaient pas derreur lorsque vous tentiez daccder une proprit undefined. Nanmoins, tant donn que la nouvelle spcification ECMAScript indique quune erreur doit tre renvoye dans cette condition, ActionScript 3.0 renvoie lexception ReferenceError. SyntaxError Une exception SyntaxError est renvoye lorsquil se produit une erreur danalyse dans votre code ActionScript. Pour plus dinformations, voir Section 15.11.6.4 du langage de spcification ECMAScript (ECMA-262), version 3 (disponible jusqu la version 4) sur le site www.ecmainternational.org/publications/ standards/Ecma-262.htm ainsi que la Section 10.3.1 de la spcification ECMAScript pour XML (E4X) (ECMA-357, version 2) sur le site www.ecmainternational.org/publications/ standards/Ecma-357.htm.

Une exception SyntaxError peut tre renvoye dans les cas suivants : ActionScript renvoie des exceptions SyntaxError lorsquune expression rgulire non valide est analyse par la classe RegExp. ActionScript renvoie des exceptions SyntaxError lorsquun fichier XML non valide est analys par la classe XMLDocument.

Comparaison des classes Error

293

Nom de classe
TypeError

Description
Lexception TypeError est renvoye lorsque le type rel dun oprande ne correspond pas au type prvu. Pour plus dinformations, voir Section 15.11.6.5 de la spcification ECMAScript sur le site www.ecmainternational.org/publications/ standards/Ecma-262.htm ainsi que la Section 10.3 de la spcification E4X sur le site www.ecma-international.org/ publications/standards/Ecma357.htm.

Remarques
Une exception TypeError peut tre renvoye dans les cas suivants : Un paramtre rel de fonction ou de mthode ne peut pas tre forc correspondre au type de paramtre formel. Une valeur est affecte une variable et ne peut pas tre force correspondre au type de la variable. Le ct droit de loprateur is ou instanceof nest pas un type valide. Lutilisation du mot cl super nest pas valide. Une recherche de proprit donne lieu plusieurs liaisons, soit un rsultat ambigu. Une mthode est appele pour un objet incompatible. Par exemple, une exception TypeError est renvoye si une mthode dans la classe RegExp est greffe sur un objet gnrique, puis appele. Une exception URIError peut tre renvoye dans les cas suivants : Un URI non valide est dfini par une fonction API de Flash qui sattend un URI valide, comme Socket.connect().

URIError

Lexception URIError est renvoye lorsque lune des fonctions de gestion URI globales est utilise dune manire qui nest pas compatible avec sa dfinition. Pour plus dinformations, voir Section 15.11.6.6 de la spcification ECMAScript sur le site www.ecmainternational.org/publications/ standards/Ecma-262.htm.

294

Gestion des erreurs

Classes Error de base dActionScript


Outre les classes Error ECMAScript de base, ActionScript ajoute plusieurs classes pour des conditions derreurs propres ActionScript et la fonctionnalit de gestion des erreurs. Etant donn que ces classes sont des extensions de langage ActionScript de la spcification de langage ECMAScript, version 4 qui pourraient tre intressantes pour la spcification prliminaire, elles sont conserves au niveau suprieur au lieu dtre places dans un package comme flash.error.
Nom de classe
ArgumentError

Description
La classe ArgumentError reprsente une erreur qui se produit lorsque les valeurs de paramtre fournies lors dun appel de fonction ne correspondent pas aux paramtres dfinis pour celle-ci.

Remarques
Voici des exemples derreurs dargument : Trop ou trop peu darguments sont fournis une mthode. Un argument devait tre membre dune numration, et cela na pas t le cas.

SecurityError

Lexception SecurityError est Voici des exemples derreurs de renvoye lorsquune violation de scurit : scurit se produit et que laccs Un accs une proprit ou un appel de mthode non autoris est refus. est effectu en franchissant les limites du sandbox de scurit. Il sest produit une tentative daccs une URL non autorise par le sandbox de scurit. Il sest produit une tentative de connexion socket un numro de port non autoris (port infrieur 1024, par exemple) sans fichier de rgulation dfini. Il sest produit une tentative daccs lappareil photo ou au microphone de lutilisateur et celui-ci a refus la demande daccs au priphrique. Une erreur VerifyError est renvoye lorsquun fichier SWF incorrect ou altr est dtect. Lorsquun fichier SWF charge un autre fichier SWF, le SWF parent peut intercepter une exception VerifyError gnre par le SWF charg.

VerifyError

Comparaison des classes Error

295

Classes Error du package flash.error


Le package flash.error regroupe des classes Error qui font partie de lAPI de Flash Player. A la diffrence des classes Error dcrites prcdemment, le package flash.error communique des vnements derreurs propres Flash Player.
Nom de classe
EOFError

Description
Une exception EOFError est renvoye lors dune tentative de lecture au-del de la fin des donnes disponibles.

Remarques
Par exemple, une exception EOFError est renvoye lorsque lune des mthodes de lecture dans linterface IDataInput est appele et quil nexiste pas assez de donnes pour satisfaire la requte de lecture. Voici quelques exemples dexceptions derreurs non valides : Une classe de base, telle que DisplayObjectContainer, propose plus de fonctionnalits quune scne peut prendre en charge. Par exemple, si vous tentez dobtenir ou de dfinir un masque sur la scne ( laide de stage.mask), Flash Player renvoie une exception IllegalOperationError accompagne du message The Stage class does not implement this property or method . Une sous-classe hrite dune mthode dont elle na pas besoin et quelle ne souhaite pas prendre en charge. Certaines mthodes daccessibilit sont appeles lorsque Flash Player est compil sans les fonctions daccessibilit. Les fonctions lies la programmation uniquement sont appeles partir dune version dexcution de Flash Player. Vous tentez de dfinir le nom dun objet plac sur le scnario.

IllegalOperationError Une exception IllegalOperationError est renvoye lorsquune mthode nest pas mise en oeuvre ou si la mise en oeuvre ne couvre pas lutilisation actuelle.

296

Gestion des erreurs

Nom de classe
IOError

Description
Une exception IOError est renvoye lorsquun type dexception E/S se produit.

Remarques
Vous obtenez cette erreur, par exemple, lorsque vous tentez une opration de lecture-criture sur un socket qui nest pas connect ou qui est dconnect.

MemoryError

Une exception MemoryError est Par dfaut, ActionScript Virtual renvoye lors de lchec dune Machine 2 nimpose pas de limite requte dallocation de mmoire. la quantit de mmoire quun programme ActionScript peut allouer. Sur un PC de bureau, les checs dallocation de mmoire ne sont pas frquents. Une erreur est renvoye lorsque le systme ne parvient pas allouer la mmoire requise pour une opration. Par consquent, sur un PC de bureau, cette exception est rare, moins quune requte dallocation soit vraiment importante (par exemple, une requte de 3 milliards doctets est impossible car un programme Microsoft Windows de 32 bits peut accder 2 Go despace dadressage uniquement). Une exception ScriptTimeoutError est renvoye lorsquun intervalle de dlai dexpiration du script de 15 secondes est atteint. En interceptant une exception ScriptTimeoutError, vous pouvez grer le dlai dexpiration du script plus en douceur. Sil nexiste aucun gestionnaire dexceptions, le gestionnaire de lexception non intercepte affiche une bote de dialogue accompagne dun message derreur. Pour viter quun dveloppeur intercepte lexception et reste dans une boucle sans fin, seule la premire exception ScriptTimeoutError renvoye au cours dun script donn peut tre intercepte. Votre code ne peut pas intercepter une exception ScriptTimeoutError ultrieure. Elle passe immdiatement au gestionnaire de lexception non intercepte.

ScriptTimeoutError

StackOverflowError Lexception StackOverflowError Une exception StackOverflowError est renvoye lorsque la pile peut indiquer quun problme de disponible pour le script a t rcursivit linfini sest produit. puise.

Comparaison des classes Error

297

Exemple : Application CustomErrors


Lapplication CustomErrors dcrit les techniques dutilisation des erreurs personnalises lors de la cration dune application. Ces techniques sont les suivantes :

Validation dun paquet XML Ecriture dune erreur personnalise Renvoi derreurs personnalises Notification des utilisateurs lors du renvoi dune erreur

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers dapplication CustomErrors se trouvent dans le dossier Samples/CustomError. Cette application se compose des fichiers suivants :
Fichier
CustomErrors.mxml ou CustomErrors.fla com/example/programmingas3/errors/ ApplicationError.as com/example/programmingas3/errors/ FatalError.as

Description
Le fichier dapplication principal dans Flash (FLA) ou Flex (MXML) Une classe servant de classe derreur de base pour les classes FatalError et WarningError. Une classe qui dfinit une erreur FatalError qui peut tre renvoye par lapplication. Cette classe tend la classe ApplicationError personnalise. Une classe qui dfinit une seule mthode qui valide un paquet XML employee fourni par lutilisateur. Une classe qui dfinit une erreur WarningError qui peut tre renvoye par lapplication. Cette classe tend la classe ApplicationError personnalise.

com/example/programmingas3/errors/ Validator.as com/example/programmingas3/errors/ WarningError.as

298

Gestion des erreurs

Prsentation de lapplication CustomErrors


Le fichier CustomErrors.mxml contient linterface utilisateur et une logique pour lapplication derreur personnalise. Une fois que lvnement creationComplete de lapplication est distribu, la mthode initApp() est appele. Cette mthode dfinit un exemple de paquet XML que la classe Validator vrifiera. Le code suivant prsente la mthode initApp() :
private function initApp():void { employeeXML = <employee id="12345"> <firstName>John</firstName> <lastName>Doe</lastName> <costCenter>12345</costCenter> <costCenter>67890</costCenter> </employee>; }

Le paquet XML est ensuite affich dans une occurrence de composant TextArea sur la scne. Ceci vous permet de modifier le paquet XML avant de tenter de le revalider. Lorsque lutilisateur clique sur le bouton de validation, la mthode validateData() est appele. Cette mthode valide le paquet XML employee laide de la mthode validateEmployeeXML() dans la classe Validator. Le code suivant prsente la mthode validateData() :
public function validateData():void { try { var tempXML:XML = XML(xmlText.text); Validator.validateEmployeeXML(tempXML); status.text = "The XML was successfully validated."; } catch (error:FatalError) { showFatalError(error); } catch (error:WarningError) { showWarningError(error); } catch (error:Error) { showGenericError(error); } }

Exemple : Application CustomErrors

299

Un objet XML temporaire est dabord cr laide du contenu de loccurrence de composant TextArea xmlText. Ensuite, la mthode validateEmployeeXML() dans la classe Validator personnalise (com.example.programmingas3/errors/Validator.as) est appele et transmet lobjet XML temporaire comme paramtre. Si le paquet XML est valide, loccurrence de composant Label status affiche un message de russite et lapplication se ferme. Si la mthode validateEmployeeXML() a renvoy une erreur personnalise (cest--dire quune erreur FatalError, WarningError ou une erreur gnrique sest produite), linstruction catch approprie est excute et appelle les mthodes showFatalError(), showWarningError() ou showGenericError(). Chacune de ces mthodes affiche un message appropri dans une composant Alert afin dinformer lutilisateur de lerreur spcifique qui sest produite. Chaque mthode met galement jour loccurrence de composant Label status avec un message spcifique. Si une erreur grave se produit pendant une tentative de validation du paquet XML employee, le message derreur saffiche dans un composant Alert, et loccurrence de composant TextArea xmlText et loccurrence de composant Button validateBtn sont dsactives, comme lindique le code suivant :
public function showFatalError(error:FatalError):void { var message:String = error.message + "\n\n" + "Click OK to end."; var title:String = error.getTitle(); Alert.show(message, title); status.text = "This application has ended."; this.xmlText.enabled = false; this.validateBtn.enabled = false; }

Si une erreur davertissement au lieu dune erreur grave se produit, le message derreur est dsactiv dans une occurrence de composant Alert, mais les occurrences de composant TextField et Button ne sont pas dsactives. La mthode showWarningError() affiche le message derreur personnalise dans loccurrence de composant Alert. Le message invite galement lutilisateur indiquer sil souhaite poursuivre la validation du XML ou abandonner le script. Le fragment de code suivant prsente la mthode showWarningError() :
public function showWarningError(error:WarningError):void { var message:String = error.message + "\n\n" + "Do you want to exit this application?"; var title:String = error.getTitle(); Alert.show(message, title, Alert.YES | Alert.NO, null, closeHandler); status.text = message; }

300

Gestion des erreurs

Lorsque lutilisateur ferme loccurrence de composant Alert au moyen du bouton Oui ou Non, la mthode closeHandler() est appele. Le fragment de code suivant prsente la mthode closeHandler() :
private function closeHandler(event:CloseEvent):void { switch (event.detail) { case Alert.YES: showFatalError(new FatalError(9999)); break; case Alert.NO: break; } }

Si lutilisateur souhaite abandonner le script en cliquant sur Oui dans la bote de dialogue Alert derreur davertissement, une exception FatalError est renvoye, provoquant larrt de lapplication.

Cration dune validation personnalise


La classe de validation personnalise contient une seule mthode, validateEmployeeXML(). La mthode validateEmployeeXML() prend un seul argument, employee, qui correspond au paquet XML que vous souhaitez valider. La mthode validateEmployeeXML() est la suivante :
public static function validateEmployeeXML(employee:XML):void { // checks for the integrity of items in the XML if (employee.costCenter.length() < 1) { throw new FatalError(9000); } if (employee.costCenter.length() > 1) { throw new WarningError(9001); } if (employee.ssn.length() != 1) { throw new FatalError(9002); } }

Exemple : Application CustomErrors

301

Un employ doit appartenir un (et un seul) centre de cot pour tre valid. Sil nappartient aucun centre de cot, la mthode renvoie une FatalError, qui se propage jusqu la mthode validateData() dans le fichier dapplication principale. Si lemploy appartient plusieurs centres de cot, une WarningError est renvoye. La dernire vrification dans la validation XML contrle que lutilisateur a exactement un numro de scurit sociale dfini (le noeud ssn dans le paquet XML). Sil ny a pas exactement un nud ssn, une erreur FatalError est renvoye. Vous pouvez ajouter des vrifications supplmentaires la mthode validateEmployeeXML(). Par exemple, pour vrifier que le noeud ssn contient un numro valide, ou que lemploy a au moins un numro de tlphone et une adresse lectronique dfinis, et que ces deux valeurs sont valides. Vous pouvez galement modifier le XML de faon ce que chaque employ ait un ID unique et spcifie lID de son responsable.

Dfinition de la classe ApplicationError


La classe ApplicationError sert de classe de base pour les classes FatalError et WarningError. Elle tend la classe Error et dfinit ses propres proprits et mthodes personnalises, y compris un ID derreur, la gravit et un objet XML contenant les codes derreur personnaliss et les messages. Cette classe dfinit galement deux constantes statiques utilises pour dfinir la gravit de chaque type derreur. La mthode du constructeur de la classe ApplicationError est la suivante :
public function ApplicationError() { messages = <errors> <error code="9000"> <![CDATA[Employee must be assigned to a cost center.]]> </error> <error code="9001"> <![CDATA[Employee must be assigned to only one cost center.]]> </error> <error code="9002"> <![CDATA[Employee must have one and only one SSN.]]> </error> <error code="9999"> <![CDATA[The application has been stopped.]]> </error> </errors>; }

302

Gestion des erreurs

Chaque noeud derreur dans lobjet XML contient un code numrique unique et un message derreur. Vous pouvez consulter facilement les messages derreur par code derreur laide dE4X, comme indiqu dans la mthode getMessageText() suivante :
public function getMessageText(id:int):String { var message:XMLList = messages.error.(@code == id); return message[0].text(); }

La mthode getMessageText() prend un seul argument entier, id, et renvoie une chane. Largument id est le code derreur pour lerreur rechercher. Par exemple, lorsque vous transmettez un id de 9001, lerreur indiquant que les employs doivent tre affects un seul centre de cot est renvoye. Si plusieurs erreurs ont le mme code, ActionScript renvoie le message derreur uniquement pour le premier rsultat trouv (message[0] dans lobjet XMLList renvoy). La mthode suivante dans cette classe, getTitle(), ne prend aucun paramtre et renvoie une valeur de chane qui contient lID derreur pour cette erreur spcifique. Cette valeur est utilise dans le titre du composant Alert pour identifier lerreur exacte stant produite lors de la validation du paquet XML. Le fragment de code suivant prsente la mthode getTitle() :
public function getTitle():String { return "Error #" + id; }

La mthode finale dans la classe ApplicationError est toString(). Cette mthode remplace la fonction dfinie dans la classe Error pour que vous puissiez personnaliser la prsentation du message derreur. La mthode renvoie une chane qui identifie le numro derreur spcifique et le message qui sest affich.
public override function toString():String { return "[APPLICATION ERROR #" + id + "] " + message; }

Exemple : Application CustomErrors

303

Dfinition de la classe FatalError


La classe FatalError tend la classe ApplicationError personnalise et dfinit trois mthodes : le constructeur FatalError, getTitle(), et toString(). La premire mthode, le constructeur FatalError, prend un seul argument entier, errorID, et dfinit la gravit de lerreur laide des valeurs de constante statiques dfinies dans la classe ApplicationError. Elle obtient le message de lerreur spcifique en appelant la mthode getMessageText() dans la classe ApplicationError. Le constructeur FatalError se prsente comme suit :
public function FatalError(errorID:int) { id = errorID; severity = ApplicationError.FATAL; message = getMessageText(errorID); }

La mthode suivante dans la classe FatalError, getTitle(), remplace la mthode getTitle() dfinie prcdemment dans la classe ApplicationError et ajoute le texte -- FATAL dans le titre pour informer lutilisateur quune erreur grave sest produite. La mthode getTitle() se prsente comme suit :
public override function getTitle():String { return "Error #" + id + " -- FATAL"; }

La mthode finale dans cette classe, toString(), remplace la mthode toString() dfinie dans la classe ApplicationError. La mthode toString() est
public override function toString():String { return "[FATAL ERROR #" + id + "] " + message; }

Dfinition de la classe WarningError


La classe WarningError tend la classe ApplicationError et est presque identique la classe FatalError, except quelques changements de chane mineurs. Elle dfinit la gravit de lerreur sur ApplicationError.WARNING au lieu de ApplicationError.FATAL, comme indiqu dans le code suivant :
public function WarningError(errorID:int) { id = errorID; severity = ApplicationError.WARNING; message = super.getMessageText(errorID); }

304

Gestion des erreurs

CHAPITRE 9

Utilisation dexpressions rgulires


Une expression rgulire dcrit un modle servant rechercher et manipuler du texte de correspondance dans des chanes. Les expressions rgulires ressemblent des chanes, mais elles comprennent des codes spciaux pour dcrire des modles et des rptitions. Par exemple, lexpression rgulire suivante correspond une chane qui commence par le caractre A suivi dun ou de plusieurs chiffres squentiels :
/A\d+/

Ce chapitre dcrit la syntaxe de base permettant de construire des expressions rgulires. Nanmoins, les expressions rgulires peuvent tre trs complexes et comporter de nombreuses nuances. Vous pouvez vous documenter sur les expressions rgulires sur le Web et dans les librairies. Diffrents environnements de programmation mettent en oeuvre des expressions rgulires de diffrentes faons. ActionScript 3.0 met en oeuvre des expressions rgulires comme dfini dans la version 3 de la spcification de langage ECMAScript (ECMA-262).

Contenu
Principes de base des expressions rgulires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 Syntaxe dexpression rgulire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 Mthodes dutilisation dexpressions rgulires avec des chanes . . . . . . . . . . . . . 327 Exemple : Un analyseur Wiki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328

305

Principes de base des expressions rgulires


Introduction lutilisation dexpressions rgulires
Une expression rgulire dcrit un modle de caractres. Les expressions rgulires servent gnralement vrifier quune valeur de texte est conforme un modle particulier (par exemple, vrifier quun numro de tlphone saisi par lutilisateur comporte le nombre de chiffres correct) ou remplacer des portions dune valeur de texte qui correspondent un modle donn. Les expressions rgulires peuvent tre simples. Par exemple, supposons que vous souhaitiez confirmer quune chane particulire corresponde ABC ou que vous souhaitiez remplacer chaque occurrence d ABC dans une chane par un autre texte. Dans ce cas, vous pouvez utiliser lexpression rgulire suivante qui dfinit le modle comportant les lettres A, B et C, dans lordre :
/ABC/

Le littral de lexpression rgulire est dlimit avec la barre oblique (/). Les modles dexpression rgulire peuvent galement tre complexes, et peuvent parfois sembler obscures, comme lexpression suivante pour tablir une correspondance avec une adresse lectronique valide :
/([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}/

Vous utiliserez le plus souvent des expressions rgulires pour rechercher des modles dans des chanes et pour remplacer des caractres. Dans ces cas, vous crerez un objet dexpression rgulire et lutiliserez comme paramtre pour une ou plusieurs mthodes de classe String. Les mthodes suivantes de la classe String prennent des expressions rgulires comme paramtres : match(), replace(), search(), et split(). Pour plus dinformations sur ces mthodes, voir Recherche de modles dans des chanes et remplacement de sous-chanes , la page 227. La classe RegExp comprend les mthodes suivantes : test() et exec(). Pour plus dinformations, voir Mthodes dutilisation dexpressions rgulires avec des chanes , la page 327.

306

Utilisation dexpressions rgulires

Tches dexpression rgulire courantes


Les diffrentes utilisations courantes dexpressions rgulires sont dcrites en dtail dans ce chapitre :

Cration dun modle dexpression rgulire Utilisation de caractres spciaux dans des modles Identification de squences de plusieurs caractres ( un nombre deux chiffres ou entre sept et dix lettres , par exemple) Identification dun caractre dans une srie de lettres ou de nombres ( toute lettre de a m ) Identification dun caractre dans un jeu de caractres possibles Identification de sous-squences (segments dans un modle) Mise en correspondance et substitution de texte selon des modles

Concepts et termes importants


La liste de rfrence suivante contient les termes importants utiliss dans ce chapitre :

Caractre dchappement : un caractre indiquant que le caractre qui suit doit tre trait comme un caractre de remplacement plutt que comme un caractre littral. Dans une syntaxe dexpression rgulire, la barre oblique inverse (\) est le caractre dchappement. Par consquent, une barre oblique inverse suivie dun autre caractre est un code spcial plutt que simplement le caractre lui-mme. Indicateur : un caractre qui spcifie une option concernant la faon dont le modle dexpression rgulire doit tre utilis (sil faut respecter la casse, par exemple). Caractre de remplacement : un caractre qui a une signification spciale dans un modle dexpression rgulire et qui ne reprsente pas littralement ce caractre dans le modle. Quantificateur : un caractre (ou plusieurs caractres) indiquant combien de fois une partie du modle doit se rpter. Par exemple, un quantificateur peut tre utilis pour indiquer quun code postal amricain doit contenir cinq ou neuf chiffres. Expressions rgulires : une instruction de programme dfinissant un modle de caractres pouvant tre utilis pour confirmer si dautres chanes correspondent ce modle ou pour remplacer des portions dune chane.

Principes de base des expressions rgulires

307

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Etant donn que les codes de ce chapitre sont constitus principalement de modles dexpressions rgulires, le test des exemples implique que vous suiviez les tapes suivantes :
1. 2. 3.

Crez un nouveau document Flash. Slectionnez une image-cl et ouvrez le panneau Actions. Crez une variable RegExp (expression rgulire) comme la suivante :
var pattern:RegExp = /ABC/;

4.

Copiez le modle de lexemple et affectez-le comme valeur de votre variable RegExp. Par exemple, dans la ligne de code prcdente, le modle fait partie du code situ droite du signe dgalit, point-virgule exclu (/ABC/). Crez une ou plusieurs variables contenant des chanes appropries au test de votre expression rgulire. Par exemple, si vous crez une expression rgulire pour tester des adresses lectroniques valides, crez quelques variables String contenant des adresses lectroniques valides et non valides :
var goodEmail:String = "bob@example.com"; var badEmail:String = "5@$2.99";

5.

6.

Ajoutez des lignes de code pour tester les variables String afin de dterminer si elles correspondent au modle dexpression rgulire. Celles-ci seront les valeurs que vous afficherez lcran laide de la fonction trace() ou en les crivant dans un champ texte sur la scne.
trace(goodEmail, " is valid:", pattern.test(goodEmail)); trace(badEmail, " is valid:", pattern.test(badEmail));

Par exemple, supposons que pattern dfinisse le modle dexpression rgulire pour une adresse lectronique valide. Les lignes de code prcdentes crivent ce texte dans le panneau Sortie :
bob@example.com is valid: true 5@$2.99 is valid: false

Pour plus dinformations sur le test des valeurs en les crivant dans une instance de champ texte sur la scne ou en utilisant la fonction trace() pour imprimer les valeurs dans le panneau Sortie, voir Test des exemples de code contenus dans un chapitre , la page 67.

308

Utilisation dexpressions rgulires

Syntaxe dexpression rgulire


Cette section dcrit tous les lments de la syntaxe dexpression rgulire dActionScript. Comme vous pourrez le constater, les expressions rgulires peuvent tre trs complexes et comporter de nombreuses nuances. Vous pouvez vous documenter sur les expressions rgulires sur le Web et dans les librairies. Diffrents environnements de programmation mettent en oeuvre des expressions rgulires de diffrentes faons. ActionScript 3.0 met en uvre des expressions rgulires comme dfini dans la version 3 de la spcification de langage ECMAScript (ECMA-262). Gnralement, vous utilisez des expressions rgulires qui correspondent des modles plus compliqus quune simple chane de caractres. Par exemple, lexpression rgulire suivante dfinit le modle comportant les lettres A, B et C, dans lordre, suivies par un chiffre :
/ABC\d/

Le code \d reprsente un chiffre . La barre oblique inverse (\) est appele caractre dchappement. Lorsquelle est combine au caractre qui la suit (dans ce cas, la lettre d), elle a une signification spciale dans lexpression rgulire. Ce chapitre dcrit ces squences de caractres dchappement et dautres fonctions de syntaxe dexpression rgulire. Lexpression rgulire suivante dfinit le modle des lettres ABC suivies par des chiffres (remarquez lastrisque) :
/ABC\d*/

Lastrisque (*) est un caractre de remplacement. Un caractre de remplacement est un caractre ayant une signification spciale dans les expressions rgulires. Lastrisque est un type de caractre de remplacement spcifique appel quantificateur, utilis pour quantifier le nombre de rptitions dun caractre ou groupe de caractres. Pour plus dinformations, voir Quantificateurs , la page 316. Outre son modle, une expression rgulire peut contenir des indicateurs qui spcifient comment lexpression rgulire doit tre mise en correspondance. Par exemple, lexpression rgulire suivante utilise lindicateur i qui spcifie quelle ignore le respect de la casse dans les chanes de correspondance :
/ABC\d*/i

Pour plus dinformations, voir Indicateurs et proprits , la page 322. Vous pouvez utiliser des expressions rgulires laide des mthodes suivantes de la classe String : match(), replace(), et search(). Pour plus dinformations sur ces mthodes, voir Recherche de modles dans des chanes et remplacement de sous-chanes , la page 227.

Syntaxe dexpression rgulire

309

Cration dune instance dune expression rgulire


Il existe deux faons de crer une instance dexpression rgulire. Lune des mthodes consiste utiliser des barres obliques (/) pour dlimiter lexpression rgulire, et lautre consiste utiliser le constructeur new. Par exemple, les expressions rgulires suivantes sont quivalentes :
var pattern1:RegExp = /bob/i; var pattern2:RegExp = new RegExp("bob", "i");

Des barres obliques dlimitent un littral dexpression rgulire de la mme faon que des guillemets dlimitent un littral de chane. La partie de lexpression rgulire contenue entre les barres obliques dfinit le modle. Lexpression rgulire peut galement inclure des indicateurs aprs la barre de dlimitation finale. Ces indicateurs sont considrs comme faisant partie de lexpression rgulire, mais ils sont spars de son modle. Lorsque vous utilisez le constructeur new, vous utilisez deux chanes pour dfinir lexpression rgulire. La premire chane dfinit le modle, et la seconde les indicateurs, comme dans lexemple suivant :
var pattern2:RegExp = new RegExp("bob", "i");

Lorsque vous incluez une barre oblique dans une expression rgulire qui est dfinie laide de dlimiteurs de barre oblique, vous devez faire prcder la barre oblique du caractre dchappement (\). Par exemple, lexpression rgulire suivante correspond au modle 1/2 :
var pattern:RegExp = /1\/2/;

Pour inclure des guillemets dans une expression rgulire dfinie avec le constructeur new, vous devez ajouter un caractre dchappement (\) avant les guillemets (comme lorsque vous dfinissez un littral String). Par exemple, les expressions rgulires suivantes correspondent au modle eat at "joes" :
var pattern1:RegExp = new RegExp("eat at \"joe's\"", ""); var pattern2:RegExp = new RegExp('eat at "joe\'s"', "");

Nutilisez pas le caractre dchappement avec des guillemets dans des expressions rgulires dfinies laide des dlimiteurs de barre oblique. De mme, nutilisez pas le caractre dchappement avec des barres obliques dans des expressions rgulires dfinies avec le constructeur new. Les expressions rgulires suivantes sont quivalentes. Elles dfinissent le modle 1/2 "joes":
var pattern1:RegExp = /1\/2 "joe's"/; var pattern2:RegExp = new RegExp("1/2 \"joe's\"", ""); var pattern3:RegExp = new RegExp('1/2 "joe\'s"', '');

310

Utilisation dexpressions rgulires

De mme, dans une expression rgulire dfinie laide du constructeur new, tapez deux fois le caractre barre oblique inverse pour utiliser une mtasquence dbutant par le caractre barre oblique inverse(\), telle que \d (qui correspond nimporte quel chiffre).
var pattern:RegExp = new RegExp("\\d+", ""); // correspondance avec un // ou plusieurs chiffres

Vous devez taper deux fois le caractre barre oblique inverse, car le premier paramtre de la mthode constructeur RegExp() est une chane. Dans un littral de chane, ce caractre doit tre entr deux fois pour tre interprt comme une barre oblique inverse unique. La section qui suit dcrit la syntaxe servant dfinir des modles dexpression rgulire. Pour plus dinformations sur les indicateurs, voir Indicateurs et proprits , la page 322.

Caractres, caractres de remplacement et mtasquences


Lexpression rgulire la plus simple est celle qui correspond une squence de caractres, comme dans lexemple suivant :
var pattern:RegExp = /hello/;

Nanmoins, les caractres suivants, appels caractres de remplacement, ont des significations spciales dans des expressions rgulires :
^ $ \ . * + ? ( ) [ ] { } |

Par exemple, lexpression rgulire suivante correspond la lettre A suivie par zro ou plusieurs instances de la lettre B (le caractre de remplacement astrisque indique cette rptition), suivie par la lettre C :
/AB*C/

Pour inclure un caractre de remplacement sans sa signification spciale dans un modle dexpression rgulire, vous devez utiliser le caractre dchappement (\). Par exemple, lexpression rgulire suivante correspond la lettre A suivie par la lettre B, suivie par un astrisque, suivie par la lettre C :
var pattern:RegExp = /AB\*C/;

Une mtasquence, comme un caractre de remplacement, a une signification spciale dans une expression rgulire. Une mtasquence est constitue de plusieurs caractres. Les sections suivantes fournissent des dtails sur lutilisation des caractres de remplacement et des mtasquences.

Syntaxe dexpression rgulire

311

A propos des caractres de remplacement


Le tableau suivant rpertorie les caractres de remplacement que vous pouvez utiliser dans des expressions rgulires :
Caractre de remplacement
^ (caret)

Description
Etablit une correspondance au dbut dune chane. Lorsque lindicateur
m (multiline) est dfini, le caret correspond au dbut dune ligne

galement (voir Lindicateur m (multiline) , la page 324). Lorsquil est utilis au dbut dune classe de caractre, le caret indique la ngation et non le dbut dune chane. Pour plus dinformations, voir Classes de caractre , la page 314. $ (signe dollar) Etablit une correspondance la fin dune chane. Lorsque lindicateur m (multiline) est dfini, $ correspond la position avant une nouvelle ligne (\n) galement. Pour plus dinformations, voir Lindicateur m (multiline) , la page 324. Echappe la signification spciale du caractre de remplacement des caractres spciaux. Vous pouvez galement utiliser le caractre dchappement si vous souhaitez utiliser une barre oblique dans un littral dexpression rgulire, comme dans /1\/2/ (pour correspondre au caractre 1, suivi par la barre oblique, suivi par le caractre 2). Correspond un seul caractre. Un point correspond un caractre de nouvelle ligne (\n) uniquement si lindicateur s (dotall) est dfini. Pour plus dinformations, voir Lindicateur s (dotall) , la page 325. Correspond llment prcdent rpt zro ou plusieurs fois. Pour plus dinformations, voir Quantificateurs , la page 316. Correspond llment prcdent rpt une ou plusieurs fois. Pour plus dinformations, voir Quantificateurs , la page 316. Correspond llment prcdent rpt zro ou une fois. Pour plus dinformations, voir Quantificateurs , la page 316. Dfinit des groupes dans lexpression rgulire. Utilisez des groupes pour : confiner le domaine de laltrateur | : /(a|b|c)d/ dfinir le domaine dun quantificateur : /(walla.){1,2}/ dans des backreferences. Par exemple, le \1 dans lexpression rgulire suivante correspond toute correspondance au premier groupe entre parenthses du modle :
/(\w*) est rpt : \1/

\ (caractre dchappement)

. (point)

* (toile) + (plus) ? (point dinterrogation) ( et )

Pour plus dinformations, voir Groupes , la page 319.

312

Utilisation dexpressions rgulires

Caractre de remplacement
[ et ]

Description
Spcifie une classe de caractre qui dfinit des correspondances possibles pour un seul caractre : /[aeiou]/ correspond lun des caractres spcifis. Dans les classes de caractre, utilisez le trait dunion (-) pour dsigner une plage de caractres : /[A-Z0-9]/ correspond aux lettres majuscules A Z ou aux chiffres 0 9. Dans les classes de caractre, insrez un caractre dchappement pour chapper les caractres ] et - : /[+\-]\d+/ correspond + ou - avant un ou plusieurs chiffres. Dans les classes de caractre, dautres caractres (qui sont normalement des caractres de remplacement) sont considrs comme des caractres normaux (et non comme des caractres de remplacement), sans quun caractre dchappement soit ncessaire : /[$]/ correspond $ ou . Pour plus dinformations, voir Classes de caractre , la page 314. Utilis pour la permutation, pour correspondre la partie de gauche ou celle de droite : /abc|xyz/ correspond abc ou xyz.

| (oprateur de

transfert de donnes)

A propos des mtasquences


Les mtasquences sont des squences de caractres ayant une signification spciale dans un modle dexpression rgulire. Le tableau suivant dcrit ces mtasquences :
Mtasquence
{n} {n,}

Description
Indique un quantificateur numrique ou une plage de quantificateurs pour llment prcdent : /A{27}/ correspond au caractre A rpt 27 fois. /A{3}/ correspond au caractre A rpt 3 fois ou plus. /A{3,5}/ correspond au caractre A rpt 3 5 fois. Pour plus dinformations, voir Quantificateurs , la page 316. Etablit une correspondance la position entre un caractre mot et un caractre non-mot. Si le premier ou Ie dernier caractre dans la chane est un caractre mot, correspond galement au dbut ou la fin de la chane. Etablit une correspondance la position entre deux caractres mot. Correspond galement la position entre deux caractres non-mot. Correspond une dcimale.

et
{n,n}

\b

\B

\d

Syntaxe dexpression rgulire

313

Mtasquence
\D \f \n \r \s

Description
Correspond tout caractre autre quun chiffre. Correspond un caractre de changement de page. Correspond au caractre de nouvelle ligne. Correspond au caractre de retour de chariot. Correspond tout caractre despace blanc (un espace, une tabulation, une nouvelle ligne ou un caractre de retour de chariot). Correspond tout caractre autre quun caractre despace blanc. Correspond au caractre de tabulation. Correspond au caractre Unicode avec le code de caractre spcifi par le nombre hexadcimal nnnn. Par exemple, \u263a est le caractre smiley. Correspond un caractre davancement vertical. Correspond un caractre mot (AZ, az, 0-9, ou _). \w ne correspond pas aux caractres qui ne sont pas anglais tels que , , ou . Correspond tout caractre autre quun caractre mot. Correspond au caractre avec la valeur ASCII spcifie, comme dfini par le nombre hexadcimal nn.

\S \t \unnnn

\v \w

\W \xnn

Classes de caractre
Vous utilisez des classes de caractre pour spcifier une liste de caractres devant correspondre une position dans lexpression rgulire. Vous dfinissez des classes de caractre avec des crochets ( [ et ] ). Par exemple, lexpression rgulire suivante dfinit une classe de caractre qui correspond bag, beg, big, bog, ou bug :
/b[aeiou]g/

Squences dchappement dans des classes de caractre


La plupart des caractres de remplacement et des mtasquences ayant normalement des significations spciales dans une expression rgulire nont pas ces mmes significations dans une classe de caractre. Par exemple, dans une expression rgulire, lastrisque est utilis pour la rptition, mais ce nest pas le cas lorsquil apparat dans une classe de caractre. La classe de caractre suivante correspond lastrisque de faon littrale, avec tout autre caractre rpertori :
/[abc*123]/

314

Utilisation dexpressions rgulires

Cependant, les trois caractres rpertoris dans le tableau suivant fonctionnent comme des caractres de remplacement, avec une signification spciale, dans des classes de caractre :
Caractre de remplacement
] -

Signification dans des classes de caractre


Dfinit la fin de la classe de caractre. Dfinit une plage de caractres (voir Plages de caractres dans des classes de caractre , la page 316). Dfinit des mtasquences et annule la signification spciale des caractres de remplacement.

Pour que ces caractres soient reconnus comme caractres littraux (dans la signification du caractre de remplacement spciale), vous devez faire prcder le caractre du caractre dchappement. Par exemple, lexpression rgulire suivante inclut une classe de caractre qui correspond lun des quatre symboles ($, \, ], ou -) :
/[$\\\]\-]/

Outre les caractres de remplacement qui conservent leurs significations spciales, les mtasquences suivantes fonctionnent comme des mtasquences dans des classes de caractre :
Mtasquence
\n \r \t \unnnn

Signification dans des classes de caractre


Correspond un caractre de nouvelle ligne. Correspond un caractre de retour de chariot. Correspond un caractre de tabulation. Correspond au caractre avec la valeur de point de code Unicode spcifie (comme dfini par le nombre hexadcimal nnnn). Correspond au caractre avec la valeur ASCII spcifie (comme dfini par le nombre hexadcimal nn).

\xnn

Dautres caractres de remplacement et mtasquences dexpression rgulire sont considrs comme des caractres normaux dans une classe de caractre.

Syntaxe dexpression rgulire

315

Plages de caractres dans des classes de caractre


Utilisez le trait dunion pour spcifier une plage de caractres telle que A-Z, a-z, ou 0-9. Ces caractres doivent constituer une plage valide dans le jeu de caractres. Par exemple, la classe de caractre suivante correspond un caractre compris dans la plage a-z ou un chiffre :
/[a-z0-9]/

Vous pouvez galement utiliser le code de caractre ASCII \xnn pour spcifier une plage par valeur ASCII. Par exemple, la classe de caractre suivante correspond un caractre dun jeu de caractres ASCII tendus ( et , par exemple) :
/[\x80-\x9A]/

Classes de caractre nies


Lorsque vous utilisez un caret (^) au dbut dune classe de caractre, il la nie (tout caractre non rpertori est considr comme une correspondance). La classe de caractre suivante correspond tout caractre sauf une lettre minuscule (az) ou un chiffre :
/[^a-z0-9]/

Vous devez taper le caret (^) au dbut dune classe de caractre pour indiquer la ngation. Autrement, vous ajoutez simplement le caret aux caractres dans la classe de caractre. Par exemple, la classe de caractre suivante correspond un symbole (le caret, par exemple) :
/[!.,#+*%$&^]/

Quantificateurs
Vous utilisez des quantificateurs pour spcifier des rptitions de caractres ou de squences dans des modles, comme suit :
Caractre de remplacement de quantificateur
* (toile) + (plus) ? (point dinterrogation)
{n} {n,}

Description

Correspond llment prcdent rpt zro ou plusieurs fois. Correspond llment prcdent rpt une ou plusieurs fois. Correspond llment prcdent rpt zro ou une fois. Indique un quantificateur numrique ou une plage de quantificateurs pour llment prcdent : /A{27}/ correspond au caractre A rpt 27 fois. /A{3}/ correspond au caractre A rpt 3 fois ou plus. /A{3,5}/ correspond au caractre A rpt de 3 5 fois.

et
{n,n}

316

Utilisation dexpressions rgulires

Vous pouvez appliquer un quantificateur un seul caractre, une classe de caractre ou un groupe :

/a+/

correspond au caractre a rpt une ou plusieurs fois. correspond un ou plusieurs chiffres. correspond une rptition dun ou de plusieurs caractres, a, b, ou c. correspond au mot very suivi par une virgule et un espace rpt zro ou

/\d+/

/[abc]+/

/(very, )*/

plusieurs fois. Vous pouvez utiliser des quantificateurs dans des groupes de parenthses auxquels sont appliqus des quantificateurs. Par exemple, le quantificateur suivant correspond des chanes du type word et word-word-word :
/\w+(-\w+)*/

Par dfaut, les expressions rgulires effectuent un greedy matching. Tout sous-modle dans lexpression rgulire (.*, par exemple) tente de mettre en correspondance autant de caractres que possible dans la chane avant de passer la partie suivante de lexpression rgulire. Par exemple, considrez lexpression rgulire et la chane suivantes :
var pattern:RegExp = /<p>.*<\/p>/; str:String = "<p>Paragraph 1</p> <p>Paragraph 2</p>";

Lexpression rgulire correspond la chane entire :


<p>Paragraph 1</p> <p>Paragraph 2</p>

Supposez, nanmoins, que vous souhaitez tablir une correspondance avec un seul groupe <p>...</p>. Vous pouvez procder comme suit :
<p>Paragraph 1</p>

Ajoutez un point dinterrogation (?) aprs les quantificateurs pour quils deviennent des quantificateurs paresseux. Par exemple, lexpression rgulire suivante, qui utilise le quantificateur paresseux *?, correspond <p> suivi du nombre minimum de caractres possible (paresseux), suivi de </p>:
/<p>.*?<\/p>/

Syntaxe dexpression rgulire

317

Lisez attentivement les points suivants concernant les quantificateurs :


Les quantificateurs {0} et {0,0} nexcluent pas un lment dune correspondance. Ne combinez pas plusieurs quantificateurs, comme dans /abc+*/. Le point (.) ne couvre pas des lignes moins que lindicateur s (dotall) soit dfini, mme sil est suivi par un quantificateur *. Par exemple, considrez le code suivant :
var str:String = "<p>Test\n"; str += "Multiline</p>"; var re:RegExp = /<p>.*<\/p>/; trace(str.match(re)); // null; re = /<p>.*<\/p>/s; trace(str.match(re)); // rsultat : <p>Test // Multiligne</p>

Pour plus dinformations, voir Lindicateur s (dotall) , la page 325.

Permutation
Utilisez le caractre | (barre) dans une expression rgulire pour que son moteur tienne compte des autres possibilits pour une correspondance. Par exemple, lexpression rgulire suivante correspond lun des mots cat, dog, pig, rat :
var pattern:RegExp = /cat|dog|pig|rat/;

Vous pouvez utiliser des parenthses pour dfinir des groupes et limiter le domaine du permutateur |. Lexpression rgulire suivante correspond cat suivi de nap ou nip :
var pattern:RegExp = /cat(nap|nip)/;

Pour plus dinformations, voir Groupes , la page 319. Les deux expressions rgulires suivantes (lune utilisant le permutateur |, lautre une classe de caractre (dfinie avec [ et ] )) sont quivalentes :
/1|3|5|7|9/ /[13579]/

Pour plus dinformations, voir Classes de caractre , la page 314.

318

Utilisation dexpressions rgulires

Groupes
Vous pouvez spcifier un groupe dans une expression rgulire en utilisant des parenthses, comme suit :
/class-(\d*)/

Un groupe est une sous-section dun modle. Vous pouvez utiliser des groupes pour effectuer les oprations suivantes :

Appliquer un quantificateur plusieurs caractres Dlimiter des sous-modles appliquer avec la permutation ( laide du caractre |) Capturer des correspondances de sous-chane (par exemple, en utilisant \1 dans une expression rgulire pour tablir une correspondance avec un groupe mis en correspondance prcdemment, ou en utilisant $1 de la mme faon dans la mthode replace() de la classe String)

Les sections suivantes fournissent des dtails sur ces utilisations de groupes.

Utilisation de groupes avec des quantificateurs


Si vous nutilisez pas de groupe, un quantificateur sapplique au caractre ou la classe de caractre qui le prcde, comme indiqu ci-dessous :
var pattern:RegExp = /ab*/ ; // correspond au caractre a suivi de // zro ou plusieurs occurrences du caractre b pattern = /a\d+/; // correspond au caractre a suivi de // un ou plusieurs chiffres pattern = /a[123]{1,3}/; // correspond au caractre a suivi de // lune des trois occurrences de 1, 2 ou 3

Nanmoins, vous pouvez utiliser un groupe pour appliquer un quantificateur plusieurs caractres ou classes de caractre :
var pattern:RegExp = /(ab)*/; // correspond zro ou plusieurs occurrences du caractre a // suivi du caractre b, comme ababab pattern = /(a\d)+/; // correspond une ou plusieurs occurrences du caractre a suivi de // un chiffre, tel que a1a5a8a3 pattern = /(spam ){1,3}/; // correspond 1 3 occurrences du mot spam suivi dun espace

Pour plus dinformations sur les quantificateurs, voir Quantificateurs , la page 316.

Syntaxe dexpression rgulire

319

Utilisation de groupes avec le permutateur (|)


Vous pouvez utiliser des groupes pour dfinir le groupe de caractres auquel vous souhaitez appliquer un permutateur (|), comme suit :
var pattern:RegExp = /cat|dog/; // correspond cat ou dog pattern = /ca(t|d)og/; // correspond catog ou cadog

Utilisation de groupes pour capturer des correspondances de sous-chane


Lorsque vous dfinissez un groupe entre parenthses standard dans un modle, vous pouvez ensuite vous y rfrer dans lexpression rgulire. Il sagit dune backreference. Ces types de groupes sont appels groupes capturs. Par exemple, dans lexpression rgulire suivante, la squence \1 correspond toute sous-chane mise en correspondance avec le groupe entre parenthses captur :
var pattern:RegExp = /(\d+)-by-\1/; // correspond aux lments suivants : 48-par-48

Vous pouvez spcifier jusqu 99 backreferences dans une expression rgulire en tapant \1, \2, ... , \99. De mme, dans la mthode replace() de la classe String, vous pouvez utiliser $1$99 pour insrer des correspondances de chane de groupe captur dans la chane de remplacement :
var pattern:RegExp = /Hi, (\w+)\./; var str:String = "Hi, Bob."; trace(str.replace(pattern, "$1, hello.")); // rsultat : Bob, bonjour.

Si vous utilisez des groupes capturs, la mthode exec() de la classe RegExp et la mthode match() de la classe String renvoient des sous-chanes qui correspondent aux groupes capturs :
var pattern:RegExp = /(\w+)@(\w+).(\w+)/; var str:String = "bob@example.com"; trace(pattern.exec(str)); // bob@test.com,bob,example,com

320

Utilisation dexpressions rgulires

Utilisation de groupes non capturs et de groupes danticipation


Un groupe non captur est utilis pour le regroupement uniquement ; il nest pas collect , et il ne correspond pas des backreferences numrotes. Utilisez (?: et ) pour dfinir des groupes non capturs, comme suit :
var pattern = /(?:com|org|net);

Par exemple, notez la diffrence entre mettre (com|org) dans un groupe captur et dans un groupe non captur (la mthode exec() rpertorie les groupes capturs aprs la correspondance complte) :
var pattern:RegExp = /(\w+)@(\w+).(com|org)/; var str:String = "bob@example.com"; trace(pattern.exec(str)); // bob@test.com,bob,example,com //non captur : var pattern:RegExp = /(\w+)@(\w+).(?:com|org)/; var str:String = "bob@example.com"; trace(pattern.exec(str)); // bob@test.com,bob,example

Un type spcial de groupe non captur est le groupe danticipation dont il existe deux types : le groupe danticipation positif et le groupe danticipation ngatif. Utilisez (?= et ) pour dfinir un groupe danticipation positif, qui spcifie que le sous-modle dans le groupe doit tablir une correspondance la position. Nanmoins, la portion de la chane qui correspond au groupe danticipation positif peut correspondre aux modles restants dans lexpression rgulire. Par exemple, tant donn que (?=e) est un groupe danticipation positif dans le code suivant, le caractre e auquel il correspond peut tre mis en correspondance par une partie suivante de lexpression rgulire (dans ce cas, le groupe captur, \w*) :
var pattern:RegExp = /sh(?=e)(\w*)/i; var str:String = "Shelly sells seashells by the seashore"; trace(pattern.exec(str)); // Shelly,elly

Utilisez (?= et ) pour dfinir un groupe danticipation ngatif, qui indique que le sousmodle dans le groupe ne doit pas tablir une correspondance la position. Voici un exemple :
var pattern:RegExp = /sh(?!e)(\w*)/i; var str:String = "She sells seashells by the seashore"; trace(pattern.exec(str)); // shore,ore

Syntaxe dexpression rgulire

321

Utilisation de groupes nomms


Un groupe nomm est un type de groupe dans une expression rgulire ayant un identificateur nomm. Utilisez (?P<nom> et ) pour dfinir le groupe nomm. Par exemple, lexpression rgulire suivante inclut un groupe nomm avec lidentificateur nomm digits :
var pattern = /[a-z]+(?P<digits>\d+)[a-z]+/;

Lorsque vous utilisez la mthode exec(), un groupe nomm de correspondance est ajout comme proprit du tableau result :
var myPattern:RegExp = /([a-z]+)(?P<digits>\d+)[a-z]+/; var str:String = "a123bcd"; var result:Array = myPattern.exec(str); trace(result.digits); // 123

Voici un autre exemple, qui utilise deux groupes nomms, avec les identificateurs name et dom :
var emailPattern:RegExp = /(?P<name>(\w|[_.\-])+)@(?P<dom>((\w|-)+))+\.\w{2,4}+/; var address:String = "bob@example.com"; var result:Array = emailPattern.exec(address); trace(result.name); // bob trace(result.dom); // exemple
REMARQUE g i m 322

Les groupes nomms ne font pas partie de la spcification de langage ECMAScript. Ils reprsentent une fonction ajoute dans ActionScript 3.0.

Indicateurs et proprits
Le tableau suivant rpertorie les cinq indicateurs que vous pouvez dfinir pour des expressions rgulires. Vous pouvez accder chaque indicateur en tant que proprit de lobjet dexpression rgulire.
Indicateur Proprit
global ignoreCase

Description
A plusieurs correspondances. Correspondance sensible la casse. Sapplique aux caractres AZ et az mais pas des caractres tendus tels que et . Lorsque cet indicateur est dfini, $ et ^ peuvent correspondre au dbut dune ligne et la fin dune ligne, respectivement.

multiline

Utilisation dexpressions rgulires

Indicateur Proprit
s dotall

Description
Lorsque cet indicateur est dfini, . (point) peut correspondre au caractre de nouvelle ligne (\n). Autorise les expressions rgulires tendues. Vous pouvez tapez des espaces dans lexpression rgulire. Ils sont ignors dans le cadre du modle. Ceci vous permet de taper un code dexpression rgulire de faon plus lisible.

extended

Ces proprits sont en lecture seule. Vous pouvez dfinir les indicateurs (g, i, m, s, x) lorsque vous dfinissez une variable dexpression rgulire, comme suit :
var re:RegExp = /abc/gimsx;

Cependant, vous ne pouvez pas dfinir directement les proprits nommes. Par exemple, le code suivant gnre une erreur :
var re:RegExp = /abc/; re.global = true; // Gnration dune erreur.

Par dfaut, moins de les spcifier dans la dclaration dexpression rgulire, les indicateurs ne sont pas dfinis, et les proprits correspondantes sont galement dfinies sur false. De plus, il existe deux autres proprits dune expression rgulire :

La proprit lastIndex spcifie la position dindex dans la chane utiliser pour lappel suivant la mthode exec() ou test() dune expression rgulire. La proprit source spcifie la chane qui dfinit la portion de modle de lexpression rgulire.

Lindicateur g (global)
Lorsque lindicateur g (global) nest pas inclus, une expression rgulire na pas plus dune correspondance. Par exemple, avec lindicateur g exclu de lexpression rgulire, la mthode String.match() renvoie une sous-chane de correspondance uniquement :
var str:String = "she sells seashells by the seashore."; var pattern:RegExp = /sh\w*/; trace(str.match(pattern)) // rsultat : she

Lorsque lindicateur g est dfini, la mthode Sting.match() renvoie plusieurs correspondances, comme suit :
var str:String = "she sells seashells by the seashore."; var pattern:RegExp = /sh\w*/g; // Le mme modle, mais cette fois, lindicateur g EST dfini. trace(str.match(pattern)); // rsultat : she,shells,shore

Syntaxe dexpression rgulire

323

Lindicateur i (ignoreCase)
Par dfaut, les correspondances dexpression rgulire sont sensibles la casse. Lorsque vous dfinissez lindicateur i (ignoreCase), le respect de la casse est ignor. Par exemple, la lettre minuscule s dans lexpression rgulire ne correspond pas la lettre majuscule S, le premier caractre de la chane :
var str:String = "She sells seashells by the seashore."; trace(str.search(/sh/)); // rsultat : 13 -- Pas le premier caractre

Lorsque lindicateur i est dfini, cependant, lexpression rgulire correspond la lettre majuscule S :
var str:String = "She sells seashells by the seashore."; trace(str.search(/sh/i)); // rsultat : 0

Lindicateur i ignore le respect de la casse uniquement pour les caractres AZ et az, mais par pour les caractres tendus tels que et .

Lindicateur m (multiline)
Si lindicateur m (multiline) nest pas dfini, le ^ correspond au dbut de la chane et le $ sa fin. Si lindicateur m est dfini, ces caractres correspondent au dbut dune ligne et la fin dune ligne, respectivement. Considrez la chane suivante, qui inclut un caractre de nouvelle ligne :
var str:String = "Test\n"; str += "Multiline"; trace(str.match(/^\w*/g)); // Correspondance avec un mot au dbut // de la chane.

Mme si lindicateur g (global) est dfini dans lexpression rgulire, la mthode match() correspond une seule sous-chane, car il nexiste quune seule correspondance pour le ^ (le dbut de la chane). Le rsultat est le suivant :
Test

Voici le mme code avec lindicateur m dfini :


var str:String = "Test\n"; str += "Multiline"; trace(str.match(/^\w*/gm)); // Correspondance avec un mot au dbut // des lignes.

Cette fois, le rsultat inclut les mots au dbut des deux lignes :
Test,Multiline

Seul le caractre \n signale la fin dune ligne. Ce nest pas le cas des caractres suivants :

Retour de chariot (\r) Sparateur de ligne Unicode (\u2028) Sparateur de paragraphe Unicode (\u2028)

324

Utilisation dexpressions rgulires

Lindicateur s (dotall)
Si lindicateur s (dotall ou dot all ) nest pas dfini, un point (.) dans un modle dexpression rgulire ne correspond pas un caractre de nouvelle ligne (\n). Par consquent, il nexiste aucune correspondance pour lexemple suivant :
var str:String = "<p>Test\n"; str += "Multiline</p>"; var re:RegExp = /<p>.*?<\/p>/; trace(str.match(re));

Nanmoins, si lindicateur the s est dfini, le point correspond au caractre de nouvelle ligne :
var str:String = "<p>Test\n"; str += "Multiline</p>"; var re:RegExp = /<p>.*?<\/p>/s; trace(str.match(re));

Dans ce cas, la correspondance est la sous-chane entire dans les balises <p>, y compris le caractre de nouvelle ligne :
<p>Test Multiline</p>

Lindicateur x (extended)
Les expressions rgulires peuvent tre difficiles lire, notamment lorsquelles comprennent de nombreux mtasymboles et mtasquences. Voici un exemple :
/<p(>|(\s*[^>]*>)).*?<\/p>/gi

Lorsque vous utilisez lindicateur x (extended) dans une expression rgulire, les espaces vides que vous tapez dans le modle sont ignors. Par exemple, lexpression rgulire suivante est identique lexemple prcdent :
/ <p (> | (\s* [^>]* >)) .*? <\/p> /gix

Si lindicateur x est dfini et que vous souhaitez tablir une correspondance avec un espace vide, faites prcder lespace vide dune barre oblique. Par exemple, les deux expressions rgulires suivantes sont quivalentes :
/foo bar/ /foo \ bar/x

Syntaxe dexpression rgulire

325

La proprit lastIndex
La proprit lastIndex spcifie la position dindex dans la chane laquelle la recherche suivante doit dmarrer. Cette proprit affecte les mthodes exec() et test() appeles sur une expression rgulire dont lindicateur g est dfini sur true. Par exemple, considrez le code suivant :
var pattern:RegExp = /p\w*/gi; var str:String = "Pedro Piper picked a peck of pickled peppers."; trace(pattern.lastIndex); var result:Object = pattern.exec(str); while (result != null) { trace(pattern.lastIndex); result = pattern.exec(str); }

La proprit lastIndex est dfini sur 0 par dfaut (pour commencer les recherches au dbut de la chane). Aprs chaque correspondance, elle est dfinie sur la position dindex suivant la correspondance. Par consquent, le rsultat pour le code prcdent est le suivant :
0 5 11 18 25 36 44

Si lindicateur global est dfini sur false, les mthodes exec() et test() nutilisent pas ni ne dfinissent la proprit lastIndex. Les mthodes match(), replace() et search() de la classe String dmarrent toutes les recherches du dbut de la chane, indpendamment du rglage de la proprit lastIndex de lexpression rgulire utilise dans lappel la mthode. (Nanmoins, la mthode match() dfinit lastIndex sur 0.) Vous pouvez dfinir la proprit lastIndex de faon ajuster la position de dbut dans la chane pour la mise en correspondance des expressions rgulires.

La proprit source
La proprit source spcifie la chane qui dfinit la portion de modle dune expression rgulire. Voici un exemple :
var pattern:RegExp = /foo/gi; trace(pattern.source); // foo

326

Utilisation dexpressions rgulires

Mthodes dutilisation dexpressions rgulires avec des chanes


La classe RegExp comprend deux mthodes : exec() et test(). Outre les mthodes exec() et test() de la classe RegExp, la classe String comprend les mthodes suivantes qui vous permettent dtablir une correspondance avec des expressions rgulires dans des chanes : match(), replace(), search(), et splice().

La mthode test()
La mthode test() de la classe RegExp vrifie si la chane fournie contient une correspondance pour lexpression rgulire, comme lindique lexemple suivant :
var pattern:RegExp = /Class-\w/; var str = "Class-A"; trace(pattern.test(str)); // rsultat : true

La mthode exec()
La mthode exec() de la classe RegExp vrifie si la chane fournie contient une correspondance pour lexpression rgulire et renvoie un tableau avec les lments suivants :

La sous-chane correspondante Les correspondances de sous-chane pour les groupes entre parenthses dans lexpression rgulire

Le tableau inclut galement une proprit index qui indique la position dindex du dbut de la correspondance de sous-chane. Par exemple, considrez le code suivant :
var pattern:RegExp = /\d{3}\-\d{3}-\d{4}/; // numro de tlphone // aux Etats-Unis var str:String = "phone: 415-555-1212"; var result:Array = pattern.exec(str); trace(result.index, " - ", result); // 7 - 415-555-1212

Mthodes dutilisation dexpressions rgulires avec des chanes

327

Utilisez la mthode exec() plusieurs fois pour tablir une correspondance avec plusieurs souschanes lorsque lindicateur g (global) est dfini pour lexpression rgulire :
var pattern:RegExp = /\w*sh\w*/gi; var str:String = "She sells seashells by the seashore"; var result:Array = pattern.exec(str); while (result != null) { trace(result.index, "\t", pattern.lastIndex, "\t", result); result = pattern.exec(str); } //rsultat : // 0 3 She // 10 19 seashells // 27 35 seashore

Mthodes de chane utilisant des paramtres RegExp


Les mthodes suivantes de la classe String prennent des expressions rgulires comme paramtres : match(), replace(), search(), et split(). Pour plus dinformations sur ces mthodes, voir Recherche de modles dans des chanes et remplacement de sous-chanes , la page 227.

Exemple : Un analyseur Wiki


Cet exemple simple de conversion de texte Wiki illustre des utilisations dexpressions rgulires :

Conversion de lignes de texte qui mettent en correspondance un modle Wiki source et les chanes de sortie HTML appropries. Utilisation dune expression rgulire pour convertir des modles URL en balises de lien hypertexte HTML <a>. Utilisation dune expression rgulire pour convertir les chanes dollar amricain ("$9.95", par exemple) en chanes euro ("8.24 ", par exemple).

328

Utilisation dexpressions rgulires

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/ learn_programmingAS3samples_flash_fr. Les fichiers dapplication WikiEditor se trouvent dans le dossier Samples/WikiEditor. Cette application se compose des fichiers suivants :
Fichier
WikiEditor.mxml ou WikiEditor.fla com/example/programmingas3/ regExpExamples/WikiParser.as

Description
Le fichier dapplication principal dans Flash (FLA) ou Flex (MXML). Une classe qui comprend des mthodes utilisant des expressions rgulires pour convertir des modles de texte dentre Wiki en sortie HTML quivalente. Une classe qui comprend des mthodes utilisant des expressions rgulires pour convertir des chanes URL en balises de lien hypertexte HTML <a>. Une classe qui comprend des mthodes utilisant des expressions rgulires pour convertir des chanes dollar amricain en chanes euro.

com/example/programmingas3/ regExpExamples/URLParser.as

com/example/programmingas3/ regExpExamples/CurrencyConverter.as

Dfinition de la classe WikiParser


La classe WikiParser inclut des mthodes qui convertissent le texte dentre Wiki en sortie HTML quivalente. Il ne sagit pas dune application de conversion Wiki trs puissante, mais elle illustre des utilisations dexpressions rgulires pour la mise en correspondance de modle et la conversion de chane. La fonction constructeur et la mthode setWikiData() initialisent un exemple de chane de texte dentre Wiki, comme suit :
public function WikiParser() { wikiData = setWikiData(); }

Exemple : Un analyseur Wiki

329

Lorsque lutilisateur clique sur le bouton de test dans lapplication exemple, cette dernire appelle la mthode parseWikiString() de lobjet WikiParser. Cette mthode appelle plusieurs autres mthodes, qui assemblent leur tour la chane HTML rsultante.
public function parseWikiString(wikiString:String):String { var result:String = parseBold(wikiString); result = parseItalic(result); result = linesToParagraphs(result); result = parseBullets(result); return result; }

Chaque mthode appeleparseBold(), parseItalic(), linesToParagraphs(), et parseBullets()utilise la mthode replace() de la chane pour remplacer les modles de correspondance, dfinis par une expression rgulire, de faon transformer le texte Wiki en texte format HTML.

Conversion des modles de texte en gras et en italique


La mthode parseBold() recherche un modle de texte Wiki en gras (foo, par exemple) et le transforme en son quivalent HTML (<b>foo</b>, par exemple), comme suit :
private function parseBold(input:String):String { var pattern:RegExp = /'''(.*?)'''/g; return input.replace(pattern, "<b>$1</b>"); }

La portion (.?*) de lexpression rgulire correspond des caractres (*) entre les deux modles de dfinition . Le quantificateur ? rend la correspondance nongreedy, de faon ce que pour une chane telle que aaa bbb ccc, la premire chane mise en correspondance soit aaa et non la chane entire (qui commence et se termine par le modle ).
replace()

Les parenthses dans lexpression rgulire dfinissent un groupe captur, et la mthode se rfre ce groupe en utilisant le code $1 dans la chane de remplacement. Lindicateur g (global) dans lexpression rgulire vrifie que la mthode replace() remplace toutes les correspondances dans la chane (pas simplement la premire). La mthode parseItalic() fonctionne comme la mthode parseBold(), sauf quelle recherche deux apostrophes () comme sparateur pour le texte en italique (au lieu de trois) :

private function parseItalic(input:String):String { var pattern:RegExp = /''(.*?)''/g; return input.replace(pattern, "<i>$1</i>"); }

330

Utilisation dexpressions rgulires

Conversion de modles de puce


Comme dans lexemple suivant, la mthode parseBullet() recherche le modle de puce Wiki (* foo, par exemple) et le transforme en son quivalent HTML (<li>foo</li>, par exemple) :
private function parseBullets(input:String):String { var pattern:RegExp = /^\*(.*)/gm; return input.replace(pattern, "<li>$1</li>"); }

Le symbole ^ au dbut de lexpression rgulire correspond au dbut dune ligne. Lindicateur m (multiline) dans lexpression rgulire fait en sorte que cette dernire compare le symbole ^ au dbut dune ligne, et non simplement au dbut de la chane. Le modle \* correspond un astrisque (la barre oblique est utilise pour signaler un astrisque littral au lieu dun quantificateur *).
replace()

Les parenthses dans lexpression rgulire dfinissent un groupe captur, et la mthode se rfre ce groupe en utilisant le code $1 dans la chane de remplacement. Lindicateur g (global) dans lexpression rgulire vrifie que la mthode replace() remplace toutes les correspondances dans la chane (pas simplement la premire).

Conversion de modles Wiki de paragraphe


La mthode linesToParagraphs() convertit chaque ligne dans la chane Wiki dentre en une balise de paragraphe HTML <p>. Ces lignes dans la mthode extraient des lignes vides de la chane dentre Wiki :
var pattern:RegExp = /^$/gm; var result:String = input.replace(pattern, "");

Les symboles ^ et $ dans lexpression rgulire correspondent au dbut et la fin dune ligne. Lindicateur m (multiline) dans lexpression rgulire fait en sorte que cette dernire compare le symbole ^ au dbut dune ligne, et non simplement au dbut de la chane. La mthode replace() remplace toutes les chanes de correspondance (lignes vides) par une chane vide (""). Lindicateur g (global) dans lexpression rgulire vrifie que la mthode replace() remplace toutes les correspondances dans la chane (pas simplement la premire).

Exemple : Un analyseur Wiki

331

Conversion dURL en balises HTML <a>


Lorsque lutilisateur clique sur le bouton de test dans lexemple dapplication et quil a coch la case urlToATag, lapplication appelle la mthode statique URLParser.urlToATag() pour convertir les chanes URL de la chane Wiki dentre en balises HTML <a>.
var var var var protocol:String = "((?:http|ftp)://)"; urlPart:String = "([a-z0-9_-]+\.[a-z0-9_-]+)"; optionalUrlPart:String = "(\.[a-z0-9_-]*)"; urlPattern:RegExp = new RegExp(protocol + urlPart + optionalUrlPart, "ig"); var result:String = input.replace(urlPattern, "<a href='$1$2$3'><u>$1$2$3</u></a>");

La fonction constructeur RegExp() sert assembler une expression rgulire (urlPattern) partir de plusieurs parties constituantes. Ces parties constituantes sont reprsentes par chaque chane dfinissant une partie du modle de lexpression rgulire. La premire partie du modle de lexpression rgulire, dfinie par la chane protocol, dfinit un protocole URL : soit http:// soit ftp://. Les parenthses dfinissent un groupe non captur, indiqu par le symbole ?. Ceci signifie que les parenthses servent simplement dfinir un groupe pour le modle de permutation | ; le groupe ne correspondra pas des codes de backreference ($1, $2, $3) dans la chane de remplacement de la mthode replace(). Les autres parties constituantes de lexpression rgulire utilisent chacune des groupes capturs (indiqus par des parenthses dans le modle) qui sont ensuite utiliss dans les codes de backreference ($1, $2, $3) dans la chane de remplacement de la mthode replace(). La partie du modle dfinie par la chane urlPart correspond au moins lun des caractres suivants : a-z, 0-9, _, ou -. La quantificateur + indique quau moins un caractre a une correspondance. Le \. indique un point obligatoire (.). Et le reste correspond une autre chane dau moins un de ces caractres : a-z, 0-9, _, ou -. La partie du modle dfinie par la chane optionalUrlPart correspond zro ou plus des caractres suivants : un point (.) suivi par nimporte quel nombre de caractres alphanumriques (y compris _ et -). Le quantificateur * indique que zro ou plus de caractres ont une correspondance. Lappel la mthode replace() utilise lexpression rgulire et assemble la chane HTML de remplacement, laide de backreferences. La mthode urlToATag() appelle ensuite la mthode emailToATag(), qui utilise des techniques semblables pour remplacer des modles de courrier lectronique avec des chanes de lien hypertexte HTML <a>. Les expressions rgulires utilises pour correspondre des URL HTTP, FTP et de courrier lectronique dans le fichier sont assez simples car elles sont donnes titre dexemple. Elles sont beaucoup plus compliques si lon souhaite tablir une correspondance plus correcte.

332

Utilisation dexpressions rgulires

Conversion des chanes dollar amricain en chanes euro


Lorsque lutilisateur clique sur le bouton de test dans lexemple dapplication et quil a coch la case dollarToEuro, lapplication appelle la mthode statique CurrencyConverter.usdToEuro() pour convertir des chanes dollar amricain ("$9.95", par exemple) en chanes euro ("8.24 ", par exemple), comme suit :
var usdPrice:RegExp = /\$([\d,]+.\d+)+/g; return input.replace(usdPrice, usdStrToEuroStr);

La premire ligne dfinit un modle simple pour tablir une correspondance avec des chanes dollar amricain. Le caractre $ est prcd du caractre dchappement (\). La mthode replace() utilise lexpression rgulire pour tablir une correspondance avec le modle et appelle la fonction usdStrToEuroStr() pour dterminer la chane de remplacement (une valeur en euros). Lorsquun nom de fonction est utilis comme deuxime paramtre de la mthode replace(), les lments suivants sont transmis comme paramtres la fonction appele :

La partie correspondante de la chane. Tout groupe entre parenthses captur correspondant. Le nombre darguments transmis de cette faon varie selon le nombre de correspondances de groupes entre parenthses captures. Pour dterminer le nombre de correspondances de groupes entre parenthses capturs, vrifiez arguments.length - 3 dans le code de la fonction. La position dindex dans la chane o dbute la correspondance. La chane complte.

La mthode usdStrToEuroStr() convertit les modles de chane dollar amricain en chanes euro, comme suit :
private function usdToEuro(...args):String { var usd:String = args[1]; usd = usd.replace(",", ""); var exchangeRate:Number = 0.828017; var euro:Number = Number(usd) * exchangeRate; trace(usd, Number(usd), euro); const euroSymbol:String = String.fromCharCode(8364); // return euro.toFixed(2) + " " + euroSymbol; } args[1] reprsente le groupe entre parenthses captur mis en correspondance par lexpression rgulire usdPrice. Il sagit de la portion numrique de la chane dollar amricain : cest--dire la quantit en dollar, sans le signe $. La mthode applique une conversion de taux de change et renvoie la chane rsultante (avec un symbole de fin de ligne au lieu du symbole $ plac gauche).

Exemple : Un analyseur Wiki

333

334

Utilisation dexpressions rgulires

CHAPITRE 10

Gestion dvnements
Un systme de gestion des vnements permet au programmeur de rpondre aux actions de lutilisateur et aux vnements systme de manire pratique. Le modle dvnements ActionScript 3.0 nest pas uniquement pratique, il respecte les normes en vigueur et sintgre parfaitement la liste daffichage dAdobe Flash Player 9. Ce modle repose sur la spcification dvnements Document Object Model (DOM) de niveau 3, une architecture de gestion dvnements normalise. Il constitue donc pour les programmeurs ActionScript un outil puissant et parfaitement intuitif. Ce chapitre sorganise en cinq sections. Les deux premires fournissent des informations gnrales sur la gestion dvnements dans ActionScript. Les trois dernires dcrivent les principaux concepts qui sous-tendent le modle dvnements : le flux dvnements, lobjet vnement et les couteurs dvnements. Dans ActionScript 3.0, le systme de gestion des vnements interagit troitement avec la liste daffichage ; ce chapitre suppose que vous connaissiez les principes de base de cette liste. Pour plus dinformations, voir Programmation de laffichage , la page 395.

10

Contenu
Principes de base de la gestion des vnements . . . . . . . . . . . . . . . . . . . . . . . . . . . .336 Variation de la gestion dvnements dans ActionScript 3.0 par rapport aux versions antrieures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .339 Flux dvnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .343 Objets vnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .345 Ecouteurs dvnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 Exemple : un rveil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360

335

Principes de base de la gestion des vnements


Introduction la gestion des vnements
Vous pouvez concevoir un vnement comme tout type daction qui se produit dans votre fichier SWF et qui prsente un intrt pour vous en tant que programmeur. Par exemple, la plupart des fichiers SWF prennent en charge une certaine forme dinteraction, quil sagisse dune action aussi simple quun clic avec la souris ou dune opration plus complexe, telle que lacceptation et le traitement des donnes saisies dans un formulaire. Toute interaction de ce type dans le fichier SWF est considre comme un vnement. Des vnements peuvent galement se produire sans aucune interaction directe de lutilisateur, par exemple lorsque le chargement des donnes depuis un serveur se termine ou quune camra connecte devient active. Dans ActionScript 3.0, tout vnement est reprsent par un objet vnement, qui correspond une instance de la classe Event ou de lune de ses sous-classes. Le rle dun objet vnement est non seulement de stocker des informations relatives un vnement spcifique, mais aussi de contenir des mthodes qui favorisent la manipulation de cet objet. Par exemple, lorsque Flash Player dtecte un clic de la souris, il cre un objet vnement (une instance de la classe MouseEvent) qui reprsente cet vnement particulier. Aprs cration dun objet vnement, Flash Player le distribue, ce qui signifie que lobjet vnement est transmis lobjet reprsentant la cible de lvnement. Lobjet qui doit recevoir lobjet vnement ainsi distribu est appel cible dvnement. Par exemple, lorsquune camra relie devient active, Flash Player distribue un objet vnement directement la cible de lvnement, dans ce cas lobjet reprsentant la camra. Toutefois, si la cible dvnement se trouve dans la liste daffichage, lobjet vnement est transmis tout au long de la hirarchie de la liste daffichage jusqu ce quil atteigne la cible en question. Dans certains cas, lobjet vnement se propage ensuite vers le haut de la hirarchie de la liste daffichage, selon le mme cheminement. Cette traverse de la hirarchie de la liste daffichage correspond au flux dvnements. Vous pouvez couter les objets vnement de votre code grce aux couteurs dvnements. Les couteurs dvnements sont des fonctions ou des mthodes que vous crivez pour rpondre aux diffrents vnements. Pour garantir que le programme ragisse aux vnements, vous devez ajouter des couteurs dvnements soit la cible dvnement, soit lun des objets de la liste daffichage qui font partie du flux dvnements de lobjet vnement.

336

Gestion dvnements

Chaque fois que vous crivez un code dcouteur dvnement, il suit cette structure de base (les lments en gras sont des espaces rservs que vous rempliriez pour votre cas particulier) :
function eventResponse(eventObject:EventType):void { // Les actions effectues en rponse lvnement apparaissent ici. }

eventTarget.addEventListener(EventType.EVENT_NAME, eventResponse); Ce code a deux rles. Tout dabord, il dfinit une fonction, qui est une manire de spcifier les actions excuter en rponse lvnement. Ensuite, il appelle la mthode addEventListener() de lobjet source, inscrivant ainsi la fonction auprs de lvnement spcifi de faon ce que lorsque lvnement survient, les actions de la fonction ont lieu. Lorsque lvnement se produit, la cible de lvnement vrifie sa liste de toutes les fonctions et mthodes enregistres en tant qucouteurs dvnements. Elle appelle ensuite chacune dentre elles, transmettant lobjet vnement comme paramtre. Vous devez apporter quatre modifications ce code pour crer votre propre couteur dvnement. Premirement, vous devez remplacer le nom de la fonction par celui que vous souhaitez utiliser (ceci doit tre modifi deux endroits, l o le code indique eventResponse). Deuximement, vous devez spcifier le nom de la classe de lobjet vnement qui est envoy par lvnement que vous souhaitez couter (EventType dans le code), et vous devez indiquer la constante pour lvnement en question (EVENT_NAME dans la liste). Troisimement, vous devez appeler la mthode addEventListener() sur lobjet qui enverra lvnement (eventTarget dans ce code). Vous pouvez galement modifier le nom de la variable utilise comme paramtre de la fonction (eventObject dans ce code).

Tches courantes de gestion des vnements


Vous trouverez ci-dessous des tches courantes de gestion des vnements. Chacune dentre elles est dcrite dans ce chapitre :

Ecrire un code pour rpondre des vnements Empcher quun code rponde des vnements Utiliser des objets event Utiliser un flux dvnements :

Identification des informations de flux dvnements Arrt du flux dvnements Arrt du comportement par dfaut

Envoyer des vnements partir de vos classes Crer un type dvnement personnalis

Principes de base de la gestion des vnements

337

Concepts et termes importants


La liste de rfrence suivante contient les termes importants que vous rencontrerez dans ce chapitre :

Comportement par dfaut : certains vnements sont lis un comportement appel comportement par dfaut. Par exemple, lorsquun utilisateur tape du texte dans un champ, un vnement de saisie de texte est dclench. Le comportement par dfaut de cet vnement consiste afficher le caractre tap dans le champ textemais vous pouvez annuler ce comportement par dfaut (si vous ne souhaitez pas afficher le caractre tap, par exemple). Envoyer : indiquer des couteurs dvnements quun vnement a eu lieu. Evnement : quelque chose qui sest produit sur un objet et que ce dernier peut indiquer dautres objets. Flux dvnements : lorsque des vnements concernent un objet sur la liste daffichage (un objet affich lcran), tous les objets qui contiennent lobjet sont informs de lvnement et avertissent leur tour leurs couteurs dvnements. Ce processus commence avec la scne et se poursuit travers la liste daffichage jusqu lobjet rel o sest produit lvnement. Il recommence ensuite avec la scne. Ce processus est appel flux dvnements. Objet vnement : un objet contenant des informations sur loccurrence dun vnement particulier qui est envoy tous les couteurs lorsquun vnement est envoy. Cible dvnement : lobjet qui envoie un vnement. Par exemple, si lutilisateur clique sur un bouton situ dans un Sprite se trouvant dans la scne, tous ces objets envoient des vnements mais cest au niveau de la cible dvnement que se produit lvnement (le bouton cliqu, dans ce cas). Ecouteur : un objet ou une fonction qui sest enregistr(e) avec un objet, pour indiquer quil doit tre averti lorsquun vnement spcifique se produit.

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Tous les codes de ce chapitre comprennent un appel de la fonction trace() pour tester les rsultats du code. Pour tester les codes de ce chapitre :
1. 2. 3.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code dans le panneau Script.

338

Gestion dvnements

4.

Excutez le programme en slectionnant Contrle > Tester lanimation. Les rsultats des fonctions trace() des codes saffichent dans le panneau Sortie.

Certains codes sont plus complexes et sont crits sous la forme dune classe. Pour tester ces exemples :
1. 2.

Crez un document Flash vide et enregistrez-le sur votre ordinateur. Crez un nouveau fichier ActionScript et enregistrez-le dans le mme rpertoire que le document Flash. Le nom du fichier doit correspondre au nom de la classe du code. Par exemple, si le code dfinit une classe EventTest, enregistrez le fichier ActionScript sous le nom EventTest.as. Copiez le code dans le fichier ActionScript et enregistrez le fichier. Dans le document Flash, cliquez sur une partie vide de la scne ou de lespace de travail pour activer linspecteur Proprits du document. Dans linspecteur Proprits, dans le champ Classe du document, saisissez le nom de la classe ActionScript que vous avez copie du texte. Excutez le programme en slectionnant Contrle > Tester lanimation Les rsultats de lexemple saffichent dans le panneau Sortie.

3. 4.

5.

6.

Ces techniques de test des exemples de code sont dcrites de faon plus dtaille dans Test des exemples de code contenus dans un chapitre , la page 67.

Variation de la gestion dvnements dans ActionScript 3.0 par rapport aux versions antrieures
En ce qui concerne la gestion des vnements, la diffrence la plus vidente entre ActionScript 3.0 et les versions antrieures est quActionScript 3.0 comprend un seul systme de gestion des vnements alors que les anciennes versions dActionScript en comptent plusieurs. Cette section commence par une prsentation gnrale du fonctionnement de la gestion des vnements dans les versions prcdentes, puis tudie les nouveauts apportes par ActionScript 3.0 dans ce domaine.

Variation de la gestion dvnements dans ActionScript 3.0 par rapport aux versions antrieures

339

Gestion des vnements dans les versions prcdentes dActionScript


Antrieurement ActionScript 3.0, le langage ActionScript fournissait plusieurs mthodes de gestion des vnements :

Les gestionnaires dvnement on(), qui peuvent se placer directement sur des occurrences Button et MovieClip Les gestionnaires dvnement onClipEvent(), qui peuvent se placer directement sur des occurrences MovieClip Des proprits de fonction de rappel, telles que XML.onload et Camera.onActivity Des couteurs dvnements, que vous pouvez enregistrer laide de la mthode
addListener()

La classe UIEventDispatcher, qui mettait partiellement en uvre le modle dvnements DOM

Chacun de ces mcanismes prsente des avantages et des inconvnients. Les gestionnaires on() et onClipEvent() sont simples dutilisation, mais compliquent la maintenance des projets car il peut savrer difficile de localiser le code plac directement sur les boutons ou les clips. Les fonctions de rappel sont galement faciles mettre en uvre, mais imposent une limite dune seule fonction de rappel par vnement. La mise en uvre des couteurs dvnements est plus complexe : ils ncessitent non seulement la cration dun objet et dune fonction dcouteur mais aussi lenregistrement de lcouteur auprs de lobjet qui gnre lvnement. Bien quelle accroisse le temps systme ncessaire, cette solution vous permet de crer plusieurs objets couteur et de tous les enregistrer pour le mme vnement. Dans ActionScript 2.0, le dveloppement des composants engendrait un modle dvnements encore diffrent. Ce nouveau modle, caractris par la classe UIEventDispatcher, reposait sur un sous-ensemble de la spcification dvnements DOM. Ainsi, pour les dveloppeurs accoutums la gestion des vnements de composant, le passage au nouveau modle dvnements dActionScript 3.0 se fera sans trop de difficults. Malheureusement, si lon constate des recoupements entre les divers modles dvnements, il existe aussi des diffrences. Par exemple, dans ActionScript 2.0, certaines proprits, telles que TextField.onChanged, peuvent sutiliser soit comme fonction de rappel, soit comme couteur dvnements. Toutefois, la syntaxe qui permet denregistrer les objets couteurs varie selon que vous utilisez lune des six classes qui prennent en charge les couteurs ou la classe UIEventDispatcher. Pour les classes Key, Mouse, MovieClipLoader, Selection, Stage et TextField, vous utilisez la mthode addListener(), mais pour la gestion des vnements de composant, vous utilisez une mthode appele addEventListener().

340

Gestion dvnements

La multiplicit des modles de gestion dvnements a fait natre une autre complexit : ltendue de la fonction de gestionnaire dvnements variait largement en fonction du mcanisme utilis. En dautres termes, la signification du mot-cl this ntait pas cohrente sur lensemble des systmes de gestion dvnements.

Gestion dvnements dans ActionScript 3.0


ActionScript 3.0 utilise pour la premire fois un modle de gestion dvnements qui vient remplacer les nombreux mcanismes qui existaient dans les prcdentes versions du langage. Ce nouveau modle dvnements se fonde sur la spcification dvnements du modle dobjet de document (DOM, Document Object Model) niveau 3. Bien que le format de fichier SWF ne suive pas spcifiquement la norme DOM, il existe suffisamment de similitudes entre la liste daffichage et la structure du DOM pour permettre la mise en uvre de ce modle dvnements. Un objet de la liste daffichage est semblable un nud de la structure hirarchique du DOM ; dans ce chapitre, les termes objet de liste daffichage et nud sont dailleurs utiliss de faon interchangeable. La mise en uvre du modle dvnements DOM dans Flash Player comprend un concept appel comportements par dfaut. Un comportement par dfaut est une action que Flash Player effectue comme consquence normale de certains vnements.

Comportements par dfaut


Les dveloppeurs se chargent normalement dcrire le code qui permet de rpondre aux vnements. Dans certains cas, cependant, un comportement est si couramment associ un vnement que Flash Player lexcute automatiquement, sauf si le dveloppeur ajoute du code pour annuler son excution. Comme Flash Player se livre automatiquement cette opration, on parle de comportements par dfaut. Par exemple, lorsquun utilisateur entre du texte dans un objet TextField, il est si courant de voir safficher la saisie dans lobjet TextField en question que ce comportement est prdfini dans Flash Player. Si vous ne souhaitez pas conserver ce comportement par dfaut, vous pouvez lannuler laide du systme de gestion des vnements. Lorsquun utilisateur entre du texte dans un objet TextField, Flash Player cre une instance de la classe TextEvent afin de reprsenter cette saisie. Pour viter que Flash Player naffiche le texte dans lobjet TextField, vous devez accder cette instance TextEvent spcifique et appeler sa mthode preventDefault(). Certains comportements par dfaut ne peuvent tre vits. Par exemple, Flash Player gnre un objet MouseEvent lorsque lutilisateur double-clique sur un mot dans un objet TextField. Le comportement par dfaut, qui ne peut tre vit, consiste mettre en vidence le mot situ sous le curseur.
Variation de la gestion dvnements dans ActionScript 3.0 par rapport aux versions antrieures 341

De nombreux types dobjets vnement ne sont associs aucun comportement par dfaut. Par exemple, lobjet vnement Connect, que Flash Player distribue lorsquune connexion rseau est tablie, nest associe aucun comportement par dfaut. La documentation de lAPI relative la classe Event et ses sous-classes fait linventaire de chaque type dvnement, dcrit le comportement par dfaut qui lui est ventuellement associ et indique si ce dernier peut tre vit. Il est important de comprendre que les comportements par dfaut sont uniquement associs des objets vnement distribus par Flash Player ; il nen existe aucun pour les objets vnement distribus via ActionScript par programmation. Par exemple, vous pouvez utiliser les mthodes de la classe EventDispatcher pour distribuer un objet vnement du type textInput, mais cet objet ne sera associ aucun comportement par dfaut. En dautres termes, Flash Player naffiche aucun caractre dans un objet TextField en rponse un vnement textInput que vous avez distribu par programmation.

Nouveauts des couteurs dvnements dans ActionScript 3.0


Pour les dveloppeurs familiariss avec la mthode ActionScript 2.0 addListener(), il peut tre utile de souligner les diffrences entre le modle dcouteur dvnements dActionScript 2.0 et le modle dvnements dActionScript 3.0. La liste ci-aprs dcrit les principales diffrences entre ces deux modles dvnements :

Pour ajouter des couteurs dvnements dans ActionScript 2.0, vous utilisez, selon le cas, addListener() ou addEventListener(). Dans ActionScript 3.0, il faut utiliser addEventListener() dans tous les cas. ActionScript 2.0 ne propose aucun flux dvnements dans ActionScript 2.0, ce qui signifie que la mthode addListener() peut uniquement tre appele sur lobjet qui met lvnement. Dans ActionScript 3.0, la mthode addEventListener() peut tre appele sur tout objet faisant partie du flux dvnements. Dans ActionScript 2.0, les couteurs dvnements peuvent tre des fonctions, des mthodes ou des objets, alors que dans ActionScript 3.0, seules les fonctions et les mthodes peuvent agir comme couteurs dvnements.

342

Gestion dvnements

Flux dvnements
Flash Player distribue des objets vnement ds que survient un vnement. Si la cible dvnement ne se trouve pas dans la liste daffichage, Flash Player distribue lobjet vnement directement la cible. Par exemple, Flash Player distribue lobjet vnement Progress directement un objet URLStream. Cependant, si la cible dvnement se trouve dans la liste daffichage, Flash Player distribue lobjet vnement la liste daffichage, dans laquelle lobjet chemine jusqu atteindre la cible dvnement. Le flux dvnements reprsente le parcours que suivra un objet vnement dans la liste daffichage. Cette liste sorganise de manire hirarchique, pour constituer une arborescence. Au sommet de la liste daffichage se trouve la scne, un conteneur dobjet daffichage spcial qui lui sert de racine. La scne, reprsente par la classe flash.display.Stage, est uniquement accessible via un objet daffichage. Chaque objet daffichage prsente une proprit nomme stage, qui renvoie la scne de cette application. Lorsque Flash Player distribue un objet dvnement, celui-ci effectue un aller-retour entre la scne et le nud cible. Selon la dfinition de la spcification dvnements DOM, le nud cible est le nud qui reprsente la cible dvnement. En dautres termes, le nud cible est lobjet de la liste daffichage au niveau duquel est survenu lvnement. Par exemple, si lutilisateur clique sur un objet de la liste daffichage appel child1, Flash Player distribue un objet vnement dont le nud cible est child1. Le flux dvnements se dcompose en trois phases. La premire correspond la phase de capture, qui comprend tous les nuds de la scne jusquau parent du nud cible. La deuxime partie est appele la phase cible, qui comprend uniquement le nud cible. La troisime partie sappelle la phase de propagation vers le haut. Elle comprend les nuds rencontrs lors du cheminement du parent du nud cible jusqu la scne. Le nom de ces phases prend tout son sens si vous envisagez la liste daffichage comme une hirarchie verticale dont le sommet est la scne, comme illustr par le schma suivant :
Scne

Nud parent

Nud enfant1

Nud enfant2

Flux dvnements

343

Si un utilisateur clique sur Child1 Node, Flash Player distribue un objet vnement dans ce flux dvnements. Comme le montre lillustration suivante, le parcours de lobjet commence Stage. Lobjet descend ensuite jusqu Parent Node, puis vers Child1 Node. Il se propage alors vers le haut jusqu Stage, en repassant par Parent Node.
Scne Phase de capture Phase de propagation vers le haut Nud parent

Nud enfant1 Phase cible

Nud enfant2

Dans cet exemple, la phase de capture comprend Stage et Parent Node pendant le trajet descendant initial. La phase cible comprend le temps pass au nud Child1 Node. La phase de propagation comprend les nuds Parent Node et Stage, qui se trouvent sur le chemin du retour vers le nud racine. Le flux dvnements contribue au renforcement du systme de gestion des vnements par rapport aux versions prcdentes dActionScript. Dans ces dernires, le flux dvnements est inexistant, ce qui signifie que les couteurs dvnements sajoutent uniquement lobjet qui gnre lvnement. Dans ActionScript 3.0, vous pouvez ajouter des couteurs dvnements aussi bien un nud cible qu tout autre nud du flux dvnements. Cette possibilit dajouter des couteurs dvnements tout au long du flux dvnements savre particulirement utile lorsquun composant dinterface comprend plusieurs objets. Par exemple, un objet bouton contient souvent un objet texte qui sert de libell au bouton. Sans la possibilit dajouter un couteur au flux dvnements, il faudrait en ajouter un lobjet bouton et un lobjet texte pour tre sr dtre averti des vnements de clic survenant tout endroit du bouton. Le flux dvnements vous permet, au contraire, de placer un seul couteur dvnements sur lobjet bouton afin de grer les vnements de clic, quils se produisent sur lobjet texte ou sur des zones de lobjet bouton non couvertes par lobjet texte.

344

Gestion dvnements

Cependant, certains objets vnement ne participent pas aux trois phases du flux dvnements. Certains types dvnements, tels que enterFrame et init, sont distribus directement au nud cible et ne participent ni la phase de capture, ni la phase de propagation vers le haut. Dautres vnements peuvent cibler des objets qui ne font pas partie de la liste daffichage, par exemple les vnements distribus une instance de la classe Socket. Ces objets vnements aboutissent directement lobjet cible, sans participer la phase de capture et de propagation vers le haut. Pour savoir comme se comporte un type dvnement particulier, vous pouvez consulter la documentation de lAPI ou examiner les proprits de lobjet vnement. Cette dernire mthode est dcrite la section suivante.

Objets vnements
Les objets vnements jouent deux rles essentiels dans le nouveau systme de gestion des vnements. Tout dabord, ces objets reprsentent de vritables vnements puisquils stockent dans un ensemble de proprits des informations relatives des vnements prcis. Ils contient en outre un jeu de mthodes qui vous permet de manipuler les objets vnements et dagir sur le comportement du systme de gestion des vnements. Pour faciliter laccs ces proprits et ces mthodes, lAPI Flash Player dfinit une classe Event qui constitue la classe de base de tous les objets vnement. La classe Event dfinit un jeu fondamental de proprits et de mthodes commun tous les objets vnements. Cette section commence par tudier les proprits de la classe Event avant de dcrire les mthodes de cette mme classe, puis explique lexistence de sous-classes dans la classe Event.

Prsentation des proprits de la classe Event


La classe Event dfinit plusieurs proprits et constantes en lecture seule qui fournissent des informations essentielles sur lobjet vnement. Les points suivants revtent une importance particulire :

Les types dobjet vnement sont reprsents par des constantes et stocks dans la proprit Event.type. La possibilit dviter le comportement par dfaut dun vnement est reprsente par une valeur boolenne, stocke dans la proprit Event.cancelable. Les informations relatives au flux dvnements se trouvent dans les proprits restantes.

Objets vnements

345

Types dobjets vnement


Chaque objet vnement est associ un type dvnement. Les types dvnement sont stocks dans la proprit Event.type sous forme de chane. Il est utile de connatre le type dun objet vnement car votre code peut alors distinguer les objets de types diffrents. Par exemple, le code suivant spcifie que la fonction clickHandler() doit rpondre tous les objets vnements clic de souris transmis myDisplayObject :
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

La classe Event est elle-mme associe deux douzaines de types dvnement, reprsents par des constantes de la classe Event. Dans cet extrait de la dfinition de la classe Event, certaines de ces constantes sont illustres :
package flash.events { public class Event { // Constantes de classe public static const ACTIVATE:String = "activate"; public static const ADDED:String = "added"; // Les autres constantes sont omises par souci de concision } }

Ces constantes permettent de faire facilement rfrence des types dvnement prcis. Vous devez utiliser ces constantes au lieu des chanes quelles reprsentent. Si vous orthographiez de manire incorrecte un nom de constante dans votre code, le compilateur peut dtecter lerreur. Si vous utilisez les chanes quelles reprsentent, une erreur de frappe ne sera pas forcment dtecte lors de la compilation et pourrait provoquer un comportement inattendu, difficile dboguer. Par exemple, utilisez le code suivant pour ajouter un couteur dvnements :
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

plutt que :
myDisplayObject.addEventListener("click", clickHandler);

Informations de comportement par dfaut


Le code que vous crivez est en mesure de vrifier si le comportement par dfaut dun objet vnement donn peut tre vit. Pour ce faire, il doit accder la proprit cancelable. La proprit cancelable contient une valeur boolenne qui indique si le comportement par dfaut peut tre vit ou non. Vous pouvez viter, ou annuler, le comportement par dfaut de quelques vnements laide de la mthode preventDefault(). Pour plus dinformations, voir Annulation du comportement dvnement par dfaut , la page 350.

346

Gestion dvnements

Informations de flux dvnements


Les proprits restantes de la classe Event contiennent des informations importantes sur lobjet vnement et ses relations au flux dvnements, comme lexplique la liste suivante :

La proprit bubbles contient des informations sur les parties du flux dvnements auquel participe lobjet vnement. La proprit eventPhase indique la phase actuelle du flux dvnements. La proprit target stocke une rfrence la cible dvnement. La proprit currentTarget stocke une rfrence de lobjet de liste daffichage qui traite actuellement lobjet vnement.

La proprit bubbles On dit dun vnement quil se propage vers le haut (en anglais, to bubble ) lorsquil participe la phase de propagation vers le haut du flux dvnements, cest--dire quand lobjet vnement est transmis du nud cible via ses ascendants jusqu la scne. La proprit Event.bubbles stocke une valeur boolenne qui indique si lobjet vnement participe la phase de propagation vers le haut. Tous les vnements qui se propagent vers le haut participent galement aux phases de capture et cible ; de tels vnements participent donc aux trois phases du flux dvnements. Si la valeur est true, lobjet vnement participe aux trois phrases. Si la valeur est false, lobjet vnement ne participe pas la phase de propagation vers le haut. Proprit eventPhase Vous pouvez dterminer la phase dvnement de tout objet vnement grce sa proprit eventPhase. La proprit eventPhase a pour valeur un entier non sign qui reprsente lune des trois phases du flux dvnements. LAPI de Flash Player dfinit une classe EventPhase distincte qui contient trois constantes correspondant aux trois valeurs entires non signes, comme illustr par lextrait de code suivant :
package flash.events { public final class EventPhase { public static const CAPTURING_PHASE:uint = 1; public static const AT_TARGET:uint = 2; public static const BUBBLING_PHASE:uint = 3; } }

Objets vnements

347

Ces constantes correspondent aux trois valeurs valables pour la proprit eventPhase. Vous pouvez utiliser ces constantes pour amliorer la lisibilit de votre code. Supposons par exemple que vous souhaitiez tre sr quune fonction nomme myFunc() soit uniquement appele lorsque la cible dvnement se trouve dans la scne cible. Le code suivant vous permet de tester cette condition :
if (event.eventPhase == EventPhase.AT_TARGET) { myFunc(); }

Proprit target La proprit target contient une rfrence lobjet cible de lvnement. Dans certains cas, ce systme est simple, par exemple, lorsquun micro devient actif, la cible de lobjet vnement est lobjet Microphone. Toutefois, si la cible se trouve sur la liste daffichage, la hirarchie de cette dernire doit tre prise en compte. Par exemple, si un utilisateur clique avec la souris sur un point correspondant plusieurs objets de la liste daffichage qui se chevauchent, Flash Player choisit toujours comme cible dvnement lobjet qui se trouve le plus loin de la scne. Dans des fichiers SWF complexes, et particulirement ceux dont les boutons sont rgulirement orns dobjets enfant plus petits, la proprit target ne doit pas tre utilise frquemment car elle pointera souvent vers lobjet enfant du bouton plutt que vers le bouton lui-mme. Dans de telles situations, il est courant dajouter des couteurs dvnements au bouton et dutiliser la proprit currentTarget. En effet, cette dernire pointe vers le bouton alors que la proprit target peut pointer vers lun des enfants du bouton. Proprit currentTarget La proprit currentTarget contient une rfrence de lobjet de liste daffichage qui traite actuellement lobjet vnement. Mme sil peut paratre trange de ne pas savoir quel nud traite actuellement lobjet vnement que vous tudiez, gardez lesprit que vous pouvez ajouter une fonction couteur nimporte quel objet daffichage du flux dvnements de lobjet vnement en question. En outre, cette fonction couteur peut tre place tout endroit. Par ailleurs, la mme fonction couteur peut tre ajoute diffrents objets daffichage. Lutilit de la proprit currentTarget augmente donc avec la taille et la complexit du projet.

348

Gestion dvnements

Prsentation des mthodes de la classe Event


Il existe trois catgories de mthodes dans la classe Event :

Les mthodes dutilitaire, qui peuvent crer des copies dun objet vnement ou le convertir en chane Les mthodes de flux dvnements, qui suppriment les objets vnement du flux dvnements Les mthodes de comportement par dfaut, qui vitent le comportement par dfaut ou vrifient sil peut tre vit

Mthodes dutilitaire de la classe Event


La classe Event compte deux mthodes dutilitaire. La mthode clone() permet de crer des copies dun objet vnement. La mthode toString() permet de reprsenter sous forme de chanes les proprits dun objet vnement ainsi que leurs valeurs. Bien quutilises en interne par le modle dvnements, ces deux mthodes sont mises la disposition des dveloppeurs pour un usage gnrique. Pour les dveloppeurs expriments qui souhaitent crer des sous-classes de la classe Event, il est ncessaire de redfinir et de mettre en uvre des versions de ces deux mthodes dutilitaires afin de garantir le bon fonctionnement de la sous-classe dvnement.

Arrt du flux dvnements


La mthode Event.stopPropogation() ou Event.stopImmediatePropogation() vous permet darrter le cheminement dun objet vnement dans le flux dvnements. Quasi identiques, ces deux mthodes diffrent uniquement en ce que les autres couteurs dvnements du nud actuel sont autoriss ou non sexcuter :

La mthode Event.stopPropogation() empche lobjet vnement de passer au nud suivant mais seulement aprs que tous les autres couteurs du nud actuel ont t autoriss sexcuter. La mthode Event.stopImmediatePropogation() empche lobjet vnement de passer au nud suivant sans autoriser les autres couteurs du nud actuel sexcuter.

Quelle que soit la mthode appele, elle na aucun effet sur la ralisation du comportement par dfaut de lvnement. Utilisez les mthodes de comportement par dfaut de la classe Event pour viter le comportement par dfaut.

Objets vnements

349

Annulation du comportement dvnement par dfaut


Deux mthodes sont lies lannulation du comportement par dfaut : preventDefault() et isDefaultPrevented(). Appelez la mthode preventDefault() pour annuler le comportement par dfaut associ un vnement. Pour vrifier si preventDefault() a dj t appele sur un objet vnement, appelez la mthode isDefaultPrevented(), qui renvoie la valeur true si la mthode a dj t appele, false dans le cas contraire. La mthode preventDefault() fonctionne uniquement sil est possible dannuler le comportement par dfaut de lvnement. Pour vrifier que cest le cas, reportez-vous la documentation de lAPI de ce type dvnement ou examinez la proprit cancelable de lobjet vnement laide du code ActionScript. Lannulation du comportement par dfaut na aucun effet sur la progression dun objet vnement dans le flux dvnements. Utilisez les mthodes de flux dvnements de la classe Event pour supprimer un objet vnement du flux dvnements.

Sous-classes de la classe Event


Pour de nombreux vnements, le jeu de proprits commun, dfini dans la classe Event est suffisant. Nanmoins, dautres vnements prsentent des caractristiques exclusives qui ne peuvent tre captures par les proprits disponibles dans la classe Event. Pour ceux-l, lAPI de Flash Player dfinit plusieurs sous-classes de la classe Event. Chaque sous-classe fournit un complment de proprits et de types dvnement spcifiques la catgorie dvnement considre. Par exemple, les vnements lis aux actions de la souris prsentent plusieurs caractristiques uniques, que les proprits dfinies dans la classe Event ne peuvent capturer. La classe MouseEvent constitue une extension de la classe Event puisquelle ajoute dix proprits contenant des informations telles que lemplacement de lvnement de souris et les ventuelles touches actionnes en mme temps. Une sous-classe dEvent contient galement des constantes qui reprsentent de types dvnement associs la sous-classe. Par exemple, la classe MouseEvent dfinit des constantes pour plusieurs types dvnement de souris, notamment click, doubleClick, mouseDown et mouseUp. Comme le dcrit la section Mthodes dutilitaire de la classe Event , la page 349, lors de la cration dune sous-classe dEvent, vous devez bloquer les mthodes clone() et toString() pour fournir la fonctionnalit propre la sous-classe.

350

Gestion dvnements

Ecouteurs dvnements
Les couteurs dvnements, galement appels gestionnaires dvnements, sont des fonctions que Flash Player excute en rponse des vnements dtermins. La procdure dajout dun couteur dvnements se droule en deux temps. En premier lieu, vous crez une fonction ou mthode de classe que Flash Player doit excuter en rponse lvnement. On parle parfois de fonction dcouteur ou de fonction de gestionnaire dvnements. En second lieu, vous utilisez la mthode addEventListener() pour enregistrer la fonction dcouteur auprs de la cible de lvnement ou tout autre objet de la liste daffichage qui appartient au flux dvnements appropri.

Cration dune fonction dcouteur


La cration dune fonction dcouteur est un domaine dans lequel le modle dvnements ActionScript 3.0 diffre du modle dvnements DOM. Le modle dvnements DOM tablit une distinction claire entre lcouteur dvnements et la fonction dcouteur : un couteur dvnements est une instance de classe qui met en uvre linterface EventListener, tandis que la fonction dcouteur est une mthode de la classe appele handleEvent(). Dans le modle dvnements DOM, vous enregistrez linstance de classe qui contient la fonction dcouteur, plutt que la fonction dcouteur elle-mme. Le modle dvnements ActionScript ne fait aucune distinction entre lcouteur dvnements et la fonction dcouteur. Linterface EventListener est inexistante dans ActionScript 3.0 et les fonctions dcouteur peuvent tre dfinies en dehors de toute classe ou au sein dune classe. Par ailleurs, il nest pas ncessaire de nommer les fonctions dcouteur handleEvent() ; vous pouvez utiliser tout identifiant valable. Dans ActionScript 3.0, vous enregistrez le nom de la fonction dcouteur elle-mme.

Ecouteurs dvnements

351

Fonction dcouteur dfini en dehors de toute classe


Le code suivant cre un fichier SWF simple qui affiche une forme carre de couleur rouge. Une fonction dcouteur nomme clickHandler(), qui nappartient aucune classe, coute les vnements de clic de souris dans le carr rouge.
package { import flash.display.Sprite; public class ClickExample extends Sprite { public function ClickExample() { var child:ChildSprite = new ChildSprite(); addChild(child); } } } import flash.display.Sprite; import flash.events.MouseEvent; class ChildSprite extends Sprite { public function ChildSprite() { graphics.beginFill(0xFF0000); graphics.drawRect(0,0,100,100); graphics.endFill(); addEventListener(MouseEvent.CLICK, clickHandler); } } function clickHandler(event:MouseEvent):void { trace("clickHandler detected an event of type: " + event.type); trace("the this keyword refers to: " + this); }

Lorsquun utilisateur interagit avec le fichier SWF rsultant, en cliquant sur le carr, Flash Player gnre la sortie de trace ci-aprs :
clickHandler detected an event of type: click the this keyword refers to: [object global]

Notez que lobjet vnement est transmis sous forme dinstruction clickHandler(). Cela permet votre fonction dcouteur dexaminer lobjet vnement. Dans cet exemple, vous utilisez la proprit type de lobjet vnement pour vrifier que cet vnement correspond un clic. Lexemple vrifie aussi la valeur du mot-cl this. Dans ce cas, this reprsente lobjet global, ce qui est logique puisque la fonction est dfinie en dehors de toute classe ou objet personnalis.

352

Gestion dvnements

Fonction dcouteur dfinie comme mthode de classe


Lexemple ci-dessous est identique au prcdent, qui dfinit la classe ClickExample, sauf que la fonction clickHandler() est dfinie comme mthode de la classe ChildSprite :
package { import flash.display.Sprite; public class ClickExample extends Sprite { public function ClickExample() { var child:ChildSprite = new ChildSprite(); addChild(child); } } } import flash.display.Sprite; import flash.events.MouseEvent; class ChildSprite extends Sprite { public function ChildSprite() { graphics.beginFill(0xFF0000); graphics.drawRect(0,0,100,100); graphics.endFill(); addEventListener(MouseEvent.CLICK, clickHandler); } private function clickHandler(event:MouseEvent):void { trace("clickHandler detected an event of type: " + event.type); trace("the this keyword refers to: " + this); } }

Lorsquun utilisateur interagit avec le fichier SWF rsultant, en cliquant sur le carr rouge, Flash Player gnre la sortie de trace ci-aprs :
clickHandler detected an event of type: click the this keyword refers to: [object ChildSprite]

Ecouteurs dvnements

353

Notez que le mot-cl this renvoie linstance ChildSprite nomme child. Cela constitue un changement de comportement par rapport ActionScript 2.0. Si vous utilisiez des composants dans ActionScript 2.0, vous vous rappelez sans doute que lorsquune mthode de classe tait transmise UIEventDispatcher.addEventListener(), ltendue de la mthode tait lie au composant qui mettait lvnement, et non la classe dans laquelle la mthode dcouteur tait dfinie. En dautres termes, si vous utilisiez cette technique dans ActionScript 2.0, le motcl this renvoyait au composant mettant lvnement et non linstance ChildSprite. Pour certains dveloppeurs, il sagissait dun vrai problme car cela signifiait quils ne pouvaient accder aucune autre mthode et proprit de la classe qui contenait la mthode dcouteur. Pour le contourner, les programmeurs dActionScript 2.0 pouvaient utiliser la classe mx.util.Delegate pour modifier ltendue de la mthode dcouteur. Cette manipulation nest plus ncessaire puisque ActionScript 3.0 cre une mthode lie lorsque addEventListener() est appele. Par consquent, le mot-cl this fait rfrence linstance ChildSprite nomme child et le programmeur peut accder aux autres mthodes et proprits de la classe ChildSprite.

Ecouteur dvnement ne pas utiliser


Une troisime technique permet de crer un objet gnrique dont lune des proprits pointe vers une fonction dcouteur affecte dynamiquement. Elle est cependant dconseille. Nous lvoquons ici en raison de son utilisation courante dans ActionScript 2.0 ; il nest toutefois pas recommand de lutiliser dans ActionScript 3.0. Cette mise en garde tient au fait que le mot-cl this fera rfrence lobjet global et non lobjet couteur. Lexemple ci-aprs est identique lexemple prcdent de la classe ClickExample, sauf que la fonction dcouteur est dfinie comme faisant partie dun objet gnrique appel myListenerObj :
package { import flash.display.Sprite; public class ClickExample extends Sprite { public function ClickExample() { var child:ChildSprite = new ChildSprite(); addChild(child); } } }

354

Gestion dvnements

import flash.display.Sprite; import flash.events.MouseEvent; class ChildSprite extends Sprite { public function ChildSprite() { graphics.beginFill(0xFF0000); graphics.drawRect(0,0,100,100); graphics.endFill(); addEventListener(MouseEvent.CLICK, myListenerObj.clickHandler); } } var myListenerObj:Object = new Object(); myListenerObj.clickHandler = function (event:MouseEvent):void { trace("clickHandler detected an event of type: " + event.type); trace("the this keyword refers to: " + this); }

Les rsultats de trace seront les suivants :


clickHandler detected an event of type: click the this keyword refers to: [object global]

On sattendrait ce que this fasse rfrence myListenerObj et que la sortie de trace soit [object Object], mais le mot-cl renvoie en fait lobjet global. Lorsque vous transmettez un nom de proprit dynamique comme instruction addEventListener(), Flash Player est incapable de crer une mthode lie. En effet, ce que vous transmettez comme paramtre listener nest rien de plus que ladresse mmoire de votre fonction dcouteur ; Flash Player na aucun moyen de lier cette adresse linstance myListenerObj.

Ecouteurs dvnements

355

Gestion des couteurs dvnements


Vous pouvez grer vos fonctions dcouteur laide des mthodes de linterface IEventDispatcher. Cette interface est la version ActionScript 3.0 de linterface EventTarget du modle dvnements DOM. Bien que le nom IEventDispatcher semble impliquer que lobjet principal de la classe est lenvoi (ou la distribution) des objets vnements, les mthodes qui lui correspondent servent en fait plus souvent lenregistrement, la vrification et la suppression des couteurs dvnements. Linterface IEventDispatcher dfinit cinq mthodes, comme illustr dans le code suivant :
package flash.events { public interface IEventDispatcher { function addEventListener(eventName:String, listener:Object, useCapture:Boolean=false, priority:Integer=0, useWeakReference:Boolean=false):Boolean; function removeEventListener(eventName:String, listener:Object, useCapture:Boolean=false):Boolean; function dispatchEvent(eventObject:Event):Boolean; function hasEventListener(eventName:String):Boolean; function willTrigger(eventName:String):Boolean; } }

LAPI de Flash Player met en uvre linterface IEventDispatcher laide de la classe Event Dispatcher. Cette dernire constitue la classe de base de toutes les classes pouvant servir de cibles dvnement ou faire partie dun flux dvnements. Par exemple, la classe DisplayObject hrite de la classe EventDispatcher, par consquent, tout objet de la liste daffichage peut accder aux mthode de linterface IEventDispatcher.

356

Gestion dvnements

Ajout des couteurs dvnements


La mthode addEventListener() est la cl de vote de linterface IEventDispatcher. Elle permet denregistrer les fonctions dcouteurs. Les deux paramtres requis sont type et listener. Le paramtre type spcifie le type dvnement. Avec le paramtre listener, vous pouvez spcifier la fonction dcouteur qui doit sexcuter lorsque lvnement survient. Le paramtre listener peut tre une rfrence une fonction ou une mthode de classe.
REMARQUE

Nutilisez pas de parenthses lors de la spcification du paramtre listener. Par exemple, la fonction clickHandler() est spcifie sans parenthses dans lappel suivant la mthode addEventListener() : addEventListener(MouseEvent.CLICK, clickHandler).

Le paramtre useCapture de la mthode addEventListener() vous permet de contrler la phase du flux dvnements pendant laquelle votre couteur sera actif. Si useCapture a la valeur true, votre couteur sera actif pendant la phase de capture du flux dvnements. Si useCapture a la valeur false, votre couteur sera actif pendant la phase cible et la phase de propagation du flux dvnements. Pour couter un vnement pendant toutes les phases du flux dvnements, vous devez appeler deux fois addEventListener() ; la premire fois useCapture prend la valeur true, la seconde, useCapture prend la valeur false. Le paramtre priority de la mthode addEventListener() ne fait pas officiellement partie du modle dvnements DOM de niveau 3. Il est inclus dans ActionScript 3.0 pour vous offrir une plus grande souplesse dans lorganisation de vos couteurs dvnements. Lorsque vous appelez addEventListener(), vous pouvez dfinir la priorit de cet couteur dvnements en transmettant une valeur entire comme paramtre priority. La valeur par dfaut est 0. Vous pouvez toutefois utiliser une valeur entire ngative ou positive. Plus le nombre est lev, plus lexcution de lcouteur dvnements est rapide. Les couteurs dvnements de priorit quivalente sont excuts suivant lordre dans lequel ils ont t ajouts : plus lcouteur est ajout tt, plus il est excut rapidement. Le paramtre useWeakReference vous permet de spcifier si la rfrence la fonction dcouteur est faible ou normale. En lui attribuant la valeur true, vous vitez les situations dans lesquelles les fonctions dcouteurs demeurent dans la mmoire alors quelles sont inutiles. Flash Player utilise une technique appele nettoyage pour effacer de la mmoire les objets qui ne servent plus. Un objet est considr comme inutilis lorsquil napparat dans aucune rfrence. Le nettoyeur de mmoire ignore les rfrences faibles, cest--dire quune fonction dcouteur vers laquelle pointe uniquement une rfrence faible est incluse dans le nettoyage.

Ecouteurs dvnements

357

Ce paramtre prsente une consquence importante concernant lutilisation des vnements dobjets daffichage. On sattendrait normalement ce quun objet daffichage soit supprim de la mmoire ds sa suppression de la liste daffichage. Cependant, si dautres objets se sont enregistrs comme couteurs auprs de lobjet daffichage, avec le paramtre useWeakReference ayant la valeur par dfaut false, lobjet daffichage persiste dans la mmoire Flash Player bien quil ne saffiche plus lcran. Pour pallier ce problme, soit vous enregistrez tous les couteurs auprs de lobjet daffichage en attribuant au paramtre useWeakReference la valeur true, soit vous supprimez tous les couteurs dvnements de lobjet daffichage laide de la mthode removeEventListener().

Suppression des couteurs dvnements


La mthode removeEventListener() permet de supprimer un couteur dvnements dont vous navez plus besoin. Il est judicieux de supprimer tous les couteurs qui ne seront plus utiliss. Les paramtres requis sont notamment eventName et listener, soit les mmes que ceux requis pour la mthode addEventListener(). Rappel : pour couter les vnements pendant toutes les phases du flux dvnements, vous pouvez appeler addEventListener() deux fois, en attribuant useCapture la valeur true la premire, puis false la seconde. Pour supprimer les deux couteurs dvnements, il serait ncessaire dappeler removeEventListener() deux reprises, la premire fois en attribuant la valeur true useCapture, la seconde fois en utilisant la valeur false.

Distribution dvnements
La mthode dispatchEvent() peut servir aux dveloppeurs chevronns pour distribuer un objet vnement personnalis dans le flux dvnements. Cette mthode accepte un seul paramtre, une rfrence lobjet vnement, qui doit tre une instance de la classe Event ou de lune de ces sous-classes. Aprs distribution, la proprit target de lobjet vnement est dfinie avec lobjet sur lequel portait lappel dispatchEvent().

Vrification des couteurs dvnements existants


Les deux dernires mthodes de linterface IEventDispatcher fournissent des informations prcieuses sur lexistence des couteurs dvnements. La mthode hasEventListener() renvoie la valeur true si un couteur dvnements est dtect pour un type dvnement spcifique sur un objet particulier de la liste daffichage. La mthode willTrigger() renvoie galement la valeur true si un couteur est dtect pour un objet donn de la liste daffichage. Cependant willTrigger() vrifie les couteurs sur lobjet daffichage en question mais galement sur tous les ascendants de cet objet dans lensemble des phases du flux dvnements.

358

Gestion dvnements

Evnements derreur sans couteurs


Plus que les vnements, les exceptions constituent le mcanisme principal de gestion des erreurs dans ActionScript 3.0. Toutefois, la gestion des exceptions ne fonctionne pas sur les oprations asynchrones telles que les chargements de fichiers. Si une erreur survient pendant une opration asynchrone, Flash Player distribue un objet vnement derreur. Si vous ne crez pas dcouteur pour lvnement derreur, la version de dbogage de Flash Player affiche une bote de dialogue comportant des informations sur lerreur en question. Par exemple, si vous utilisez une URL incorrecte lors du chargement dun fichier, la version de dbogage de Flash Player affiche la bote de dialogue suivante :

La plupart des vnements derreur reposent sur la classe ErrorEvent. Ils prsentent donc une proprit nomme text, qui sert au stockage du message derreur que Flash Player affiche. Il existe deux exceptions : les classe StatusEvent et NetStatusEvent. Ces deux classes possdent une proprit level (StatusEvent.level et NetStatusEvent.info.level). Lorsque la valeur de la proprit level est error, ces types dvnement sont considrs comme des vnements derreur. Un vnement derreur ninterrompt pas lexcution du fichier SWF. Il se traduit uniquement par laffichage dune bote de dialogue dans les versions de dbogage des navigateurs et des lecteurs autonomes, dun message dans le panneau de sortie du lecteur de cration et dune entre dans le fichier journal dAdobe Flex Builder 2. Aucune manifestation nest visible dans les autres versions de Flash Player.

Ecouteurs dvnements

359

Exemple : un rveil
Lexemple Alarm Clock correspond une horloge qui permet lutilisateur de dterminer lheure laquelle lalarme doit se dclencher et dafficher un message en mme temps. Il repose sur lapplication SimpleClock du Chapitre 5, Utilisation des dates et heures et illustre de nombreux aspects de lutilisation des vnements dans ActionScript 3.0, notamment les suivants :

Ecoute des vnements et rponse Notification dun vnement aux couteurs Cration dun type dvnement personnalis

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers dapplication Alarm Clock se trouvent dans le dossier Samples/AlarmClock. Il sagit des fichiers suivants :
Fichier
AlarmClockApp.mxml ou AlarmClockApp.fla com/example/programmingas3/clock/ AlarmClock.as com/example/programmingas3/clock/ AlarmEvent.as

Description
Le fichier dapplication principal dans Flash (FLA) ou Flex (MXML). Classe permettant dtendre la classe SimpleClock, qui ajoute la fonctionnalit de rveil. Une classe dvnement personnalis (sous-classe de flash.events.Event), qui sert dobjet vnement lvnement alarm de la classe AlarmClock. Dessine une horloge ronde et les aiguilles des heures, des minutes et des secondes en fonction de lheure (dcrit dans lexemple SimpleClock). Composant dinterface dhorloge dot dune fonctionnalit simple de mesure temporelle (dcrit dans lexemple SimpleClock).

com/example/programmingas3/clock/ AnalogClockFace.as

com/example/programmingas3/clock/ SimpleClock.as

360

Gestion dvnements

Prsentation du rveil
Dans cet exemple, la principale fonctionnalit de lhorloge (dont la mesure du temps et laffichage du cadran) rutilise le code de lapplication SimpleClock, dcrite dans Exemple : une horloge analogique simple , la page 213. La classe AlarmClock tend la classe SimpleClock de cet exemple en y ajoutant la fonctionnalit de rveil requise : rglage de lheure de dclenchement et avertissement une fois lalarme dclenche. Le rle des vnements est de fournir un avertissement lorsque se produit quelque chose. La classe AlarmClock expose lvnement Alarme, lcoute duquel dautres objets peuvent tre placs afin deffectuer les actions voulues. En outre, la classe AlarmClock utilise une instance de la classe Timer pour dterminer quel moment dclencher lalarme. Comme la classe AlarmClock, la classe Timer fournit un vnement pour avertir dautres objets (une instance AlarmClock dans ce cas) une fois un certain dlai coul. Comme dans la plupart des applications ActionScript, les vnements constituent une part importante de la fonctionnalit de lexemple Alarm Clock.

Dclenchement de lalarme
Comme mentionn plus haut, la seule fonctionnalit de la classe AlarmClock est lie la dfinition et au dclenchement de lalarme. La classe intgre Timer (flash.utils.Timer) permet au dveloppeur de dfinir du code qui sera excut aprs un dlai spcifique. La classe AlarmClock utilise une instance Timer pour dterminer le moment auquel dclencher lalarme.
import flash.events.TimerEvent; import flash.utils.Timer; /** * Timer sera utilis pour lalarme. */ public var alarmTimer:Timer; ... /** * Instancie une nouvelle AlarmClock dune taille donne. */ public override function initClock(faceSize:Number = 200):void { super.initClock(faceSize); alarmTimer = new Timer(0, 1); alarmTimer.addEventListener(TimerEvent.TIMER, onAlarm); }

Exemple : un rveil

361

Linstance Timer dfinie dans la classe AlarmClock est nomme alarmTimer. La mthode initClock(), qui effectue les oprations de configuration ncessaires linstance AlarmClock, exploite la variable alarmTimer de deux manires. Tout dabord, la variable est instancie avec les paramtres indiquant linstance Timer dattendre 0 millisecondes et de dclencher lvnement timer une seule fois. Aprs instanciation de alarmTimer, le code appelle la mthode addEventListener() de cette variable pour indiquer quil veut couter lvnement timer de cette variable. Le fonctionnement dune instance Timer repose sur la distribution de lvnement timer aprs un certain dlai. La classe AlarmClock doit savoir quand lvnement timer est distribu afin de dclencher sa propre alarme. En appelant addEventListener(), le code AlarmClock senregistre comme couteur auprs de alarmTimer. Les deux paramtres indiquent que la classe AlarmClock souhaite couter lvnement timer (indiqu par la constante TimerEvent.TIMER), et que lorsque lvnement survient, la mthode onAlarm() de la classe AlarmClock doit tre appele en rponse lvnement. Pour effectivement dfinir lalarme, la mthode setAlarm() de la classe AlarmClock est appele, comme suit :
/** * Dfinit lheure laquelle lalarme doit se dclencher. * @param hour La partie Heure de lheure dalarme. * @param hour La partie Minutes de lheure dalarme. * @param message Le message afficher lorsque lalarme se dclenche. * @return Dfinit lheure laquelle lalarme se dclenchera. */ public function setAlarm(hour:Number = 0, minutes:Number = 0, message:String = "Alarm!"):Date { this.alarmMessage = message; var now:Date = new Date(); // Crer cette heure sur la date du jour. alarmTime = new Date(now.fullYear, now.month, now.date, hour, minutes); // Dterminer si lheure spcifie est dj passe aujourdhui. if (alarmTime <= now) { alarmTime.setTime(alarmTime.time + MILLISECONDS_PER_DAY); } // Arrter le minuteur de lalarme sil est dj dfini. alarmTimer.reset(); // Calculer le nombre de millisecondes qui doit scouler avant // que lalarme ne se dclenche (diffrence entre lheure dalarme et // lheure actuelle) et dfinir cette valeur comme dlai du minuteur // dalarme. alarmTimer.delay = Math.max(1000, alarmTime.time - now.time); alarmTimer.start(); return alarmTime; }

362

Gestion dvnements

Cette mthode effectue plusieurs oprations, notamment le stockage du message dalarme et la cration dun objet Date (alarmTime) reprsentant le moment rel o lalarme se dclenchera. Point le plus important de cette tude, le minuteur de la variable alarmTimer, dans les dernires lignes la mthode, est dfini et activ. Tout dabord, la mthode reset() est appele, qui arrte le minuteur et le remet zro sil est dj reparti. Ensuite, lheure actuelle (reprsente par la variable now) est soustraite la valeur de la variable alarmTime afin de dterminer combien de millisecondes doivent scouler avant le dclenchement de lalarme. La classe Timer ne dclenche pas lvnement timer une heure absolue ; cest ce dcalage relatif qui est attribu la proprit delay de alarmTimer. Enfin, la mthode start() est appele pour lancer le minuteur. Une fois le dlai spcifi coul, alarmTimer distribue lvnement timer. Comme la classe AlarmClock sest enregistre comme couteur auprs de sa mthode onAlarm() pour lvnement timer, lorsque celui-ci survient, onAlarm() est appele.
/** * Appele lorsque lvnement Timer est distribu. */ public function onAlarm(event:TimerEvent):void { trace("Alarm!"); var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage); this.dispatchEvent(alarm); }

Lorsquune mthode est enregistre comme couteur dvnements, elle doit tre dfinie avec la signature adapte (cest--dire le jeu de paramtres et le type de renvoi de la mthode). Pour couter lvnement timer de la classe Timer, une mthode doit comporter un paramtre dont le type de donnes est TimerEvent (flash.event.TimerEvent), une sous-classe de la classe Event. Lorsque linstance Timer appelle ses couteurs dvnements, elle transmet une instance TimerEvent lobjet vnement.

Exemple : un rveil

363

Notification de lalarme dautres composants


De mme que la classe Timer, la classe AlarmClock fournit un vnement qui permet de transmettre des notifications dautres lments de code lorsque lalarme se dclenche. Pour quune classe puisse utiliser le systme de gestion des vnements intgr ActionScript, elle doit mettre en uvre linterface flash.events.IEventDispatcher. La plupart du temps, cela se fait par extension de la classe flash.events.EventDispatcher, qui assure une mise en uvre standard de IEventDispatcher (ou par extension de lune des sous-classe de EventDispatcher). Comme dcrit prcdemment, la classe AlarmClock tend la classe SimpleClock, qui son tour tend la classe Sprite, elle-mme extension de la classe EventDispatcher (par hritage). Ainsi, la classe AlarmClock intgre dj une fonctionnalit lui permettant de fournir ses propres vnements. Dautres lments de code peuvent senregistrer pour tre notifis de lvnement alarm de la classe AlarmClock en appelant la mthode addEventListener(), hrite de EventDispatcher. Lorsquune instance AlarmClock est prte notifier dautres lments de code le dclenchement de lvnement alarm, elle le fait en appelant la mthode dispatchEvent(), galement hrite de EventDispatcher.
var alarm:AlarmEvent = new AlarmEvent(this.alarmMessage); this.dispatchEvent(alarm);

Ces lignes de code sont extraites de la mthode onAlarm() de la classe AlarmClock (prsente plus haut dans son intgralit). La mthode dispatchEvent() de linstance AlarmClock est appele, puis elle notifie tous les couteurs enregistrs le dclenchement de lvnement alarm de linstance AlarmClock. Le paramtre transmis dispatchEvent() est lobjet vnement qui sera ensuite pass aux mthodes dcouteur. Dans ce cas, il sagit dune instance de la classe AlarmEvent, une sous-classe de Event cre spcialement pour cet exemple.

Elaboration dun vnement dalarme personnalis


Tous les couteurs dvnements reoivent un paramtre dobjet vnement avec des informations sur lvnement qui a t dclench. Dans bien des cas, lobjet vnement est une instance de la classe Event. Dans dautres cas nanmoins, il savre utile de fournir des informations complmentaires aux couteurs dvnements. Comme dcrit plus haut dans ce chapitre, il suffit pour cela de dfinir une nouvelle classe, sous-classe de la classe Event, et dutiliser une instance de cette classe comme objet vnement. Dans cet exemple, une instance AlarmEvent est utilise comme objet vnement lorsque lvnement alarm de la classe AlarmClock est distribu. La classe AlarmEvent, prsente ici, fournit des informations complmentaires sur lvnement alarm, savoir le message dalarme :

364

Gestion dvnements

import flash.events.Event; /** * Cette classe Event personnalise ajoute une proprit message un vnement classique. */ public class AlarmEvent extends Event { /** * Le nom du nouveau type AlarmEvent. */ public static const ALARM:String = "alarm"; /** * Un message texte qui peut tre transmis un gestionnaire dvnements * avec cet objet vnement. */ public var message:String; /** /* Constructeur. * @param message Le texte afficher lorsque lalarme se dclenche. */ public function AlarmEvent(message:String = "ALARM!") { super(ALARM); this.message = message; } ... }

Le meilleur moyen de crer une classe dobjet vnement personnalise est de dfinir une classe qui tend la classEvent, comme illustr dans lexemple prcdent. Pour complter la fonctionnalit hrite, la classe AlarmEvent dfinit une proprit message qui contient le texte du message dalarme associ lvnement. La valeur message est transmise sous forme de paramtre au constructeur AlarmEvent. La classe AlarmEvent dfinit galement la constante ALARM qui peut servir rfrencer lvnement (alarm) lors de lappel de la mthode addEventListener() de la classe AlarmClock.

Exemple : un rveil

365

Outre lajout de fonctionnalit, chaque sous-classe Event doit redfinir la mthode clone() hrite dans le cadre de la gestion des vnements ActionScript. Les sous-classes Event peuvent ventuellement redfinir la mthode toString() afin dinclure les proprits de lvnement personnalis dans la valeur renvoye par lappel de la mthode toString().
/** * Cre et renvoie une copie de linstance actuelle. * @return Copie de linstance actuelle. */ public override function clone():Event { return new AlarmEvent(message); } /** * Renvoie une chane contenant toutes les proprits de * linstance actuelle. * @return Chane reprsentant linstance actuelle. */ public override function toString():String { return formatToString("AlarmEvent", "type", "bubbles", "cancelable", "eventPhase", "message"); }

La mthode clone() redfinie doit renvoyer une nouvelle instance de la sous-classe Event personnalise, avec toutes les proprits personnalises dfinies pour correspondre linstance actuelle. Dans la mthode toString() redfinie, la mthode dutilitaire formatToString() (hrite de Event) sert fournir une chane comportant le nom du type personnalis, ainsi que les noms et valeurs de toutes ses proprits.

366

Gestion dvnements

CHAPITRE 11

Utilisation de XML
ActionScript 3.0 inclut un groupe de classes bas sur la spcification ECMAScript pour XML (E4X) (ECMA-357 version 2). Ces classes comprennent une fonctionnalit puissante et facile utiliser permettant de travailler avec des donnes XML. A laide dE4X, vous pouvez dvelopper un code avec des donnes XML plus rapidement quavec les techniques de programmation prcdentes. En outre, le code que vous produisez est plus facile lire. Ce chapitre dcrit comment utiliser E4X pour traiter des donnes XML.

11

Contenu
Principes de base de XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .368 Lapproche E4X concernant le traitement XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 Objets XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .374 XMLList, objet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 Initialisation de variables XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 Assemblage et transformation dobjets XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 Parcours de structures XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 Utilisation despaces de nom XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 Conversion de type XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .388 Lecture de documents XML externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 Exemple : Chargement de donnes RSS depuis Internet . . . . . . . . . . . . . . . . . . . . 390

367

Principes de base de XML


Introduction lutilisation de XML
XML est un moyen standard de reprsenter des informations structures afin de permettre aux ordinateurs de les utiliser facilement et aux utilisateurs de les crire et de les comprendre. XML est labrviation de eXtensible Markup Language. La norme XML est disponible ladresse www.w3.org/XML/. XML offre une faon pratique et standard de classer des donnes, afin de faciliter leur lecture, leur accs et leur manipulation. XML utilise une arborescence et une structure de balises identique HTML. Voici un exemple simple de donnes XML :
<song> <title>What you know?</title> <artist>Steve and the flubberblubs</artist> <year>1989</year> <lastplayed>2006-10-17-08:31</lastplayed> </song>

Les donnes XML peuvent galement tre plus complexes, avec des balises imbriques dans dautres balises ainsi que des attributs et dautres composants structurels. Voici un exemple plus complexe de donnes XML :
<album> <title>Questions, unanswered</title> <artist>Steve and the flubberblubs</artist> <year>1989</year> <tracks> <song tracknumber="1" length="4:05"> <title>What do you know?</title> <artist>Steve and the flubberblubs</artist> <lastplayed>2006-10-17-08:31</lastplayed> </song> <song tracknumber="2" length="3:45"> <title>Who do you know?</title> <artist>Steve and the flubberblubs</artist> <lastplayed>2006-10-17-08:35</lastplayed> </song> <song tracknumber="3" length="5:14"> <title>When do you know?</title> <artist>Steve and the flubberblubs</artist> <lastplayed>2006-10-17-08:39</lastplayed> </song>

368

Utilisation de XML

<song tracknumber="4" length="4:19"> <title>Do you know?</title> <artist>Steve and the flubberblubs</artist> <lastplayed>2006-10-17-08:44</lastplayed> </song> </tracks> </album>

Vous remarquerez que ce document XML contient dautres structures XML compltes (les balises song avec leurs enfants, par exemple). Il dmontre galement dautres structures XML telles que des attributs (tracknumber et length dans les balises song), et des balises qui contiennent dautres balises au lieu de donnes (la balise tracks, par exemple).

Bien dmarrer avec XML


Si vous avez peu ou pas dexprience avec XML, voici une brve description des aspects les plus courants des donnes XML. Les donnes XML sont crites sous forme de texte brut, avec une syntaxe spcifique permettant dorganiser les informations en un format structur. Gnralement, un seul jeu de donnes XML est appel un document XML. Dans le format XML, les donnes sont organises en lments (qui peuvent tre des lments de donnes uniques ou des conteneurs pour dautres lments) laide dune structure hirarchique. Chaque document XML possde un lment comme niveau suprieur ou lment principal. Cet lment racine peut contenir une seule information, mme sil est plus probable quil contienne dautres lments qui, leur tour, contiennent dautres lments, et ainsi de suite. Par exemple, ce document XML contient les informations relatives un album musical :
<song tracknumber="1" length="4:05"> <title>What do you know?</title> <artist>Steve and the flubberblubs</artist> <mood>Happy</mood> <lastplayed>2006-10-17-08:31</lastplayed> </song>

Chaque lment se distingue par un ensemble de balisesle nom de llment plac entre chevrons (signes infrieur et suprieur ). La balise de dbut, indiquant le dbut de llment, porte le nom de llment :
<title>

La balise de fin, qui marque la fin de llment, a une barre oblique avant le nom de llment :
</title>

Si un lment est vide, il peut tre crit comme lment vide (parfois appel lment de fin automatique). Dans XML, cet lment :
<lastplayed/>

Principes de base de XML

369

est identique cet lment :


<lastplayed></lastplayed>

Outre le contenu de llment plac entre les balises de dbut et de fin, un lment peut comporter dautres valeurs, appeles attributs, dfinis dans la balise de dbut de llment. Par exemple, cet lment XML dfinit un seul attribut appel length, avec la valeur 4:19 :
<song length="4:19"></song>

Chaque lment XML possde un contenu qui est soit une valeur, soit un ou plusieurs lments XML, ou rien du tout (pour un lment vide).

En savoir plus sur XML


Pour en savoir plus sur lutilisation de XML, un grand nombre de livres et de ressources sont disponibles, ainsi que les sites Web suivants :

Didacticiel W3Schools XML : http://w3schools.com/xml/ XML.com : http://www.xml.com/ Didacticiels XMLpitstop, listes de discussion, etc. : http://xmlpitstop.com/

Classes ActionScript pour utiliser XML


ActionScript 3.0 inclut plusieurs classes permettant dutiliser des informations structures XML. Les deux classes principales sont les suivantes :

XML : reprsente un seul lment XML, qui peut tre un document XML avec plusieurs enfants ou un lment une seule valeur dans un document. XMLList : reprsente un ensemble dlments XML. Un objet XMLList est utilis lorsque plusieurs lments XML sont des frres (au mme niveau, et contenus par le mme parent, dans la hirarchie du document XML). Par exemple, une instance XMLList serait le moyen le plus facile dutiliser cet ensemble dlments XML (probablement contenus dans un document XML) :
<artist type="composer">Fred Wilson</artist> <artist type="conductor">James Schmidt</artist> <artist type="soloist">Susan Harriet Thurndon</artist>

Pour des utilisations plus avances impliquant des espaces de noms XML, ActionScript inclut galement les classes Namespace et QName. Pour plus dinformations, voir Utilisation despaces de nom XML , la page 387. Outre les classes intgres permettant dutiliser XML, ActionScript 3.0 comprend galement plusieurs oprateurs offrant des fonctionnalits spcifiques pour accder et manipuler des donnes XML. Cette approche dutilisation de XML au moyen de ces classes et de ces oprateurs est appele ECMAScript pour XML (E4X), comme dfini par la spcification ECMA-357 version 2.

370

Utilisation de XML

Tches XML courantes


Lorsque vous utilisez XML dans ActionScript, il est probable que vous effectuiez les tches suivantes :

Construction de documents XML (ajout dlments et de valeurs) Accs des lments, valeurs et attributs XML Filtrage (recherche dans) dlments XML Passage en boucle sur un ensemble dlments XML Conversion de donnes entre des classes XML et la classe String Utilisation despaces de nom XML Chargement de fichiers XML externes

Concepts et termes importants


La liste de rfrence suivante contient les termes importants utiliss dans ce chapitre :

Elment : un seul lment dans un document XML, identifi comme le contenu se trouvant entre une balise de dbut et une balise de fin (balises comprises). Les lments XML peuvent contenir des donnes de texte ou dautres lments, ou bien tre vides. Elment vide : un lment XML qui ne contient aucun lment enfant. Les lments vides sont souvent crits en tant que balises de fin automatique (<element/>, par exemple). Document : une structure XML unique. Un document XML peut contenir nimporte quel nombre dlments (ou peut tre constitu dun seul lment vide) ; cependant, un document XML peut avoir un seul lment de niveau suprieur qui contient tous les autres lments dans le document. Nud : un autre nom pour un lment XML. Attribut : une valeur nomme associe un lment qui est crit dans la balise de dbut de llment au format attributename="value", plutt que dtre crit comme lment enfant spar imbriqu dans llment.

Principes de base de XML

371

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Tous les codes de ce chapitre comprennent lappel de la fonction trace(). Pour tester les codes de ce chapitre :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code dans le panneau Script. Excutez le programme en slectionnant Contrle > Tester lanimation. Les rsultats de la fonction trace() saffichent dans le panneau de sortie.

Ceci ainsi que dautres techniques de test des codes sont dcrits en dtail dans Test des exemples de code contenus dans un chapitre , la page 67.

Lapproche E4X concernant le traitement XML


La spcification ECMAScript pour XML dfinit un ensemble de classes et de fonctionnalits permettant dutiliser des donnes XML. Cet ensemble de classes et de fonctionnalits est connu sous le nom de E4X. ActionScript 3.0 comprend les classes E4X suivantes : XML, XMLList, QName et Namespace. Les mthodes, proprits et oprateurs des classes E4X sont conus avec les objectifs suivants :

SimplicitLorsque cela est possible, E4X facilite lcriture et la comprhension du code utiliser avec des donnes XML. CohrenceLes mthodes et le raisonnement E4X sont cohrents avec eux-mmes et avec dautres parties dActionScript. ConnaissanceVous manipulez des donnes XML avec des oprateurs bien connus tels que loprateur point (.).
ActionScript 2.0 comprenait une classe XML. Dans ActionScript 3.0, cette classe a t renomme XMLDocument afin dtre compatible avec la classe XML dActionScript 3.0 faisant partie dE4X. Dans ActionScript 3.0, les classes hritesXMLDocument, XMLNode, XMLParser et XMLTagsont comprises dans le package flash.xml, pour la prise en charge du contenu hrit principalement. Les nouvelles classes E4X sont des classes de base. Vous ne devez pas importer de package pour les utiliser. Ce chapitre ne dcrit pas les classes XML dActionScript 2.0 hrites de faon dtaille. Pour de plus amples informations, voir le package flash.xml dans la Rfrence du langage et des composants ActionScript 3.0.

372

REMARQUE

Utilisation de XML

Voici un exemple de manipulation de donnes avec E4X :


var myXML:XML = <order> <item id='1'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order>

Votre application charge souvent des donnes XML depuis une source externe telle quun service Web ou un flux RSS. Nanmoins, par souci de clart, les exemples fournis dans ce chapitre affectent des donnes XML comme littraux. Comme lindique le code suivant, E4X inclut des oprateurs intuitifs tels que les oprateurs point (.) et identificateur dattribut (@) pour accder aux proprits et aux attributs dans lXML :
trace(myXML.item[0].menuName); // Rsultat : burger trace(myXML.item.(@id==2).menuName); // Rsultat : fries trace(myXML.item.(menuName=="burger").price); // Rsultat : 3.95

Utilisez la mthode appendChild() pour affecter un nouveau nud enfant lXML, comme lindique le code suivant :
var newItem:XML = <item id="3"> <menuName>medium cola</menuName> <price>1.25</price> </item> myXML.appendChild(newItem);

Utilisez les oprateurs @ et . non seulement pour lire des donnes mais galement pour les affecter, comme dans lexemple suivant :
myXML.item[0].menuName="regular burger"; myXML.item[1].menuName="small fries"; myXML.item[2].menuName="medium cola"; myXML.item.(menuName=="regular burger").@quantity = "2"; myXML.item.(menuName=="small fries").@quantity = "2"; myXML.item.(menuName=="medium cola").@quantity = "2";

Lapproche E4X concernant le traitement XML

373

Utilisez une boucle for pour parcourir en boucle les nuds de lXML, comme suit :
var total:Number = 0; for each (var property:XML in myXML.item) { var q:int = Number(property.@quantity); var p:Number = Number(property.price); var itemTotal:Number = q * p; total += itemTotal; trace(q + " " + property.menuName + " $" + itemTotal.toFixed(2)) } trace("Total: $", total.toFixed(2));

Objets XML
Un objet XML peut reprsenter un lment XML, un attribut, un commentaire, une instruction de traitement ou un lment de texte. Un objet XML est class soit dans la catgorie des objets ayant un contenu simple, soit dans celle des objets ayant un contenu complexe. Un objet XML ayant des nuds enfants est considr comme ayant un contenu complexe. Le contenu simple dun objet XML peut tre lun des lments suivants : un attribut, un commentaire, une instruction de traitement ou un nud de texte. Par exemple, lobjet XML suivant contient un contenu complexe, y compris un commentaire et une instruction de traitement :
XML.ignoreComments = false; XML.ignoreProcessingInstructions = false; var x1:XML = <order> <!--This is a comment. --> <?PROC_INSTR sample ?> <item id='1'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order>

Comme lindique lexemple suivant, vous pouvez maintenant utiliser les mthodes comments() et processingInstructions() pour crer des objets XML, un commentaire et une instruction de traitement :
var x2:XML = x1.comments()[0]; var x3:XML = x1.processingInstructions()[0];

374

Utilisation de XML

Proprits XML
La classe XML a cinq proprits statiques :

Les proprits ignoreComments et ignoreProcessingInstructions dterminent si les commentaires ou les instructions de traitement sont ignors lorsque lobjet XML est analys. La proprit ignoreWhitespace dtermine si les espaces blancs sont ignors dans les balises dun lment et les expressions intgres spares uniquement par des espaces blancs. Les proprits prettyIndent et prettyPrinting servent formater le texte renvoy par les mthodes toString() et toXMLString() de la classe XML.

Pour de plus amples informations sur ces proprits, voir Rfrence du langage et des composants ActionScript 3.0.

Mthodes XML
Les mthodes suivantes vous permettent dutiliser la structure hirarchique des objets XML :

appendChild() child() childIndex() children() descendants() elements() insertChildAfter() insertChildBefore() parent() prependChild()

Les mthodes suivantes vous permettent dutiliser des attributs dobjet XML :

attribute() attributes()

Les mthodes suivantes vous permettent dutiliser des proprits dobjet XML :

hasOwnProperty() propertyIsEnumerable() replace() setChildren()

Objets XML

375

Les mthodes suivantes vous permettent dutiliser des espaces de nom et des noms qualifis :

addNamespace() inScopeNamespaces() localName() name() namespace() namespaceDeclarations() removeNamespace() setLocalName() setName() setNamespace()

Les mthodes suivantes vous permettent dutiliser et de dterminer certains types de contenu XML :

comments() hasComplexContent() hasSimpleContent() nodeKind() processingInstructions() text()

Les mthodes suivantes vous permettent deffectuer des conversions en chanes et de formater des objets XML :

defaultSettings() setSettings() settings() normalize() toString() toXMLString()

Il existe quelques mthodes supplmentaires :


contains() copy() valueOf() length()

Pour de plus amples informations sur ces mthodes, voir Rfrence du langage et des composants ActionScript 3.0.
376 Utilisation de XML

XMLList, objet
Une instance XMLList reprsente un ensemble arbitraire dobjets XML. Elle peut contenir des documents XML complets, des fragments XML ou les rsultats dune requte XML. Les mthodes suivantes vous permettent dutiliser la structure hirarchique des objets XMLList :

child() children() descendants() elements() parent()

Les mthodes suivantes vous permettent dutiliser des attributs dobjet XMLList :

attribute() attributes()

Les mthodes suivantes vous permettent dutiliser des proprits XMLList :


hasOwnProperty() propertyIsEnumerable()

Les mthodes suivantes vous permettent dutiliser et de dterminer certains types de contenu XML :

comments() hasComplexContent() hasSimpleContent() processingInstructions() text()

Les mthodes suivantes vous permettent deffectuer des conversions en chanes et de formater les objets XMLList :

normalize() toString() toXMLString()

Il existe quelques mthodes supplmentaires :


contains() copy() length() valueOf()

XMLList, objet

377

Pour de plus amples informations sur ces mthodes, voir Rfrence du langage et des composants ActionScript 3.0. Pour un objet XMLList qui contient exactement un lment XML, vous pouvez utiliser toutes les proprits et les mthodes de la classe XML car un XMLList avec un lment XML est trait comme un objet XML. Par exemple, dans le code suivant, tant donn que doc.div est un objet XMLList contenant un lment, vous pouvez utiliser la mthode appendChild() de la classe XML :
var doc:XML = <body> <div> <p>Hello</p> </div> </body>; doc.div.appendChild(<p>World</p>);

Pour consulter la liste des mthodes et des proprits XML, voir Objets XML , la page 374.

Initialisation de variables XML


Vous pouvez affecter un littral XML un objet XML, comme suit :
var myXML:XML = <order> <item id='1'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order>

Comme indiqu dans le code suivant, vous pouvez galement utiliser le constructeur new pour crer une instance dun objet XML partir dune chane contenant des donnes XML :
var str:String = "<order><item id='1'><menuName>burger</menuName>" + "<price>3.95</price></item></order>"; var myXML:XML = new XML(str);

378

Utilisation de XML

Si les donnes XML dans la chane ne sont pas bien formes (par exemple, sil manque une balise de fin), une erreur dexcution se produit. Vous pouvez galement transmettre des donnes par rfrence ( partir dautres variables) dans un objet XML, comme indiqu dans lexemple suivant :
var tagname:String = "item"; var attributename:String = "id"; var attributevalue:String = 5; var content:String = "Chicken"; var x:XML = <{tagname} {attributename}={attributevalue}>{content}</ {tagname}>; trace(x.toXMLString()) // Rsultat : <item id="5">Chicken</item>

Pour charger des donnes XML depuis un URL, utilisez la classe URLLoader, comme indiqu dans lexemple suivant :
import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; var externalXML:XML; var loader:URLLoader = new URLLoader(); var request:URLRequest = new URLRequest("xmlFile.xml"); loader.load(request); loader.addEventListener(Event.COMPLETE, onComplete); function onComplete(event:Event):void { var loader:URLLoader = event.target as URLLoader; if (loader != null) { externalXML = new XML(loader.data); trace(externalXML.toXMLString()); } else { trace("loader is not a URLLoader!"); } }

Pour lire des donnes XML depuis une connexion de socket, utilisez la classe XMLSocket. Pour de plus amples informations, voir lentre XMLSocket dans la Rfrence du langage et des composants ActionScript 3.0.

Initialisation de variables XML

379

Assemblage et transformation dobjets XML


Utilisez la mthode prependChild() ou appendChild() pour ajouter une proprit au dbut ou la fin de la liste des proprits dun objet XML, comme indiqu dans lexemple suivant :
var x1:XML = <p>Line 1</p> var x2:XML = <p>Line 2</p> var x:XML = <body></body> x = x.appendChild(x1); x = x.appendChild(x2); x = x.prependChild(<p>Line 0</p>); // x == <body><p>Line 0</p><p>Line 1</p><p>Line 2</p></body>

Utilisez la mthode insertChildBefore() ou insertChildAfter() pour ajouter une proprit avant ou aprs une proprit spcifie, comme suit :
var x:XML = <body> <p>Paragraph 1</p> <p>Paragraph 2</p> </body> var newNode:XML = <p>Paragraph 1.5</p> x = x.insertChildAfter(x.p[0], newNode) x = x.insertChildBefore(x.p[2], <p>Paragraph 1.75</p>)

Comme indiqu dans lexemple suivant, vous pouvez galement utiliser des accolades ( { et } ) pour transmettre des donnes par rfrence ( partir dautres variables) lorsque vous construisez des objets XML :
var ids:Array = [121, 122, 123]; var names:Array = [["Murphy","Pat"], ["Thibaut","Jean"], ["Smith","Vijay"]] var x:XML = new XML("<employeeList></employeeList>"); for (var i:int = 0; i < 3; i++) { var newnode:XML = new XML(); newnode = <employee id={ids[i]}> <last>{names[i][0]}</last> <first>{names[i][1]}</first> </employee>; x = x.appendChild(newnode) }

380

Utilisation de XML

Vous pouvez affecter des proprits et des attributs un objet XML laide de loprateur =, comme dans lexemple suivant :
var x:XML = <employee> <lastname>Smith</lastname> </employee> x.firstname = "Jean"; x.@id = "239";

Ceci dfinit lobjet XML x de la faon suivante :


<employee id="239"> <lastname>Smith</lastname> <firstname>Jean</firstname> </employee>

Vous pouvez utiliser les oprateurs + et += pour concatner des objets XMLList :
var x1:XML = <a>test1</a> var x2:XML = <b>test2</b> var xList:XMLList = x1 + x2; xList += <c>test3</c>

Ceci dfinit lobjet XMLList xList de la faon suivante :


<a>test1</a> <b>test2</b> <c>test3</c>

Parcours de structures XML


Lune des fonctions puissantes dXML est sa capacit fournir des donnes imbriques, complexes, via une chane linaire de caractres de texte. Lorsque vous chargez des donnes dans un objet XML, ActionScript les analyse et charge sa structure hirarchique en mmoire (ou envoie une erreur dexcution si les donnes XML ne sont pas formes correctement). Les oprateurs et les mthodes des objets XML et XMLList permettent de parcourir aisment la structure des donnes XML.

Parcours de structures XML

381

Utilisez loprateur point (.) et loprateur daccesseur descendant (..) pour accder aux proprits enfants dun objet XML. Considrez lobjet XML suivant :
var myXML:XML = <order> <book ISBN="0942407296"> <title>Baking Extravagant Pastries with Kumquats</title> <author> <lastName>Contino</lastName> <firstName>Chuck</firstName> </author> <pageCount>238</pageCount> </book> <book ISBN="0865436401"> <title>Emu Care and Breeding</title> <editor> <lastName>Case</lastName> <firstName>Justin</firstName> </editor> <pageCount>115</pageCount> </book> </order>

Lobjet myXML.book est un objet XMLList contenant des proprits enfants de lobjet myXML appeles book. Ces deux objets XML correspondent aux deux proprits book de lobjet myXML. Lobjet myXML..lastName est un objet XMLList contenant des proprits descendantes appeles lastName. Ces deux objets XML correspondent aux deux proprits lastName de lobjet myXML. Lobjet myXML.book.editor.lastName est un objet XMLList contenant les enfants appels des enfants nomms editor des enfants appels book de lobjet myXML : dans ce cas, un objet XMLList contenant un seul objet XML (la proprit lastName avec la valeur "Case").
lastName

Accs aux noeuds enfants et parents


La mthode parent() renvoie le parent dun objet XML. Vous pouvez utiliser les valeurs dindex ordinales dune liste enfant pour accder des objets enfants spcifiques. Par exemple, considrez un objet XML myXML ayant deux proprits enfants nommes book. Chaque proprit enfant appele book possde un numro dindex qui lui est associ :
myXML.book[0] myXML.book[1]

382

Utilisation de XML

Pour accder un petit-enfant spcifique, vous pouvez indiquer des numros dindex pour les noms de lenfant et du petit-enfant :
myXML.book[0].title[0]

Cependant, sil nexiste quun seul enfant de x.book[0] nomm title, vous pouvez omettre la rfrence dindex, comme suit :
myXML.book[0].title

De mme, sil nexiste quun seul enfant book de lobjet x, et si cet objet enfant possde un seul objet title, vous pouvez omettre les deux rfrences dindex, de la faon suivante :
myXML.book.title

Vous pouvez utiliser la mthode child() pour accder des enfants ayant des noms bass sur une variable ou une expression, comme indiqu dans lexemple suivant :
var myXML:XML = <order> <book> <title>Dictionary</title> </book> </order>; var childName:String = "book"; trace(myXML.child(childName).title) // rsultat : Dictionary

Accs des attributs


Utilisez le symbole @ (loprateur identificateur dattribut) pour accder aux attributs dans un objet XML ou XMLList, comme indiqu dans le code suivant :
var employee:XML = <employee id="6401" code="233"> <lastName>Wu</lastName> <firstName>Erin</firstName> </employee>; trace(employee.@id); // 6401

Vous pouvez utiliser le symbole de caractre gnrique * avec le symbole @ pour accder tous les attributs dun objet XML ou XMLList, comme dans le code suivant :
var employee:XML = <employee id="6401" code="233"> <lastName>Wu</lastName> <firstName>Erin</firstName> </employee>; trace(employee.@*.toXMLString()); // 6401 // 233

Parcours de structures XML

383

Vous pouvez utiliser la mthode attribute() ou attributes() pour accder un attribut spcifique ou tous les attributs dun objet XML ou XMLList, comme dans le code suivant :
var employee:XML = <employee id="6401" code="233"> <lastName>Wu</lastName> <firstName>Erin</firstName> </employee>; trace(employee.attribute("id")); // 6401 trace(employee.attribute("*").toXMLString()); // 6401 // 233 trace(employee.attributes().toXMLString()); // 6401 // 233

Vous pouvez galement utiliser la syntaxe suivante pour accder des attributs, comme indiqu dans lexemple suivant :
employee.attribute("id") employee["@id"] employee.@["id"]

Ils sont tous quivalents employee.@id. Nanmoins, la syntaxe employee.@id est lapproche privilgie.

Filtrage par attribut ou valeur dlment


Vous pouvez utiliser les oprateurs parenthses ( et ) pour filtrer des lments avec un nom dlment spcifique ou une valeur dattribut. Considrez lobjet XML suivant :
var x:XML = <employeeList> <employee id="347"> <lastName>Zmed</lastName> <firstName>Sue</firstName> <position>Data analyst</position> </employee> <employee id="348"> <lastName>McGee</lastName> <firstName>Chuck</firstName> <position>Jr. data analyst</position> </employee> </employeeList>

Les expressions suivantes sont toutes valides :


x.employee.(lastName == "McGee")Il

sagit du deuxime nud employee. sagit de la proprit firstName

x.employee.(lastName == "McGee").firstNameIl

du deuxime nud employee.

384

Utilisation de XML

x.employee.(lastName == "McGee").@idIl

sagit de la valeur de lattribut id du

deuxime nud employee.


x.employee.(@id == 347)Le

premier nud employee. sagit de la proprit lastName du premier

x.employee.(@id == 347).lastNameIl

nud employee.

x.employee.(@id > 300)Il

sagit dun XMLList avec deux proprits employee. sagit dun

x.employee.(position.toString().search("analyst") > -1)Il

XMLList avec deux proprits position. Si vous tentez de filtrer en fonction dattributs ou dlments qui nexistent pas, Adobe Flash Player renvoie une exception. Par exemple, la dernire ligne du code suivant gnre une erreur car il nexiste aucun attribut id dans le deuxime lment p :
var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>; trace(doc.p.(@id == '123'));

De mme, la dernire ligne du code suivant gnre une erreur car il nexiste aucune proprit b du second lment p :
var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>; trace(doc.p.(b == 'Bob'));

Pour viter ces erreurs, vous pouvez identifier les proprits ayant les lments ou les attributs correspondants, laide des mthodes attribute() et elements(), comme dans le code suivant :
var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>; trace(doc.p.(attribute('id') == '123')); trace(doc.p.(elements('b') == 'Bob'));

Parcours de structures XML

385

Vous pouvez galement utiliser la mthode hasOwnProperty(), comme dans le code suivant :
var doc:XML = <body> <p id='123'>Hello, <b>Bob</b>.</p> <p>Hello.</p> </body>; trace(doc.p.(hasOwnProperty('@id') && @id == '123')); trace(doc.p.(hasOwnProperty('b') && b == 'Bob'));

Utilisation des instructions for..in et for each..in


ActionScript 3.0 comprend les instructions for..in et for each..in pour parcourir en boucle des objets XMLList. Par exemple, considrez lobjet XML suivant, myXML, et lobjet XMLList, myXML.item. Lobjet XMLList, myXML.item, est constitu de deux nuds item de lobjet XML.
var myXML:XML = <order> <item id='1' quantity='2'> <menuName>burger</menuName> <price>3.95</price> </item> <item id='2' quantity='2'> <menuName>fries</menuName> <price>1.45</price> </item> </order>;

Linstruction for..in vous permet de procder une itration pour un ensemble de noms de proprit dans un XMLList :
var total:Number = 0; for (var pname:String in myXML.item) { total += myXML.item.@quantity[pname] * myXML.item.price[pname]; }

Linstruction for each..in vous permet de parcourir en boucle les proprits dans lXMLList :
var total2:Number = 0; for each (var prop:XML in myXML.item) { total2 += prop.@quantity * prop.price; }

386

Utilisation de XML

Utilisation despaces de nom XML


Les espaces de nom dans un objet (ou document) XML identifient le type de donnes que contient lobjet. Par exemple, lorsque vous envoyez et fournissez des donnes XML un service Web qui utilise le protocole de messagerie SOAP, vous dclarez lespace de nom dans la balise de dbut de lXML :
var message:XML = <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <soap:Body xmlns:w="http://www.test.com/weather/"> <w:getWeatherResponse> <w:tempurature >78</w:tempurature> </w:getWeatherResponse> </soap:Body> </soap:Envelope>;

Lespace de nom a un prfixe, soap, et un URI qui dfinit lespace de nom, http://schemas.xmlsoap.org/soap/envelope/. ActionScript 3.0 inclut la classe Namespace pour utiliser des espaces de nom XML. Pour lobjet XML dans lexemple prcdent, vous pouvez utiliser la classe Namespace comme suit :
var soapNS:Namespace = message.namespace("soap"); trace(soapNS); // Rsultat : http://schemas.xmlsoap.org/soap/envelope/ var wNS:Namespace = new Namespace("w", "http://www.test.com/weather/"); message.addNamespace(wNS); var encodingStyle:XMLList = message.@soapNS::encodingStyle; var body:XMLList = message.soapNS::Body; message.soapNS::Body.wNS::GetWeatherResponse.wNS::tempurature = "78";

La classe XML inclut les mthodes suivantes pour utiliser des espaces de nom : addNamespace(), inScopeNamespaces(), localName(), name(), namespace(), namespaceDeclarations(), removeNamespace(), setLocalName(), setName(), et setNamespace(). La directive default xml namespace vous permet daffecter un espace de nom par dfaut pour des objets XML. Par exemple, dans lexemple suivant, x1 et x2 ont le mme espace de nom par dfaut :
var ns1:Namespace = new Namespace("http://www.example.com/namespaces/"); default xml namespace = ns1; var x1:XML = <test1 />; var x2:XML = <test2 />;

Utilisation despaces de nom XML

387

Conversion de type XML


Vous pouvez convertir des objets XML et XMLList en valeurs String. De mme, vous pouvez convertir des chanes en objets XML et XMLList. Sachez que toutes les valeurs dattribut XML, les noms et les valeurs de texte sont des chanes. Les sections suivantes dcrivent toutes ces formes de conversion de type XML.

Conversion dobjets XML et XMLList en chanes


Les classes XML et XMLList contiennent les mthodes toString() et toXMLString(). La mthode toXMLString() renvoie une chane qui comprend toutes les balises, les attributs, les dclarations despace de nom et le contenu de lobjet XML. Pour les objets XML ayant un contenu complexe (lments enfants), la mthode toString() procde exactement comme la mthode toXMLString(). Pour les objets XML ayant un contenu simple (ceux qui contiennent un seul lment de texte), la mthode toString() renvoie uniquement le contenu de texte de llment, comme indiqu dans lexemple suivant :
var myXML:XML = <order> <item id='1' quantity='2'> <menuName>burger</menuName> <price>3.95</price> </item> <order>; trace(myXML.item[0].menuName.toXMLString()); // <menuName>burger</menuName> trace(myXML.item[0].menuName.toString()); // burger

Si vous utilisez la mthode trace() sans spcifier toString() ou toXMLString(), les donnes sont converties laide de la mthode toString() par dfaut, comme indiqu dans le code suivant :
var myXML:XML = <order> <item id='1' quantity='2'> <menuName>burger</menuName> <price>3.95</price> </item> <order>; trace(myXML.item[0].menuName); // burger

Lorsque vous utilisez la mthode trace() pour dboguer un code, vous pouvez utiliser la mthode toXMLString() de faon ce que la mthode trace() gnre des donnes plus compltes.
388 Utilisation de XML

Conversion de chanes en objets XML


Vous pouvez utiliser le constructeur new XML() pour crer un objet XML partir dune chane, comme suit :
var x:XML = new XML("<a>test</a>");

Si vous tentez de convertir une chane en XML partir dune chane qui reprsente un XML non valide ou un XML qui nest pas form correctement, une erreur dexcution est renvoye, comme suit :
var x:XML = new XML("<a>test"); // renvoi dune erreur

Conversion de valeurs dattribut, de noms et de valeurs de texte partir de chanes


Toutes les valeurs dattribut XML, les noms et les valeurs de texte sont des types de donnes String que vous pouvez convertir en dautres types de donnes. Par exemple, le code suivant utilise la fonction Number() pour convertir des valeurs de texte en nombres :
var myXML:XML = <order> <item> <price>3.95</price> </item> <item> <price>1.00</price> </item> </order>; var total:XML = <total>0</total>; myXML.appendChild(total); for each (var item:XML in myXML.item) { myXML.total.children()[0] = Number(myXML.total.children()[0]) + Number(item.price.children()[0]); } trace(myXML.total); // 4.35;

Si ce code nutilisait pas la fonction Number(), le code interprterait loprateur + comme loprateur de concatnation de chane, et la mthode trace() dans la dernire ligne gnrerait les lments suivants :
01.003.95

Conversion de type XML

389

Lecture de documents XML externes


Vous pouvez utiliser la classe URLLoader pour charger des donnes XML depuis une URL. Pour utiliser le code suivant dans vos applications, remplacez la valeur XML_URL dans lexemple par une URL valide :
var myXML:XML = new XML(); var XML_URL:String = "http://www.example.com/Sample3.xml"; var myXMLURL:URLRequest = new URLRequest(XML_URL); var myLoader:URLLoader = new URLLoader(myXMLURL); myLoader.addEventListener("complete", xmlLoaded); function xmlLoaded(event:Event):void { myXML = XML(myLoader.data); trace("Data loaded."); }

Vous pouvez galement utiliser la classe XMLSocket pour dfinir une connexion de socket XML asynchrone avec un serveur. Pour plus dinformations, voir Rfrence du langage et des composants ActionScript 3.0.

Exemple : Chargement de donnes RSS depuis Internet


Lexemple dapplication RSSViewer prsente plusieurs fonctions dutilisation dXML dans ActionScript, notamment :

Utilisation de mthodes XML pour parcourir des donnes XML sous la forme dun flux RSS. Utilisation de mthodes XML pour assembler des donnes XML sous la forme HTML utiliser dans un champ texte.

390

Utilisation de XML

Le format RSS est largement utilis pour diffuser des nouvelles via XML. Un fichier de donnes RSS simple peut avoir laspect suivant :
<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>Alaska - Weather</title> <link>http://www.nws.noaa.gov/alerts/ak.html</link> <description>Alaska - Watches, Warnings and Advisories</description> <item> <title> Short Term Forecast - Taiya Inlet, Klondike Highway (Alaska) </title> <link> http://www.nws.noaa.gov/alerts/ak.html#A18.AJKNK.1900 </link> <description> Short Term Forecast Issued At: 2005-04-11T19:00:00 Expired At: 2005-04-12T01:00:00 Issuing Weather Forecast Office Homepage: http://pajk.arh.noaa.gov </description> </item> <item> <title> Short Term Forecast - Haines Borough (Alaska) </title> <link> http://www.nws.noaa.gov/alerts/ak.html#AKZ019.AJKNOWAJK.190000 </link> <description> Short Term Forecast Issued At: 2005-04-11T19:00:00 Expired At: 2005-04-12T01:00:00 Issuing Weather Forecast Office Homepage: http://pajk.arh.noaa.gov </description> </item> </channel> </rss>

Lapplication SimpleRSS lit les donnes RSS depuis Internet, analyse les donnes la recherche de titres, de liens et de descriptions et renvoie ces donnes. La classe SimpleRSSUI fournit lIU et appelle la classe SimpleRSS qui effectue le traitement XML.

Exemple : Chargement de donnes RSS depuis Internet

391

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/ learn_programmingAS3samples_flash_fr. Les fichiers dapplication RSSViewer se trouvent dans le dossier Samples/RSSViewer. Cette application se compose des fichiers suivants :
Fichier
RSSViewer.mxml ou RSSViewer.fla

Description
Le fichier dapplication principal dans Flash (FLA) ou Flex (MXML).

com/example/programmingas3/rssViewer/ Une classe qui contient des mthodes utilisant RSSParser.as E4X pour parcourir des donnes (XML) RSS et gnrer une reprsentation HTML correspondante. RSSData/ak.rss Un exemple de fichier RSS. Cette application est dfinie pour lire des donnes RSS partir du Web, sur un flux RSS Flex hberg par Adobe. Nanmoins, vous pouvez facilement modifier lapplication pour lire des donnes RSS depuis ce document qui utilise un schma lgrement diffrent de celui du flux RSS Flex.

Lecture et analyse de donnes XML


La classe RSSParser comprend une mthode xmlLoaded() qui convertit les donnes RSS dentre, stockes dans la variable rssXML, en une chane contenant une sortie formate HTML, rssOutput. Vers le dbut de la mthode, le code dfinit lespace de nom XML par dfaut si les donnes RSS source comprennent un espace de nom par dfaut :
if (rssXML.namespace("") != undefined) { default xml namespace = rssXML.namespace(""); }

Les lignes suivantes parcourent ensuite en boucle le contenu des donnes XML source, en examinant chaque proprit descendante nomme item :
for each (var item:XML in rssXML..item) { var itemTitle:String = item.title.toString(); var itemDescription:String = item.description.toString(); var itemLink:String = item.link.toString(); outXML += buildItemHTML(itemTitle, itemDescription, itemLink); }

392

Utilisation de XML

Les trois premires lignes dfinissent simplement des variables de chane pour reprsenter les proprits de titre, de description et de lien de la proprit item des donnes XML. La ligne suivante appelle la mthode buildItemHTML() pour obtenir des donnes HTML sous la forme dun objet XMLList, laide des trois nouvelles variables de chane comme paramtres.

Assemblage de donnes XMLList


Les donnes HTML (un objet XMLList) ont la forme suivante :
<b>itemTitle</b> <p> itemDescription <br /> <a href="link"> <font color="#008000">More...</font> </a> </p>

Les premires lignes de la mthode effacent lespace de nom xml par dfaut :
default xml namespace = new Namespace();

La directive default xml namespace a un domaine de niveau bloc de fonction. Cela signifie que le domaine de cette dclaration est la mthode buildItemHTML(). Les lignes qui suivent assemblent lXMLList en fonction des arguments de chane transmis la fonction :
var body:XMLList = new XMLList(); body += new XML("<b>" + itemTitle + "</b>"); var p:XML = new XML("<p>" + itemDescription + "</p>"); var link:XML = <a></a>; link.@href = itemLink; // <link href="itemLinkString"></link> link.font.@color = "#008000"; // <font color="#008000"></font></a> // 0x008000 = green link.font = "More..."; p.appendChild(<br/>); p.appendChild(link); body += p;

Cet objet XMLList reprsente des donnes de chane adaptes un champ texte HTML dActionScript. La mthode xmlLoaded() utilise la valeur de renvoi de la mthode buildItemHTML() et la convertit en une chane :
XML.prettyPrinting = false; rssOutput = outXML.toXMLString();

Exemple : Chargement de donnes RSS depuis Internet

393

Extraction du titre du flux RSS et envoi dun vnement personnalis


La mthode xmlLoaded() dfinit une variable de chane rssTitle, en fonction des informations contenues dans les donnes XML RSS source :
rssTitle = rssXML.channel.title.toString();

Pour finir, la mthode xmlLoaded() gnre un vnement qui notifie lapplication que les donnes sont analyses et disponibles :
dataWritten = new Event("dataWritten", true);

394

Utilisation de XML

CHAPITRE 12

Programmation de laffichage
La programmation de laffichage en ActionScript 3.0 permet de contrler des lments qui apparaissent sur la scne dAdobe Flash Player 9. Ce chapitre dcrit les concepts de base permettent dutiliser des lments affichs lcran, ainsi que lorganisation des lments visuels. Vous apprendrez aussi crer vos propres classes pour afficher des objets.

12

Sommaire
Bases de la programmation de laffichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 Classes daffichage de base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 Avantages de lutilisation de la liste daffichage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 Utilisation des objets daffichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 Manipulation des objets daffichage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 Masquage des objets daffichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 Animation des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 Exemple : SpriteArranger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451

Bases de la programmation de laffichage


Introduction la programmation de laffichage
Chaque application cre laide dActionScript 3.0 comporte une hirarchie des objets affichs, appele liste daffichage. La liste daffichage contient tous les lments visibles de lapplication. Ces derniers appartiennent un ou plusieurs des groupes suivants :

La scne

395

La scne est le conteneur de base des objets affichs. Chaque application possde un objet Scne, qui contient tous les objets visibles lcran. La scne est le conteneur de niveau suprieur, elle figure au sommet de la hirarchie de la liste daffichage :
Scne Stage

Instance de la classe principale du fichier SWF

Objet daffichage

Conteneur dobjet daffichage

Conteneur dobjet daffichage

Objet daffichage

Conteneur dobjet daffichage

Objet daffichage

Conteneur dobjet daffichage

Chaque fichier SWF est associ une classe ActionScript, appele la classe principale du fichier SWF. Lorsque Flash Player ouvre un fichier SWF dans une page HTML, il appelle la fonction constructeur de cette classe, et linstance qui est cre (et qui est toujours un type dobjet daffichage) est ajoute comme enfant de lobjet Scne. La classe principale dun fichier SWF tend toujours la classe Sprite (pour plus dinformations, consultez la section Avantages de lutilisation de la liste daffichage , la page 403). La proprit stage de toute instance de DisplayObject permet daccder la scne. Pour plus dinformations, consultez la section Dfinition des proprits de la scne , la page 413.

396

Programmation de laffichage

Objets daffichage En ActionScript 3.0, tous les lments dune application qui apparaissent lcran sont des types dobjets daffichage. Le paquet flash.display comprend une classe DisplayObject, qui est une classe de base que de nombreuses autres classes tendent. Ces diffrentes classes reprsentent divers types dobjets daffichage (formes vectorielles, clips ou champs texte par exemple). Pour un aperu de ces classes, consultez la section Avantages de lutilisation de la liste daffichage , la page 403.

Conteneurs des objets daffichage Les conteneurs des objets daffichage sont des types spciaux dobjets daffichage qui, outre leur propre reprsentation visuelle, peuvent galement contenir des objets daffichage enfants. La classe DisplayObjectContainer est une sous-classe de la classe DisplayObject. Un objet DisplayObjectContainer peut contenir plusieurs objets daffichage dans sa liste dobjets enfants. Par exemple, lillustration ci-dessous reprsente un type dobjet DisplayObjectContainer appel Sprite et contenant divers objets daffichage :
Objet SimpleButton. Ce type dobjet daffichage possde des tats up , down et over . Objet Bitmap. Dans ce cas prcis, lobjet Bitmap a t charg partir dun fichier JPEG externe, via un objet Loader. Objet Shape. Le cadre contient un rectangle arrondi trac en ActionScript. Un filtre Ombre porte est appliqu lobjet Shape.

Objet TextField.

Dans le contexte des objets daffichage, les objets DisplayObjectContainer sont galement appels conteneurs dobjets daffichage ou simplement conteneurs. Bien que tous les objets daffichage visibles hritent de la classe DisplayObject, le type de chacun dentre eux est une sous-classe spcifique de la classe DisplayObject. Par exemple, les classes Shape et Video possdent toutes deux une fonction constructeur, mais ce nest pas le cas de la classe DisplayObject. Comme nous lavons dj mentionn, la scne elle-mme est un conteneur dobjets daffichage.

Bases de la programmation de laffichage

397

Tches courantes de contrle de laffichage par programmation


Dans la mesure o une grande partie de la programmation en ActionScript concerne la cration et la manipulation dlments visuels, de nombreuses tches de programmation sont dvolues laffichage. Ce chapitre dcrit des tches courantes concernant les objets daffichage :

Utilisation de la liste daffichage et des conteneurs dobjets daffichage


Ajout dobjets daffichage la liste daffichage Suppression dobjets de la liste daffichage Dplacement dobjets parmi les conteneurs daffichage Dplacement dobjets devant ou derrire dautres objets Dfinition de la frquence daffichage Contrle de la mise lchelle de la scne Utilisation du mode plein cran

Utilisation de la scne

Gestion des vnements des objets daffichage Positionnement des objets daffichage, y compris la cration dinteractions aux actions de glisser-dposer Redimensionnement, mise lchelle et rotation des objets daffichage Application de modes de fondu, de transformations de couleur et de transparence aux objets daffichage Masquage des objets daffichage animation des objets daffichage Chargement de contenu visuel externe (fichiers SWF ou images, par exemple)

Des chapitres ultrieurs de ce manuel dcrivent de tches supplmentaires dutilisation des objets daffichage. Ces tches peuvent sappliquer tous les types dobjets daffichage ou uniquement des types prcis :

Traage en ActionScript de graphismes vectoriels, dcrit dans le Chapitre 14, Utilisation de lAPI de dessin , la page 475 Application de transformations gomtriques aux objets daffichage, dcrite dans le Chapitre 13, Utilisation de la gomtrie , la page 459 Application deffets de filtres graphiques (flou, rayonnement, ombre porte, etc.) aux objets daffichage, dcrite dans le Chapitre 15, Filtrage des objets daffichage , la page 495

398

Programmation de laffichage

Utilisation des caractristiques spcifiques des clips, dcrite dans le Chapitre 16, Utilisation des clips , la page 521 Utilisation des objets TextField, dcrite dans le Chapitre 17, Utilisation de texte , la page 539 Utilisation des graphismes bitmap, dcrite dans le Chapitre 18, Utilisation des graphismes bitmap , la page 571 Utilisation des lments vido, dcrite dans le Chapitre 19, Utilisation de la vido , la page 587

Concepts importants et terminologie


La liste de rfrence suivante numre les termes importants que vous rencontrerez dans ce chapitre :

Alpha : valeur colorimtrique reprsentant le niveau de transparence (ou, plus exactement, le niveau dopacit) dune couleur. Par exemple, une couleur ayant une valeur de 60 % pour son canal alpha ne possde que 60 % de sa pleine densit (elle est transparente 40 %). Graphisme Bitmap : graphisme dfini sous forme dun tableau (lignes et colonnes) de pixels colors. Les graphismes bitmap sont gnralement des photos numriques et autres images comportant de nombreuses couleurs. Mode de fondu : indication de la faon dont le contenu de deux images qui se chevauchent doit interagir. En gnral, une image opaque place par dessus une autre image masque simplement le contenu de cette dernire, qui nest donc pas visible. Toutefois, diffrents modes de fondu permettent de combiner les couleurs des deux images de diverses manires, si bien que le rsultat est une combinaison des deux images. Liste daffichage : hirarchie des objets daffichage qui seront affichs par Flash Player sous forme de contenu visible. La scne reprsente la racine de la liste daffichage, et cette dernire est constitue de tous les objets daffichage qui sont affects la scne ou lun de ses objets enfants (mme pour les objets qui ne sont pas rellement affichs, par exemple sils sont positionns lextrieur de la scne). Objet daffichage : objet reprsentant un contenu visuel quelconque dans Flash Player. Seuls les objets daffichage peuvent figurer dans la liste daffichage, et toutes les classes des objets daffichage sont des sous-classes de la classe DisplayObject. Conteneur dobjets daffichage : type spcial dobjet daffichage pouvant contenir des objets daffichage enfants, outre leur ventuelle propre reprsentation visuelle.

Bases de la programmation de laffichage

399

Classe principale du fichier SWF : classe dfinissant le comportement de lobjet daffichage de plus haut niveau dun fichier SWF, et qui est, conceptuellement, la classe du fichier SWF lui-mme. Par exemple, un fichier SWF cr dans lenvironnement Flash possde un scnario principal qui contient tous les autres scnarios. La classe principale du fichier SWF est la classe dont le scnario principal est une instance. Masquage : technique permettant de cacher certaines parties dune image (ou, linverse, de ne laisser apparatre que certaines parties dune image). La partie masque de limage devient transparente, ce qui laisse apparatre le contenu figurant derrire celle-ci. Ce terme est emprunt au ruban de masquage utilis par les peintres pour viter dappliquer de la peinture certains endroits. Scne : conteneur visuel qui est la base, ou larrire-plan, de tout le contenu visuel dun fichier SWF. Transformation : modification des caractristiques visuelles dun graphique (rotation de lobjet, modification de son chelle, dsalignement, dformation ou altration de sa couleur). Graphisme vectoriel : graphisme qui est dfini par un ensemble de lignes et de formes traces avec des caractristiques particulires (paisseur, longueur, taille, angle et position).

Utilisation des exemples des chapitres


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Ce chapitre portant sur la cration et la manipulation de contenu visuel, pratiquement tous ses exemples de code crent des objets visuels et les affichent. Pour tester ces exemples, il est ncessaire den afficher le rsultat dans Flash Player, plutt que sous forme de valeurs de variables comme dans les chapitres prcdents. Pour tester les exemples de code de ce chapitre :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code de lexemple dans la fentre de script : Choisissez Contrle > Tester lanimation pour excuter le programme. Les rsultats du code seront affichs lcran, et tout appel la fonction trace() provoquera un affichage dans le panneau de sortie.

Diverses autres techniques permettant de tester les exemples de code sont expliques dans la section Test des exemples de code contenus dans un chapitre , la page 67.

400

Programmation de laffichage

Classes daffichage de base


Le paquet ActionScript 3.0 flash.display contient les classes des objets visuels qui peuvent apparatre dans le lecteur Flash Player. Lillustration ci-dessous montre les relations de sousclasses de ces classes de base dobjets daffichage.

AVM1Movie

Bitmap

InteractiveObject

MorphShape

Shape

StaticText

Video

DisplayObjectContainer

SimpleButton

TextField

Loader

Sprite

Stage

MovieClip

Lillustration ci-dessous montre lhritage de classe des classes dobjets daffichage. Notez que certaines classes (StaticText, TextField et Video) ne figurent pas dans le paquet flash.display, bien quelles hritent de la classe DisplayObject. Toutes les classes qui tendent la classe DisplayObject hritent de ses mthodes et proprits. Pour plus dinformations, consultez la section Proprits et mthodes de la classe DisplayObject , la page 406. Il est possible dinstancier des objets des classes suivantes, contenues dans le paquet flash.display :

Bitmap la classe Bitmap permet de dfinir des objets bitmap, chargs partir de fichiers externes ou rendus en ActionScript. La classe Loader permet de charger des bitmaps partir de fichiers externes. Il est possible de charger des fichiers GIF, JPG ou PNG, ou bien de crer un objet BitmapData contenant les donnes voulues et de crer un objet Bitmap pour utiliser ces donnes. Les mthodes de la classe BitmapData permettent de modifier les graphismes bitmaps, quils soient crs en ActionScript ou chargs. Pour plus dinformations, consultez la section Chargement dobjets daffichage , la page 446 et le Chapitre 18, Utilisation des graphismes bitmap , la page 571. Loader la classe Loader permet de charger des lments externes (fichiers SWF ou graphismes). Pour plus dinformations, consultez la section Chargement dynamique de contenu afficher , la page 446.

Classes daffichage de base

401

Shape la classe Shape permet de crer des graphismes vectoriels (rectangles, lignes, cercles, etc.) Pour plus dinformations, consultez la section Chapitre 14, Utilisation de lAPI de dessin , la page 475. SimpleButton un objet SimpleButton est la reprsentation en ActionScript dun symbole de bouton dans Flash. Une instance de SimpleButton possde trois tats : up , down et over . Sprite un objet Sprite peut contenir ses propres graphismes et/ou des objets daffichage enfants. (La classe Sprite tend la classe DisplayObjectContainer). Pour plus dinformations, consultez la section Utilisation des conteneurs dobjets daffichage , la page 407 et le Chapitre 14, Utilisation de lAPI de dessin , la page 475. MovieClip un objet MovieClip est lquivalent en ActionScript dun symbole de clip cr dans lenvironnement auteur Flash. En pratique, un objet MovieClip est similaire un objet Sprite, lexception du fait quil possde en plus un scnario. Pour plus dinformations, consultez la section Chapitre 16, Utilisation des clips , la page 521.

Les classes suivantes, qui ne se trouvent pas dans le paquet flash.display, sont toutefois des sous-classes de la classe DisplayObject :

La classe TextField, incluse dans le paquet flash.text, est un objet daffichage qui permet de crer des zones daffichage et de saisie de texte. Pour plus dinformations, consultez la section Chapitre 17, Utilisation de texte , la page 539. La classe Video, incluse dans le paquet flash.media, est lobjet daffichage qui permet dafficher des fichiers vido. Pour plus dinformations, consultez la section Chapitre 19, Utilisation de la vido , la page 587.

Les classes suivantes, qui se trouvent dans le paquet flash.display, tendent la classe DisplayObject mais il est impossible de les instancier. Elles font en effet office de classes parentes pour dautres objets daffichage, en combinant en une seule classe des fonctionnalits communes.

AVM1Movie La classe AVM1Movie permet de reprsenter des objets SWF chargs, qui ont t crs en ActionScript 1.0 ou 2.0. DisplayObjectContainer les classes Loader, Stage, Sprite et MovieClip tendent la classe DisplayObjectContainer. Pour plus dinformations, consultez la section Utilisation des conteneurs dobjets daffichage , la page 407. InteractiveObject la classe InteractiveObject est la classe de base de tous les objets utiliss pour linteraction avec la souris et le clavier. Les objets SimpleButton, TextField, Video, Loader, Sprite, Stage et MovieClip sont tous des sous-classes de la classe InteractiveObject. Pour plus dinformations sur la cration dinteractions avec la souris et le clavier, consultez le Chapitre 21, Capture des donnes saisies par lutilisateur , la page 665.

402

Programmation de laffichage

MorphShape ces objets sont crs lors de la cration dune interpolation de forme dans lenvironnement auteur Flash. Il est impossible de les instancier en ActionScript, mais ils sont accessibles dans la liste daffichage. Stage La classe Stage tend la classe DisplayObjectContainer. Il nexiste quune seule instance de Stage par application, et elle figure au sommet de la hirarchie de la liste daffichage. La proprit stage de toute instance de DisplayObject permet daccder la scne. Pour plus dinformations, consultez la section Dfinition des proprits de la scne , la page 413.

Par ailleurs, la classe StaticText, qui se trouve dans le paquet flash.text, tend la classe DisplayObject mais il est impossible de linstancier par code. Les champs texte statiques ne peuvent tre crs que dans Adobe Flash CS3 Professional.

Avantages de lutilisation de la liste daffichage


En ActionScript 3.0, il existe des classes spares pour les diffrents types dobjets daffichage. En ActionScript 1.0 et 2.0, un grand nombre dobjets du mme type sont inclus dans une mme classe : la classe MovieClip. Cette individualisation des classes et la structure hirarchique des listes daffichage offrent les avantages suivants :

une meilleure efficacit du rendu et une rduction de lutilisation mmoire, Une meilleure gestion de la profondeur une traverse complte de la liste daffichage, Des objets de liste daffichage hors liste une plus grande facilit de sous-classement des objets daffichage.

Ces avantages sont dcrits dans les sections suivantes.

Une meilleure efficacit du rendu et une rduction de lutilisation mmoire


En ActionScript 1.0 et 2.0, il ntait possible de tracer des formes que dans un objet MovieClip. En ActionScript 3.0, il existe des classes dobjets daffichage qui permettent de tracer des formes plus simplement. Dans la mesure o ces classes dobjets daffichage dActionScript 3.0 ne comprennent pas le jeu complet des mthodes et des proprits qui figurent dans un objet MovieClip, ils sont plus conomes en mmoire et en temps processeur.

Avantages de lutilisation de la liste daffichage

403

Par exemple, chaque objet MovieClip comporte des proprits pour le scnario du clip, ce qui nest pas le cas dun objet Shape. Les proprits permettant de grer le scnario ncessitent beaucoup de mmoire et de ressources processeur. En ActionScript 3.0, lutilisation de lobjet Shape autorise de meilleures performances. Lobjet Shape ncessite moins de ressources supplmentaires que lobjet MovieClip, qui est plus complexe. Flash Player na pas grer les proprits de MovieClip qui ne sont pas utilises, ce qui en amliore la vitesse et la consommation mmoire.

Une meilleure gestion de la profondeur


En ActionScript 1.0 et 2.0, la profondeur tait gre par le biais dun schma linaire et par certaines mthodes, par exemple getNextHighestDepth(). ActionScript 3.0 comprend dsormais la classe DisplayObjectContainer, qui dispose de mthodes et proprits plus pratiques pour grer la profondeur des objets daffichage. En ActionScript 3.0, lorsque lutilisateur dplace un objet daffichage vers une nouvelle position dans la liste des enfants dune instance de DisplayObjectContainer, les autres enfants de ce conteneur sont automatiquement repositionns et reoivent leur nouvelle position dindex dans le conteneur dobjets daffichage. De plus, en ActionScript 3.0 il est toujours possible de dcouvrir tous les objets enfants dun conteneur dobjets daffichage donn. Chaque instance de DisplayObjectContainer possde une proprit numChildren qui liste le nombre denfants du conteneur dobjets daffichage. Puisque la liste des enfants dun conteneur dobjets daffichage est indexe, il est donc possible dexaminer chaque objet de cette liste de la position dindex 0 la dernire position dindex (numChildren - 1). En ActionScript 1.0 et 2.0, cette opration ntait pas possible avec les mthodes et les proprits dun objet MovieClip. En ActionScript 3.0, il est facile de traverser squentiellement la liste daffichage. Il ny a pas de positions non utilises dans les numros dindex de la liste des enfants dun conteneur dobjets daffichage. Il est donc beaucoup plus ais de traverser la liste daffichage et de grer la profondeur des objets quen ActionScript 1.0 et 2.0. En ActionScript 1.0 et 2.0, lordre de profondeur des objets dun clip pouvait comporter des indices vides, ce qui rendait plus difficile la traverse de la liste des objets. En ActionScript 3.0, chaque liste des enfants dun conteneur dobjets daffichage est mise en cache en interne, sous forme de tableau dlments, ce qui autorise une recherche trs rapide laide de lindex. Une boucle parcourant tous les objets dun conteneur est galement trs rapide. De plus, en ActionScript 3.0, il est galement possible daccder aux enfants dun conteneur dobjets daffichage partir de leur nom, laide de la mthode getChildByName() de la classe DisplayObjectContainer.

404

Programmation de laffichage

Une traverse complte de la liste daffichage


En ActionScript 1.0 et 2.0, il tait impossible daccder certains objets, par exemple les formes vectorielles, qui taient dessines dans lenvironnement auteur Flash. En ActionScript 3.0, tous les objets sont accessibles dans la liste daffichage, quils aient t crs en ActionScript ou dans lenvironnement auteur Flash. Pour plus dinformations, consultez la section Traverse de la liste daffichage , la page 411.

Des objets daffichage hors liste


En ActionScript 3.0, il est possible de crer des objets daffichage ne figurant pas parmi les objets visibles dans la liste. Ils sont alors appels objets daffichage hors liste. Un objet daffichage nest ajout la liste des objets visibles que lorsque vous appelez la mthode addChild() ou addChildAt() dune instance de DisplayObjectContainer qui a dj t ajoute la liste daffichage. Les objets daffichage hors liste permettent dassembler des objets daffichage complexes, par exemple dans le cas de plusieurs conteneurs ayant chacun plusieurs objets daffichage. En conservant des objets daffichage hors liste, vous pouvez assembler des objets compliqus sans consommer de temps de calcul pour le rendu de ces objets. Ces objets hors liste peuvent ensuite tre ajouts la liste le moment venu. De plus, un enfant dun conteneur dobjets daffichage peut tre tout moment ajout la liste daffichage la position dsire ou en tre supprim.

Une plus grande facilit de sous-classement des objets daffichage.


En ActionScript 1.0 et 2.0, il tait souvent ncessaire dajouter de nouveaux objets MovieClip un fichier SWF pour crer des formes de base ou pour afficher des bitmaps. En ActionScript 3.0, la classe DisplayObject comporte de nombreuses sous-classes, dont Shape et Bitmap. Les classes en ActionScript 3.0 tant plus spcialises pour des types dobjets spcifiques, il est plus facile de crer des sous-classes des classes intgres. Par exemple, pour tracer un cercle en ActionScript 2.0, vous pouviez crer une classe CustomCircle tendant la classe MovieClip lors de linstanciation dun objet de la classe CustomCircle. Toutefois, cette classe comportait aussi un certain nombre de proprits et de mthodes de la classe MovieClip (par exemple totalFrames) qui ne sappliquaient pas votre classe. En ActionScript 3.0, par contre, vous pouvez crer une classe CustomCircle tendant lobjet Shape mais, ce titre, ne comportant pas les proprits et mthodes contenues dans la classe MovieClip. Le code suivant est un exemple dune classe CustomCircle :

Avantages de lutilisation de la liste daffichage

405

import flash.display.*; private class CustomCircle extends Shape { var xPos:Number; var yPos:Number; var radius:Number; var color:uint; public function CustomCircle(xInput:Number, yInput:Number, rInput:Number, colorInput:uint) { xPos = xInput; yPos = yInput; radius = rInput; color = colorInput; this.graphics.beginFill(color); this.graphics.drawCircle(xPos, yPos, radius); } }

Utilisation des objets daffichage


Aprs cette prsentation des concepts de base de la scne, des objets daffichage et de leurs conteneurs, ainsi que de la liste daffichage, cette section contient des informations plus spcifiques sur lutilisation des objets daffichage en ActionScript 3.0.

Proprits et mthodes de la classe DisplayObject


Tous les objets daffichage sont des sous-classes de la classe DisplayObject, et hritent donc de ses proprits et mthodes. Les proprits hrites sont des proprits de base communes tous les objets daffichage. Par exemple, chaque objet daffichage possde une proprit x et une proprit y qui indiquent sa position dans son conteneur dobjets daffichage. Il est impossible de crer une instance de DisplayObject laide du constructeur de la classe DisplayObject. Il est ncessaire de crer un autre type dobjet (qui doit tre une sous-classe de la classe DisplayObject), par exemple un Sprite, pour instancier un objet laide de loprateur new. Par ailleurs, pour crer une classe dobjet daffichage, vous devez crer une sous-classe de lune des sous-classes dobjets daffichage ayant une fonction constructeur utilisable (par exemple la classe Shape ou la classe Sprite). Pour plus dinformations, reportezvous la description de la classe DisplayObject dans le manuel Rfrence du langage et des composants ActionScript 3.0.

406

Programmation de laffichage

Ajout dobjets daffichage la liste daffichage


Lorsque vous instanciez un objet daffichage, il napparat lcran (sur la scne) que lorsque vous ajoutez cette instance un conteneur dobjets daffichage figurant dans la liste daffichage. Par exemple, dans le code suivant, lobjet TextField myText ne sera pas visible si vous omettez la dernire ligne de code. Dans celle-ci, le mot-cl this doit faire rfrence un conteneur dobjets daffichage qui a dj t ajout la liste.
import flash.display.*; import flash.text.TextField; var myText:TextField = new TextField(); myText.text = "Buenos dias."; this.addChild(myText);

Lorsque vous ajoutez un lment visuel sur la scne, cet lment devient un enfant de lobjet Stage. Le premier fichier SWF charg par une application (par exemple celui que vous incorporez dans une page HTML) est automatiquement ajout comme enfant de la scne, mais cet objet peut tre de nimporte quel type sous rserve quil tende la classe Sprite. Tout objet daffichage cr sans utiliser ActionScript (par exemple en ajoutant une balise MXML dans Adobe Flex Builder 2 ou en plaant un lment sur la scne dans Flash) est ajout la liste daffichage. Bien que ces objets naient pas t ajouts en ActionScript, ils sont accessibles en ActionScript. Par exemple, le code suivant modifie la largeur dun objet nomm button1, qui a t ajout dans lenvironnement auteur Flash et non pas en ActionScript :
button1.width = 200;

Utilisation des conteneurs dobjets daffichage


Si un objet DisplayObjectContainer est supprim de la liste daffichage, ou sil est dplac ou modifi dune faon quelconque, chaque objet daffichage de ce conteneur DisplayObjectContainer est galement supprim, dplac ou modifi.

Utilisation des objets daffichage

407

Par ailleurs, un conteneur dobjets daffichage est en soi un type dobjet daffichage, il peut donc tre ajout un autre conteneur dobjets daffichage. Par exemple, limage ci-dessous montre un conteneur dobjets daffichage, pictureScreen, contenant un contour de forme et quatre autres conteneurs dobjets daffichage (du type PictureFrame) :

Forme dfinissant la bordure du conteneur dobjets daffichage


pictureScreen

Quatre conteneurs dobjets daffichage, enfants de lobjet


pictureScreen

Pour quun objet daffichage apparaisse dans la liste daffichage, il est ncessaire de lajouter un conteneur dobjets daffichage figurant dans cette liste. Pour ce faire, on utilise la mthode addChild() ou la mthode addChildAt() de lobjet conteneur. Par exemple, sans la ligne finale du code ci-dessous, lobjet myTextField ne sera pas affich :
var myTextField:TextField = new TextField(); myTextField.text = "hello"; this.root.addChild(myTextField);

Dans cet exemple de code, this.root pointe sur le conteneur dobjets daffichage MovieClip, qui contient le code. Dans votre propre code, vous pouvez spcifier un autre conteneur. Pour ajouter lobjet enfant une position spcifique dans la liste des enfants du conteneur dobjets daffichage, utilisez la mthode addChildAt(). Ces positions dindex en base zro dans la liste des enfants sont quivalentes la position des objets parmi les calques (du premier plan larrire-plan). Considrons par exemple les trois objets daffichage suivants. Chaque objet a t cr partir dune classe de lutilisateur nomme Ball.

408

Programmation de laffichage

La mthode addChildAt() permet de modifier la profondeur de ces objets daffichage dans leur objet conteneur. Par exemple, considrons le code suivant :
ball_A = new Ball(0xFFCC00, "a"); ball_A.name = "ball_A"; ball_A.x = 20; ball_A.y = 20; container.addChild(ball_A); ball_B = new Ball(0xFFCC00, "b"); ball_B.name = "ball_B"; ball_B.x = 70; ball_B.y = 20; container.addChild(ball_B); ball_C = new Ball(0xFFCC00, "c"); ball_C.name = "ball_C"; ball_C.x = 40; ball_C.y = 60; container.addChildAt(ball_C, 1);

Aprs lexcution de ce code, les objets daffichage sont positionns dans lobjet DisplayObjectContainer container comme suit. Notez la position verticale des objets.

Pour repositionner un objet au sommet de la liste daffichage, il suffit de lajouter nouveau la liste. Par exemple, aprs le code ci-dessus, pour amener ball_A au sommet de la pile (au premier plan), utilisez la ligne de code suivante :
container.addChild(ball_A);

Ce code supprime ball_A de son emplacement actuel dans la liste daffichage de container, et lajoute ensuite au sommet de la liste, ce qui a pour effet de le placer en haut de lempilement dobjets. Vous pouvez utiliser la mthode getChildAt() pour vrifier lordre des objets affichs dans les calques. La mthode getChildAt() renvoie les objets enfants dun conteneur en fonction de lindice que vous lui passez en paramtre. Par exemple, le code ci-dessous rvle les noms des objets daffichage de diverses positions dans la liste des enfants de lobjet DisplayObjectContainer container :
trace(container.getChildAt(0).name); // ball_A trace(container.getChildAt(1).name); // ball_C trace(container.getChildAt(2).name); // ball_B

Utilisation des objets daffichage

409

Si vous supprimez un objet daffichage de la liste des enfants de son conteneur parent, les lments de la liste ayant un indice plus lev descendent tous dune position dans lindex des enfants. Par exemple, la suite du code ci-dessus, le code suivant montre que lobjet daffichage qui tait en position 2 dans lobjet DisplayObjectContainer container passe la position 1 si un autre objet enfant dindice suprieur est supprim :
container.removeChild(ball_C); trace(container.getChildAt(0).name); // ball_A trace(container.getChildAt(1).name); // ball_B

Les mthodes removeChild() et removeChildAt() ne suppriment pas entirement une instance dun objet daffichage, elles la suppriment seulement de la liste des enfants du conteneur. Une autre variable peut encore rfrencer linstance. (Pour supprimer entirement un objet, utilisez loprateur delete.) Un objet daffichage nayant quun seul conteneur parent, il nest possible dajouter une instance dun objet daffichage qu un seul conteneur dobjet daffichage. Par exemple, le code suivant montre que lobjet daffichage tf1 ne peut exister que dans un seul conteneur (dans ce cas prcis, un Sprite qui tend la classe DisplayObjectContainer) :
tf1:TextField = new TextField(); tf2:TextField = new TextField(); tf1.name = "text 1"; tf2.name = "text 2"; container1:Sprite = new Sprite(); container2:Sprite = new Sprite(); container1.addChild(tf1); container1.addChild(tf2); container2.addChild(tf1); trace(container1.numChildren); // 1 trace(container1.getChildAt(0).name); // texte 2 trace(container2.numChildren); // 1 trace(container2.getChildAt(0).name); // texte 1

Si vous ajoutez un conteneur dobjets daffichage un objet qui est dj contenu dans un autre conteneur dobjets daffichage, lobjet sera supprim de la liste des enfants de ce dernier. Outre les mthodes dcrites ci-dessus, la classe DisplayObjectContainer dfinit plusieurs mthodes permettant de manipuler des objets daffichage enfants :

contains()

: dtermine si un objet daffichage est un enfant dun objet DisplayObjectContainer. : renvoie un objet daffichage partir de son nom. : renvoie lindice dun objet daffichage. : modifie la position dun objet daffichage.

getChildByName() getChildIndex() setChildIndex()

410

Programmation de laffichage

swapChildren()

: change lordre dempilement de deux objets daffichage. : change lordre dempilement de deux objets daffichage, spcifis

swapChildrenAt()

par leurs indices. Pour plus dinformations, consultez les sections appropries du manuel Rfrence du langage et des composants ActionScript 3.0. Noubliez pas quun objet daffichage qui ne figure pas dans la liste daffichage (donc, qui ne se trouve pas dans un conteneur dobjets daffichage enfant de la scne) est appel objet daffichage hors liste.

Traverse de la liste daffichage


Comme nous lavons vu, la liste daffichage est une structure en arborescence. La scne, qui peut contenir de nombreux objets daffichage, est au sommet de larborescence. Ces objets daffichage, qui sont eux-mmes des conteneurs dobjets daffichage, peuvent contenir dautres conteneurs ou objets daffichage.
Scne Stage

Instance de la classe principale du fichier SWF

Objet daffichage

Conteneur dobjet daffichage

Conteneur dobjet daffichage

Objet daffichage

Conteneur dobjet daffichage

Objet daffichage

Conteneur dobjet daffichage

Utilisation des objets daffichage

411

La classe DisplayObjectContainer comporte des proprits et des mthodes qui permettent de traverser la liste daffichage via les listes denfants des conteneurs dobjets daffichage. Par exemple, le code suivant ajoute deux objets daffichage, title et pict, lobjet container (qui est un Sprite, et la classe Sprite tend la classe DisplayObjectContainer) :
var container:Sprite = new Sprite(); var title:TextField = new TextField(); title.text = "Hello"; var pict:Loader = new Loader(); var url:URLRequest = new URLRequest("banana.jpg"); pict.load(url); pict.name = "banana loader"; container.addChild(title); container.addChild(pict);

La mthode getChildAt() renvoie lenfant de la liste daffichage qui a la position dindex spcifie :
trace(container.getChildAt(0) is TextField); // true

Les objets enfants sont galement accessibles par leur nom. Chaque objet daffichage possde un nom, qui est attribu par dfaut par Flash Player (par exemple "instance1") si vous ne lattribuez pas vous-mme. Par exemple, le code ci-dessous dmontre lutilisation de la mthode getChildByName() pour accder un objet daffichage enfant ayant pour nom "banana loader":
trace(container.getChildByName("banana loader") is Loader); // true

Lutilisation de la mthode getChildByName() peut tre plus lente que celle de la mthode getChildAt(). Un conteneur dobjets daffichage pouvant en contenir dautres dans sa liste daffichage, il est possible de traverser toute larborescence de la liste daffichage de lapplication. Par exemple, dans lextrait de code prcdent, lorsque lopration de chargement de lobjet Loader pict est termin, lobjet pict possde un objet daffichage enfant, le bitmap. Pour accder cet objet daffichage bitmap, vous pouvez utiliser le code pict.getChildAt(0). Mais vous pouvez galement utiliser container.getChildAt(0).getChildAt(0) (puisque container.getChildAt(0) == pict).

412

Programmation de laffichage

La fonction ci-dessous produit une sortie indente trace() de la liste daffichage dun conteneur dobjets daffichage :
function traceDisplayList(container:DisplayObjectContainer, indentString:String = ""):void { var child:DisplayObject; for (var i:uint=0; i < container.numChildren; i++) { child = container.getChildAt(i); trace(indentString, child, child.name); if (container.getChildAt(i) is DisplayObjectContainer) { traceDisplayList(DisplayObjectContainer(child), indentString + "") } } }

Dfinition des proprits de la scne


La classe Stage redfinit la plupart des proprits et mthodes de la classe DisplayObject. Si vous appelez lune des proprits ou mthodes ainsi redfinies, Flash Player renvoie une exception. Par exemple, lobjet Stage ne possde pas de proprits x ou y, puisque sa position est fixe en tant que conteneur principal de lapplication. Or, les proprits x et y indiquent la position dun objet daffichage par rapport son conteneur, et puisque la scne ne se trouve pas dans un autre conteneur dobjets daffichage, ces proprits seraient inapplicables.
REMARQUE

Certaines proprits et mthodes de la classe Stage ne sont pas disponibles pour les objets daffichage qui ne se trouvent pas dans le mme sandbox de scurit que le premier fichier SWF charg. Pour plus dinformations, consultez la section scurit de la scne , la page 824.

Contrle de la frquence daffichage


La proprit framerate de la classe Stage permet de dfinir la frquence daffichage pour tous les fichiers SWF chargs dans lapplication. Pour plus dinformations, voir Rfrence du langage et des composants ActionScript 3.0.

Contrle de la mise lchelle de la scne


En cas de redimensionnement de lcran de Flash Player, le contenu de la scne est automatiquement redimensionn en consquence. La proprit scaleMode de la classe Stage dtermine comment le contenu de la scne est ajust. Cette proprit reoit lune des quatre valeurs dfinies par des constantes dans la classe flash.display.StageScaleMode.

Utilisation des objets daffichage

413

Avec trois des valeurs possibles pour scaleMode (StageScaleMode.EXACT_FIT, StageScaleMode.SHOW_ALL et StageScaleMode.NO_BORDER), Flash Player met lchelle le contenu de la scne pour ladapter aux nouvelles dimensions.La diffrence entre ces trois options rside dans la mthode de redimensionnement :

StageScaleMode.EXACT_FIT StageScaleMode.SHOW_ALL

respecte les proportions dorigine du fichier SWF.

dtermine sil existe une bordure (comme dans le cas des barres noires qui apparaissent au-dessus et en dessous de limage dun film en cran large sur un tlviseur standard. dtermine sil est possible ou non de recadrer une partie du

StageScaleMode.NO_BORDER

contenu. Avec la quatrime option de scaleMode, StageScaleMode.NO_SCALE, le contenu de la scne conserve ses dimensions dorigine lorsque lutilisateur redimensionne la fentre de Flash Player. Dans ce mode, et uniquement dans ce mode, les proprits width et height de la classe Stage peuvent tre utilises pour dterminer les dimensions relles (en pixels) de la fentre redimensionne de Flash Player. Dans les autres modes, les proprits stageWidth et stageHeight renvoient toujours la largeur et la hauteur originales du fichier SWF.) De plus, lorsque la proprit scaleMode est dfinie sur StageScaleMode.NO_SCALE et que le fichier SWF est redimensionn, lvnement resize de la classe Stage est distribu, ce qui vous permet deffectuer des ajustements en consquence. Le choix de loption StageScaleMode.NO_SCALE pour scaleMode permet donc de disposer dun meilleur contrle sur lajustement du contenu en cas de redimensionnement de la fentre. Par exemple, en cas de redimensionnement de la scne pour un fichier SWF contenant une vido et une barre de commandes, il peut tre souhaitable de conserver les dimensions de cette dernire et de ne modifier que les dimensions de limage vido. Lexemple suivant en est une dmonstration :
// // // // // // // // // videoScreen est un objet daffichage (une instance de Video) contenant un clip vido positionn dans le coin suprieur gauche de la scne, et dont les dimensions doivent sajuster en cas de redimensionnement du fichier SWF. controlBar est un objet daffichage (un Sprite) contenant plusieurs boutons ; il doit rester positionn dans le coin infrieur gauche de la scne (sous videoScreen) et ses dimensions doivent rester fixes si le fichier SWF. est redimensionn. flash.display.Stage; flash.display.StageAlign; flash.display.StageScaleMode; flash.events.Event;

import import import import

414

Programmation de laffichage

var swfStage:Stage = videoScreen.stage; swfStage.scaleMode = StageScaleMode.NO_SCALE; swfStage.align = StageAlign.TOP_LEFT; function resizeDisplay(event:Event):void { var swfWidth:int = swfStage.stageWidth; var swfHeight:int = swfStage.stageHeight; // Resize the video window. var newVideoHeight:Number = swfHeight - controlBar.height; videoScreen.height = newVideoHeight; videoScreen.scaleX = videoScreen.scaleY; // Reposition the control bar. controlBar.y = newVideoHeight; } swfStage.addEventListener(Event.RESIZE, resizeDisplay);

Utilisation du mode plein cran


Le mode plein cran permet dafficher un fichier SWF sur la totalit de lcran de lutilisateur, sans bordures, barres de menu ou autres lments dinterface. La proprit displayState de la classe Stage permet dactiver ou dsactiver ce mode pour un fichier SWF. La proprit displayState reoit lune des valeurs dfinies par les constantes de la classe flash.display.StageDisplayState. Pour activer le mode plein cran, displayState doit recevoir la valeur StageDisplayState.FULL_SCREEN :
// mySprite est une instance de Sprite dj ajoute la liste daffichage mySprite.stage.displayState = StageDisplayState.FULL_SCREEN;

Pour dsactiver le mode plein cran, la proprit displayState doit recevoir la valeur StageDisplayState.NORMAL :
mySprite.stage.displayState = StageDisplayState.NORMAL;

De plus, lutilisateur peut choisir de quitter le mode plein cran en activant une autre fentre ou laide de plusieurs combinaisons de touches : Echappement (toutes les plates-formes), Ctrl-W (Windows), Command-W (Mac) ou Alt-F4 (Windows). En mode plein cran, le comportement de mise lchelle de la scne est identique celui du mode normal. Cette mise lchelle est contrle par la proprit scaleMode de la classe Stage. Comme toujours, si la proprit scaleMode est paramtre sur StageScaleMode.NO_SCALE, les proprits stageWidth et stageHeight de la scne changent en fonction de la surface dcran occupe par le SWF (en mode plein cran, lcran entier).

Utilisation des objets daffichage

415

Lvnement fullScreen de la classe Stage permet de dtecter et rpondre lactivation ou la dsactivation du mode plein cran. Par exemple, il peut tre ncessaire de repositionner, ajouter ou supprimer des lments lors dun changement dtat du mode plein cran, comme dans cet exemple :
import flash.events.FullScreenEvent; function fullScreenRedraw(event:FullScreenEvent):void { if (event.fullScreen) { //supprimer les champs texte de saisie // ajout dun bouton qui ferme le mode plein cran } else { //rinsrer les champs texte de saisie // suppression du bouton qui ferme le mode plein cran } } mySprite.stage.addEventListener(FullScreenEvent.FULL_SCREEN, fullScreenRedraw);

Comme le montre ce code, lobjet de lvnement fullScreen est une instance de la classe flash.events.FullScreenEvent, dont la proprit fullScreen indique si le mode plein cran est activ (true) ou non (false). Si vous utilisez le mode plein cran en ActionScript, ne perdez pas de vue les considrations suivantes :

Le mode plein cran ne peut tre activ en ActionScript quen rponse un clic de souris (y compris par le bouton droit) ou un appui de touche. Si lutilisateur dispose de plusieurs moniteurs, le contenu SWF ne remplira quun seul cran. Flash Player utilise une mtrique pour dterminer le moniteur qui contient la plus grande partie du SWF, et cest ce moniteur qui est utilis pour le mode plein cran. Dans le cas dun fichier SWF incorpor dans une page HTML, le code HTML qui incorpore Flash Player doit comporter une balise param et un attribut embed ayant le nom allowFullScreen et la valeur true, comme ci-dessous :
<object> ... <param name="allowFullScreen" value="true" /> <embed ... allowfullscreen="true" /> </object>

416

Programmation de laffichage

Si vous utilisez du JavaScript dans une page Web pour gnrer les balises dincorporation du fichier SWF, modifiez le code JavaScript pour y ajouter la balise et lattribut du paramtre allowFullScreen. Par exemple, si la page HTML utilise la fonction AC_FL_RunContent() (qui est utilise la fois par Flex Builder et les pages HTML gnres par Flash), ajoutez le paramtre allowFullScreen lappel de cette fonction, comme ci-dessous :
AC_FL_RunContent( ... 'allowFullScreen','true', ... ); //end AC code

Cette prcaution ne sapplique pas un fichier SWF excut dans le lecteur autonome.

Tout le code ActionScript relatif au clavier (vnements clavier et saisie de texte dans les instances dobjets TextField) est dsactiv en mode plein cran, lexception des raccourcis-clavier qui ferment le mode plein cran

Il est ncessaire de connatre certaines restrictions lies la scurit. Elles sont dcrites dans la section Sandboxes de scurit , la page 812.

Gestion des vnements des objets daffichage


La classe DisplayObject hrite de la classe EventDispatcher. Les objets daffichage participent donc intgralement du modle dvnements (tel quil est dcrit dans le Chapitre 10, Gestion dvnements , la page 335). Chaque objet daffichage peut utiliser sa mthode addEventListener() (hrite de la classe EventDispatcher) pour attendre un vnement particulier, mais ceci uniquement si lobjet couteur fait partie du flux dvnement de lvnement considr. Lorsque Flash Player distribue un objet dvnement, celui-ci effectue un aller-retour entre la scne et lobjet daffichage pour lequel lvnement sest produit. Par exemple, si lutilisateur clique sur un objet daffichage nomm child1, Flash Player distribue un objet vnement de la scne lobjet daffichage child1 via la hirarchie de la liste daffichage.

Utilisation des objets daffichage

417

Le flux dvnement se dcompose en trois parties, comme dans le diagramme suivant :


Scne Phase de capture Phase de propagation vers le haut Nud parent

Nud enfant1 Phase cible

Nud enfant2

Pour plus dinformations, consultez le Chapitre 10, Gestion dvnements , la page 335. Lors de la gestion des vnements lis aux objets daffichage, il est important de ne pas oublier leffet potentiel des objets couteurs dvnements sur lventuelle suppression automatique des objets daffichage de la mmoire (garbage collection) lorsquils sont supprims de la liste daffichage. Si dautres objets se sont enregistrs comme couteurs dvnements auprs de lobjet daffichage, celui-ci ne sera pas supprim en mmoire lorsquil sera supprim de la liste daffichage, puisquil possdera encore des rfrences ces autres objets. Pour plus dinformations, consultez la section Gestion des couteurs dvnements , la page 356.

Choix dune sous-classe de DisplayObject


Plusieurs options tant disponibles, lune des dcisions importantes prendre lors de lutilisation dobjets daffichage est le choix de lobjet utiliser dans un but prcis. Voici quelques conseils qui vous aideront faire ce choix. Ces suggestions sappliquent aussi bien si vous crez une instance dune classe que si vous choisissez une classe de base pour une nouvelle classe crer :

Si vous navez pas besoin dun objet pouvant tre le conteneur dautres objets daffichage (autrement dit, si vous avez simplement besoin dun objet utiliser comme lment isol), choisissez lune des sous-classes de DisplayObject ou dInteractiveObject, selon lutilisation prvue :

Bitmap pour afficher une image bitmap, TextField pour ajouter du texte, Video pour afficher de la vido, Shape pour disposer dune toile vierge pour tracer du contenu, en particulier si vous souhaitez crer une instance pour dessiner des formes lcran et si cette instance ne sera pas conteneur dautres objets daffichage, car vous obtiendrez des performances nettement suprieures en utilisant Shape plutt que Sprite ou MovieClip,
Programmation de laffichage

418

MorphShape, StaticText ou SimpleButton pour crer des lments spcifiques de lenvironnement auteur Flash. (Il est impossible de crer par programmation des instances de ces classes, mais vous pouvez crer des variables avec ces types de donnes pour pointer sur des lments crs avec lenvironnement auteur Flash.)

Si vous avez besoin dune variable pour faire rfrence lobjet principal Stage, utilisez la classe Stage comme type de donnes. Si vous voulez disposer dun conteneur pour charger un fichier externe (SWF ou image) utilisez une instance de Loader. Le contenu ainsi charg sera ajout la liste daffichage comme enfant de cette instance de Loader. Son type de donnes dpendra de la nature du contenu charger :

une image sera une instance de Bitmap, un fichier SWF rdig en ActionScript 3.0 sera une instance de Sprite ou de MovieClip (ou une instance dune sous-classe de ces classes, selon le type choisi par le crateur du contenu), un fichier SWF crit en ActionScript 1.0 ou ActionScript 2.0 sera une instance de AVM1Movie.

Si vous avez besoin dun objet qui sera le conteneur dautres objets daffichage (que vous ayez ou non lintention de dessiner en ActionScript dans cet objet), choisissez lune des sous-classes de DisplayObjectContainer :

Sprite si lobjet doit tre cr en ActionScript uniquement, ou servira de classe de base un objet daffichage qui sera uniquement cr et manipul en ActionScript, MovieClip si vous crez une variable pour pointer sur un symbole de clip cr dans Flash.

Si vous crez une classe qui sera associe un symbole de clip de la bibliothque de Flash, choisissez lune des sous-classes de DisplayObjectContainer comme classe de base de votre future classe :

MovieClip si le contenu du symbole de clip associ recouvre plusieurs images, Sprite si le contenu du symbole de clip associ ne recouvre quune image.

Utilisation des objets daffichage

419

Manipulation des objets daffichage


Quel que soit lobjet daffichage utilis, en tant qulments affichs lcran les objets daffichage ont en commun un certain nombre de manipulations. Ainsi, ils peuvent tous tre positionns lcran, avancs ou reculs dans lordre des calques, mis lchelle, pivots, etc. Dans la mesure o tous les objets daffichage hritent ces fonctionnalits de leur classe de base commune (DisplayObject), lesdites fonctionnalits ont le mme comportement pour une instance dun objet TextField, Video, Shape ou tout autre objet daffichage. Les sections suivantes prsentent plusieurs de ces manipulations communes.

Modification de la position
La manipulation la plus banale dun objet daffichage consiste en modifier la position lcran. Pour dfinir la position dun objet daffichage, changez ses proprits x et y.
myShape.x = 17; myShape.y = 212;

Le systme de positionnement des objets daffichage traite la scne comme un systme de coordonnes cartsiennes (avec un axe horizontal x et un axe vertical y). Lorigine du systme de coordonnes (les coordonnes 0,0 des axes x et y) est le coin suprieur gauche de la scne. De ce point, les valeurs de x sont positives en allant vers la droite et ngatives en allant vers la gauche, alors que, loppos des systmes de traage traditionnels, les valeurs de y sont positives en descendant et ngatives en montant. Par exemple, les lignes de code ci-dessus dplacent lobjet myShape la coordonne x 17 (17 pixels droite du point dorigine) et la coordonne y 212 (212 pixels sous le point dorigine). Par dfaut, lorsquun objet daffichage est cr en ActionScript, les proprits x et y sont 0, ce qui revient placer lobjet dans le coin suprieur gauche de son contenu parent.

420

Programmation de laffichage

Changement de position par rapport la scne


Il est important de se rappeler que les proprits x et y rfrent toujours la position de lobjet daffichage par rapport aux coordonnes 0,0 des axes de son objet daffichage parent. Ainsi, pour une instance de Shape (par exemple un cercle) contenue dans une instance de Sprite, mettre zro les proprits x et y de lobjet Shape revient placer le cercle dans le coin suprieur gauche de lobjet Sprite, qui nest pas forcment le coin suprieur gauche de la scne. Pour positionner un objet par rapport aux coordonnes globales de la scne, utilisez la mthode globalToLocal() de tout objet daffichage afin de convertir les coordonnes globales (scne) en coordonnes locales (conteneur de lobjet daffichage) :
// positionner la forme dans le coin suprieur gauche de la scne, // quelle que soit la position de son objet parent. // crer un Sprite, positionn x:200 et y:200. var mySprite:Sprite = new Sprite(); mySprite.x = 200; mySprite.y = 200; this.addChild(mySprite); // tracer un point de rfrence aux coordonnes 0,0 du Sprite. mySprite.graphics.lineStyle(1, 0x000000); mySprite.graphics.beginFill(0x000000); mySprite.graphics.moveTo(0, 0); mySprite.graphics.lineTo(1, 0); mySprite.graphics.lineTo(1, 1); mySprite.graphics.lineTo(0, 1); mySprite.graphics.endFill(); // cration de linstance de Shape pour le cercle. var circle:Shape = new Shape(); mySprite.addChild(circle); // tracer dans la forme un cercle de rayon 50, avec les coordonnes // x:50, y:50 pour le centre. circle.graphics.lineStyle(1, 0x000000); circle.graphics.beginFill(0xff0000); circle.graphics.drawCircle(50, 50, 50); circle.graphics.endFill(); // positionner la forme dans le coin suprieur gauche de la scne, // aux coordonnes 0. var stagePoint:Point = new Point(0, 0); var targetPoint:Point = mySprite.globalToLocal(stagePoint); circle.x = targetPoint.x; circle.y = targetPoint.y;

Inversement, vous pouvez utiliser la mthode localToGlobal() de la classe DisplayObject pour convertir des coordonnes locales en coordonnes de la scne.

Manipulation des objets daffichage

421

Cration dinteractions aux actions de glisser-dposer


Il est frquent quun objet doive tre dplac en rponse une action de glisser-dposer, par exemple pour dplacer un objet avec la souris jusqu ce que lutilisateur relche le bouton gauche. Il existe deux faons de crer des interactions aux actions de glisser-dposer en ActionScript. Dans les deux cas, deux vnements de souris sont utiliss : lorsque le bouton de gauche est press (lobjet reoit alors linstruction de suivre le curseur de la souris) et lorsquil est relch (lobjet reoit alors linstruction de cesser de suivre le curseur de la souris). La premire technique, qui fait appel la mthode startDrag(), est la plus simple mais la plus limite. Lorsque le bouton de la souris est press, la mthode startDrag() de lobjet dplacer est appele. Lorsque le bouton est relch, cest son tour la mthode stopDrag() qui est appele.
// // // // // ce code cre une interaction une action de glisser-dposer laide de startDrag() (deuxime technique) square est un objet daffichage (par ex. une instance de MovieClip ou de Sprite).

import flash.events.MouseEvent; // cette fonction est appele lors de lappui sur le bouton de la souris. function startDragging(event:MouseEvent):void { square.startDrag(); } // cette fonction est appele lors du relchement du bouton de la souris. function stopDragging(event:MouseEvent):void { square.stopDrag(); } square.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); square.addEventListener(MouseEvent.MOUSE_UP, stopDragging);

Cette technique souffre toutefois dune limitation importante : il nest possible de dplacer quun seul lment la fois avec startDrag(). Si un objet daffichage est en cours de dplacement avec cette mthode, et si la mthode startDrag() dun autre objet est appele, le premier objet cesse immdiatement de suivre la souris. Par exemple, si la fonction startDragging() est modifie comme ci-dessous, seul lobjet circle sera dplac, malgr lappel de la mthode square.startDrag() :
function startDragging(event:MouseEvent):void { square.startDrag(); circle.startDrag(); }

422

Programmation de laffichage

tant donn quun seul objet la fois peut tre dplac laide de la mthode startDrag(), la mthode stopDrag() peut tre appele pour tout objet daffichage, et elle interrompt le dplacement en cours, quel que soit lobjet actuellement dplac. Pour dplacer plusieurs objets daffichage, ou pour viter tout risque de conflit au cas o plusieurs objets seraient susceptibles dutiliser startDrag(), il est prfrable dutiliser la technique de suivi de la souris pour crer leffet de glisser-dposer. Avec cette technique, lorsque le bouton de la souris est press, une fonction est enregistre comme objet couteur auprs de lvnement mouseMove de la scne. Cette fonction, qui est alors appele chaque dplacement de souris, dplace lobjet gliss sur les coordonnes x et y de la souris. Lors du relchement du bouton de la souris, lenregistrement de la fonction comme couteur est annule, si bien quelle nest plus appele en cas de mouvement de la souris et que lobjet cesse de suivre celle-ci. Le code suivant illustre cette technique :
// // // // // ce code cre une interaction une action de glisser-dposer laide dune fonction de suivi de souris (deuxime technique) circle est un objet daffichage (par ex. une instance de MovieClip ou de Sprite).

import flash.events.MouseEvent; var offsetX:Number; var offsetY:Number; // cette fonction est appele lors de lappui sur le bouton de la souris. function startDragging(event:MouseEvent):void { // enregistrer la diffrence (dcalage) entre le point o tait // le curseur lors de lappui sur le bouton et les coordonnes x,y // du cercle lors de cet appui. offsetX = event.stageX - circle.x; offsetY = event.stageY - circle.y; // ordonner Flash Player dcouter lvnement mouseMove stage.addEventListener(MouseEvent.MOUSE_MOVE, dragCircle); } // cette fonction est appele lors du relchement du bouton de la souris. function stopDragging(event:MouseEvent):void { // ordonner Flash Player de cesser dcouter lvnement mouseMove stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragCircle); }

Manipulation des objets daffichage

423

// cette fonction est appele chaque mouvement de souris, // tant que le bouton gauche reste appuy. function dragCircle(event:MouseEvent):void { // dplacement du cercle lemplacement du curseur, en prservant // le dcalage entre lemplacement du curseur et // lemplacement de lobjet dplac. circle.x = event.stageX - offsetX; circle.y = event.stageY - offsetY; // ordonner Flash Player dexcuter un rafrachissement dcran // aprs cet vnement. event.updateAfterEvent(); } circle.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); circle.addEventListener(MouseEvent.MOUSE_UP, stopDragging);

Outre le dplacement dun objet daffichage avec le curseur de la souris, une autre interaction courante avec le glisser-dposer consiste amener lobjet dplac au premier-plan, afin quil semble flotter au-dessus des autres objets. Par exemple, supposons deux objets, un cercle et un carr, qui sont tous deux dots dune interaction aux actions de glisser-dposer. Si le cercle se trouve sous le carr dans la liste daffichage, et si vous cliquez sur le cercle et le dplacez vers le carr, il semblera glisser sous le carr, ce qui dtruira lillusion. Il est donc prfrable de prvoir quen cas de clic sur le cercle celui-ci soit amen en haut de la liste daffichage, afin de toujours apparatre au-dessus des autres objets. Le code suivant (qui est une adaptation de lexemple prcdent) cre une interaction de glisser-dposer pour deux objets daffichage, un cercle et un carr. Lorsque le bouton de la souris est press au-dessus de lun deux, cet lment est amen en haut de la liste daffichage de la scne, afin que llment dplac passe toujours devant les autres. Le code qui a t modifi ou ajout par rapport lexemple prcdent apparat en gras.
// // // // // // ce code cre une interaction une action de glisser-dposer laide dune fonction de suivi de souris (deuxime technique) circle et square sont des objets daffichage (par ex. des instances de MovieClip ou de Sprite). instances).

import flash.display.DisplayObject; import flash.events.MouseEvent; var offsetX:Number; var offsetY:Number; var draggedObject:DisplayObject;

424

Programmation de laffichage

// cette fonction est appele lors de lappui sur le bouton de la souris. function startDragging(event:MouseEvent):void { // mmoriser lobjet dplacer draggedObject = DisplayObject(event.target); // enregistrer la diffrence (dcalage) entre le point o tait // le curseur lors de lappui sur le bouton et les coordonnes x,y // de lobjet lors de cet appui. offsetX = event.stageX - draggedObject.x; offsetY = event.stageY - draggedObject.y; // dplacer lobjet slectionn en haut de la liste daffichage stage.addChild(draggedObject); // ordonner Flash Player dcouter lvnement mouseMove stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject); } // cette fonction est appele lors du relchement du bouton de la souris. function stopDragging(event:MouseEvent):void { // ordonner Flash Player de cesser dcouter lvnement mouseMove stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragObject); } // cette fonction est appele chaque mouvement de souris, // tant que le bouton gauche reste appuy. function dragObject(event:MouseEvent):void { // dplacement de lobjet lemplacement du curseur, en prservant // le dcalage entre lemplacement du curseur et // lemplacement de lobjet dplac. draggedObject.x = event.stageX - offsetX; draggedObject.y = event.stageY - offsetY; // ordonner Flash Player dexcuter un rafrachissement dcran // aprs cet vnement. event.updateAfterEvent(); } circle.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); circle.addEventListener(MouseEvent.MOUSE_UP, stopDragging); square.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); square.addEventListener(MouseEvent.MOUSE_UP, stopDragging);

Manipulation des objets daffichage

425

Pour crer un effet plus sophistiqu, par exemple pour un jeu o des jetons ou des cartes passent dune pile lautre, il est possible dajouter lobjet dplac la liste daffichage de la scne lorsquil est pris , puis de lajouter une autre liste daffichage (la pile sur laquelle il est dpos) lors du relchement du bouton de souris. Enfin, pour obtenir un meilleur effet, vous pouvez aussi appliquer un filtre Ombre porte lobjet lors du clic (au dbut du dplacement) et dsactiver ce filtre lorsque lobjet est dpos. Pour tous dtails sur lutilisation du filtre Ombre porte et des autres filtres en ActionScript, voir le Chapitre 15, Filtrage des objets daffichage , la page 495.

Dfilement horizontal et vertical des objets daffichage


Si la taille dun objet daffichage est trop importante pour la zone dans laquelle vous voulez lafficher, vous pouvez utiliser la proprit scrollRect pour dfinir la partie visible de cet objet. De plus, en modifiant la proprit scrollRect en rponse aux mouvements de lutilisateur, vous pouvez faire dfiler le contenu horizontalement ou verticalement. La proprit scrollRect est une instance de la classe Rectangle. Celle-ci combine les valeur ncessaires pour dfinir une zone rectangulaire comme objet. Pour dfinir la zone visible de lobjet, crez une nouvelle instance de Rectangle et affectez-la la proprit scrollRect de lobjet. Par la suite, pour obtenir un dfilement horizontal ou vertical, il suffit de lire la proprit scrollRect dans une variable Rectangle spare et de changer la proprit voulue (par exemple, modifier la proprit x de linstance de Rectangle pour un dfilement horizontal, ou sa proprit y pour un dfilement vertical). Vous raffectez ensuite cette instance de Rectangle la proprit scrollRect pour transmettre la nouvelle valeur lobjet daffichage. Par exemple, le code suivant dfinit la zone visible dun objet TextField nomm bigText dont la hauteur est trop importante pour les dimensions du fichier SWF. Lors dun clic sur les deux boutons nomms up et down, des fonctions sont appeles pour faire dfiler vers le haut ou le bas le contenu de lobjet TextField, en modifiant la proprit y de linstance de Rectangle scrollRect.
import flash.events.MouseEvent; import flash.geom.Rectangle; // dfinir la zone visible initiale de linstance de TextField : //gauche : 0, top: 0, width: TextFields width, height: 350 pixels. bigText.scrollRect = new Rectangle(0, 0, bigText.width, 350); // mettre le TextField en cache sous forme de bitmap pour amliorer // les performances. bigText.cacheAsBitmap = true;

426

Programmation de laffichage

// fonction appele lors dun clic sur le bouton up function scrollUp(event:MouseEvent):void { // accder au rectangle de dfilement actuel. var rect:Rectangle = bigText.scrollRect; // diminuer la valeur y du rectangle de 20, afin de le // dplacer vers le bas de 20 pixels. rect.y -= 20; // raffecter le rectangle lobjet TextField afin dappliquer // la modification. bigText.scrollRect = rect; } // fonction appele lors dun clic sur le bouton down function scrollDown(event:MouseEvent):void { // accder au rectangle de dfilement actuel. var rect:Rectangle = bigText.scrollRect; // augmenter la valeur y du rectangle de 20, afin de le // dplacer vers le haut de 20 pixels. rect.y += 20; // raffecter le rectangle lobjet TextField afin dappliquer // la modification. bigText.scrollRect = rect; } up.addEventListener(MouseEvent.CLICK, scrollUp); down.addEventListener(MouseEvent.CLICK, scrollDown);

Comme le montre cet exemple, lorsque vous utilisez la proprit scrollRect dun objet daffichage, il est prfrable de spcifier que Flash doit mettre en cache le contenu de lobjet sous forme de bitmap, laide de la proprit cacheAsBitmap. Ainsi, Flash Player na pas redessiner le contenu complet de lobjet chaque dfilement de celui-ci, et il peut utiliser le bitmap mis en cache pour afficher la portion concerne directement lcran. Pour plus dinformations, consultez la section Mise en cache des objets daffichage , la page 432.

Manipulation des objets daffichage

427

Redimensionnement et mise lchelle des objets


La taille dun objet daffichage peut tre obtenue et modifie de deux faons, en utilisant soit les proprits de dimensions (width et height) ou les proprits dchelle (scaleX et scaleY). Chaque objet daffichage possde une proprit width et une proprit height, qui sont initialement dfinies avec la taille de lobjet en pixels. Il est possible de lire les valeurs de ces proprits pour mesurer la taille de lobjet. Vous pouvez aussi spcifier de nouvelles valeurs pour modifier la taille de lobjet :
// redimensionnement dun objet daffichage. square.width = 420; square.height = 420; // dtermination du rayon dun objet de type cercle. var radius:Number = circle.width / 2;

La modification de la proprit height ou width dun objet daffichage provoque une mise lchelle de cet objet, si bien que son contenu est tir ou rtrci pour ladapter la nouvelle zone. Si lobjet ne contient que des formes vectorielles, ces dernires sont retraces la nouvelle chelle, sans perte de qualit. Par contre, tout lment bitmap figurant dans lobjet sera mis lchelle, et non pas redessin. Ainsi, une photo numrique dont la largeur et la hauteur sont augmentes au-del des dimensions relles des informations de pixels de limage subira une pixellisation, do un effet descaliers. Si vous modifiez les proprits width ou height dun objet daffichage, Flash Player actualise aussi en consquence les proprits scaleX et scaleY de lobjet. Ces proprits reprsentent la taille relative de lobjet daffichage par rapport sa taille originale. Les proprits scaleX et scaleY utilisent des valeurs dcimales pour reprsenter des pourcentages. Par exemple, si la proprit width dun objet a t rduite la moiti de sa largeur originale, la proprit scaleX de cet objet prendra la valeur 0,5, soit 50 %. Si sa hauteur a t double, sa proprit scaleY prendra la valeur 2, soit 200 %.
// circle est un objet daffichage dont la largeur et la hauteur sont // de 150 pixels. // sa taille originale, les valeurs de scaleX et scaleY sont de 1 (100%). trace(circle.scaleX);// sortie : 1 trace(circle.scaleY);// sortie : 1 si les proprits width // Flash Player modifie circle.width = 100; circle.height = 75; trace(circle.scaleX);// trace(circle.scaleY);// et height sont modifies, les proprits scaleX et scaleY en consquence.

sortie : 0.6622516556291391 sortie : 0.4966887417218543

428

Programmation de laffichage

Les changements de taille ne sont pas proportionnels. Autrement dit, si vous changez la proprit height dun carr mais pas sa proprit width, ses proportions ne seront plus identiques et le carr deviendra un rectangle. Pour obtenir une modification relative de la taille dun objet daffichage, vous pouvez modifier les valeurs des proprits scaleX et scaleY afin de redimensionner lobjet, plutt que ses proprits width et height. Par exemple, le code suivant change la proprit width de lobjet daffichage square, puis modifie lchelle verticale (scaleY) pour quelle soit identique lchelle horizontale, afin de prserver les proportions du carr.
// changer directement la largeur. square.width = 150; // changer lchelle verticale pour quelle soit identique // lchelle horizontale, // afin de prserver les proportions du carr. square.scaleY = square.scaleX;

Contrle de la distorsion lors de la mise lchelle


Normalement, lors de la mise lchelle dun objet daffichage (par exemple lorsquil est tir horizontalement), la distorsion qui en rsulte est rpartie sur lensemble de lobjet, si bien que chaque partie est tire de la mme valeur. Pour les graphiques et les lments de design, cest probablement la meilleure solution. Toutefois, il est parfois prfrable de garder le contrle sur les parties de lobjet qui seront tires et celles qui ne le seront pas. Un exemple courant est celui dun bouton reprsent par un rectangle aux angles arrondis. Avec une mise lchelle normale, les coins du bouton seront tirs, si bien que leurs rayons changeront en fonction du redimensionnement du bouton.

Manipulation des objets daffichage

429

Mais dans ce cas prcis, il serait prfrable de contrler la mise lchelle, cest--dire de pouvoir dsigner certaines zones qui seront mises lchelle (les cts) et celles qui ne le seront pas (les angles), afin que le changement dchelle ne provoque pas de distorsion visible.

Vous pouvez utiliser la mise lchelle 9 dcoupes (Echelle-9), qui permet de contrler la mise lchelle des objets. Avec la mise lchelle 9 dcoupes, lobjet est divis en neuf rectangles distincts (sur une grille de 3 par 3, comme celle dun tic-tac-toe). Ces rectangles ne sont pas obligatoirement de la mme taille, car lutilisateur choisit lemplacement des lignes de sparation. Le contenu situ dans les quatre rectangles des angles (dans notre exemple, les coins arrondis du bouton) ne sera pas tir ou compress lors de la mise lchelle de lobjet. Les rectangles centraux du haut et du bas seront mis lchelle horizontalement mais pas verticalement, alors que les rectangles centraux de gauche et de droite seront mis lchelle verticalement mais pas horizontalement. Le rectangle central sera mis lchelle la fois horizontalement et verticalement.

Ainsi, si vous crez un objet daffichage et souhaitez quune partie du contenu ne subisse jamais de mise lchelle, il vous suffit de placer les lignes de sparation de la grille de mise lchelle 9 dcoupes de telle sorte que ce contenu se trouve dans lun des rectangles des angles. En ActionScript, il suffit de dfinir une valeur pour la proprit scale9Grid dun objet daffichage pour activer la mise lchelle 9 dcoupes pour cet objet et dfinir la taille des rectangles de la grille. Utilisez une instance de la classe Rectangle comme valeur de la proprit scale9Grid :
myButton.scale9Grid = new Rectangle(32, 27, 71, 64);

430

Programmation de laffichage

Les quatre paramtres du constructeur Rectangle sont les coordonnes x et y, la largeur et la hauteur. Dans cet exemple, le coin suprieur gauche du rectangle est plac aux points x: 32, y: 27 de lobjet daffichage myButton. Ce rectangle mesure 71 pixels de largeur et 65 pixels de hauteur (son bord droit se trouve donc sur la coordonne x 103 de lobjet daffichage, et sa base sur la coordonne y 92 de cet objet).

La zone qui est contenue dans la partie dfinie par linstance de Rectangle reprsente le rectangle central de la grille 9 dcoupes. Les autres rectangles sont calculs par Flash Player en tendant les cts de linstance de Rectangle, comme ici :

Dans ce cas prcis, lors dune mise lchelle du bouton, les coins arrondis ne seront ni tirs ni compresss, et les autres zones seront seules modifies pour la nouvelle chelle.
myButton.width = 131; myButton.height = 106; myButton.width = 73; myButton.height = 69; myButton.width = 54; myButton.height = 141;

Manipulation des objets daffichage

431

Mise en cache des objets daffichage


Quil sagisse de crer une application ou des animations complexes par programmation, prenez en compte les performances et loptimisation mesure que la taille de vos projets Flash augmente. Lorsque du contenu doit demeurer statique (par exemple une instance de Shape rectangulaire), Flash ne loptimise pas. Toutefois, lorsque vous modifiez la position du rectangle, Flash redessine la totalit de linstance de Shape. Vous pouvez mettre certains objets daffichage en cache pour amliorer les performances de votre fichier SWF. Lobjet daffichage est essentiellement une surface, cest--dire une version bitmap des donnes vectorielles de linstance, donnes non destines tre normment modifies tout au long de la vie de votre fichier SWF. Ainsi, les instances pour lesquelles la mise en cache est active ne sont pas continuellement redessines pendant la lecture du fichier SWF, et le rendu de ce dernier est plus rapide.
REMARQUE 432

Vous pouvez mettre jour les donnes vectorielles au moment de la recration de la surface. Ainsi, les donnes vectorielles mises en cache dans la surface ne doivent pas ncessairement tre les mmes pour lensemble du fichier SWF.

Pour quun objet daffichage mette en cache sa reprsentation sous forme de bitmap, il suffit dactiver sa proprit cacheAsBitmap (true). Flash cre un objet de surface pour linstance, sous la forme dune image bitmap mise en cache et non des donnes vectorielles. Si vous modifiez les limites de lobjet daffichage, la surface est recre et non redimensionne. Les surfaces peuvent simbriquer dans dautres surfaces. La surface enfant copiera limage bitmap sur sa surface parent. Pour plus dinformations, consultez la section Activation de la mise en cache sous forme de bitmap , la page 435. Les proprits opaqueBackground et scrollRect de la classe DisplayObject portent sur la mise en cache ralise avec la proprit cacheAsBitmap. Bien que ces trois proprits soient indpendantes lune de lautre, opaqueBackground et scrollRect ne sont utiles que lorsquun objet est mis en cache sous forme de bitmap. Les avantages des proprits opaqueBackground et scrollRect en termes de performances ne sont visibles que si cacheAsBitmap est active. Pour plus dinformations sur le dfilement du contenu des objets daffichage, consultez la section Dfilement horizontal et vertical des objets daffichage , la page 426. Pour plus dinformations sur lactivation dun arrire-plan opaque, consultez la section Dfinition dune couleur darrire-plan opaque , la page 435. Pour des informations sur le masquage de canal alpha, qui exige que vous dfinissiez la proprit du cacheAsBitmapsur true, consultez Masquage du canal alpha , la page 442.

Programmation de laffichage

Pertinence de la mise en cache


Lactivation de la mise en cache dun objet daffichage cre une surface, ce qui offre de nombreux avantages, par exemple pour acclrer le rendu des animations vectorielles complexes. Il existe diverses situations pour lesquelles il est souhaitable dactiver la mise en cache. Il pourrait sembler avantageux de toujours activer la mise en cache pour amliorer les performances du fichier SWF, mais dans certains cas cette opration ne les amliore pas, voire mme les diminue. Cette section prsente des cas o la mise en cache savre bnfique, et dautres o il est prfrable dutiliser les objets de faon normale. Les performances gnrales des donnes mises en cache dpendent de la complexit des donnes vectorielles de vos instances, de la quantit de modifications et de lactivation ou non de la proprit opaqueBackground. Si vous modifiez de petites zones, la diffrence entre lutilisation dune surface et celle de donnes vectorielles sera ngligeable. Vous pouvez dans ce cas tester les deux scnarios avant de dployer votre application. Quand utiliser le cache bitmap Voici diverses situations qui illustrent les avantages de la mise en cache sous forme de bitmap.

Image darrire-plan complexe : une application qui contient une image de fond complexe de donnes vectorielles (par exemple une image laquelle vous avez appliqu la commande de traage de bitmap ou un graphisme cr dans Adobe Illustrator). Si vous animez des personnages sur larrire-plan, cela ralentit lanimation car larrire-plan doit rgnrer continuellement les donnes vectorielles. Pour amliorer les performances, activez la proprit opaqueBackground de lobjet daffichage de larrire-plan. Larrireplan est converti en bitmap et peut tre redessin rapidement pour que lanimation dfile beaucoup plus vite. Dfilement dun champ texte : application qui affiche une grande quantit de texte dans une zone de texte droulant. Vous pouvez placer la zone de texte dans un objet daffichage que vous dfinissez comme droulant laide de bornes de droulement (proprit scrollRect), ce qui autorise un dfilement rapide des pixels pour linstance spcifie. Lorsque lutilisateur fait dfiler linstance de lobjet, Flash dcale les pixels vers le haut et gnre uniquement la nouvelle zone visible au lieu de rgnrer toute la zone de texte. Systme de fentres : application comportant un systme complexe de fentres se chevauchant. Chaque fentre peut tre ouverte ou ferme (par exemple, les fentres du navigateur Web). Si vous marquez chaque fentre comme une surface (en activant la proprit cacheAsBitmap), chaque fentre sera isole et mise en cache. Les utilisateurs peuvent faire glisser les fentres de manire ce quelles se chevauchent. Chaque fentre na pas besoin de gnrer nouveau le contenu vectoriel.

Manipulation des objets daffichage

433

Masquage du canal alpha : Si vous utilisez le masquage du canal alpha, vous devez activer la proprit chacheAsBitmap. Pour plus dinformations, consultez la section Masquage du canal alpha , la page 442.

Dans ces divers cas, lactivation de la mise en cache sous forme de bitmap amliore la ractivit et linteractivit de lapplication en optimisant les graphismes vectoriels. De plus, si vous appliquez un filtre un objet daffichage, la proprit cacheAsBitmap est automatiquement active par Flash Player, mme si vous lavez explicitement dsactive. Si vous supprimez ensuite tous les filtres de lobjet, la proprit cacheAsBitmap retrouve sa valeur prcdente. Quand viter dutiliser la mise en cache bitmap Un mauvais usage de cette fonctionnalit peut avoir un effet ngatif sur le fichier SWF. Avant dutiliser la mise en cache sous forme de bitmap, vrifiez les points suivants :

Nabusez pas des surfaces (objets daffichage dont la mise en cache est active). Chaque surface utilise plus de mmoire quun objet daffichage normal, il est donc conseill de nactiver les surfaces que pour amliorer les performances. Un bitmap mis en cache utilise beaucoup plus de mmoire quun objet normal. Par exemple, si une instance de Sprite sur la scne a une taille de 250 x 250 pixels, elle peut occuper 250 Ko si elle est mise en cache, contre 1 Ko pour une instance normale (non mise en cache).

vitez de zoomer dans les surfaces mises en cache. Si vous abusez de la mise en cache sous forme de bitmap, une grande quantit de mmoire sera occupe (voir le point prcdent), surtout si vous zoomez sur le contenu. Utilisez des surfaces pour les instances dobjets daffichage essentiellement statiques (non anims). Vous pouvez faire glisser ou dplacer linstance, mais son contenu ne doit pas tre anim ni subir de nombreuses modifications. (Les animations et les modifications de contenu sont courantes avec les instances de MovieClip contenant des animations et avec les instances de lobjet Video.) Par exemple, si vous faites pivoter ou transformez une instance, la diffrence entre la surface et les donnes vectorielles rend le traitement difficile et affecte le fichier SWF. Si vous mlangez des surfaces avec des donnes vectorielles, vous augmentez la tche de traitement pour Flash Player (et parfois pour lordinateur). Regroupez les surfaces dans la mesure du possible, par exemple si vous crez des applications avec fentrage.

434

Programmation de laffichage

Activation de la mise en cache sous forme de bitmap


Pour activer la mise en cache dun objet daffichage sous forme de bitmap, activez sa proprit cacheAsBitmap sur true :
mySprite.cacheAsBitmap = true;

Aprs avoir activ la proprit cacheAsBitmap, vous remarquerez peut-tre que lobjet daffichage est automatiquement dcal pour avoir des coordonnes entires. En testant le fichier SWF, vous devriez remarquer que le rendu des animations vectorielles complexes est bien plus rapide. Dans les deux cas suivants, aucune surface nest cre, mme si la proprit cacheAsBitmap est active :

Limage bitmap serait de taille suprieure 2 880 pixels, en hauteur ou en largeur. Il est impossible dallouer de la mmoire pour limage bitmap.

Dfinition dune couleur darrire-plan opaque


Il est possible de dfinir un arrire-plan opaque pour un objet daffichage. Par exemple, si le fichier SWF possde un arrire-plan avec un trac vectoriel complexe, vous pouvez activer la proprit opaqueBackground avec une couleur donne (en gnral la mme couleur que la scne). Cette couleur est spcifie sous forme de chiffre (hexadcimal en gnral). Larrireplan est alors considr comme un bitmap, ce qui permet doptimiser les performances. Si vous activez la proprit cacheAsBitmap et donnez la proprit opaqueBackground une couleur donne, le bitmap interne est opaque et restitu plus rapidement. Si vous nactivez pas cacheAsBitmap, la proprit opaqueBackground ajoute une forme carre vectorielle opaque larrire-plan de lobjet daffichage. Elle ne cre par automatiquement de bitmap. Lexemple suivant montre comment dfinir larrire-plan dun objet daffichage pour optimiser les performances.
myShape.cacheAsBitmap = true; myShape.opaqueBackground = 0xFF0000;

Dans cet exemple, la couleur darrire-plan de lobjet Shape nomm myShape est rouge (0xFF0000). Si lon supose que linstance de Shape contient un triangle vert, sur une scne dote dun fond blanc le rsultat sera un triangle vert sur le fond rouge dfini par le cadre de slection de linstance de Shape (le rectangle qui entoure entirement Shape).

Manipulation des objets daffichage

435

Il va de soi que ce code serait plus logique sil tait utilis sur une scne ayant un fond rouge opaque, ou sur un fond dune autre couleur en choisissant celle-ci pour le rectangle. Par exemple, pour un fichier SWF ayant un fond blanc, la proprit opaqueBackground sera vraisemblablement dfinie comme 0xFFFFFF, soit le blanc pur.

Application de modes de fondu


Les modes de fondu supposent dassocier les couleurs dune image (limage de base) celles dune autre image (limage mlange) afin de produire une troisime image, qui est celle qui sera en fait affiche lcran. Chaque valeur de pixels dune image est traite avec la valeur de pixels correspondante de lautre image afin dobtenir un rsultat prsentant une valeur de pixels de position identique. Tous les objets daffichage possdent une proprit blendMode qui peut tre dfinie avec lun des modes de fondu ci-dessous. Ces valeurs sont des constantes dfinies dans la classe BlendMode. Il est galement possible dutiliser directement les chanes (indiques entre parenthses) qui reprsentent les valeurs de ces constantes.

: couramment utilis pour crer un effet de transition par fondu au blanc anim entre deux images.
BlendMode.ALPHA ("alpha")

BlendMode.ADD ("add")

: couramment utilis pour appliquer la transparence de : couramment utilis pour une superposition de type. : couramment utilis pour crer des couleurs

lavant-plan larrire-plan.

BlendMode.DARKEN ("darken")

BlendMode.DIFFERENCE ("difference")

plus vives.

BlendMode.ERASE ("erase") : couramment utilis pour effacer (dcouper) une partie de larrire-plan laide de la couche alpha davant-plan. BlendMode.HARDLIGHT ("hardlight")

: couramment utilis pour crer des effets

dombre.

BlendMode.INVERT ("invert") BlendMode.LAYER ("layer")

: utilis pour inverser larrire-plan.

: utilis pour forcer la cration dun tampon provisoire en vue de la prcomposition dun objet daffichage spcifique. : couramment utilis pour une superposition de type. : couramment utilis pour crer des effets dombre

BlendMode.LIGHTEN ("lighten")

BlendMode.MULTIPLY ("multiply")

et de profondeur.

BlendMode.NORMAL ("normal") : utilis pour que les valeurs des pixels de limage mlange remplacent celles de limage de base. BlendMode.OVERLAY ("overlay")

: couramment utilis pour crer des effets dombre.

436

Programmation de laffichage

BlendMode.SCREEN ("screen")

: couramment utilis pour crer des hautes lumires et

des halos.

BlendMode.SUBTRACT ("subtract")

: couramment utilis pour crer un effet de transition par fondu au noir anim entre deux images.

Modification des couleurs des objets daffichage


Les mthodes de la classe ColorTransform intgre (flash.geom.ColorTransform) permettent de modifier la couleur dun objet daffichage. Tous les objets daffichage possdent une proprit transform, qui est une instance de la classe Transform et contient des informations sur les diverses transformations appliques leur objet daffichage (rotation, changement dchelle ou de position, etc.). Outre les informations sur les transformations gomtriques, la classe Transform comporte galement une proprit colorTransform qui est une instance de la classe ColorTransform et permet de procder des modifications de couleur sur lobjet. Pour accder aux informations de transformation dun objet daffichage, utilisez le code suivant :
var colorInfo:ColorTransform = myDisplayObject.transform.colorTransform;

Aprs avoir cr une instance de ColorTransform, vous pouvez lire les valeurs de ses proprits pour connatre les transformations de couleur qui lui ont dj t appliques, et vous pouvez modifier ces valeurs pour changer les couleurs de lobjet. Pour actualiser lobjet daffichage aprs un changement, vous devez raffecter linstance de ColorTransform la proprit transform.colorTransform.
var colorInfo:ColorTransform = my DisplayObject.transform.colorTransform; // transformations de couleur. // activer la modification. myDisplayObject.transform.colorTransform = colorInfo;

Manipulation des objets daffichage

437

Modification par code des valeurs des couleurs


La proprit color de la classe ColorTransform permet daffecter des valeurs rouge, vert, bleu (RVB) spcifiques lobjet. Lexemple suivant utilise la proprit color pour changer en bleu la couleur de lobjet daffichage square lorsque lutilisateur clique sur le bouton blueBtn :
// square est un objet daffichage sur la scne. // blueBtn, redBtn, greenBtn et blackBtn sont des boutons sur la scne. import flash.events.MouseEvent; import flash.geom.ColorTransform; // accder linstance de ColorTransform associe au carr. var colorInfo:ColorTransform = square.transform.colorTransform; // cette fonction est appele en cas de clic sur blueBtn function makeBlue(event:MouseEvent):void { // modifier la couleur de lobjet ColorTransform colorInfo.color = 0x003399; // appliquer le changement lobjet square.transform.colorTransform = colorInfo; } blueBtn.addEventListener(MouseEvent.CLICK, makeBlue);

Notez que si vous changez la couleur dun objet daffichage laide de la proprit color, cest la couleur de lobjet entier qui est modifie, mme sil comportait plusieurs couleurs lorigine. Par exemple, si un objet daffichage contient un cercle vert en arrire-plan dun texte noir, le choix du rouge pour la proprit color de linstance de ColorTransform associe cet objet transformera intgralement lobjet en rouge, cercle et texte compris (le texte ne sera donc plus lisible sur le fond de la mme couleur).

Modification par code des effets de couleur et de luminosit


Supposons quun objet daffichage comporte plusieurs couleurs (par exemple une photo numrique) et que vous nayez pas lintention de modifier la couleur de lensemble de lobjet, mais uniquement celle dun de ses lments sur la base des couleurs existantes. Cest pour ce genre de situation que la classe ColorTransform comporte une srie de proprits de multiplication et de dcalage qui permettent de procder ce type de modification. Les proprits de modification redMultiplier, greenMultiplier, blueMultiplier et alphaMultiplier fonctionnent comme des filtres photographiques colors, en amplifiant ou rduisant certaines couleurs de lobjet. Les proprits de dominante (redOffset, greenOffset, blueOffset et alphaOffset) permettent dajouter lobjet une quantit supplmentaire dune certaine couleur, ou dindiquer la valeur minimale que peut avoir une couleur particulire.

438

Programmation de laffichage

Ces proprits daugmentation et de dominante sont identiques aux rglages de couleur disponibles pour les symboles de clips dans lenvironnement de cration Flash, lorsque vous cliquez sur loption Avanc du menu local Couleur de linspecteur des proprits. Le code ci-dessous charge une image JPEG et lui applique un filtre de transformation de couleurs, qui modifie les canaux rouge et vert mesure que le pointeur de la souris se dplace le long de laxe x et de laxe y. Dans ce cas prcis, comme aucune valeur de dominante nest spcifie, les valeurs de chaque canal colorimtrique seront un pourcentage de la valeur de couleur originale de limage, cest--dire que la valeur maximale de rouge ou de vert dun pixel donn sera la quantit originale de vert ou de rouge de ce pixel.
import import import import import flash.display.Loader; flash.events.MouseEvent; flash.geom.Transform; flash.geom.ColorTransform; flash.net.URLRequest;

// chargement de limage dans la scne var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/ images/image1.jpg"); loader.load(url); this.addChild(loader); // cette fonction est appele lors du dplacement de la souris au-dessus // de limage charge. function adjustColor(event:MouseEvent):void { // accder lobjet ColorTransform du Loader (contenant limage) var colorTransformer:ColorTransform = loader.transform.colorTransform; // modifier les multiplicateurs de vert et de rouge en fonction de // la position de la souris. // le rouge varie de 0% (pas de rouge) lorsque le curseur est gauche // 100% (valeur normale de rouge) lorsque le curseur est droite // mme comportement pour le canal vert, qui est contrl par la // position de la souris sur laxe y. colorTransformer.redMultiplier = (loader.mouseX / loader.width) * 1; colorTransformer.greenMultiplier = (loader.mouseY / loader.height) * 1; // appliquer les changements lobjet loader.transform.colorTransform = colorTransformer; } loader.addEventListener(MouseEvent.MOUSE_MOVE, adjustColor);

Manipulation des objets daffichage

439

Rotation des objets


Les objets daffichage peuvent subir une rotation laide de la proprit rotation. La valeur de cette proprit est accessible en lecture pour savoir si lobjet a subi une rotation, et elle peut tre modifie en lui attribuant une valeur qui exprime le nombre de degrs de rotation appliquer lobjet. Par exemple, cette ligne de code fait pivoter lobjet square de 45 degrs (un huitime de tour complet) :
square.rotation = 45;

Vous pouvez aussi faire pivoter un objet en lui appliquant une matrice de transformation, comme dcrit dans le Chapitre 13, Utilisation de la gomtrie , la page 459.

Application deffets de fondu des objets


Il est possible de contrler la transparence dun objet daffichage pour le rendre partiellement ou compltement transparent, ou encore pour le faire apparatre ou disparatre en fondu. La proprit alpha de la classe DisplayObject dfinit la transparence (ou plus prcisment lopacit) dun objet daffichage. La proprit alpha peut avoir une valeur comprise entre 0 et 1, 0 tant la transparence totale et 1 lopacit totale. Par exemple, le code suivant rend lobjet myBall transparent 50 % lors dun clic de souris :
function fadeBall(event:MouseEvent):void { myBall.alpha = .5; } myBall.addEventListener(MouseEvent.CLICK, fadeBall);

Vous pouvez aussi modifier la transparence dun objet daffichage laide des rglages de couleur disponibles dans la classe ColorTransform. Pour plus dinformations, consultez la section Modification des couleurs des objets daffichage , la page 437.

Masquage des objets daffichage


Vous pouvez utiliser un objet daffichage comme masque pour crer un trou laissant apparatre le contenu dun autre objet.

440

Programmation de laffichage

Dfinition dun masque


Pour indiquer quun objet daffichage sera le masque dun autre objet, dfinissez lobjet masque comme proprit mask de lobjet masquer :
// dfinir lobjet maskSprite comme masque de lobjet mySprite. mySprite.mask = maskSprite;

Lobjet masqu apparat sous toutes les zones opaques (non transparentes) de celui qui fait office de masque. Par exemple, le code suivant cre une instance de Shape contenant un carr rouge de 100 x 100 pixels, et une instance de Sprite contenant un cercle bleu dun rayon de 25 pixels. Lorsque lutilisateur clique sur le cercle, celui-ci est dfini comme masque du carr, si bien que la seule partie visible du carr est celle qui est couverte par la partie solide du cercle. Autrement dit, seul un cercle rouge est visible.
// ce code doit tre excut dans un conteneur dobjets daffichage, // par ex. une instance de MovieClip ou de Sprite. import flash.display.Shape; // tracer un carr et lajouter la liste daffichage. var square:Shape = new Shape(); square.graphics.lineStyle(1, 0x000000); square.graphics.beginFill(0xff0000); square.graphics.drawRect(0, 0, 100, 100); square.graphics.endFill(); this.addChild(square); // tracer un cercle et lajouter la liste daffichage. var circle:Sprite = new Sprite(); circle.graphics.lineStyle(1, 0x000000); circle.graphics.beginFill(0x0000ff); circle.graphics.drawCircle(25, 25, 25); circle.graphics.endFill(); this.addChild(circle); function maskSquare(event:MouseEvent):void { square.mask = circle; circle.removeEventListener(MouseEvent.CLICK, maskSquare); } circle.addEventListener(MouseEvent.CLICK, maskSquare);

Manipulation des objets daffichage

441

Lobjet daffichage qui fait office de masque peut tre dplac, anim, redimensionn dynamiquement, et il peut aussi utiliser des formes spares au sein dun mme masque. Il nest pas ncessaire que lobjet qui fait office de masque soit ajout la liste daffichage. Toutefois, si vous avez lintention de redimensionner cet objet masque en cas de mise lchelle de la scne, ou encore si vous voulez autoriser une interaction de lutilisateur avec le masque (par exemple un glisser-dposer ou un redimensionnement), vous devez lajouter la liste daffichage. Lindice de profondeur (z-index, pour lordre de superposition) des objets daffichage na pas dimportance, ds lors que lobjet masque est ajout la liste daffichage. (Lobjet masque napparatra pas lcran, si ce nest sous forme de masque.) Si lobjet masque est une instance de MovieClip comportant plusieurs images, toutes les images de son scnario sont lues, au mme titre que sil ntait pas utilis comme masque. Pour supprimer un masque, mettez la proprit mask null :
// supprime le masque de mySprite mySprite.mask = null;

Il est impossible dutiliser un masque pour en masquer un autre. Il est impossible de dfinir la proprit alpha dun objet utilis comme masque. Seuls les remplissages sont utiliss dans un objet utilis comme masque, les traits sont ignors.

Masquage des polices de priphrique


Vous pouvez utiliser un objet daffichage pour masquer du texte dfini dans une police de priphrique. Dans ce cas, le cadre de slection rectangulaire du masque est utilis comme forme de masquage. Ainsi, si vous crez un objet masque non rectangulaire pour un texte, le masque qui apparat dans le fichier SWF est la forme de la bote de dlimitation rectangulaire du masque, et non celle du masque lui-mme.

Masquage du canal alpha


Le masquage de canal alpha est possible si le masque et les objets masqus utilisent la mise en cache sous forme de bitmap :
// maskShape est une instance de Shape qui comporte un remplissage e // n dgrad. mySprite.cacheAsBitmap = true; maskShape.cacheAsBitmap = true; mySprite.mask = maskShape;

Par exemple, une application du masquage du canal alpha consiste utiliser un filtre sur lobjet masque, indpendamment dun autre filtre qui est appliqu lobjet masqu.

442

Programmation de laffichage

Dans lexemple suivant, un fichier image externe est charg sur la scne. Cette image (ou, plus exactement, linstance de Loader dans laquelle elle est charge) reprsentera lobjet masqu. Un dgrad ovale (centre noir opaque devenant progressivement transparent sur les bords) est dessin sur limage. Il fera office de masque alpha. La mise en cache sous forme de bitmap est active pour les deux objets daffichage. Lovale est dfini comme masque de limage, puis il est rendu dplaable.
// ce code doit tre excut dans un conteneur dobjets daffichage, // par ex. une instance de MovieClip ou de Sprite. import import import import import flash.display.GradientType; flash.display.Loader; flash.display.Sprite; flash.geom.Matrix; flash.net.URLRequest;

// charger une image et lajouter la liste daffichage. var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/ images/image1.jpg"); loader.load(url); this.addChild(loader); // crer un Sprite. var oval:Sprite = new Sprite(); // tracer un ovale dgrad. var colors:Array = [0x000000, 0x000000]; var alphas:Array = [1, 0]; var ratios:Array = [0, 255]; var matrix:Matrix = new Matrix(); matrix.createGradientBox(200, 100, 0, -100, -50); oval.graphics.beginGradientFill(GradientType.RADIAL, colors, alphas, ratios, matrix); oval.graphics.drawEllipse(-100, -50, 200, 100); oval.graphics.endFill(); //ajouter le Sprite la liste daffichage. this.addChild(oval); // activer la proprit cacheAsBitmap pour les deux objets daffichage. loader.cacheAsBitmap = true; oval.cacheAsBitmap = true; // dfinir lovale comme masque du loader (et de son enfant, // limage charge). loader.mask = oval; // rendre lovale dplaable oval.startDrag(true);

Manipulation des objets daffichage

443

Animation des objets


Lanimation est le processus de dplacer un ou plusieurs objets, ou de les modifier dans le temps. Les animations par script reprsentent un lment fondamental des jeux vido, et elles sont aussi frquemment utilises pour obtenir un rsultat plus sduisant et ajouter des interaction dautres applications. Lide de base de lanimation par script est le changement, et celui-ci doit tre divis en tapes excutes successivement. Il est facile de rpter une opration en ActionScript, laide dune simple boucle. Toutefois, toutes les itrations dune boucle sont excutes avant lactualisation de laffichage. Pour crer une animation par programmation, il est donc ncessaire de rdiger du code ActionScript qui excute une action rptition et actualise lcran aprs chacune de ces excutions. Par exemple, imaginons que vous souhaitez crer une animation simple : faire traverser lcran par un ballon. ActionScript comporte un mcanisme simple qui permet de dcompter le temps coul et dactualiser lcran en consquence, ce qui permet de rdiger du code pour dplacer le ballon dune faible distance la fois, jusqu ce quil atteigne sa destination. Lcran est actualis aprs chaque mouvement, si bien que le dplacement est visible par lutilisateur. Dun point de vue pratique, il est logique de synchroniser lanimation par programmation avec la frquence de dfilement du fichier SWF (autrement dit, de programmer un changement de lanimation chaque fois quune nouvelle image doit tre affiche), puisque cest ce dfilement qui provoque le rafrachissement dcran par Flash Player. Chaque objet daffichage possde un vnement enterFrame qui est diffus en fonction de la cadence daffichage du fichier SWF (un vnement par image). La plupart des dveloppeurs qui crent des animations par programmation utilisent lvnement enterFrame pour crer des actions rptitives. Il est possible dcrire du code pour couter lvnement enterFrame et dplacer le ballon anim dune certaine valeur chaque nouvelle image, si bien qu chaque rafrachissement dcran ( chaque image) le ballon sera redessin son nouvel emplacement, crant ainsi lillusion du mouvement.
R E MA R Q U E 444

Une autre technique pour excuter une action rptition rgulire consiste utiliser la classe Timer. Une instance de Timer dclenche une notification dvnement chaque fois que le dlai spcifi a expir. Il est donc possible dcrire du code effectuant une animation sur la base de lvnement timer de la classe Timer, en dfinissant un intervalle trs court (une fraction de seconde). Pour plus dinformations sur lutilisation de la classe Timer, consultez la section Contrle des intervalles temporels , la page 210.

Programmation de laffichage

Dans lexemple suivant, une instance de Sprite, nomme circle, est cre sur la scne. Lorsque lutilisateur clique dans le cercle, une squence danimation cre par code dbute, rduisant lopacit de circle (sa proprit alpha) jusqu ce quil soit compltement transparent :
import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; // tracer un cercle et lajouter la liste daffichage. var circle:Sprite = new Sprite(); circle.graphics.beginFill(0x990000); circle.graphics.drawCircle(50, 50, 50); circle.graphics.endFill(); addChild(circle); // lorsque cette animation dbute, cette fonction est appele // chaque image. // le changement effectu par cette fonction (actualis chaque // image) est ce qui provoque leffet danimation. function fadeCircle(event:Event):void { circle.alpha -= .05; if (circle.alpha <= 0) { circle.removeEventListener(Event.ENTER_FRAME, fadeCircle); } } function startAnimation(event:MouseEvent):void { circle.addEventListener(Event.ENTER_FRAME, fadeCircle); } circle.addEventListener(MouseEvent.CLICK, startAnimation);

Lorsque lutilisateur clique dans le cercle, la fonction fadeCircle() est enregistre comme couteur de lvnement enterFrame, et elle est donc appele une fois chaque nouvelle image. Cette fonction provoque un fondu de lobjet circle en changeant sa proprit alpha, si bien qu chaque nouvelle image la valeur de la proprit alpha du cercle dcrot de 0,05 (5 %) et lcran est actualis. En fin dopration, lorsque la valeur de alpha est de 0 (circle est alors compltement transparent), la fonction fadeCircle() est retire de la liste des couteurs dvnements, ce qui met fin lanimation.

Animation des objets

445

Le mme code pourrait tre utilis pour crer un mouvement au lieu dun effet de fondu. Il suffit de remplacer la proprit alpha par une autre dans la fonction qui coute les vnements enterFrame, et cette proprit sera alors anime. Par exemple, en remplaant la ligne
circle.alpha -= .05;

par le code
circle.x += 5;

cest la proprit x qui sera anime, provoquant un dplacement du cercle vers la droite sur la scne. La condition qui met fin lanimation peut tre active cet effet (en annulant lenregistrement comme couteur de enterFrame) lorsque la coordonne x voulue est atteinte.

Chargement dynamique de contenu afficher


Les lments daffichage externes suivants peuvent tre chargs dans une application ActionScript 3.0 :

Un fichier SWF cr en ActionScript 3.0 ce fichier peut tre un Sprite, un MovieClip ou toute classe qui tend Sprite). UN fichier image (JPG, PNG ou GIF). Un fichier SWF AVM1 (fichier SWF cr en ActionScript 1.0 ou 2.0).

Ces lments sont chargs laide de la classe Loader.

Chargement dobjets daffichage


Les objets Loader permettent de charger des fichiers SWF et des fichiers graphiques dans lapplication. La classe Loader est une sous-classe de la classe DisplayObjectContainer. Un objet Loader ne peut contenir quun seul objet daffichage enfant (lobjet qui reprsente le fichier SWF ou graphique quil charge) dans sa propre liste daffichage. Lorsque vous ajoutez un objet Loader la liste daffichage, comme dans le code ci-dessous, vous ajoutez galement lobjet daffichage enfant charg la liste daffichage une fois que le chargement a t effectu :
var pictLdr:Loader = new Loader(); var pictURL:String = "banana.jpg" var pictURLReq:URLRequest = new URLRequest(pictURL); pictLdr.load(pictURLReq); this.addChild(pictLdr);

446

Programmation de laffichage

Une fois le fichier SWF ou image charg, lobjet daffichage charg peut tre dplac dans un autre conteneur dobjets daffichage, comme lobjet DisplayObjectContainer container dans cet exemple :
import flash.display.*; import flash.net.URLRequest; import flash.events.Event; var container:Sprite = new Sprite(); addChild(container); var pictLdr:Loader = new Loader(); var pictURL:String = "banana.jpg" var pictURLReq:URLRequest = new URLRequest(pictURL); pictLdr.load(pictURLReq); pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded); function imgLoaded(event:Event):void { container.addChild(pictLdr.content); }

Suivi de la progression du chargement.


Ds que le chargement du fichier a dbut, un objet LoaderInfo est cr. Un objet LoaderInfo fournit diverses informations sur le chargement : progression, adresses URL du chargeur et du charg, nombre doctets total de lobjet multimdia et dimensions nominales (hauteur et largeur) de celui-ci. Par ailleurs, un objet LoaderInfo distribue les vnements qui permettent de suivre la progression du chargement. The following diagram shows the different uses of the LoaderInfo objectfor the instance of the main class of the SWF file, for a Loader object, and for an object loaded by the Loader object :
Scne

Objet LoaderInfo
Proprit LoaderInfo

Instance de la classe principale du fichier SWF

Objet Loader

Proprit ContentLoaderInfo

Objet LoaderInfo Contenu


Proprit LoaderInfo

Chargement dynamique de contenu afficher

447

Lobjet LoaderInfo est accessible comme proprit la fois de lobjet Loader et de lobjet daffichage charg. Ds que le chargement dbute, lobjet LoaderInfo est accessible via la proprit contentLoaderInfo de lobjet Loader. Lorsque le chargement de lobjet daffichage est termin, lobjet LoaderInfo est galement accessible comme proprit loaderInfo de cet objet charg. La proprit loaderInfo de lobjet charg fait rfrence au mme objet LoaderInfo que la proprit contentLoaderInfo de lobjet Loader. Autrement dit, un objet LoaderInfo est partag entre lobjet charg et lobjet Loader qui la charg. Pour tre en mesure daccder aux proprits du contenu charg, il est ncessaire dajouter un couteur dvnements lobjet LoaderInfo, comme dans le code suivant :
import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; var ldr:Loader = new Loader(); var urlReq:URLRequest = new URLRequest("Circle.swf"); ldr.load(urlReq); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); addChild(ldr); function loaded(event:Event):void { var content:Sprite = event.target.content; content.scaleX = 2; }

Pour plus dinformations, consultez le Chapitre 10, Gestion dvnements , la page 335.

448

Programmation de laffichage

Spcification du contexte de chargement


Pour le chargement dun fichier externe dans Flash Player via la mthode load() ou loadBytes() de la classe Loader, il est possible de spcifier un paramtre context. Ce paramtre est n objet LoaderContext. La classe LoaderContext comporte trois proprits qui permettent de dfinir le contexte dutilisation du contenu charg :

checkPolicyFile : cette proprit est rserve au chargement dun fichier image, pas dun SWF. Si vous dfinissez cette proprit sur true, Loader recherche un fichier de rgulation interdomaine sur le serveur dorigine (voir Contrles de site Web (fichiers de rgulation interdomaine) , la page 806). Cette prcaution nest ncessaire que pour du contenu provenant dun autre domaine que le fichier SWF qui contient lobjet Loader. Si le serveur accorde lautorisation au domaine do provient lobjet Loader, le code ActionScript du fichier SWF provenant de ce domaine peut accder aux donnes de limage ainsi charge. Autrement dit, vous pouvez alors utiliser la commande BitmapData.draw() pour accder aux donnes de limage.

Notez quun fichier SWF provenant dun autre domaine que celui de lobjet Loader peut appeler Security.allowDomain() pour autoriser un domaine spcifique.

securityDomain : cette proprit est rserve au chargement dun fichier SWF, pas dun fichier image. Cette proprit peut tre appele pour un fichier SWF provenant dun autre domaine que le fichier qui contient lobjet Loader. Si cette proprit est active, Flash Player vrifie lexistence dun fichier de rgulation interdomaine, et sil en existe un les fichiers SWF provenant des domaines autoriss par ce fichier de rgulation peuvent contrler par programmation le contenu SWF charg. Le paramtre est flash.system.SecurityDomain.currentDomain. applicationDomain : cette proprit ne peut tre utilise que lors du chargement dun fichier SWF rdig en ActionScript 3.0 (ni un fichier image, ni un fichier SWF crit en ActionScript 1.0 ou 2.0). Lors du chargement du fichier, vous pouvez spcifier que celui-ci doit tre inclus dans le mme domaine dapplication que lobjet Loader, en dfinissant le paramtre applicationDomain comme flash.system.ApplicationDomain.currentDomain. Si vous placez le fichier SWF charg dans le mme domaine dapplication, vous pourrez accder directement ses classes, ce qui peut tre utile si vous chargez un fichier SWF contenant des objets multimdia incorpors, auxquels vous pourrez alors accder via les noms des classes qui leur sont associes. Pour plus dinformations, consultez la section Utilisation de la classe ApplicationDomain , la page 736.

Chargement dynamique de contenu afficher

449

Voici un exemple de vrification dun fichier de rgulation inter-domaines lors du chargement dun fichier bitmap partir dun autre domaine :
var context:LoaderContext = new LoaderContext(); context.checkPolicyFile = true; var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/ photo11.jpg"); var ldr:Loader = new Loader(); ldr.load(urlReq, context);

Voici un exemple de vrification dun fichier de rgulation inter-domaines lors du chargement dun fichier SWF partir dun autre domaine, dans le but de placer ce fichier dans la mme Sandbox de scurit que lobjet Loader. De plus, ce code ajoute les classes du fichier SWF charg au domaine dapplication de lobjet Loader :
var context:LoaderContext = new LoaderContext(); context.securityDomain = SecurityDomain.currentDomain; context.applicationDomain = ApplicationDomain.currentDomain; var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/ library.swf"); var ldr:Loader = new Loader(); ldr.load(urlReq, context);

Pour plus dinformations, reportez-vous la description de la classe LoaderContext dans le manuel Rfrence du langage et des composants ActionScript 3.0.

450

Programmation de laffichage

Exemple : SpriteArranger
Lexemple SpriteArranger est bas sur lexemple Geometric Shapes dcrit dans un autre chapitre (voir Exemple : GeometricShapes , la page 193). Lexemple SpriteArranger illustre divers concepts de la gestion des objets daffichage :

extension des classes dobjets daffichage, ajout dobjets la liste daffichage, gestion de la superposition des objets daffichage et utilisation de leurs conteneurs, gestion des vnements des objets daffichage, utilisation des proprits et mthodes des objets daffichage.

Pour obtenir les fichiers de cet exemple dapplication, consultez la page www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers de lapplication SpriteArranger se trouvent dans le dossier Examples/SpriteArranger. Cette application se compose des fichiers suivants :
Fichier
SpriteArranger.mxml ou SpriteArranger.fla com/example/programmingas3/ SpriteArranger/CircleSprite.as com/example/programmingas3/ SpriteArranger/DrawingCanvas.as com/example/programmingas3/ SpriteArranger/SquareSprite.as com/example/programmingas3/ SpriteArranger/TriangleSprite.as com/example/programmingas3/ SpriteArranger/GeometricSprite.as

Description
Le fichier dapplication principal pour Flash (FLA) ou Flex (MXML) Classe dfinissant un type dobjet Sprite traant un cercle lcran. Classe dfinissant la toile vierge que reprsente un conteneur dobjets daffichage contenant les objets GeometricSprite. Classe dfinissant un type dobjet Sprite traant un carr lcran. Classe dfinissant un type dobjet Sprite traant un triangle lcran. Class qui tend lobjet Sprite et est utilise pour dfinir un objet lcran. Les classes CircleSprite, SquareSprite et TriangleSprite tendent cette classe. Interface de base dfinissant les mthodes qui doivent tre implmentes par toutes les classes des formes gomtriques. Interface dfinissant les mthodes qui doivent tre implmentes par les classes des formes gomtriques qui comportent plusieurs cts.

com/example/programmingas3/ geometricshapes/IGeometricShape.as com/example/programmingas3/ geometricshapes/IPolygon.as

Exemple : SpriteArranger

451

Fichier
com/example/programmingas3/ geometricshapes/RegularPolygon.as com/example/programmingas3/ geometricshapes/Circle.as

Description
Type de forme gomtrique dont les cts sont de longueur gale et positionns symtriquement autour du centre de la forme. Type de forme gomtrique qui dfinit un cercle.

com/example/programmingas3/ Sous-classe de RegularPolygon, dfinissant un geometricshapes/EquilateralTriangle.as triangle quilatral. com/example/programmingas3/ geometricshapes/Square.as com/example/programmingas3/ geometricshapes/ GeometricShapeFactory.as Sous-classe de RegularPolygon, dfinissant un rectangle dont les quatre cts sont gaux. Classe contenant une mthode de factorisation pour crer des formes partir dun type et dune taille de forme.

Dfinition des classes de SpriteArranger


Lapplication SpriteArranger permet dajouter divers objets daffichage la toile vierge que reprsente lcran. La classe DrawingCanvas dfinit une zone de traage, un type spcial de conteneur dobjets daffichage dans lequel lutilisateur peut ajouter des formes. Ces formes affiches lcran sont des instances de lune des sous-classes de la classe GeometricSprite.

La classe DrawingCanvas
La classe DrawingCanvas tend la classe Sprite, et cet hritage est dfini dans la dclaration de la classe DrawingCanvas :
public class DrawingCanvas extends Sprite

La classe Sprite est une sous-classe des classes DisplayObjectContainer et DisplayObject, et la classe DrawingCanvas utilise les mthodes et les proprits de ces classes. La mthode constructeur DrawingCanvas() met en place un objet Rectangle, bounds, qui est une proprit destine tre utilise ensuite pour tracer les limites de la zone de dessin. Elle appelle ensuite la mthode initCanvas(), comme suit :
this.bounds = new Rectangle(0, 0, w, h); initCanvas(fillColor, lineColor);

452

Programmation de laffichage

Comme le montre lexemple ci-dessous, la mthode initCanvas() dfinit diverses proprits de lobjet DrawingCanvas (ces proprits ont t passes en arguments la fonction constructeur) :
this.lineColor = lineColor; this.fillColor = fillColor; this.width = 500; this.height = 200;

La mthode initCanvas() appelle ensuite la mthode drawBounds() qui trace le rectangle de la zone de dessin laide de la proprit graphics de la classe DrawingCanvas. La proprit graphics est hrite de la classe Shape.
this.graphics.clear(); this.graphics.lineStyle(1.0, this.lineColor, 1.0); this.graphics.beginFill(this.fillColor, 1.0); this.graphics.drawRect(bounds.left - 1, bounds.top - 1, bounds.width + 2, bounds.height + 2); this.graphics.endFill();

Diverses autres mthodes de la classe DrawingCanvas sont appeles en fonction des actions de lutilisateur dans lapplication :

Les mthodes addShape() et describeChildren(), qui sont dcrites dans la section Ajout dobjets daffichage la zone de dessin , la page 454. Les mthodes moveToBack(), moveDown(), moveToFront() et moveUp(), qui sont dcrites dans la section Modification de lordre de superposition des objets daffichage , la page 457. La mthode onMouseUp(), qui est dcrite dans la section Glisser-dposer des objets daffichage , la page 456.

La classe GeometricSprite et ses sous-classes


Chaque objet daffichage quil est possible dajouter dans la zone de dessin est une instance de lune des sous-classes suivantes de la classe GeometricSprite :

CircleSprite SquareSprite TriangleSprite

La classe GeometricSprite tend la classe flash.display.Sprite :


public class GeometricSprite extends Sprite

Exemple : SpriteArranger

453

La classe GeometricSprite possde diverses proprits qui sont communes tous les objets GeometricSprite. Ces proprits sont dfinies dans la fonction constructeur partir des paramtres passs la fonction. Par exemple :
this.size = size; this.lineColor = lColor; this.fillColor = fColor;

La proprit geometricShape de la classe GeometricSprite dfinit une interface IGeometricShape, qui elle-mme dfinit les proprits mathmatiques, et non pas visuelles, de la forme. Les classes qui implmentent linterface IGeometricShape sont dfinies dans lexemple dapplication GeometricShapes (voir Exemple : GeometricShapes , la page 193). La classe GeometricSprite dfinit la mthode drawShape(), qui est ensuite redfinie par les dfinitions de chaque sous-classe de GeometricSprite. Pour plus dinformations, consultez la section Ajout dobjets daffichage la zone de dessin ci-dessous. La classe GeometricSprite fournit galement les mthodes suivantes :

Les mthodes onMouseDown() et onMouseUp(), qui sont dcrites dans la section Glisserdposer des objets daffichage , la page 456. Les mthodes showSelected() et hideSelected(), qui sont dcrites dans la section Glisser-dposer des objets daffichage , la page 456.

Ajout dobjets daffichage la zone de dessin


Lorsque lutilisateur clique sur le bouton Add Shape (Ajouter une forme), lapplication appelle la mthode addShape() de la classe DrawingCanvas. Elle instancie GeometricSprite en appelant la fonction constructeur approprie de lune des sous-classes de GeometricSprite, comme dans lexemple suivant :
public function addShape(shapeName:String, len:Number):void { var newShape:GeometricSprite; switch (shapeName) { case "Triangle": newShape = new TriangleSprite(len); break; case "Square": newShape = new SquareSprite(len); break;

454

Programmation de laffichage

case "Circle": newShape = new CircleSprite(len); break; } newShape.alpha = 0.8; this.addChild(newShape); }

Chaque mthode constructeur appelle la mthode drawShape(), qui utilise la proprit graphics (hrite de la classe Sprite) de la classe pour tracer le graphisme vectoriel appropri. Par exemple, la mthode drawShape() de la classe CircleSprite comporte le code suivant :
this.graphics.clear(); this.graphics.lineStyle(1.0, this.lineColor, 1.0); this.graphics.beginFill(this.fillColor, 1.0); var radius:Number = this.size / 2; this.graphics.drawCircle(radius, radius, radius);

Lavant-dernire ligne de la fonction addShape() dfinit la proprit alpha (hrite de la classe DisplayObject) de lobjet daffichage, si bien que chaque objet daffichage ajout dans la zone de dessin est lgrement transparent, laissant apparatre les objets derrire lui. La dernire ligne de la mthode addChild() ajoute le nouvel objet daffichage la liste des enfants de linstance de la classe DrawingCanvas, qui figure dj dans la liste daffichage. Le nouvel objet apparat donc sur la scne. Linterface de lapplication comporte deux champs texte, selectedSpriteTxt et outputTxt. Les proprits de texte de ces champs sont actualises avec les informations sur les objets GeometricSprite qui ont t ajouts dans la zone de dessin ou slectionns par lutilisateur. Cest la classe GeometricSprite qui gre cette tche de transmission des informations, en redfinissant comme suit la mthode toString() :
public override function toString():String { return this.shapeType + of size + this.size + " at " + this.x + ", " + this.y; }

La valeur approprie est affecte la proprit shapeType dans la mthode constructeur de chaque sous-classe de GeometricSprite. Par exemple, la mthode toString() peut renvoyer la valeur suivante pour une instance de CircleSprite ajoute rcemment linstance de DrawingCanvas :
Cercle de diamtre 50 0, 0

Exemple : SpriteArranger

455

La mthode describeChildren() de la classe DrawingCanvas parcourt en boucle la liste des enfants de la zone de dessin, en utilisant la proprit numChildren (hrite de la classe DisplayObjectContainer) pour la limite suprieure de la boucle for. Elle produit une chane contenant la liste de tous les enfants :
var desc:String = ""; var child:DisplayObject; for (var i:int=0; i < this.numChildren; i++) { child = this.getChildAt(i); desc += i + ": " + child + '\n'; }

La chane rsultante est utilise pour dfinir la proprit text du champ texte outputTxt.

Glisser-dposer des objets daffichage


Lorsque lutilisateur clique sur une instance de GeometricSprite, lapplication appelle le gestionnaire dvnement onMouseDown(). Comme le montre le code ci-dessous, ce gestionnaire dvnement coute les vnements de clic gauche de souris dans la fonction constructeur de la classe GeometricSprite :
this.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);

La mthode onMouseDown() appelle alors la mthode showSelected() de lobjet GeometricSprite. Si cest la premire fois que cette mthode est appele pour cet objet, la mthode cre un nouvel objet Shape nomm selectionIndicator et utilise la proprit graphics de lobjet Shape pour tracer un rectangle rouge :
this.selectionIndicator = new Shape(); this.selectionIndicator.graphics.lineStyle(1.0, 0xFF0000, 1.0); this.selectionIndicator.graphics.drawRect(-1, -1, this.size + 1, this.size + 1); this.addChild(this.selectionIndicator);

Si ce nest pas le premier appel de la mthode onMouseDown(), celle-ci active simplement la proprit visible (hrite de la classe DisplayObject) de la forme selectionIndicator :
this.selectionIndicator.visible = true;

La mthode hideSelected() cache la forme selectionIndicator de lobjet prcdemment slectionn en dsactivant sa proprit visible.
startDrag()

La mthode de gestion de lvnement onMouseDown() appelle galement la mthode (hrite de la classe Sprite), qui contient le code suivant :

var boundsRect:Rectangle = this.parent.getRect(this.parent); boundsRect.width -= this.size; boundsRect.height -= this.size; this.startDrag(false, boundsRect);

456

Programmation de laffichage

Cette opration permet de dplacer lobjet slectionn dans la zone de dessin, dans les limites dfinies par le rectangle boundsRect. Lorsque lutilisateur relche le bouton de souris, lvnement mouseUp est distribu. La mthode constructeur de DrawingCanvas dfinit lcouteur dvnement suivant :
this.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);

Cet couteur dvnement est dfini pour lobjet DrawingCanvas plutt que pour les objets GeometricSprite individuels. En effet, lorsque lobjet GeometricSprite est dplac, il peut se retrouver derrire un autre objet daffichage (un autre objet GeometricSprite) lors du relchement du bouton de souris. Cest alors cet objet au premier plan qui recevrait lvnement mouse up , et non pas lobjet dplac par lutilisateur. Lajout de lcouteur lobjet DrawingCanvas permet de grer correctement lvnement. La mthode onMouseUp() appelle la mthode onMouseUp() de lobjet GeometricSprite, qui son tour appelle la mthode stopDrag() de lobjet GeometricSprite.

Modification de lordre de superposition des objets daffichage


Linterface utilisateur de lapplication comporte les boutons Move Back, Move Down, Move Up et Move to Front. Lorsque lutilisateur clique sur lun de ces boutons, lapplication appelle la mthode correspondante de la classe DrawingCanvas : moveToBack(), moveDown(), moveUp() ou moveToFront(). Par exemple, la mthode moveToBack() comporte le code suivant :
public function moveToBack(shape:GeometricSprite):void { var index:int = this.getChildIndex(shape); if (index > 0) { this.setChildIndex(shape, 0); } }

Cette mthode utilise la mthode setChildIndex() (hrite de la classe DisplayObjectContainer) pour positionner lobjet daffichage la position dindex 0 dans la liste des enfants de linstance de DrawingCanvas (this).

Exemple : SpriteArranger

457

La mthode moveDown() fonctionne de la mme faon, si ce nest quelle dcrmente la position de lobjet daffichage dans lindex de la liste des enfants de linstance DrawingCanvas :
public function moveDown(shape:GeometricSprite):void { var index:int = this.getChildIndex(shape); if (index > 0) { this.setChildIndex(shape, index - 1); } }

Les mthodes moveUp() et moveToFront() fonctionnent de faon similaire aux mthodes moveToBack() et moveDown().

458

Programmation de laffichage

CHAPITRE 13

Utilisation de la gomtrie
Le package flash.geom contient des classes qui dfinissent des objets gomtriques, tels que des points, des rectangles et des matrices de transformation. Vous utilisez ces classes pour dfinir les proprits des objets qui sont utiliss dans dautres classes.

13

Contenu
Principes de base de la gomtrie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 Utilisation des objets Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .462 Utilisation dobjets Rectangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .465 Utilisation des objets Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 Exemple : Application dune transformation de matrice un objet daffichage . .470

Principes de base de la gomtrie


Introduction lutilisation de la gomtrie
La gomtrie peut tre une matire difficile retenir mais quelques connaissances peuvent tre un instrument trs utile pour utiliser ActionScript. Le package flash.geom contient des classes qui dfinissent des objets gomtriques, tels que des points, des rectangles et des matrices de transformation. Ces classes ne fournissent pas ncessairement de fonctionnalit par elles-mmes ; nanmoins, elles sont utilises pour dfinir les proprits des objets utiliss dans dautres classes. Toutes les classes de gomtrie se basent sur la notion selon laquelle les emplacements lcran sont reprsents comme un plan en deux dimensions. Lcran est trait comme un graphique plat avec un axe horizontal (x) et un axe vertical (y). Tout emplacement (ou point) lcran peut tre reprsent sous la forme dune paire de valeurs x et y, appeles coordonnes de cet emplacement.

459

Chaque objet daffichage, y compris la scne, a son propre espace de coordonnes essentiellement son propre graphique pour le trac demplacements dobjets daffichage enfants, de dessins, etc. Gnralement, lorigine (coordonnes 0, 0 o les axes x et y se croisent) est place en haut gauche de lobjet daffichage. Ceci est toujours vrai pour la scne, mais pas ncessairement pour dautres objets daffichage. Comme dans les systmes de coordonnes en deux dimensions standard, les valeurs sur laxe x augmentent en allant vers la droite et diminuent en allant vers la gauche - gauche de lorigine, la coordonne x est ngative. Nanmoins, contrairement aux systmes de coordonnes classiques, dans ActionScript, les valeurs sur laxe y augmentent an allant vers le bas et diminuent en allant vers le haut de lcran (avec des valeurs au-dessus de lorigine ayant une coordonne y ngative). Etant donn que langle suprieur gauche de la scne est lorigine de son espace de coordonnes, tout objet sur la scne aura une coordonne x suprieure 0 et infrieure la largeur de la scne. Sa coordonne y sera suprieure 0 et infrieure la hauteur de la scne. Vous pouvez utiliser des instances de la classe Point pour reprsenter des points individuels dans un espace de coordonnes. Vous pouvez crer une instance Rectangle pour reprsenter une rgion rectangulaire dans un espace de coordonnes. Les utilisateurs chevronns peuvent utiliser une instance Matrix pour appliquer des transformations multiples ou complexes un objet daffichage. De nombreuses transformations simples (rotation, position, et changements dchelle, par exemple) peuvent tre appliques directement un objet daffichage laide des proprits de ce dernier. Pour plus dinformations sur lapplication de transformations laide des proprits dun objet daffichage, voir Manipulation des objets daffichage , la page 420.

Tches de gomtrie courantes


Vous souhaiterez probablement effectuer les tches suivantes laide des classes de gomtrie dans ActionScript :

Calcul de la distance entre deux points Dtermination des coordonnes dun point dans diffrents espaces de coordonnes Dplacement dun objet daffichage laide de langle et de la distance Utilisation des instances Rectangle :

Repositionnement dune instance Rectangle Redimensionnement dune instance Rectangle Dtermination de la taille combine ou des zones de chevauchement dinstances Rectangle

Cration dobjets Matrix Utilisation dun objet Matrix pour appliquer des transformations un objet daffichage

460

Utilisation de la gomtrie

Concepts et termes importants


La liste de rfrence suivante contient les termes importants que vous rencontrerez dans ce chapitre :

Coordonnes cartsiennes : les coordonnes sont gnralement crites sous la forme dune paire de chiffres (5, 12 ou 17, -23). Les deux chiffres sont la coordonne x et la coordonnes y, respectivement. Espace de coordonnes : le graphique des coordonnes contenu dans un objet daffichage, sur lequel ses lments enfant sont positionns. Origine : le point dans un espace de coordonnes o laxe x et laxe y se croisent. Ce point a les coordonnes 0, 0. Point : emplacement unique dans un espace de coordonnes. Dans le systme de coordonnes en 2 dimensions utilis dans ActionScript, un point est dfini par son emplacement le long de laxe x et de laxe y (les coordonnes du point). Point dalignement : dans un objet daffichage, lorigine (coordonnes 0, 0) de son espace de coordonnes. Echelle : la taille dun objet par rapport sa taille dorigine. Redimensionner un objet signifie changer sa taille (en lagrandissant ou en le rduisant). Translater : modifier les coordonnes dun point dun espace de coordonnes un autre. Transformation : un rglage effectu sur les caractristiques visuelles dun graphique (rotation de lobjet, modification de son chelle, dsalignement, dformation ou altration de sa couleur). Axe X : laxe horizontal dans le systme de coordonnes en 2 dimensions utilis dans ActionScript. Axe Y : laxe vertical dans le systme de coordonnes en 2 dimensions utilis dans ActionScript.

Utilisation des exemples fournis dans le chapitre


Un grand nombre des exemples fournis dans ce chapitre illustrent des calculs ou des changements de valeurs ;la plupart dentre eux incluent les appels de la fonction trace() appropris pour dmontrer les rsultats du code. Pour tester ces exemples, procdez comme suit :
1. 2. 3.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code dans le panneau Script.

Principes de base de la gomtrie

461

4.

Excutez le programme en slectionnant Contrle > Tester lanimation. Les rsultats des fonctions trace() des codes saffichent dans le panneau Sortie.

Certains exemples du chapitre dmontrent lapplication de transformations aux objets daffichage. Les rsultats de ces exemples sont affichs au lieu dtre entrs dans un champ texte. Pour tester ces exemples de transformation, procdez comme suit :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code dans le panneau Script. Crez une instance de symbole de clip sur la scne. Par exemple, dessinez une forme, slectionnez-la et choisissez Modification > Convertir en symbole. Donnez ensuite un nom au symbole. Slectionnez le clip de la scne et donnez un nom linstance dans linspecteur des proprits. Le nom doit correspondre au nom utilis pour lobjet daffichage dans lexemple de code (par exemple, si le code applique une transformation un objet myDisplayObject, vous devez appeler votre instance de clip myDisplayObject galement). Excutez le programme en slectionnant Contrle > Tester lanimation. Les rsultats des transformations appliques lobjet comme indiqu dans le code saffichent lcran.

5.

6.

Les techniques de test des exemples de code sont dcrites de faon plus dtaille dans Test des exemples de code contenus dans un chapitre , la page 67.

Utilisation des objets Point


Un objet Point dfinit une paire de coordonnes cartsiennes. Il reprsente un emplacement dans un systme de coordonnes deux dimensions, dans lequel x est laxe horizontal et y laxe vertical. Pour dfinir un objet Point, vous dfinissez ses proprits x et y comme suit :
import flash.geom.*; var pt1:Point = new Point(10, 20); // x == 10; y == 20 var pt2:Point = new Point(); pt2.x = 10; pt2.y = 20;

462

Utilisation de la gomtrie

Calcul de la distance entre deux points


Vous pouvez utiliser la mthode distance() de la classe Point pour calculer la distance entre deux points dans un espace de coordonnes. Par exemple, le code suivant calcule la distance entre les points dalignement de deux objets daffichage, circle1 et circle2, dans le mme conteneur dobjet daffichage :
import flash.geom.*; var pt1:Point = new Point(circle1.x, circle1.y); var pt2:Point = new Point(circle2.x, circle2.y); var distance:Number = Point.distance(pt1, pt2);

Translation despaces de coordonnes


Si deux objets daffichage se trouvent dans des conteneurs dobjet daffichage diffrents, il se peut quils soient dans des espaces de coordonnes diffrents. Vous pouvez utiliser la mthode localToGlobal() de la classe DisplayObject pour traduire les coordonnes dans le mme espace de coordonnes (global), celui de la scne. Par exemple, le code suivant calcule la distance entre les points dalignement de deux objets daffichage, circle1 et circle2, dans les diffrents conteneurs dobjet daffichage :
import flash.geom.*; var pt1:Point = new Point(circle1.x, circle1.y); pt1 = circle1.localToGlobal(pt1); var pt2:Point = new Point(circle1.x, circle1.y); pt2 = circle2.localToGlobal(pt2); var distance:Number = Point.distance(pt1, pt2);

De mme, pour rechercher la distance du point dalignement dun objet daffichage nomm target partir dun point spcifique sur la scne, vous pouvez utiliser la mthode localToGlobal() de la classe DisplayObject :
import flash.geom.*; var stageCenter:Point = new Point(); stageCenter.x = this.stage.stageWidth / 2; stageCenter.y = this.stage.stageHeight / 2; var targetCenter:Point = new Point(target.x, target.y); targetCenter = target.localToGlobal(targetCenter); var distance:Number = Point.distance(stageCenter, targetCenter);

Utilisation des objets Point

463

Dplacement dun objet daffichage dune distance et dun angle spcifis


Vous pouvez utiliser la mthode polar() de la classe Point pour dplacer un objet daffichage dune distance et dun angle spcifiques. Par exemple, le code suivant dplace lobjet myDisplayObject dune distance de 100 pixels et dun angle de 60 degrs :
import flash.geom.*; var distance:Number = 100; var angle:Number = 2 * Math.PI * (90 / 360); var translatePoint:Point = Point.polar(distance, angle); myDisplayObject.x += translatePoint.x; myDisplayObject.y += translatePoint.y;

Autres utilisations de la classe Point


Vous pouvez utiliser des objets Point avec les proprits et les mthodes suivantes :
Classe Mthodes ou proprits Description

DisplayObjectContainer areInaccessibleObjectsUnderPoint() Utilise pour renvoyer getObjectsUnderPoint() une liste dobjets sous un point dans un conteneur dobjet daffichage. BitmapData hitTest() Utilise pour dfinir le pixel dans lobjet BitmapData ainsi que le point pour lequel vous recherchez une zone active. Utilise pour indiquer les positions des rectangles qui dfinissent les oprations. Utilise pour dfinir des points auxquels vous souhaitez appliquer une transformation. Utilise pour dfinir ces proprits.

BitmapData

applyFilter() copyChannel() merge() paletteMap() pixelDissolve() threshold() deltaTransformPoint() transformPoint()

Matrix

Rectangle

bottomRight size topLeft

464

Utilisation de la gomtrie

Utilisation dobjets Rectangle


Un objet Rectangle dfinit une zone rectangulaire. Un objet Rectangle a une position dfinie par les coordonnes x et y de son angle suprieur gauche, une proprit width et une proprit height. Vous pouvez dfinir ces proprits pour un nouvel objet Rectangle en appelant la fonction constructeur Rectangle(), comme suit :
import flash.geom.Rectangle; var rx:Number = 0; var ry:Number = 0; var rwidth:Number = 100; var rheight:Number = 50; var rect1:Rectangle = new Rectangle(rx, ry, rwidth, rheight);

Redimensionnement et repositionnement des objets Rectangle


Il existe de nombreuses faons de redimensionner et de repositionner des objets Rectangle. Vous pouvez redimensionner directement lobjet Rectangle en modifiant ses proprits x et y. Ceci na aucune incidence sur la largeur ou la hauteur de lobjet Rectangle.
import flash.geom.Rectangle; var x1:Number = 0; var y1:Number = 0; var width1:Number = 100; var height1:Number = 50; var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); trace(rect1) // (x=0, y=0, w=100, h=50) rect1.x = 20; rect1.y = 30; trace(rect1); // (x=20, y=30, w=100, h=50)

Comme indiqu dans le code suivant, si vous modifiez la proprit left ou top dun objet Rectangle, il est repositionn avec ses propritsx et y correspondant aux proprits left et top, respectivement. Nanmoins, la position de langle infrieur gauche de lobjet Rectangle ne change pas. Par consquent, il est redimensionn.
import flash.geom.Rectangle; var x1:Number = 0; var y1:Number = 0; var width1:Number = 100; var height1:Number = 50; var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); trace(rect1) // (x=0, y=0, w=100, h=50) rect1.left = 20; rect1.top = 30; trace(rect1); // (x=30, y=20, w=70, h=30)

Utilisation dobjets Rectangle

465

De mme, comme indiqu dans lexemple suivant, si vous modifiez la proprit bottom ou right dun objet Rectangle, la position de son angle suprieur gauche ne change pas. Il est donc redimensionn en consquence :
import flash.geom.Rectangle; var x1:Number = 0; var y1:Number = 0; var width1:Number = 100; var height1:Number = 50; var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); trace(rect1) // (x=0, y=0, w=100, h=50) rect1.right = 60; trect1.bottom = 20; trace(rect1); // (x=0, y=0, w=60, h=20)

Vous pouvez galement repositionner un objet Rectangle laide de la mthode offset(), comme suit :
import flash.geom.Rectangle; var x1:Number = 0; var y1:Number = 0; var width1:Number = 100; var height1:Number = 50; var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); trace(rect1) // (x=0, y=0, w=100, h=50) rect1.offset(20, 30); trace(rect1); // (x=20, y=30, w=100, h=50)

La mthode offsetPt() fonctionne de la mme faon, sauf quelle prend un objet Point comme paramtre, plutt que les valeurs de dcalage x et y. Vous pouvez galement redimensionner un objet Rectangle laide de la mthode inflate() qui inclut deux paramtres, dx et dy. Le paramtre dx reprsente le nombre de pixels dont les cts gauche et droit du rectangle vont se dplacer depuis le centre, et le paramtre dy reprsente le nombre de pixels dont les cts suprieur et infrieur du rectangle vont se dplacer depuis le centre :
import flash.geom.Rectangle; var x1:Number = 0; var y1:Number = 0; var width1:Number = 100; var height1:Number = 50; var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); trace(rect1) // (x=0, y=0, w=100, h=50) rect1.inflate(6,4); trace(rect1); // (x=-6, y=-4, w=112, h=58)

La mthode inflatePt() fonctionne de la mme faon, sauf quelle prend un objet Point comme paramtre, plutt que les valeurs de dcalage dx et dy.

466

Utilisation de la gomtrie

Recherche dunions et dintersections dobjets Rectangle


Vous utilisez la mthode union() pour rechercher la rgion rectangulaire forme par les limites de deux rectangles :
import flash.display.*; import flash.geom.Rectangle; var rect1:Rectangle = new Rectangle(0, 0, 100, 100); trace(rect1); // (x=0, y=0, w=100, h=100) var rect2:Rectangle = new Rectangle(120, 60, 100, 100); trace(rect2); // (x=120, y=60, w=100, h=100) trace(rect1.union(rect2)); // (x=0, y=0, w=220, h=160)

Vous utilisez la mthode intersection() pour rechercher la rgion rectangulaire forme par la rgion commune de deux rectangles :
import flash.display.*; import flash.geom.Rectangle; var rect1:Rectangle = new Rectangle(0, 0, 100, 100); trace(rect1); // (x=0, y=0, w=100, h=100) var rect2:Rectangle = new Rectangle(80, 60, 100, 100); trace(rect2); // (x=120, y=60, w=100, h=100) trace(rect1.intersection(rect2)); // (x=80, y=60, w=20, h=40)

Vous utilisez la mthode intersects() pour savoir si deux rectangles se recouvrent. Vous pouvez galement utiliser la mthode intersects() pour savoir si un objet daffichage est dans une certaine rgion de la scne. Par exemple, dans le code suivant, supposez que lespace de coordonnes du conteneur dobjet daffichage contenant lobjet circle est identique celui de la scne. Lexemple indique comment utiliser la mthode intersects() pour dterminer si un objet daffichage, circle, recoupe des rgions spcifies de la scne, dfinies par les objets Rectangle target1 et target2 :
import flash.display.*; import flash.geom.Rectangle; var circle:Shape = new Shape(); circle.graphics.lineStyle(2, 0xFF0000); circle.graphics.drawCircle(250, 250, 100); addChild(circle); var circleBounds:Rectangle = circle.getBounds(stage); var target1:Rectangle = new Rectangle(0, 0, 100, 100); trace(circleBounds.intersects(target1)); // false var target2:Rectangle = new Rectangle(0, 0, 300, 300); trace(circleBounds.intersects(target2)); // true

De mme, vous pouvez utiliser la mthode intersects() pour savoir si les cadres de dlimitation de deux objets daffichage se chevauchent. Vous pouvez utiliser la mthode getRect() de la classe DisplayObject pour inclure un espace supplmentaire que les traits dun objet daffichage peuvent ajouter une rgion de dlimitation.

Utilisation dobjets Rectangle

467

Autres utilisations des objets Rectangle


Les objets Rectangle sont utiliss dans les proprits et les mthodes suivantes :
Classe
BitmapData

Mthodes ou proprits
applyFilter(), colorTransform(), copyChannel(), copyPixels(), draw(), fillRect(), generateFilterRect(), getColorBoundsRect(), getPixels(), merge(), paletteMap(), pixelDissolve(), setPixels() et threshold() getBounds(), getRect(), scrollRect, scale9Grid

Description
Utilise comme type de certains paramtres pour dfinir une rgion de lobjet BitmapData.

DisplayObject

Utilise comme type de donnes pour la proprit ou le type de donnes renvoy. Utilise pour dfinir le paramtre printArea. Utilise pour dfinir le paramtre bounds. Utilise comme type de valeur renvoy. Utilise comme type de donnes.

PrintJob Sprite TextField Transform

addPage() startDrag() getCharBoundaries() pixelBounds

468

Utilisation de la gomtrie

Utilisation des objets Matrix


La classe Matrix reprsente une matrice de transformation qui dtermine le mappage des points dun espace de coordonnes lautre. Pour appliquer diverses transformations graphiques un objet daffichage, vous pouvez dfinir les proprits dun objet Matrix, puis appliquer celui-ci la proprit matrix dun objet Transform, que vous appliquez ensuite la proprit transform de lobjet daffichage. Ces fonctions de transformation incluent la translation (repositionnement de x et y), la rotation, le redimensionnement et linclinaison.

Dfinition des objets Matrix


Mme si vous pouvez dfinir une matrice en ajustant directement les proprits (a, b, c, d, tx, ty) dun objet Matrix, il est plus facile dutiliser la mthode createBox(). Cette mthode comporte des paramtres qui vous permettent de dfinir directement les effets de redimensionnement, de rotation et de translation de la matrice rsultante. Par exemple, le code suivant cre un objet Matrix qui a leffet de redimensionner un objet horizontalement de 2.0, verticalement de 3.0, de le faire pivoter de 45 degrs, de le dplacer (translation) de 10 pixels vers la droite et de 20 pixels vers le bas :
var matrix:Matrix = new Matrix(); var scaleX:Number = 2.0; var scaleY:Number = 3.0; var rotation:Number = 2 * Math.PI * (45 / 360); var tx:Number = 10; var ty:Number = 20; matrix.createBox(scaleX, scaleY, rotation, tx, ty);

Vous pouvez galement ajuster les effets de redimensionnement, de rotation et de translation dun objet Matrix laide des mthodes scale(), rotate() et translate(). Ces mthodes sont combines aux valeurs de lobjet Matrix existant. Par exemple, le code suivant dfinit un objet Matrix qui redimensionne un objet dun facteur de 4 et le fait pivoter de 60 degrs car les mthodes scale() et rotate() sont appeles deux fois :
var matrix:Matrix = new Matrix(); var rotation:Number = 2 * Math.PI * (30 / 360); // 30 var scaleFactor:Number = 2; matrix.scale(scaleFactor, scaleFactor); matrix.rotate(rotation); matrix.scale(scaleX, scaleY); matrix.rotate(rotation); myDisplayObject.transform.matrix = matrix;

Utilisation des objets Matrix

469

Pour appliquer une transformation par inclinaison un objet Matrix, ajustez sa proprit b ou c. Lorsque vous ajustez la proprit b, la matrice est incline verticalement et lorsque vous ajustez la proprit c, elle est incline horizontalement. Le code suivant incline lobjet Matrix myMatrix verticalement dun facteur de 2 :
var skewMatrix:Matrix = new Matrix(); skewMatrix.b = Math.tan(2); myMatrix.concat(skewMatrix);

Vous pouvez appliquer une transformation Matrix la proprit transform dun objet daffichage. Par exemple, le code suivant applique une transformation de matrice un objet daffichage nomm myDisplayObject :
var matrix:Matrix = myDisplayObject.transform.matrix; var scaleFactor:Number = 2; var rotation:Number = 2 * Math.PI * (60 / 360); // 60 matrix.scale(scaleFactor, scaleFactor); matrix.rotate(rotation); myDisplayObject.transform.matrix = matrix;

La premire ligne dfinit un objet Matrix sur la matrice de transformation existante utilise par lobjet daffichage myDisplayObject (la proprit matrix de la proprit transformation de lobjet daffichage myDisplayObject ). De cette faon, les mthodes de la classe Matrix que vous appelez ont un effet cumulatif sur la position, le redimensionnement et la rotation de lobjet daffichage.
REMARQUE

La classe ColorTransform est galement comprise dans le package flash.geometry. Cette classe sert dfinir la proprit colorTransform dun objet Transform. Etant donn quelle napplique aucun type de transformation gomtrique, elle nest pas traite dans ce chapitre. Pour de plus amples informations, voir la classe ColorTransform dans la Rfrence du langage et des composants ActionScript 3.0.

Exemple : Application dune transformation de matrice un objet daffichage


Lexemple dapplication DisplayObjectTransformer prsente de nombreuses fonctions permettant dutiliser la classe Matrix pour transformer un objet daffichage, notamment : Rotation de lobjet daffichage Redimensionnement de lobjet daffichage Translation (repositionnement) de lobjet daffichage Inclinaison de lobjet daffichage

470

Utilisation de la gomtrie

Lapplication fournit une interface permettant dajuster les paramtres de la transformation de matrice, comme suit :

Lorsque lutilisateur clique sur le bouton de transformation, lapplication applique la transformation approprie.

Lobjet daffichage original et lobjet daffichage pivot de -45 et redimensionn de 50 %

Exemple : Application dune transformation de matrice un objet daffichage

471

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers dapplication DisplayObjectTransformer se trouvent dans le dossier Samples/DisplayObjectTransformer. Cette application se compose des fichiers suivants :
Fichier
DisplayObjectTransformer.mxml ou DisplayObjectTransformer.fla

Description
Le fichier dapplication principal dans Flash (FLA) ou Flex (MXML)

com/example/programmingas3/geometry/ Une classe qui contient des mthodes MatrixTransformer.as permettant dappliquer des transformations de matrice. img/ Un rpertoire contenant des exemples de fichiers image utiliss par lapplication.

Dfinition de la classe MatrixTransformer


La classe MatrixTransformer comprend des mthodes statiques qui appliquent des transformations gomtriques dobjets Matrix.

La mthode transform()
La mthode transform() comprend des paramtres pour chaque lment suivant :

sourceMatrixLa xScale dx

matrice dentre, que la mthode transforme

et yScaleLe facteur de redimensionnement x et y montant de rotation, en degrs sens dinclinaison ("right" ou "left")

et dyLes montants de translation x et y, en pixels facteur dinclinaison, en pourcentage

rotationLe skewLe

skewTypeLe

La valeur renvoye est la matrice rsultante. La mthode transform() appelle les mthodes statiques suivantes de la classe :

skew() scale() translate() rotate()

Chacune renvoie la matrice source avec la transformation applique.

472

Utilisation de la gomtrie

La mthode skew()
La mthode skew() incline la matrice en ajustant les proprits b et c de la matrice. Un paramtre facultatif, unit, dtermine les units utilises pour dfinir langle dinclinaison et, le cas chant, la mthode convertit la valeur angle en radians :
if (unit == "degrees") { angle = Math.PI * 2 * angle / 360; } if (unit == "gradients") { angle = Math.PI * 2 * angle / 100; }

Un objet Matrix skewMatrix est cr et ajust pour appliquer la transformation par inclinaison. Au dpart, il sagit de la matrice didentit, comme suit :
var skewMatrix:Matrix = new Matrix();

Le paramtre skewSide dtermine le ct auquel linclinaison est applique. Sil est dfini sur "right", le code suivant dfinit la proprit b de la matrice :
skewMatrix.b = Math.tan(angle);

Autrement, le ct infrieur est inclin en ajustant la proprit c de la matrice, comme suit :


skewMatrix.c = Math.tan(angle);

Linclinaison rsultante est ensuite applique la matrice existante en concatnant les deux matrices, comme indiqu dans lexemple suivant :
sourceMatrix.concat(skewMatrix); return sourceMatrix;

La mthode scale()
Comme le montre lexemple suivant, la mthode scale() ajuste dabord le facteur de redimensionnement sil est fourni sous la forme dun pourcentage puis utilise la mthode scale() de lobjet matrix :
if (percent) { xScale = xScale / 100; yScale = yScale / 100; } sourceMatrix.scale(xScale, yScale); return sourceMatrix;

Exemple : Application dune transformation de matrice un objet daffichage

473

La mthode translate()
La mthode translate() applique simplement les facteurs de translation dx et dy en appelant la mthode translate() de lobjet matrix, comme suit :
sourceMatrix.translate(dx, dy); return sourceMatrix;

La mthode rotate()
La mthode rotate() convertit le facteur de rotation dentre en radians (sil est fourni en degrs ou dgrads) puis appelle la mthode rotate() de lobjet matrix :
if (unit == "degrees") { angle = Math.PI * 2 * angle / 360; } if (unit == "gradients") { angle = Math.PI * 2 * angle / 100; } sourceMatrix.rotate(angle); return sourceMatrix;

Appel de la mthode MatrixTransformer.transform() depuis lapplication


Lapplication contient une interface utilisateur permettant dobtenir les paramtres de transformation de lutilisateur. Elle les transmet ensuite, avec la proprit matrix de la proprit transform de lobjet daffichage, la mthode Matrix.transform(), comme suit :
tempMatrix = MatrixTransformer.transform(tempMatrix, xScaleSlider.value, yScaleSlider.value, dxSlider.value, dySlider.value, rotationSlider.value, skewSlider.value, skewSide );

Lapplication applique ensuite la valeur renvoye la proprit matrix de la proprit transform de lobjet daffichage. Ainsi, la transformation est dclenche :
img.content.transform.matrix = tempMatrix;

474

Utilisation de la gomtrie

CHAPITRE 14

Utilisation de lAPI de dessin


Bien que limportance des images et graphismes imports soit vidente, il ne faut pas ngliger la fonctionnalit connue sous le nom dAPI de dessin, qui permet de tracer des lignes et des formes en ActionScript. Vous pouvez ainsi ouvrir une application avec lquivalent informatique dune toile vierge et crer des images sur celle-ci. La possibilit de crer des graphismes ouvre de nouvelles possibilits pour vos applications. Les techniques prsentes dans ce chapitre permettent, entre autres possibilits, de crer un programme de dessin, de raliser des lments artistiques anims et interactifs, ou encore de gnrer par programmation vos propres lments dinterface.

14

Sommaire
Les bases dutilisation de lAPI de dessin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .476 Prsentation de la classe Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478 Dessin de lignes et de courbes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .479 Dessin de formes laide des mthodes intgres. . . . . . . . . . . . . . . . . . . . . . . . . . .482 Cration de lignes et de remplissages en dgrad . . . . . . . . . . . . . . . . . . . . . . . . . . .483 Utilisation de la classe Math avec les mthodes de dessin . . . . . . . . . . . . . . . . . . . 489 Animation avec lAPI de dessin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490 Exemple : gnrateur algorithmique deffets visuels . . . . . . . . . . . . . . . . . . . . . . . . . 491

475

Les bases dutilisation de lAPI de dessin


Introduction lAPI de dessin
LAPI de dessin est le nom des fonctionnalits intgres ActionScript qui permettent de crer des graphismes vectoriels (lignes, courbes, formes, remplissages et dgrads) et de les afficher laide dActionScript. Ces fonctionnalits sont prises en charge par la classe flash.display.Graphics. ActionScript permet de dessiner dans une instance dun objet de type Shape, Sprite ou MovieClip, laide de la proprit graphics dfinie dans chacune de ces classes. (La proprit graphics de ces classes est en fait une instance de la classe Graphics.) Si vous navez pas lhabitude de dessiner par code, la classe Graphics comprend plusieurs mthodes qui facilitent le trac de formes courantes (cercles, ellipses, rectangles et rectangles coins arrondis). Ces tracs peuvent tre des lignes vides ou des formes remplies. Si vous avez besoin de fonctionnalits plus sophistiques, la classe Graphics comporte aussi des mthodes destines au trac de lignes et de courbes de Bzier, qui peuvent tre utilises conjointement avec les fonctions trigonomtriques de la classe Math pour crer nimporte quelle forme.

Tches courantes faisant appel lAPI de dessin


Les oprations suivantes, qui sont dcrites dans ce chapitre, peuvent tre aisment accomplies en ActionScript avec lAPI de dessin :

Dfinition de styles de ligne et de remplissage pour le traage de formes Dessin de lignes droites et de courbes Utilisation de mthodes pour tracer des formes (cercles, ellipses et rectangles) Dessin avec des lignes et des remplissages en dgrad Dfinition dune matrice de cration de dgrad Utilisation de fonctions trigonomtriques avec lAPI de dessin Incorporation des fonctionnalits de lAPI de dessin dans une animation

476

Utilisation de lAPI de dessin

Concepts importants et terminologie


La liste de rfrence suivante numre les termes importants que vous rencontrerez dans ce chapitre :

Point dancrage : lun des deux points dextrmit dune courbe de Bzier Point de contrle : point qui dfinit la direction et la forme dune courbe de Bzier. Cette ligne courbe ne touche jamais le point de contrle, mais elle sarrondit comme si elle tait trace dans la direction de celui-ci. Espace de coordonnes : reprsentation graphique des coordonnes contenues dans un objet daffichage, par rapport auquel sont positionns les lments enfants. Remplissage : partie intrieure opaque dune forme constitue par le remplissage dune ligne, ou dune forme ne possdant pas de ligne de contour. Dgrad : transition progressive dune couleur une ou plusieurs autres (par opposition avec une couleur unie). Point : emplacement unique dans un espace de coordonnes. Dans le systme de coordonnes bidimensionnel utilis en ActionScript, un point est dfini par sa position sur laxe x et sur laxe y (les coordonnes de ce point). Courbe de Bzier : type de courbe dfinie par une formule mathmatique particulire. Dans ce type de courbe, la forme de la courbe est calcule partir des positions des points dancrage (les points dextrmit de la courbe) et dun point de contrle qui dfinit la forme et la direction de la courbe. chelle : taille relative dun objet par rapport se taille dorigine. Mettre un objet lchelle consiste modifier sa taille en ltirant ou en le rtrcissant. Trait : ligne de contour dune forme constitue par le remplissage de cette ligne, ou forme ne possdant pas de remplissage. Translation : modification des coordonnes dun point en passant dun espace de coordonnes un autre Axe X : Laxe horizontal dans le systme de coordonnes en 2 dimensions utilis dans ActionScript Axe Y : Laxe vertical dans le systme de coordonnes en 2 dimensions utilis dans ActionScript

Les bases dutilisation de lAPI de dessin

477

Utilisation des exemples des chapitres


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Etant donn que ce chapitre dcrit comment tracer du contenu visuel, le test des exemples de code implique lexcution du code et laffichage des rsultats dans le fichier SWF cr. Pour tester les exemples de code :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code de lexemple dans la fentre de script. Choisissez Contrle > Tester lanimation pour excuter le programme. Les rsultats des exemples de code apparatront dans le fichier SWF cr.

Prsentation de la classe Graphics


Chaque objet Shape, Sprite et MovieClip possde une proprit graphics qui est une instance de la classe Graphics. La classe Graphics comporte des proprits et des mthodes permettant de tracer des lignes, des remplissages et des formes. Pour disposer dun objet daffichage qui sera uniquement utilis comme toile de fond pour un dessin, utilisez une instance de Shape. Une instance de Shape est mieux adapte au dessin que les autres objets, car elle ne comporte pas les fonctionnalits (inutiles dans ce type dutilisation) des classes Sprite et MovieClip. Par contre, si vous souhaitez crer un objet daffichage qui servira de support de contenu graphique mais doit galement pouvoir contenir dautres objets daffichage, utilisez une instance de Sprite. Pour plus dinformations sur le choix des objets daffichage en fonction de la tche prvue, consultez la section Choix dune sous-classe de DisplayObject , la page 418.

478

Utilisation de lAPI de dessin

Dessin de lignes et de courbes


Tous les graphismes quil est possible de raliser laide dune instance de la classe Graphics sont des tracs laide de lignes et de courbes. Tous les dessins raliss en ActionScript doivent donc suivre les mmes tapes :

dfinition de styles de ligne et de remplissage dfinition de la position de dessin initiale dessin de lignes, courbes et de formes (ventuellement en dplaant le point de traage) le cas chant, cration dun remplissage

Dfinition de styles de ligne et de remplissage


Pour utiliser la proprit graphics dune instance de Shape, Sprite ou MovieClip, vous devez dabord dfinir le style (paisseur et couleur de la ligne, couleur de remplissage) utiliser. De la mme manire quavec les outils de dessin dAdobe Flash CS3 Professional ou de toute autre application de dessin, en ActionScript vous pouvez dessiner avec ou sans trait, et avec ou sans remplissage. Pour indiquer lapparence du trait, utilisez la mthode lineStyle() ou lineGradientStyle(). Pour crer une ligne pleine, utilisez la mthode lineStyle(). Lors de lappel de cette mthode, les valeurs les plus courantes indiquer sont les trois premiers paramtres : paisseur de ligne, couleur de ligne et niveau dopacit (alpha). Par exemple, la ligne de code suivante indique que la forme myShape doit tracer des lignes de deux pixels dpaisseur, en rouge (0x990000) et avec une opacit de 75 % :
myShape.graphics.lineStyle(2, 0x990000, .75);

La valeur par dfaut du paramtre alpha est 1.0 (100 %), vous pouvez donc le ngliger si vous souhaitez tracer une ligne entirement opaque. La mthode lineStyle() accepte galement deux paramtres supplmentaires pour lindice de lissage des pixels et le mode de mise lchelle. Pour plus dinformations sur ces paramtres, consultez la description de la mthode Graphics.lineStyle() dans le manuel Rfrence du langage et des composants ActionScript 3.0. Pour crer une ligne dgrade, utilisez la mthode lineGradientStyle(). Cette mthode est dcrite dans la section Cration de lignes et de remplissages en dgrad , la page 483.

Dessin de lignes et de courbes

479

Pour crer une forme remplie, appelez les mthodes beginFill(), beginGradientFill() ou beginBitmapFill() avant de dbuter le dessin. La plus lmentaire de ces trois mthodes, beginFill() reoit deux paramtres : la couleur de remplissage et, ventuellement, la valeur dopacit (alpha) de celle-ci. Par exemple, pour tracer une forme avec un remplissage vert uni, utilisez le code suivant (on suppose ici que vous dessinez dans un objet nomm myShape):
myShape.graphics.beginFill(0x00FF00);

Lappel dune mthode de remplissage annule implicitement le remplissage prcdemment dfini avant la mise en uvre du nouveau. Lappel dune mthode qui spcifie un style de trait remplace le style de trait prcdent, mais ne modifie pas le remplissage prcdemment dfini, et vice-versa. Aprs spcifi le style de ligne et de remplissage, ltape suivante consiste indiquer le point de dpart du dessin. Linstance de Graphics possde un point de traage, tout comme la pointe dun crayon sur une feuille de papier. Quel que soit lemplacement du point de traage, il reprsente lorigine de laction de dessin venir. Initialement, un objet Graphics dbute avec son point de traage aux points 0, 0 dans lespace de coordonnes de lobjet dans lequel il dessine. Pour que le trac dbute en un autre point, appelez la mthode moveTo() avant dappeler une des mthodes de dessin. Cet appel peut tre compar laction de lever la pointe du crayon du papier et de lamener un nouvel emplacement. Lorsque le point de traage est en place, utilisez une srie dappels aux mthodes lineTo() (pour tracer des lignes droites) et curveTo() (pour tracer des courbes).
C ON S E I L 480

Pendant lopration de dessin, vous pouvez tout moment appeler la mthode moveTo() pour amener le point de traage une nouvelle position sans dessiner.

Pendant le traage du dessin, si vous avez indiqu une couleur de remplissage vous pouvez ordonner Flash Player de fermer le remplissage en appelant la mthode endFill(). Si vous navez pas trac une forme close (autrement dit, si lors de lappel de la mthode endFill() le point de traage nest pas sur les coordonnes du point de dpart de la forme), lorsque vous appelez la mthode endFill(), Flash Player ferme automatiquement la forme en traant une ligne droite entre le point de traage actuel et lemplacement spcifi dans le dernier appel la mthode moveTo(). Si vous avez dbut un remplissage et navez pas appel endFill(), tout appel beginFill() (ou lune des autres mthodes de remplissage) ferme le remplissage actif et en dbute un nouveau.

Utilisation de lAPI de dessin

Dessin de lignes droites


Lorsque vous appelez la mthode lineTo(), lobjet Graphics trace une ligne droite (en utilisant le style de ligne que vous avez spcifi) entre le point de traage actuel et les coordonnes que vous transmettez en paramtres cette mthode. Par exemple, cette ligne de code place le point de traage aux coordonnes 100, 100 puis trace une ligne jusquau point 200, 200 :
myShape.graphics.moveTo(100, 100); myShape.graphics.lineTo(200, 200);

Lexemple suivant trace un triangle rouge et vert dune hauteur de 100 pixels :
var triangleHeight:uint = 100; var triangle:Shape = new Shape(); // red triangle, starting at point 0, 0 triangle.graphics.beginFill(0xFF0000); triangle.graphics.moveTo(triangleHeight/2, 0); triangle.graphics.lineTo(triangleHeight, triangleHeight); triangle.graphics.lineTo(0, triangleHeight); triangle.graphics.lineTo(triangleHeight/2, 0); // green triangle, starting at point 200, 0 triangle.graphics.beginFill(0x00FF00); triangle.graphics.moveTo(200 + triangleHeight/2, 0); triangle.graphics.lineTo(200 + triangleHeight, triangleHeight); triangle.graphics.lineTo(200, triangleHeight); triangle.graphics.lineTo(200 + triangleHeight/2, 0); this.addChild(triangle);

Dessin de courbes
La mthode curveTo() dessine une courbe de Bzier. Elle trace un arc entre deux points (appels points dancrage) courb en direction dun troisime point (appel point de contrle). Lobjet Graphics utilise la position de traage actuelle comme premier point dancrage. Lorsque vous appelez la mthode curveTo(), vous devez lui transmettre quatre paramtres : les coordonnes x et y du point de contrle, puis les coordonnes x et y du second point dancrage. Par exemple, le code suivant trace une courbe entre le point 100, 100 et le point 200, 200. Le point de contrle ayant les coordonnes 175, 125, la courbe est oriente vers la droite puis vers le bas :
myShape.graphics.moveTo(100, 100); myShape.graphics.curveTo(175, 125, 200, 200);

Dessin de lignes et de courbes

481

Lexemple suivant trace des objets circulaires rouges et verts avec une largeur et une hauteur de 100 pixels. Notez quen raison mme de la nature de lquation de Bzier, ces cercles ne sont pas parfaits :
var size:uint = 100; var roundObject:Shape = new Shape(); // red circular shape roundObject.graphics.beginFill(0xFF0000); roundObject.graphics.moveTo(size / 2, 0); roundObject.graphics.curveTo(size, 0, size, size / 2); roundObject.graphics.curveTo(size, size, size / 2, size); roundObject.graphics.curveTo(0, size, 0, size / 2); roundObject.graphics.curveTo(0, 0, size / 2, 0); // green circular shape roundObject.graphics.beginFill(0x00FF00); roundObject.graphics.moveTo(200 + size / 2, 0); roundObject.graphics.curveTo(200 + size, 0, 200 + size, size / 2); roundObject.graphics.curveTo(200 + size, size, 200 + size / 2, size); roundObject.graphics.curveTo(200, size, 200, size / 2); roundObject.graphics.curveTo(200, 0, 200 + size / 2, 0); this.addChild(roundObject);

Dessin de formes laide des mthodes intgres


Pour vous permettre de tracer plus commodment des formes courantes (cercles, ellipses, rectangles et rectangles coins arrondis), ActionScript 3.0 comporte des mthodes qui tracent automatiquement ces formes. Ces mthodes sont drawCircle(), drawEllipse(), drawRect(), drawRoundRect() et drawRoundRectComplex(), et sont toutes dfinies dans la classe Graphics. Elles peuvent tre utilises la place des mthodes lineTo() et curveTo(). Notez toutefois quil est ncessaire de spcifier des styles de ligne et de remplissage avant dappeler ces mthodes. Lexemple suivant dessine des carrs bleus, rouges et verts avec une largeur et une hauteur de 100 pixels. Ce code utilise la mthode drawRect() et spcifie que lopacit de la couleur de remplissage est de 50 % (0,5) :
var squareSize:uint = 100; var square:Shape = new Shape(); square.graphics.beginFill(0xFF0000, 0.5); square.graphics.drawRect(0, 0, squareSize, squareSize); square.graphics.beginFill(0x00FF00, 0.5); square.graphics.drawRect(200, 0, squareSize, squareSize);

482

Utilisation de lAPI de dessin

square.graphics.beginFill(0x0000FF, 0.5); square.graphics.drawRect(400, 0, squareSize, squareSize); square.graphics.endFill(); this.addChild(square);

Dans un objet Sprite ou MovieClip, tout contenu graphique cr laide de la proprit graphics apparat toujours derrire les objets daffichage enfants contenus par cet objet. Par ailleurs, le contenu cr avec la proprit graphics nest pas un objet daffichage spar. Il napparat donc pas dans la liste des enfants dun objet Sprite ou MovieClip. Par exemple, lobjet Sprite suivant reoit linstruction de tracer un cercle avec sa proprit graphics, et un objet TextField figure dans sa liste dobjets daffichage enfants :
var mySprite:Sprite = new Sprite(); mySprite.graphics.beginFill(0xFFCC00); mySprite.graphics.drawCircle(30, 30, 30); var label:TextField = new TextField(); label.width = 200; label.text = "They call me mellow yellow..."; label.x = 20; label.y = 20; mySprite.addChild(label); this.addChild(mySprite);

Notez que lobjet TextField apparat au-dessus du cercle trac avec la proprit graphics.

Cration de lignes et de remplissages en dgrad


Lobjet Graphics permet aussi de tracer des traits et des remplissages avec des dgrads au lieu de couleurs unies. Pour crer un trait dgrad, utilisez la mthode lineGradientStyle(). Pour crer un remplissage dgrad, utilisez la mthode beginGradientFill(). Ces deux mthodes reoivent les mmes paramtres. Les quatre premiers sont obligatoires : type, couleur, alpha et rapport. Les quatre suivants sont facultatifs mais peuvent tre utiles pour plus de personnalisation.

Le premier paramtre spcifie le type de dgrad crer. Les valeurs acceptables sont GradientFill.LINEAR et GradientFill.RADIAL. Le second paramtre indique le tableau de valeurs colorimtriques utiliser. Dans un dgrad linaire, les couleurs sont organises de gauche droite. Dans un dgrad radial, les couleurs sont organises de lintrieur lextrieur. Lordre des couleurs dans le tableau reprsente lordre dans lequel elles sont traces dans le dgrad. Le troisime paramtre indique les valeurs de transparence alpha pour les couleurs correspondantes du paramtre prcdent.

Cration de lignes et de remplissages en dgrad

483

Le quatrime paramtre spcifie les rapports, cest--dire limportance de chaque couleur dans le dgrad. Les valeurs acceptables vont de 0 255. Ces valeurs ne reprsentent pas une hauteur ou une largeur, mais plutt la position au sein du dgrad : 0 reprsente le dbut du dgrad, et 255 la fin. Cette plage de rapports doit augmenter squentiellement et comporter le mme nombre dlments que les tableaux des couleurs et des valeurs alpha spcifis comme second et troisime paramtres.

Le cinquime paramtre, la matrice de transformation, est facultatif mais frquemment utilis, car il reprsente un moyen la fois puissant et ais de contrler laspect du dgrad. Ce paramtre accepte une instance de lobjet Matrix. Le moyen le plus simple de crer un objet Matrix pour un dgrad consiste utiliser la mthode createGradientBox() de la classe Matrix.

Dfinition dun objet Matrix utiliser avec un dgrad


Utilisez les mthodes beginGradientFill() et lineGradientStyle() de la classe flash.display.Graphics pour dfinir les dgrads utiliser dans des formes. Lorsque vous dfinissez un dgrad, vous fournissez une matrice comme lun des paramtres de ces mthodes. La faon la plus facile de dfinir la matrice est dutiliser la mthode createGradientBox(), de la classe Matrix, qui dfinit un tableau utilis pour dfinir le dgrad. Dfinissez lchelle, la rotation et la position du dgrad laide des paramtres transmis la mthode createGradientBox(). La mthode createGradientBox() reoit les paramtres suivants :

Largeur de la zone de dgrad : largeur (en pixels) sur laquelle stend le dgrad Hauteur de la zone de dgrad : hauteur (en pixels) sur laquelle stend le dgrad Rotation de la zone de dgrad : rotation (en radians) qui sera applique au dgrad Translation horizontale : distance (en pixels) de dplacement horizontal du dgrad Translation verticale : distance (en pixels) de dplacement vertical du dgrad
GradientType.LINEAR

Par exemple, prenons un dgrad possdant les caractristiques suivantes :


Deux couleurs, vert et bleu, avec le tableau ratios dfini sur [0, 255]
SpreadMethod.PAD InterpolationMethod.LINEAR_RGB

484

Utilisation de lAPI de dessin

Les exemples suivants prsentent des dgrads dans lesquels le paramtre rotation de la mthode createGradientBox() diffre comme indiqu, mais tous les autres rglages restent inchangs :
width = 100; height = 100; rotation = 0; tx = 0; ty = 0;

width = 100; height = 100; rotation = Math.PI/4; // 45 tx = 0; ty = 0;

width = 100; height = 100; rotation = Math.PI/2; // 90 tx = 0; ty = 0;

Cration de lignes et de remplissages en dgrad

485

Les exemples suivants prsentent les effets sur un dgrad linaire vert bleu dans lequel les paramtres rotation, tx, et ty de la mthode createGradientBox() diffrent comme indiqu, mais tous les autres rglages restent inchangs :
width = 50; height = 100; rotation = 0; tx = 0; ty = 0;

width = 50; height = 100; rotation = 0 tx = 50; ty = 0;

width = 100; height = 50; rotation = Math.PI/2; // 90 tx = 0; ty = 0;

width = 100; height = 50; rotation = Math.PI/2; // 90 tx = 0; ty = 50;

Les paramtres width, height, tx et ty de la mthode createGradientBox() ont une incidence sur la taille et la position dun remplissage en dgrad radial galement, comme indiqu dans lexemple suivant :
width = 50; height = 100; rotation = 0; tx = 25; ty = 0;

486

Utilisation de lAPI de dessin

Le code suivant produit le dernier dgrad radial illustr :


import flash.display.Shape; import flash.display.GradientType; import flash.geom.Matrix; var var var var var var var type:String = GradientType.RADIAL; colors:Array = [0x00FF00, 0x000088]; alphas:Array = [1, 1]; ratios:Array = [0, 255]; spreadMethod:String = SpreadMethod.PAD; interp:String = InterpolationMethod.LINEAR_RGB; focalPtRatio:Number = 0;

var matrix:Matrix = new Matrix(); var boxWidth:Number = 50; var boxHeight:Number = 100; var boxRotation:Number = Math.PI/2; // 90 var tx:Number = 25; var ty:Number = 0; matrix.createGradientBox(boxWidth, boxHeight, boxRotation, tx, ty); var square:Shape = new Shape; square.graphics.beginGradientFill(type, colors, alphas, ratios, matrix, spreadMethod, interp, focalPtRatio); square.graphics.drawRect(0, 0, 100, 100); addChild(square);

Notez que la largeur et la hauteur du dgrad sont dtermines par la largeur et la hauteur de la matrice du dgrad, plutt que par celles qui sont dessines laide de lobjet Graphics. Si vous dessinez avec lobjet Graphics, vous tracez ce qui existe ces coordonnes dans la matrice du dgrad. Mme si vous utilisez lune des mthodes de cration de forme dun objet de type Graphics, par exemple drawRect(), le dgrad nest pas tir en fonction de la taille de la forme dessine : sa taille doit tre spcifie dans la matrice du dgrad.

Cration de lignes et de remplissages en dgrad

487

Lexemple ci-dessous illustre la diffrence visuelle entre les dimensions de la matrice du dgrad et celles du dessin :
var myShape:Shape = new Shape(); var gradientBoxMatrix:Matrix = new Matrix(); gradientBoxMatrix.createGradientBox(100, 40, 0, 0, 0); myShape.graphics.beginGradientFill(GradientType.LINEAR, [0xFF0000, 0x00FF00, 0x0000FF], [1, 1, 1], [0, 128, 255], gradientBoxMatrix); myShape.graphics.drawRect(0, 0, 50, 40); myShape.graphics.drawRect(0, 50, 100, 40); myShape.graphics.drawRect(0, 100, 150, 40); myShape.graphics.endFill(); this.addChild(myShape);

Ce code trace trois dgrads avec le mme style de remplissage, spcifi avec une distribution gale de rouge, vert et bleu. Les dgrads sont tracs laide de la mthode drawRect() avec des largeurs en pixels de 50, 100 et 150 respectivement. La matrice de dgrad qui est spcifie dans la mthode beginGradientFill() est cre avec une largeur de 100 pixels. Le premier dgrad ne couvre donc que la moiti de son spectre, le second le couvre en entier, et le troisime le couvre en entier et possde 50 pixels supplmentaires de bleu droite. La mthode lineGradientStyle() fonctionne de faon similaire beginGradientFill(), si ce nest quoutre la dfinition du dgrad vous devez aussi indiquer lpaisseur du trait laide de la mthode lineStyle() avant de tracer. Le code suivant trace une bote avec un trait dgrad rouge, vert et bleu :
var myShape:Shape = new Shape(); var gradientBoxMatrix:Matrix = new Matrix(); gradientBoxMatrix.createGradientBox(200, 40, 0, 0, 0); myShape.graphics.lineStyle(5, 0); myShape.graphics.lineGradientStyle(GradientType.LINEAR, [0xFF0000, 0x00FF00, 0x0000FF], [1, 1, 1], [0, 128, 255], gradientBoxMatrix); myShape.graphics.drawRect(0, 0, 200, 40); this.addChild(myShape);

Pour plus dinformations sur la classe Matrix, consultez la section Utilisation des objets Matrix , la page 469.

488

Utilisation de lAPI de dessin

Utilisation de la classe Math avec les mthodes de dessin


Un objet Graphics trace des cercles et des carrs, mais il permet aussi de dessiner des formes plus complexes, en particulier lorsque les mthodes de dessin sont utilises en combinaison avec les proprits et les mthodes de la classe Math. La classe Math contient des constantes dintrt gnral en mathmatiques, telles que Math.PI (environ 3.14159265...), qui est la constante dfinissant le rapport entre la circonfrence et le diamtre dun cercle. Elle contient galement des mthodes de fonctions trigonomtriques, entre autres Math.sin(), Math.cos() et Math.tan(). Lutilisation de ces mthodes et constantes pour le dessin de formes permet dobtenir des effets visuels plus dynamiques, en particulier en utilisant des rptitions et des rcursions. De nombreuses mthodes de la classe Math attendent des mesures circulaires en radians, et non en degrs. La conversion entre ces deux types dunits reprsente elle-mme un cas dutilisation courante de la classe Math :
var degrees = 121; var radians = degrees * Math.PI / 180; trace(radians) // 2.111848394913139

Lexemple suivant cre une onde sinusodale et une onde cosinusodale, afin dillustrer la diffrence entre les mthodes Math.sin() et Math.cos() pour une mme valeur.
var var var var var var sinWavePosition = 100; cosWavePosition = 200; sinWaveColor:uint = 0xFF0000; cosWaveColor:uint = 0x00FF00; waveMultiplier:Number = 10; waveStretcher:Number = 5;

var i:uint; for(i = 1; i < stage.stageWidth; i++) { var sinPosY:Number = Math.sin(i / waveStretcher) * waveMultiplier; var cosPosY:Number = Math.cos(i / waveStretcher) * waveMultiplier; graphics.beginFill(sinWaveColor); graphics.drawRect(i, sinWavePosition + sinPosY, 2, 2); graphics.beginFill(cosWaveColor); graphics.drawRect(i, cosWavePosition + cosPosY, 2, 2); }

Utilisation de la classe Math avec les mthodes de dessin

489

Animation avec lAPI de dessin


Lun des avantages de la cration de contenu graphique avec lAPI de dessin est que ce contenu peut tre repositionn loisir. Tout ce que vous tracez peut tre modifi, en modifiant simplement les variables utilises pour ce dessin. Vous pouvez donc obtenir de lanimation en changeant les variables et en retraant, soit sur un nombre dimages donn, soit laide dun timer. Par exemple, le code suivant change laffichage chaque nouvelle image (en coutant lvnement Event.ENTER_FRAME) : il incrmente la valeur de degrs actuelle, puis ordonne lobjet graphique deffacer et redessiner avec la nouvelle position.
stage.frameRate = 31; var currentDegrees:Number = 0; var radius:Number = 40; var satelliteRadius:Number = 6; var container:Sprite = new Sprite(); container.x = stage.stageWidth / 2; container.y = stage.stageHeight / 2; addChild(container); var satellite:Shape = new Shape(); container.addChild(satellite); addEventListener(Event.ENTER_FRAME, doEveryFrame); function doEveryFrame(event:Event):void { currentDegrees += 4; var radians:Number = getRadians(currentDegrees); var posX:Number = Math.sin(radians) * radius; var posY:Number = Math.cos(radians) * radius; satellite.graphics.clear(); satellite.graphics.beginFill(0); satellite.graphics.drawCircle(posX, posY, satelliteRadius); } function getRadians(degrees:Number):Number { return degrees * Math.PI / 180; }

Pour produire un rsultat nettement diffrent, vous pouvez exprimenter en modifiant les valeurs initiales au dbut du code, currentDegrees, radius et satelliteRadius. Par exemple, essayez en rduisant la valeur de la variable radius et/ou en augmentant la valeur de la variable totalSatellites. Ce nest quun exemple simple de la faon dont lAPI de dessin permet de crer du contenu visuel dont la complexit dissimule la simplicit de cration.

490

Utilisation de lAPI de dessin

Exemple : gnrateur algorithmique deffets visuels


Lexemple de gnrateur algorithmique deffets visuels trace de manire dynamique plusieurs satellites , des cercles qui se dplacent suivant une orbite circulaire. Les fonctionnalits de scurit prsentes sont les suivantes :

Utilisation de lAPI de dessin pour tracer une forme simple avec un aspect dynamique Utilisation de linteraction de lutilisateur pour modifier les proprits utilises pour le dessin Effet danimation par effacement du contenu et retraage chaque nouvelle image.

Lexemple de la section prcdente animait un satellite isol laide de lvnement Cet exemple le reprend en y ajoutant un panneau de contrle avec divers curseurs qui actualisent immdiatement laffichage de plusieurs satellites. Dans cet exemple, le code est formalis dans des classes externes et le code de cration du satellite est imbriqu dans une boucle, en conservant une rfrence chaque satellite dans le tableau satellites.
Event.ENTER_FRAME.

Pour obtenir les fichiers de cet exemple dapplication, consultez la page www.adobe.com/go/ learn_programmingAS3samples_flash_fr. Les fichiers de lapplication se trouvent dans le dossier Samples/AlgorithmicVisualGenerator. Celui-ci contient les fichiers suivants :
Fichier
AlgorithmicVisualGenerator.fla com/example/programmingas3/ algorithmic/AlgorithmicVisualGenerator.as

Description
Fichier dapplication principal FLA pour Flash. Classe comportant les principales fonctionnalits de lapplication : dessin des satellites sur la scne et actualisation des variables utilises pour ces dessins en rponse aux vnements du panneau de contrle. Cette classe gre les interactions de lutilisateur avec les curseurs et distribue les vnements appropris. Cette classe reprsente lobjet daffichage qui tourne sur son orbite autour dun point central et contient des proprits relatives son tat de dessin actuel.

com/example/programmingas3/ algorithmic/ControlPanel.as com/example/programmingas3/ algorithmic/Satellite.as

Exemple : gnrateur algorithmique deffets visuels

491

Dfinition des couteurs


Lapplication commence par crer trois couteurs. Le premier attend quun vnement soit distribu par le panneau de contrle pour signaler quune reconstruction des satellites est ncessaire. Le second attend des changements de taille de la scne du fichier SWF. Le troisime attend le passage de chaque image du fichier SWF et son retraage laide de la fonction doEveryFrame().

Cration des satellites


Aprs la dfinition de ces couteurs, la fonction build() est appele. Cette fonction appelle dabord la fonction clear(), qui efface le contenu du tableau satellites et supprime les ventuelles formes dj prsentes sur la scne. Cette prcaution est ncessaire car la fonction build() peut tre appele nouveau la suite dun vnement diffus par le panneau de contrle, par exemple en cas de modification des couleurs. Dans ce cas, les satellites doivent tre supprims et recrs. La fonction cre ensuite les satellites, en dfinissant les proprits initiales ncessaires cette cration, dont la variable position qui dfinit une position alatoire sur lorbite et la variable color, qui dans cet exemple ne change pas une fois que le satellite a t cr. Lors de la cration de chaque satellite, une rfrence est ajoute dans le tableau satellites. Lorsque la fonction doEveryFrame() est appele, elle actualise tous les satellites du tableau.

Actualisation de la position des satellites


La fonction doEveryFrame() est au cur du processus danimation de lapplication. Elle est appele chaque image, donc une frquence identique la cadence du fichier SWF. Les variables du dessin changent lgrement, ce qui permet dobtenir un effet danimation. La fonction efface dabord tous les ventuels dessins antrieurs et retrace larrire-plan. Elle effectue ensuite une boucle dans le conteneur de chaque satellite et incrmente la proprit position de chaque satellite, puis actualise les proprits radius et orbitRadius qui peuvent avoir t modifies par suite dune action de lutilisateur dans le panneau de contrle. Enfin, la nouvelle position de chaque satellite est affiche en appelant la mthode draw() de la classe Satellite. Notez que la variable de compteur i nest incrmente que jusqu la valeur de la variable visibleSatellites. En effet, si lutilisateur a limit laide du panneau de contrle le nombre de satellites affichs, les autres satellites de la boucle ne doivent pas tre redessins, mais masqus. La boucle charge de cette action suit immdiatement celle qui est responsable du dessin. Lorsque la fonction doEveryFrame() se termine, le nombre de satellites visibles (visibleSatellites) est redessin aux nouvelles positions.

492

Utilisation de lAPI de dessin

Rponse aux interactions de lutilisateur


Linteractivit est assure par le panneau de contrle, qui est gr par la classe ControlPanel. Cette classe dfinit pour chaque curseur un couteur et des valeurs individuelles minimum, maximum et par dfaut. Lorsque lutilisateur dplace ces curseurs, la fonction changeSetting() est appele. Elle actualise les proprits du panneau de contrle. Si la modification ncessite un nouvel affichage, un vnement est distribu et pris en charge dans le fichier principal de lapplication. En fonction de la modification signale par le panneau de contrle, la fonction doEveryFrame() redessine chaque satellite sur la base des nouvelles variables.

Amliorations possibles
Cet exemple est simplement destin illustrer la cration deffets visuels avec lAPI de dessin. Il utilise relativement peu de lignes de code pour crer une animation interactive qui semble trs complexe. Mme ainsi, cet exemple pourrait tre amlior moyennant quelques modifications mineures. Voici quelques ides :

La fonction doEveryFrame() pourrait incrmenter la valeur colorimtrique du satellite. La fonction doEveryFrame() pourrait rduire ou augmenter progressivement le rayon de lorbite du satellite. Il nest pas ncessaire que lorbite du satellite soit circulaire, la classe Math permet de le dplacer selon une sinusodale, par exemple. Les satellites pourraient utiliser une dtection de collision entre eux.

LAPI de dessin peut tre considre comme une autre solution pour la cration deffets visuels dans lenvironnement de cration Flash, en dessinant des formes de base lors de lexcution. Mais elle permet aussi de crer des effets visuels quil serait impossible de crer manuellement. LAPI de dessin et quelques notions de mathmatiques permettent au dveloppeur en ActionScript de donner vie de nombreuses crations inattendues.

Exemple : gnrateur algorithmique deffets visuels

493

494

Utilisation de lAPI de dessin

CHAPITRE 15

Filtrage des objets daffichage


Historiquement, lapplication deffets de filtres des images bitmap est du domaine des logiciels spcialiss en retouche dimage, comme Adobe Photoshop et Adobe Fireworks. ActionScript 3.0 comporte le paquet flash.filters, qui contient une srie de classes de filtres effet pour les images bitmap, permettant ainsi aux dveloppeurs dappliquer par programmation des filtres aux bitmaps et aux objets daffichage afin dobtenir une grande partie des effets disponibles dans les applications de retouche graphique.

15

Sommaire
Bases du filtrage des objets daffichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495 Cration et application de filtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .497 Filtres daffichage disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 Exemple : Filter Workbench. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520

Bases du filtrage des objets daffichage


Introduction au filtrage des objets daffichage
Lune des faons de rendre une application plus sduisante est de lui ajouter des effets graphiques simples, comme une ombre porte derrire une photo pour crer lillusion de la 3D, ou un rayonnement autour dun bouton pour indiquer que cest le bouton actif. ActionScript 3.0 comporte neuf filtres qui peuvent tre appliqus nimporte quel objet daffichage ou une instance de BitmapData. Ces filtres vont des effets de base (ombre porte et filtre de rayonnement) des effets plus complexes permettant de crer divers effets, tels que le nouveau filtre de mappage du dplacement et le filtre de convolution matricielle.

495

Tches de filtrage courantes


Les oprations suivantes, qui sont dcrites dans ce chapitre, peuvent tre aisment accomplies en ActionScript laide de filtres :

Cration dun filtre Application dun filtre un objet daffichage Application dun filtre aux donnes dimage dune instance de BitmapData Suppression des filtres appliqus un objet Cration de divers effets de filtrage :

Rayonnement Flou Ombre porte Nettet Dplacement Dtection de contour Estampage et divers autres effets

Concepts importants et terminologie


La liste de rfrence suivante numre les termes importants que vous rencontrerez dans ce chapitre :

Biseau : effet de rebord cr en claircissant les pixels de deux cts contigus et en assombrissant les pixels des deux cts opposs, afin de crer un effet tridimensionnel de bordure frquemment utilis pour donner des boutons et autres graphismes un effet enfonc ou sorti. Convolution : Distorsion des pixels dune image obtenue en combinant la valeur de chaque pixel avec celle(s) dun ou plusieurs des pixels voisins, selon divers pourcentages. Dplacement : dcalage des pixels dune image une nouvelle position. Matrice : grille de chiffres utilise pour effectuer certains calculs mathmatiques, en appliquant ces chiffres diverses valeurs et en combinant le rsultat.

496

Filtrage des objets daffichage

Utilisation des exemples des chapitres


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester les exemples de code fournis. Etant donn que ce chapitre dcrit comment crer et manipuler du contenu visuel, le test du code implique lexcution du code et laffichage des rsultats dans le fichier SWF cr. Presque tous les exemples crent du contenu laide de lAPI de dessin ou chargent des images pour leur appliquer des filtres. Pour tester les exemples de code de ce chapitre :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code de lexemple dans la fentre de script : Choisissez Contrle > Tester lanimation pour excuter le programme. Les rsultats du code apparaissent dans le fichier SWF cr.

Presque tous les exemples de code crent une image bitmap, vous pouvez donc tester le code directement sans fournir aucun contenu bitmap. Vous pouvez aussi modifier le code des listings pour charger vos propres images et les utiliser la place de celles des exemples.

Cration et application de filtres


Les filtres permettent dappliquer divers effets (ombre porte, biseau, flou, etc.) des images bitmap et des objets daffichage. Chaque filtre tant dfini sous forme de classe, il suffit pour appliquer un filtre de crer une instance dun objet filtre, ce qui nest gure diffrent de la cration de tout autre objet. Aprs avoir cr une instance dun objet filtre, il est facile de lappliquer un objet daffichage laide de la proprit filters de cet objet ou, dans le cas dun objet BitmapData, de sa mthode applyFilter().

Cration dun nouveau filtre


Pour crer un objet filtre, il suffit dappeler la fonction constructeur de la classe du filtre voulu. Par exemple, pour crer un objet DropShadowFilter, utilisez le code suivant :
import flash.filters.DropShadowFilter; var myFilter:DropShadowFilter = new DropShadowFilter();

Bien que cela napparaisse pas dans cet exemple, le constructeur de DropShadowFilter() (comme tous les autres constructeurs des classes de filtres) accepte plusieurs paramtres facultatifs qui permettent de modifier laspect de leffet du filtre.

Cration et application de filtres

497

Application dun filtre


Lorsque lobjet filtre a t cr, vous pouvez lappliquer un objet daffichage ou un objet BitmapData, mais le mode dapplication du filtre dpend de lobjet concern.

Application dun filtre un objet daffichage


Pour appliquer un effet de filtrage un objet daffichage, utilisez sa proprit filters. La proprit filters dun objet daffichage est une instance de lobjet Array, dont les lments sont les objets filtres appliqus lobjet daffichage. Pour appliquer un seul filtre un objet daffichage, crez linstance de ce filtre, ajoutez-la une instance dArray, et affectez cet objet Array la proprit filters de lobjet daffichage :
import flash.display.Bitmap; import flash.display.BitmapData; import flash.filters.DropShadowFilter; // cration et affichage dun objet bitmapData var myBitmapData:BitmapData = new BitmapData(100,100,false,0xFFFF3300); var myDisplayObject:Bitmap = new Bitmap(myBitmapData); addChild(myDisplayObject); // cration dune instance de DropShadowFilter. var dropShadow:DropShadowFilter = new DropShadowFilter(); // cration du tableau de filtres, ajout du filtre au tableau en le passant // en paramtre au constructeur de Array(). var filtersArray:Array = new Array(dropShadow); // affectation du tableau de filtres lobjet daffichage pour // appliquer leffet. myDisplayObject.filters = filtersArray;

Pour affecter plusieurs filtres lobjet, il suffit dajouter tous ces filtres linstance dArray avant de laffecter la proprit filters. Vous pouvez ajouter plusieurs objets un objet Array en les passant en paramtres son constructeur. Par exemple, ce code applique un filtre Biseau et un filtre Rayonnement lobjet daffichage cr prcdemment :
import flash.filters.BevelFilter; import flash.filters.GlowFilter; // cration des filtres et ajout de ces derniers au tableau. var bevel:BevelFilter = new BevelFilter(); var glow:GlowFilter = new GlowFilter(); var filtersArray:Array = new Array(bevel, glow); // affectation du tableau de filtres lobjet daffichage pour // appliquer leffet. myDisplayObject.filters = filtersArray;

498

Filtrage des objets daffichage

Si vous appliquez plusieurs filtres des objets daffichage, ils sont appliqus en squence, de manire cumulative. Par exemple, si un tableau de filtres comporte deux lments, le filtre Biseau puis le filtre Ombre porte, ce dernier est appliqu la fois au filtre Biseau et lobjet daffichage lui-mme, du fait que le filtre Ombre porte est en seconde position dans le tableau des filtres. Si vous souhaitez appliquer des filtres de manire non cumulative, appliquez chaque filtre une nouvelle copie de lobjet daffichage. Pour affecter uniquement un ou quelques filtres un objet daffichage, vous pouvez crer linstance du filtre et laffecter lobjet dans la mme instruction. Par exemple, le code suivant applique un filtre flou un objet daffichage nomm myDisplayObject :
myDisplayObject.filters = [new BlurFilter()];

Le code prcdent cre une instance dArray en utilisant la syntaxe littrale dArray (entre crochets), puis cre une nouvelle instance de BlurFilter comme lment du tableau, et affecte ce dernier la proprit filters de lobjet daffichage myDisplayObject.

Suppression des filtres appliqus un objet


Pour supprimer tous les filtres dun objet daffichage, il suffit daffecter la valeur null la proprit filters de celui-ci :
myDisplayObject.filters = null;

Si vous avez appliqu plusieurs filtres un objet et souhaitez nen supprimer quun, plusieurs tapes sont ncessaires pour modifier le tableau de la proprit filters. Pour plus dinformations, consultez la section Modification des filtres lexcution , la page 500.

Application dun filtre un objet BitmapData


Lapplication dun filtre un objet BitmapData ncessite dutiliser la mthode applyFilter() de lobjet BitmapData :
myBitmapData.applyFilter(sourceBitmapData);

La mthode applyFilter() applique un filtre un objet source BitmapData, produisant ainsi une nouvelle image filtre. Cette mthode ne modifie pas limage originale, car le rsultat de lapplication du filtre celle-ci est enregistr dans linstance de BitmapData pour laquelle la mthode applyFilter() est appele.

R E MA R Q U E

Pour crer le tableau des filtres, vous pouvez utiliser le constructeur new Array() (comme dans les exemples prcdents) ou la syntaxe littrale Array, en mettant les filtres entre crochets ( [] ). Par exemple, cette ligne de code :
var filters:Array = new Array(dropShadow, blur);

donne un rsultat identique celle-ci :


var filters:Array = [dropShadow, blur];

Cration et application de filtres

499

Le fonctionnement des filtres


Le filtrage des objets daffichage consiste mettre en cache une copie de lobjet original sous forme dun bitmap transparent. Lorsquun filtre a t appliqu un objet daffichage, Adobe Flash Player conserve en cache lobjet sous forme de bitmap tant que cet objet possde une liste de filtres valide. Le bitmap source est ensuite repris en tant quimage originale pour les effets de filtrage suivants. Tout objet daffichage comporte gnralement deux bitmaps : lun correspond lobjet daffichage sans filtres, et lautre limage finale aprs filtrage. Limage finale est utilise pour le rendu. Tant que lobjet daffichage ne change pas, limage source ne ncessite aucune actualisation.

Problmes potentiels dutilisation des filtres


Plusieurs sources potentielles de confusion ou de problmes peuvent survenir lors de lutilisation de filtres. Elles sont dcrites dans les sections suivantes.

Filtres et mise en cache bitmap


Pour appliquer un filtre un objet daffichage, ous devez activer la mise en cache sous forme de bitmap pour cet objet. Si vous appliquez un filtre un objet daffichage dont la proprit cacheAsBitmap est false, Flash Player met automatiquement cette proprit cacheAsBitmap sur true. Si vous supprimez ensuite tous les filtres de lobjet, Flash Player rend la proprit cacheAsBitmap sa valeur prcdente.

Modification des filtres lexcution


Si un ou plusieurs filtres sont dj appliqus un objet daffichage, il est impossible dajouter des filtres supplmentaires dans le tableau des proprits filters. Pour ajouter ou modifier le jeu de filtres appliquer, il est donc ncessaire de crer une copie de tout le tableau filters et deffectuer les modifications dans ce tableau provisoire. Pour appliquer les filtres lobjet, il suffit ensuite de raffecter ce tableau la proprit filters de lobjet daffichage. Lexemple ci-dessous illustre cette dmarche. Initialement, un flitre Rayonnement est appliqu lobjet daffichage myDisplayObject. Lorsque lutilisateur clique sur lobjet daffichage, la fonction addFilters() est appele. Dans cette fonction, deux filtres supplmentaires sont appliqus myDisplayObject :
import flash.events.MouseEvent; import flash.filters.*; myDisplayObject.filters = [new GlowFilter()];

500

Filtrage des objets daffichage

function addFilters(event:MouseEvent):void { //crer une copie du tableau de filtres. var filtersCopy:Array = myDisplayObject.filters; // modifier les filtres (dans cet exemple, ajout de filtres). filtersCopy.push(new BlurFilter()); filtersCopy.push(new DropShadowFilter()); // application du changement en raffectant le tableau la // proprit filters. myDisplayObject.filters = filtersCopy; } myDisplayObject.addEventListener(MouseEvent.CLICK, addFilters);

Filtres et transformations dobjets


Les zones filtres (ombres portes, par exemple) situes hors du cadre de slection dun objet daffichage ne sont pas prises en considration pour la dtection de clics (chevauchement ou intersection de deux instances). La mthode de dtection des clics de la classe DisplayObject tant de type vectoriel, il est impossible den pratiquer une sur le bitmap rsultant. Par exemple, si vous appliquez un filtre biseau une instance de bouton, la dtection des clics nest pas possible sur la partie biseaute de loccurrence. Le redimensionnement, la rotation et linclinaison ne sont pas pris en charge par les filtres ; si lobjet daffichage filtr lui-mme est redimensionn (scaleX et scaleY diffrents de 100 %), leffet de filtre nest pas redimensionn avec linstance. La forme originale de linstance est certes pivote, incline ou redimensionne, mais pas le filtre. Vous pouvez animer une instance avec un filtre afin de crer des effets ralistes, ou imbriquer des instances et utiliser la classe BitmapData pour animer des filtres afin dobtenir ces effets.

Filtres et objets bitmaps


Si vous appliquez un filtre un objet BitmapData, la proprit cacheAsBitmap de cet objet est automatiquement true. Le filtre peut ainsi tre appliqu la copie de lobjet plutt qu ce dernier. Cette copie est alors place lcran par-dessus lobjet original, aussi prs que possible, au pixel prs. Si les limites du bitmap original changent, la copie laquelle le filtrage est appliqu est recre au lieu dtre tire. Si vous supprimez tous les filtres de lobjet daffichage, la proprit cacheAsBitmap retrouve sa valeur dorigine.

Cration et application de filtres

501

Filtres daffichage disponibles


ActionScript 3.0 comporte neuf classes de filtres qui peuvent tre appliques nimporte quel objet daffichage ou des instances de BitmapData :

filtre biseau (classe BevelFilter) filtre flou (classe BlurFilter) filtre ombre porte (classe DropShadowFilter) filtre de rayonnement (classe GlowFilter) filtre biseau dgrad (classe GradientBevelFilter) filtre de rayonnement dgrad (classe GradientGlowFilter) filtre matrice de couleurs (classe ColorMatrixFilter) filtre convolution (classe ConvolutionFilter) filtre mappage de dplacement (classe DisplacementMapFilter)

Les six premiers sont des filtres simples pouvant tre utiliss pour des effets spcifiques, avec certains rglages possibles. Ces six filtres peuvent tre appliqus en ActionScript, mais aussi partir du panneau Filtres dAdobe Flash CS3 Professional. Par consquent, mme si vous appliquez des filtres laide dActionScript, si vous disposez de lenvironnement de cration Flash vous pouvez utiliser son interface visuelle pour vrifier rapidement leffet des diffrents filtres et de leurs rglages afin de crer leffet dsir. Les trois derniers filtres sont uniquement disponibles en ActionScript. Ces filtres (matrice de couleurs, convolution et mappage de dplacement) sont beaucoup plus souples demploi en raison des divers types deffets quils permettent dutiliser. Plutt que de simples filtres optimiss pour un effet prcis, ils apportent beaucoup de puissance et de flexibilit. Par exemple, en choisissant diffrentes valeurs pour sa matrice, il est possible dutiliser le filtre Convolution pour crer des effets de flou, de gravure, daccentuation, mais aussi pour des transformations, la dtection de contour des couleurs, etc. Chacun de ces filtres, quil soit simple ou complexe, dispose de proprits dont les valeurs peuvent tre modifies. En gnral, il existe deux possibilits pour dfinir les proprits dun filtre. Tous les filtres permettent de dfinir leurs proprits en passant des valeurs en paramtres au constructeur de lobjet filtre. Que les proprits du filtre soient dfinies ou non par un passage de paramtres, il est aussi possible de modifier ultrieurement ses rglages en changeant les valeurs des proprits de lobjet filtre. La plupart des exemples de code dfinissent directement les proprits, afin de faciliter la comprhension de lexemple. Nanmoins, il est galement possible, en gnral, dobtenir le mme rsultat avec moins de lignes de code, en passant les valeurs en paramtres dans le constructeur de lobjet filtre. Pour plus de dtails sur les proprits et les paramtres spcifiques de chaque filtre, ainsi que sur ceux de son constructeur, consultez les listings du paquet flash.filters dans le manuel Rfrence du langage et des composants ActionScript 3.0.

502

Filtrage des objets daffichage

Filtre de biseau
La classe BevelFilter permet dappliquer un effet de biseau 3D des objets daffichage. Avec ce filtre, les angles et les cts des objets semblent cisels, biseauts. Les proprits de la classe BevelFilter permettent de modifier lapparence du biseau. Vous pouvez dfinir les couleurs des zones claires et sombres, ladoucissement et les angles des cts du biseau, ainsi que la tille de ces derniers. Vous pouvez mme crer un effet de poinonnage. Lexemple suivant charge une image externe et lui applique un filtre de biseau.
import import import import import flash.display.*; flash.filters.BevelFilter; flash.filters.BitmapFilterQuality; flash.filters.BitmapFilterType; flash.net.URLRequest;

// chargement de limage dans la scne var imageLoader:Loader = new Loader(); var url:String = "http://www.helpexamples.com/flash/images/image3.jpg"; var urlReq:URLRequest = new URLRequest(url); imageLoader.load(urlReq); addChild(imageLoader); // crer le filtre de biseau et dfinir ses proprits. var bevel:BevelFilter = new BevelFilter(); bevel.distance = 5; bevel.angle = 45; bevel.highlightColor = 0xFFFF00; bevel.highlightAlpha = 0.8; bevel.shadowColor = 0x666666; bevel.shadowAlpha = 0.8; bevel.blurX = 5; bevel.blurY = 5; bevel.strength = 5; bevel.quality = BitmapFilterQuality.HIGH; bevel.type = BitmapFilterType.INNER; bevel.knockout = false; appliquer le filtre limage. imageLoader.filters = [bevel];

Filtres daffichage disponibles

503

Filtre de flou
La classe BlurFilter permet dappliquer un effet de balayage, ou de flou, un objet daffichage et son contenu. Les effets de flou permettent de donner limpression quun objet nest pas dans le plan de mise au point ou de simuler leffet dun mouvement rapide (flou de mouvement). En choisissant une valeur faible pour la proprit quality, vous pouvez simuler un effet de photo lgrement floue. Le choix dune valeur leve pour la proprit quality permet dobtenir un effet de flou lger proche de celui dun flou gaussien. Lexemple suivant cre un objet cercle laide de la mthode drawCircle() de la classe Graphics, puis lui applique un filtre flou :
import flash.display.Sprite; import flash.filters.BitmapFilterQuality; import flash.filters.BlurFilter; // dessin dun cercle. var redDotCutout:Sprite = new Sprite(); redDotCutout.graphics.lineStyle(); redDotCutout.graphics.beginFill(0xFF0000); redDotCutout.graphics.drawCircle(145, 90, 25); redDotCutout.graphics.endFill(); // ajout du cercle la liste daffichage. addChild(redDotCutout); // application du filtre au rectangle. var blur:BlurFilter = new BlurFilter(); blur.blurX = 10; blur.blurY = 10; blur.quality = BitmapFilterQuality.MEDIUM; redDotCutout.filters = [blur];

Filtre dombre porte


Lombre porte donne limpression dune source lumineuse ponctuelle au-dessus de lobjet cible. Il est possible de modifier la position et lintensit de cette source lumineuse pour produire divers effets dombre porte. Lalgorithme utilis par ce filtre est identique celui du filtre de flou. La principale diffrence tient au fait que le filtre dombre porte possde quelques proprits supplmentaires qui permettent de simuler diverses caractristiques dune source lumineuse (canal alpha, couleur, dcalage et luminosit). Le filtre dombre porte permet aussi dappliquer des options de transformation au style de lombre porte (ombre interne ou externe, ou mode de masquage.

504

Filtrage des objets daffichage

Le code suivant cre un objet Sprite carr et lui applique une ombre porte.
import flash.display.Sprite; import flash.filters.DropShadowFilter; // dessin dun carr. var boxShadow:Sprite = new Sprite(); boxShadow.graphics.lineStyle(1); boxShadow.graphics.beginFill(0xFF3300); boxShadow.graphics.drawRect(0, 0, 100, 100); boxShadow.graphics.endFill(); addChild(boxShadow); // application du filtre dombre porte ce carr. var shadow:DropShadowFilter = new DropShadowFilter(); shadow.distance = 10; shadow.angle = 25; // // // // dautres proprits peuvent tre dfinies, par exemple la couleur de lombre, le canal alpha, limportance du flou, sa force, sa qualit et les options dombre interne et de masquage.

boxShadow.filters = [shadow];

Filtre de rayonnement
La classe GlowFilter applique un effet dclairage aux objets daffichage. Ces derniers semblent illumins par en dessous. Comme le filtre dombre porte, le filtre de rayonnement possde des proprits qui permettent de modifier la distance, langle et la couleur de la source lumineuse en fonction de leffet dsir. Lobjet GlowFilter comporte aussi plusieurs options pour modifier le style de rayonnement, notamment le rayonnement interne ou externe et le mode de masquage. Le code suivant cre un objet Sprite en forme de croix et lui applique un filtre de rayonnement.
import flash.display.Sprite; import flash.filters.BitmapFilterQuality; import flash.filters.GlowFilter; // crer la forme de la croix. var crossGraphic:Sprite = new Sprite(); crossGraphic.graphics.lineStyle(); crossGraphic.graphics.beginFill(0xCCCC00); crossGraphic.graphics.drawRect(60, 90, 100, 20); crossGraphic.graphics.drawRect(100, 50, 20, 100); crossGraphic.graphics.endFill(); addChild(crossGraphic);

Filtres daffichage disponibles

505

// application du filtre de rayonnement la croix. var glow:GlowFilter = new GlowFilter(); glow.color = 0x009922; glow.alpha = 1; glow.blurX = 25; glow.blurY = 25; glow.quality = BitmapFilterQuality.MEDIUM; crossGraphic.filters = [glow];

Filtre de biseau dgrad


La classe GradientBevelFilter permet dappliquer un effet de biseau en dgrad des objets daffichage ou des objets BitmapData. Lutilisation dun dgrad de couleurs sur le biseau amliore beaucoup leffet de relief de celui-ci, en donnant aux cts un aspect 3D plus raliste. Lexemple suivant cre un objet rectangle laide de la mthode drawRect() de la classe Shape, puis lui applique un filtre de biseau dgrad :
import flash.display.Shape; import flash.filters.BitmapFilterQuality; import flash.filters.GradientBevelFilter; // dessin du rectangle. var box:Shape = new Shape(); box.graphics.lineStyle(); box.graphics.beginFill(0xFEFE78); box.graphics.drawRect(100, 50, 90, 200); box.graphics.endFill(); // application du filtre de biseau dgrad au rectangle. var gradientBevel:GradientBevelFilter = new GradientBevelFilter(); gradientBevel.distance = 8; gradientBevel.angle = 225; // inverse 45 degrs gradientBevel.colors = [0xFFFFCC, 0xFEFE78, 0x8F8E01]; gradientBevel.alphas = [1, 0, 1]; gradientBevel.ratios = [0, 128, 255]; gradientBevel.blurX = 8; gradientBevel.blurY = 8; gradientBevel.quality = BitmapFilterQuality.HIGH; // Dautres proprits permettent de dfinir la force du filtre et // autres options de biseau interne et de masquage. box.filters = [gradientBevel]; // ajout du graphisme la liste daffichage. addChild(box);

506

Filtrage des objets daffichage

Filtre de rayonnement dgrad


La classe GradientGlowFilter permet dappliquer un effet de rayonnement dgrad des objets daffichage ou des objets BitmapData. Cet effet donne davantage de contrle sur le rayonnement, produisant ainsi un effet plus raliste. De plus, le filtre de rayonnement dgrad permet dappliquer un rayonnement aux cts intrieur, extrieur ou suprieur de lobjet. Lexemple suivant dessine un cercle auquel un filtre de rayonnement dgrad est appliqu. Le montant de flou horizontal et vertical augmente mesure que le pointeur de la souris sapproche du coin infrieur droit de la scne. Si lutilisateur clique dans la scne, le niveau de flou augmente.
import import import import flash.events.MouseEvent; flash.filters.BitmapFilterQuality; flash.filters.BitmapFilterType; flash.filters.GradientGlowFilter;

// cration dune nouvelle instance de Shape var shape:Shape = new Shape(); // dessin de la forme. shape.graphics.beginFill(0xFF0000, 100); shape.graphics.moveTo(0, 0); shape.graphics.lineTo(100, 0); shape.graphics.lineTo(100, 100); shape.graphics.lineTo(0, 100); shape.graphics.lineTo(0, 0); shape.graphics.endFill(); // positionnement de la forme sur la scne. addChild(shape); shape.x = 100; shape.y = 100; // dfinition dun rayonnement dgrad var gradientGlow:GradientGlowFilter = new GradientGlowFilter(); gradientGlow.distance = 0; gradientGlow.angle = 45; gradientGlow.colors = [0x000000, 0xFF0000]; gradientGlow.alphas = [0, 1]; gradientGlow.ratios = [0, 255]; gradientGlow.blurX = 10; gradientGlow.blurY = 10; gradientGlow.strength = 2; gradientGlow.quality = BitmapFilterQuality.HIGH; gradientGlow.type = BitmapFilterType.OUTER;

Filtres daffichage disponibles

507

// dfinition des fonction dcouteur pour deux vnements. function onClick(event:MouseEvent):void { gradientGlow.strength++; shape.filters = [gradientGlow]; } function onMouseMove(event:MouseEvent):void { gradientGlow.blurX = (stage.mouseX / stage.stageWidth) * 255; gradientGlow.blurY = (stage.mouseY / stage.stageHeight) * 255; shape.filters = [gradientGlow]; } stage.addEventListener(MouseEvent.CLICK, onClick); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);

Exemple : combinaison de filtres de base


Lexemple de code suivant applique plusieurs filtres de base, en combinaison avec un timer pour la cration dactions rptitives, pour obtenir la simulation dun feu de circulation.
import import import import import import import import var var var var var var var var var var var var flash.display.Shape; flash.events.TimerEvent; flash.filters.BitmapFilterQuality; flash.filters.BitmapFilterType; flash.filters.DropShadowFilter; flash.filters.GlowFilter; flash.filters.GradientBevelFilter; flash.utils.Timer;

count:Number = 1; distance:Number = 8; angleInDegrees:Number = 225; // inverse 45 degrs colors:Array = [0xFFFFCC, 0xFEFE78, 0x8F8E01]; alphas:Array = [1, 0, 1]; ratios:Array = [0, 128, 255]; blurX:Number = 8; blurY:Number = 8; strength:Number = 1; quality:Number = BitmapFilterQuality.HIGH; type:String = BitmapFilterType.INNER; knockout:Boolean = false;

// traage de larrire-plan rectangulaire du feu de circulation. var box:Shape = new Shape(); box.graphics.lineStyle(); box.graphics.beginFill(0xFEFE78); box.graphics.drawRect(100, 50, 90, 200); box.graphics.endFill();

508

Filtrage des objets daffichage

// dessin de 3 cercles pour les trois feux. var stopLight:Shape = new Shape(); stopLight.graphics.lineStyle(); stopLight.graphics.beginFill(0xFF0000); stopLight.graphics.drawCircle(145,90,25); stopLight.graphics.endFill(); var cautionLight:Shape = new Shape(); cautionLight.graphics.lineStyle(); cautionLight.graphics.beginFill(0xFF9900); cautionLight.graphics.drawCircle(145,150,25); cautionLight.graphics.endFill(); var goLight:Shape = new Shape(); goLight.graphics.lineStyle(); goLight.graphics.beginFill(0x00CC00); goLight.graphics.drawCircle(145,210,25); goLight.graphics.endFill(); // ajout du graphisme la liste daffichage. addChild(box); addChild(stopLight); addChild(cautionLight); addChild(goLight); // application dun filtre de biseau dgrad au rectangle darrire-plan. var gradientBevel:GradientBevelFilter = new GradientBevelFilter(distance, angleInDegrees, colors, alphas, ratios, blurX, blurY, strength, quality, type, knockout); box.filters = [gradientBevel]; // cration de lombre interne (pour les feux teints) et du rayonnement // (pour les feux allums). var innerShadow:DropShadowFilter = new DropShadowFilter(5, 45, 0, 0.5, 3, 3, 1, 1, true, false); var redGlow:GlowFilter = new GlowFilter(0xFF0000, 1, 30, 30, 1, 1, false, false); var yellowGlow:GlowFilter = new GlowFilter(0xFF9900, 1, 30, 30, 1, 1, false, false); var greenGlow:GlowFilter = new GlowFilter(0x00CC00, 1, 30, 30, 1, 1, false, false); // dfinition de ltat de dpart des feux (vert allum, rouge et // orange teints). stopLight.filters = [innerShadow]; cautionLight.filters = [innerShadow]; goLight.filters = [greenGlow];

Filtres daffichage disponibles

509

// interversion des filtres sur la base du dcompte. function trafficControl(event:TimerEvent):void { if (count == 4) { count = 1; } switch (count) { case 1: stopLight.filters = [innerShadow]; cautionLight.filters = [yellowGlow]; goLight.filters = [innerShadow]; break; case 2: stopLight.filters = [redGlow]; cautionLight.filters = [innerShadow]; goLight.filters = [innerShadow]; break; case 3: stopLight.filters = [innerShadow]; cautionLight.filters = [innerShadow]; goLight.filters = [greenGlow]; break; } count++; } // cration dun timer pour linterversion des filtres toutes // les 3 secondes. var timer:Timer = new Timer(3000, 9); timer.addEventListener(TimerEvent.TIMER, trafficControl); timer.start();

Filtre matrice de couleurs


La classe ColorMatrixFilter permet de modifier les valeurs des couleurs et de canal alpha de lobjet filtr. Il est ainsi possible de crer des changements de saturation, des rotations de teinte (passage dune palette dune plage de couleur une autre), de dfinir la luminance de la couche alpha et de produire dautres effets de manipulation des couleurs en utilisant les valeurs dun canal couleur pour les appliquer aux autres canaux.

510

Filtrage des objets daffichage

Le principe de fonctionnement de ce filtre est le suivant : les pixels de limage source sont analyss un par un et leurs composants rouge, vert, bleu et alpha sont spars. Les valeurs de la matrice de couleur sont alors multiplies par chacune de ces valeurs, et les rsultats sont ajouts pour dterminer la valeur colorimtrique rsultante qui sera affiche lcran pour ce pixel. La proprit matrix du filtre est n tableau de 20 nombres qui sont utiliss pour le calcul de la couleur finale. Pour plus de dtails sur lalgorithme utilis pour calculer ces valeurs colorimtriques, consultez la section dcrivant la proprit matrix de la classe ColorMatrixFilter dans le manuel Rfrence du langage et des composants ActionScript 3.0. Vous trouverez plus dinformations et des exemples du filtre matrice de couleurs dans larticle Using Matrices for Transformations, Color Adjustments, and Convolution Effects in Flash sur le site Web du Centre de dveloppement dAdobe.

Filtre de convolution
La classe ConvolutionFilter permet dappliquer de nombreuses transformations dimage aux objets BitmapData ou aux objets daffichage, notamment le flou, la dtection de contour, laccentuation, lestampage et le biseautage. Le principe de fonctionnement du filtre convolution est le suivant : les pixels de limage source sont analyss un par un pour dterminer la couleur finale de ce pixel sur la base de sa valeur et de celles des pixels adjacents. Une matrice, sous forme dun tableau de valeurs numriques, indique dans quelle mesure la valeur de chaque pixel adjacent particulier affecte la valeur finale. Le type de matrice le plus frquemment utilis est un tableau de trois par trois. La matrice comporte donc neuf valeurs :
N N N N P N N N N

Lorsque Flash Player applique le filtre de convolution un pixel donn, il analyse la valeur colorimtrique du pixel lui-mme ( P dans notre exemple) et celles des pixels environnants ( N dans lexemple). Toutefois, le choix des valeurs de la matrice permet de spcifier la priorit de certains pixels pour le calcul de limage rsultante. Par exemple, la matrice suivante, applique un filtre de convolution, laissera limage intacte, exactement comme limage originale :
0 0 0 0 1 0 0 0 0

Filtres daffichage disponibles

511

Limage na pas t modifie car la valeur du pixel original a une priorit relative de 1 pour dterminer la couleur du pixel final, alors que les pixels environnants ont une priorit relative de 0 (autrement dit, leur couleur naffecte pas limage finale). De mme, la matrice suivante provoque un dcalage gauche de tous les pixels dune image :
0 0 0 0 0 1 0 0 0

Remarquez que dans cet exemple le pixel lui-mme na aucun effet sur la valeur finale du pixel affich au mme emplacement dans limage finale : seule la valeur du pixel de droite est utilise pour dterminer la valeur rsultante pour chaque pixel. En ActionScript, la matrice est une combinaison dune instance de lobjet Array contenant les valeurs et deux proprits spcifiant le nombre de lignes et de colonnes de la matrice. Lexemple suivant charge une image, puis lui applique un filtre de convolution sur la base de la matrice du listing prcdent :
// charger limage dans la scne var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/ images/image1.jpg"); loader.load(url); this.addChild(loader); function applyFilter(event:MouseEvent):void { // cration du filtre de convolution var matrix:Array = [ 0, 0, 0, 0, 0, 1, 0, 0, 0 ]; var convolution:ConvolutionFilter = new ConvolutionFilter(); convolution.matrixX = 3; convolution.matrixY = 3; convolution.matrix = matrix; convolution.divisor = 1; loader.filters = [convolution]; } loader.addEventListener(MouseEvent.CLICK, applyFilter);

512

Filtrage des objets daffichage

Un point important nest pas vident dans ce code : leffet de valeurs diffrentes de 1 ou 0 dans la matrice. Par exemple, la mme matrice avec le chiffre 8 au lieu de 1 dans le coin suprieur droit effectuerait la mme action (dcalage des pixels vers la gauche). Mais les couleurs de limage seraient 8 fois plus lumineuses. En effet, les valeurs finales de couleur des pixels sont calcules en multipliant les valeurs de la matrice par celles des couleurs originales des pixels, en additionnant ces valeurs, puis en les divisant par celle de la proprit divisor du filtre. Notez que dans cet exemple, la proprit divisor a la valeur 1. En rgle gnrale, pour que la luminosit des couleurs reste peu prs identique celle des couleurs de limage originale, la proprit divisor doit avoir une valeur gale la somme des valeurs de la matrice. Ainsi, avec une matrice dont la somme des valeurs est 8, et pour un diviseur de 1, limage rsultante sera environ 8 fois plus lumineuse que limage originale. Bien que leffet de cette matrice ne soit pas trs spectaculaire, dautres valeurs peuvent tre utilises pour crer divers effets. Voici quelques ensembles standards de valeurs de matrice permettant dobtenir divers effets avec une matrice de trois par trois :

Flou de base (diviseur 5) :


0 1 0 1 1 1 0 1 0

Accentuation (diviseur 1) :
0, -1, 0 -1, 5, -1 0, -1, 0

Dtection des contours (diviseur 1) :


0, -1, 0 -1, 4, -1 0, -1, 0

Estampage (diviseur 1) :
-2, -1, 0 -1, 1, 1 0, 1, 2

Notez quavec la plupart de ces effets, le diviseur est 1. En effet, laddition des valeurs ngatives et des valeurs positives dans la matrice donne 1 (ou 0 dans le cas de la dtection des contours, mais la valeur de la proprit divisor ne peut pas tre 0).

Filtres daffichage disponibles

513

Filtre mappage de dplacement


La classe DisplacementMapFilter utilise les valeurs de pixels dun objet BitmapData (appel image de mappage du dplacement) pour donner un effet de dplacement dun objet. Limage de mappage du dplacement est en gnral diffrente de linstance dobjet daffichage ou BitmapData laquelle le filtre est appliqu. Leffet de dplacement ncessite de dplacer les pixels de limage filtre, autrement dit de les dcaler dun certain niveau. Ce filtre permet de crer un effet de dcalage, de gondole ou de marbrure. La direction et la valeur du dplacement appliqu un pixel donn sont dtermines par la valeur colorimtrique de limage de mappage du dplacement. Pour utiliser ce filtre, il est ncessaire de spcifier limage de mappage, ainsi que les valeurs suivantes, qui permettent de contrler le calcul du dplacement :

Point de mappage : emplacement, dans limage filtre, auquel le coin suprieur gauche du filtre de dplacement sera appliqu. Ce paramtre nest ncessaire que pour appliquer le filtre une partie de limage seulement. Composant X : canal couleur de limage de mappage qui affecte la position x des pixels. Composant Y : canal couleur de limage de mappage qui affecte la position y des pixels. chelle X : valeur multiplicatrice qui indique le niveau de dplacement sur laxe x. chelle Y : valeur multiplicatrice qui indique le niveau de dplacement sur laxe y. Mode de filtrage : dtermine ce que Flash Player doit faire dans le cas despaces vides crs par le dcalage des pixels. Les options, dfinies par des constantes dans la classe DisplacementMapFilterMode, sont dafficher les pixels originaux (mode IGNORE), de dcaler et transfrer les pixels de lautre ct de limage (mode WRAP, qui est le mode par dfaut), dutiliser le pixel dplac le plus proche (mode CLAMP), ou de remplir ces espaces vides avec une couleur (mode COLOR).

Prenons un exemple simple pour mieux expliquer le fonctionnement du filtre de dplacement. Dans le code ci-dessous, une image est charge, puis elle est centre sur la scne et un filtre de mappage de dplacement lui est appliqu, ce qui dplace horizontalement (vers la gauche) les pixels de toute limage.
import import import import import import flash.display.BitmapData; flash.display.Loader; flash.events.MouseEvent; flash.filters.DisplacementMapFilter; flash.geom.Point; flash.net.URLRequest;

514

Filtrage des objets daffichage

// chargement de limage dans la scne var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/ images/image3.jpg"); loader.load(url); this.addChild(loader); var mapImage:BitmapData; var displacementMap:DisplacementMapFilter; // This function is called when the image finishes loading. function setupStage(event:Event):void { // centrer limage sur la scne loader.x = (stage.stageWidth - loader.width) / 2; loader.y = (stage.stageHeight - loader.height) / 2; // crer le filtre de mappage de dplacement mapImage = new BitmapData(loader.width, loader.height, false, 0xFF0000); // crer le filtre de dplacement displacementMap = new DisplacementMapFilter(); displacementMap.mapBitmap = mapImage; displacementMap.mapPoint = new Point(0, 0); displacementMap.componentX = BitmapDataChannel.RED; displacementMap.scaleX = 250; loader.filters = [displacementMap]; } loader.contentLoaderInfo.addEventListener(Event.COMPLETE, setupStage);

Les proprits utilises pour dfinir le dplacement sont les suivantes :

Bitmap de mappage : le bitmap de dplacement est une nouvelle instance de BitmapData, cre par code. Ses dimensions sont identiques celles de limage charge (le dplacement est donc appliqu toute limage). Elle est remplie de pixels rouges opaques. Point de mappage : cette valeur est dfinie pour le point 0, 0 (ici encore, le dplacement sera appliqu toute limage). Composant X : Cette valeur reoit la constante BitmapDataChannel.RED, ce qui signifie que cest la valeur de rouge de limage bitmap de mappage qui dterminera le niveau de dplacement des pixels sur laxe x. chelle X : ce paramtre reoit la valeur 250. Limage de mappage tant entirement rouge, la valeur totale de dplacement ne dcale limage que faiblement (environ un demipixel). Si cette valeur tait de 1, limage ne serait donc dcale que de 0,5 pixels horizontalement. En choisissant une valeur de 250, nous dplaons limage denviron 125 pixels.

Filtres daffichage disponibles

515

Ces valeurs provoquent un dplacement des pixels de limage filtre de 250 pixels gauche. La direction (gauche ou droite) et limportance du dplacement dpendent de la valeur colorimtrique des pixels de limage de mappage. Le principe de fonctionnement de ce filtre est le suivant : Flash Player analyse un par un les pixels de limage filtre (ou tout au moins ceux de la zone laquelle le filtre est appliqu, ce qui ici signifie toute limage), et procde comme suit pour chaque pixel :
1.

Il dtermine le pixel correspondant dans limage de mappage. Par exemple, pour calculer la valeur de dplacement du pixel du coin suprieur gauche de limage filtre, Flash Player analyse le pixel correspondant dans le coin suprieur gauche de limage de mappage. Il dtermine la valeur du canal de couleur spcifi dans le pixel de mappage. Dans cet exemple, le canal de couleur du composant x est le rouge, et Flash Player recherche donc la valeur du canal rouge au point en question dans limage de mappage. Limage de mappage tant un rouge opaque, le canal rouge du pixel a la valeur 0xFF, soit 255. Cette valeur est la valeur de dplacement. Il compare ensuite la valeur de dplacement la valeur mdiane (127, mi-chemin entre 0 et 255). Si la valeur de dplacement est infrieure la valeur mdiane, le pixel est dplac dans une direction positive (vers la droite pour laxe x, vers le bas pour laxe y). Par contre, si la valeur de dplacement est suprieure la valeur mdiane (comme dans cet exemple), le pixel est dplac dans une direction ngative (vers la gauche pour laxe x, vers le haut pour laxe y). Plus prcisment, Flash Player soustrait la valeur de dplacement de 127, et le rsultat (positif ou ngatif) est la valeur relative de dplacement qui est applique. Enfin, il dtermine la valeur relle de dplacement en calculant le pourcentage de dplacement complet reprsent par la valeur de dplacement relatif. Dans cet exemple, un rouge ) 100 % provoque un dplacement de 100 %. Ce pourcentage est ensuite multipli par la valeur de lchelle x ou de lchelle y pour dterminer le nombre de pixels de dplacement appliquer. Dans cet exemple, la valeur de dplacement est 100 % multipli par un multiple de 250, soit environ 125 pixels gauche.

2.

3.

4.

Comme nous navons spcifi aucune valeur pour les composants x et y, les valeurs par dfaut (qui ne provoquent pas de dplacement) ont t utilises. Cest pourquoi limage nest pas dplace dans le sens vertical. Dans cet exemple, le paramtre par dfaut de mode de filtrage, WRAP, est utilis, si bien que lorsque les pixels sont dplacs vers la gauche, lespace laiss vide droite est rempli par les pixels qui ont t dcals le long du ct gauche de limage. Vous pouvez modifier cette valeur pour voir les diffrents effets ainsi obtenus. Par exemple, si vous ajoutez la ligne suivante dans la partie du code qui dfinit les proprits de dplacement (avant la ligne loader.filters = [displacementMap]), limage semble avoir subi un balayage :
displacementMap.mode = DisplacementMapFilterMode.CLAMP;

516

Filtrage des objets daffichage

Le listing ci-dessous propose un exemple plus complexe, en utilisant un filtre de mappage de dplacement pour crer un effet de loupe dans limage :
import import import import import import import import import import import import flash.display.Bitmap; flash.display.BitmapData; flash.display.BitmapDataChannel; flash.display.GradientType; flash.display.Loader; flash.display.Shape; flash.events.MouseEvent; flash.filters.DisplacementMapFilter; flash.filters.DisplacementMapFilterMode; flash.geom.Matrix; flash.geom.Point; flash.net.URLRequest;

// cration des cercles dgrads qui formeront // limage de mappage du dplacement var radius:uint = 50; var type:String = GradientType.LINEAR; var redColors:Array = [ 0xFF0000, 0x000000 ]; var blueColors:Array = [ 0x0000FF, 0x000000 ]; var alphas:Array = [ 1, 1 ]; var ratios:Array = [ 0, 255 ]; var xMatrix:Matrix = new Matrix(); xMatrix.createGradientBox(radius * 2, radius * 2); var yMatrix:Matrix = new Matrix(); yMatrix.createGradientBox(radius * 2, radius * 2, Math.PI / 2); var xCircle:Shape = new Shape(); xCircle.graphics.lineStyle(0, 0, 0); xCircle.graphics.beginGradientFill(type, redColors, alphas, ratios, xMatrix); xCircle.graphics.drawCircle(radius, radius, radius); var yCircle:Shape = new Shape(); yCircle.graphics.lineStyle(0, 0, 0); yCircle.graphics.beginGradientFill(type, blueColors, alphas, ratios, yMatrix); yCircle.graphics.drawCircle(radius, radius, radius); // positionnement des cercles en bas de lcran, pour rfrence. this.addChild(xCircle); xCircle.y = stage.stageHeight - xCircle.height; this.addChild(yCircle); yCircle.y = stage.stageHeight - yCircle.height; yCircle.x = 200;

Filtres daffichage disponibles

517

// chargement de limage dans la scne var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/ images/image1.jpg"); loader.load(url); this.addChild(loader); // cration de limage de mappage en combinant les deux cercles dgrads. var map:BitmapData = new BitmapData(xCircle.width, xCircle.height, false, 0x7F7F7F); map.draw(xCircle); var yMap:BitmapData = new BitmapData(yCircle.width, yCircle.height, false, 0x7F7F7F); yMap.draw(yCircle); map.copyChannel(yMap, yMap.rect, new Point(0, 0), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE); yMap.dispose(); // affichage de limage de mappage sur la scne, pour rfrence. var mapBitmap:Bitmap = new Bitmap(map); this.addChild(mapBitmap); mapBitmap.x = 400; mapBitmap.y = stage.stageHeight - mapBitmap.height; // cration du filtre de mappage de dplacement lemplacement du pointeur // de souris function magnify():void { // positionnement du filtre. var filterX:Number = (loader.mouseX) - (map.width / 2); var filterY:Number = (loader.mouseY) - (map.height / 2); var pt:Point = new Point(filterX, filterY); var xyFilter:DisplacementMapFilter = new DisplacementMapFilter(); xyFilter.mapBitmap = map; xyFilter.mapPoint = pt; // le rouge de limage de mappage contrlera le dplacement sur laxe x. xyFilter.componentX = BitmapDataChannel.RED; // le bleu de limage de mappage contrlera le dplacement sur laxe y. xyFilter.componentY = BitmapDataChannel.BLUE; xyFilter.scaleX = 35; xyFilter.scaleY = 35; xyFilter.mode = DisplacementMapFilterMode.IGNORE; loader.filters = [xyFilter]; }

518

Filtrage des objets daffichage

// cette fonction est appele chaque mouvement de souris. Si la souris est // sur limage charge, le filtre est appliqu. function moveMagnifier(event:MouseEvent):void { if (loader.hitTestPoint(loader.mouseX, loader.mouseY)) { magnify(); } } loader.addEventListener(MouseEvent.MOUSE_MOVE, moveMagnifier);

Ce code gnre dabord deux cercles en dgrad, qui sont combins pour former limage de mappage du dplacement. Le cercle rouge est lorigine du dplacement sur laxe x (xyFilter.componentX = BitmapDataChannel.RED), et le cercle bleu est lorigine du dplacement sur laxe y (xyFilter.componentY = BitmapDataChannel.BLUE). Pour vous permettre de comprendre plus aisment laspect de limage de mappage du dplacement, le code affiche les cercles originaux, ainsi que le cercle combin qui fait office dimage de mappage, en bas de lcran.

Filtres daffichage disponibles

519

Le code charge ensuite une image et, en fonction des dplacements de la souris, applique le filtre de dplacement la partie de limage qui est sous la souris. Les cercles dgrads utiliss pour limage de mappage de dplacement provoquent un effet centrifuge dans la zone laquelle le filtre est appliqu. Notez que les zones en gris de limage de mappage du dplacement ne provoquent pas de dplacement. En effet, la valeur du gris est 0x7F7F7F. Les canaux bleu et rouge de ce niveau de gris ont donc exactement une valeur mdiane, si bien quil ny a pas de dplacement lorsquune zone grise apparat dans limage de mappage. Il ny a pas non plus de dplacement au centre du cercle. Bien que cette zone ne soit pas de couleur grise, ses canaux rouge et bleu ont des valeurs identiques celles des canaux rouge et bleu du gris moyen, et puisque le dplacement est bas sur les valeurs de bleu et de rouge, aucun dplacement na lieu.

Exemple : Filter Workbench


Lexemple Filter Workbench comporte une interface utilisateur simple qui permet dappliquer divers filtres une image et de voir le code rsultant, qui peut tre utilis pour gnrer le mme effet en ActionScript. Pour lire une description de cet exemple et tlcharger son code source, consultez la page http://www.adobe.com/go/learn_fl_filters_fr.

520

Filtrage des objets daffichage

CHAPITRE 16

Utilisation des clips


La classe MovieClip est la classe de base des animations et des symboles de clips crs avec Adobe Flash CS3 Professional. Elle comporte tous les comportements et toutes les fonctionnalits des objets daffichage, mais avec des proprits et des mthodes supplmentaires qui permettent de contrler le scnario dun clip. Ce chapitre explique comment utiliser ActionScript pour grer la lecture dun clip et crer un clip de manire dynamique.

16

Sommaire
Principes de base des clips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 Contrle de la lecture dun clip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 Cration dobjets MovieClip laide dActionScript . . . . . . . . . . . . . . . . . . . . . . . . . .528 Chargement dun fichier SWF externe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .532 Exemple : RuntimeAssetsExplorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .533

Principes de base des clips


Introduction lutilisation des clips
Les clips sont un lment capital pour les crateurs de contenu anim dans lenvironnement de cration Flash et pour contrler ce contenu en ActionScript. Lorsque vous crez un symbole de clip dans Flash, le programme ajoute ce symbole la bibliothque du document Flash. Par dfaut, ce symbole devient une instance de la classe MovieClip et il hrite donc des proprits et mthodes de cette classe.

521

Lorsquune instance dun symbole de clip est place sur la scne, la progression du scnario de ce clip seffectue automatiquement (si le clip comporte plusieurs images), sauf si cette lecture est modifie en ActionScript. Le scnario est llment distinctif de la classe MovieClip. Il permet de crer des animations par interpolation de mouvement ou de forme via linterface de Flash. Par contre, un objet daffichage issu de la classe Sprite peut uniquement tre anim par programmation, en modifiant ses valeurs. Dans les versions prcdentes dActionScript, la classe MovieClip constituait la classe de base de toutes les instances de la scne. En ActionScript 3.0, un clip est dsormais un objet daffichage parmi dautres, tous susceptibles de safficher lcran. Sil nest pas ncessaire de dfinir un scnario pour la fonction dun objet daffichage, lutilisation de la classe Shape au lieu de la classe MovieClip peut accrotre les performances daffichage. Pour plus dinformations sur le choix des objets daffichage en fonction de la tche prvue, consultez la section Choix dune sous-classe de DisplayObject , la page 418.

Tches courantes dutilisation des clips


Voici quelques tches courantes relatives aux clips qui sont prsentes dans ce chapitre :

Lecture et arrt des clips Lecture des clips en marche arrire. Dplacement de la tte de lecture un point spcifique du scnario dun clip Utilisation des tiquettes dimages en ActionScript Accs aux informations de squence en ActionScript Cration dinstances de symboles de clips dans la bibliothque en ActionScript Chargement et contrle de fichiers SWF externes, y compris sils ont t crs avec des versions antrieures de Flash Player Construction dun systme en ActionScript pour la cration dlments graphiques charger lors de lexcution

Concepts importants et terminologie


La liste de rfrence suivante numre les termes importants que vous rencontrerez dans ce chapitre :

SWF AVM1 : fichier SWF cr en ActionScript 1.0 ou ActionScript 2.0, et gnralement destin aux versions 8 ou antrieures de Flash Player. SWF AVM2 : fichier SWF cr en ActionScript 3.0 pour Adobe Flash Player 9. SWF externe : fichier SWF cr sparment de celui du projet, et destin tre charg et lu dans celui-ci.

522

Utilisation des clips

Image : lment de base du scnario. Comme les images de films, chaque image est une photographie et cest la lecture rapide des images en squence qui produit leffet danimation. Scnario : mtaphore reprsentant la srie dimages qui composent la squence danimation dun clip. Le scnario dun objet MovieClip est lquivalent du scnario de cet objet dans lenvironnement de cration Flash. Tte de lecture : marqueur identifiant la position (limage) dans le scnario qui est affiche un moment donn

Utilisation des exemples des chapitres


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Ce chapitre portant sur lutilisation des clips vido en ActionScript, un grand nombre dexemples de code manipulent un symbole de clip qui a t auparavant cr et plac sur la scne. Pour tester un exemple, il est ncessaire dafficher son rsultat dans Flash Player pour voir leffet du code sur le symbole. Pour tester les exemples de code de ce chapitre :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code de lexemple dans la fentre de script : Crez une instance dun symbole de clip sur la scne. Par exemple, tracez une forme, slectionnez-la, choisissez Modification > Convertir en symbole, et donnez un nom ce symbole. Laissez ce clip slectionn et, dans linspecteur Proprits, donnez-lui un nom doccurrence. Le nom doit correspondre au nom utilis pour le clip dans lexemple de code (par exemple, si le code manipule un clip myMovieClip, vous devez appeler votre instance de clip myMovieClip galement). Choisissez Contrle > Tester lanimation pour excuter le programme. Vous verrez lcran le rsultat du code de lexemple.

5.

6.

Diverses autres techniques permettant de tester les exemples de code sont expliques dans la section Test des exemples de code contenus dans un chapitre , la page 67.

Principes de base des clips

523

Utilisation des objets MovieClip


Lorsque vous publiez un fichier SWF, Flash convertit toutes les instances de symboles de clips sur la scne en objets MovieClip. Pour quun symbole de clip soit disponible en ActionScript, donnez-lui un nom dinstance dans le champ Nom de loccurrence de linspecteur de proprits. Lors de la cration du fichier SWF, Flash gnre le code qui cre linstance de MovieClip sur la scne et dclare une variable avec ce nom dinstance. Si les clips que vous avez nomms sont imbriqus dans dautres clips nomms, ces clips enfants sont traits comme des proprits du clip parent : vous pouvez accder tous les clips de cette hirarchie en utilisant la syntaxe avec point. Par exemple, si une instance de clip nomme childClip est imbriqu dans une autre nomme parentClip, vous pouvez lancer sa lecture en appelant le code suivant :
parentClip.childClip.play()

Si de nombreuses mthodes et proprits de la classe MovieClip dActionScript 2.0 restent les mmes, dautres ont chang. Toutes les proprits qui taient prfixes dun trait de soulignement ont t renommes. Par exemple, les proprits _width et _height sont dsormais accessibles sous le nom width et height, _xscale et _yscale sous le nomscaleX et scaleY. La liste complte des proprits et mthodes de la classe MovieClip figure dans la Rfrence du langage et des composants ActionScript 3.0.

Contrle de la lecture dun clip


Flash utilise la mtaphore du scnario pour traduire une animation ou un changement dtat. Tout lment visuel qui a recours un scnario est soit un objet MovieClip, soit une extension de la classe MovieClip. Bien quilo soit possible en ActionScript de commander larrt ou la lecture dun clip et le passage un autre point du scnario, il nest pas possible de crer dynamiquement un scnario ni dajouter du contenu dans une image spcifique. Seul loutil de cration Flash le permet. Pendant la lecture, le clip progresse le long du scnario une vitesse fixe par la cadence dimage du fichier SWF. Vous pouvez galement remplacer ce paramtre par la proprit Stage.frameRate en ActionScript.

524

Utilisation des clips

Lecture et arrt des clips


Les mthodes play() et stop() permettent deffectuer des manipulations simples sur un clip tout au long du scnario. Par exemple, supposons quun symbole de clip sur la scne contienne une animation reprsentant une bicyclette qui traverse lcran, et dont le nom dinstance est bicycle. Si le code suivant est associ une image-cl du scnario principal,
bicycle.stop();

la bicyclette ne se dplace pas (son animation nest pas mise en lecture). Le mouvement de la bicyclette peut tre dclench par une action de lutilisateur. Par exemple, avec un bouton nomm startButton, le code suivant (dans une image-cl du scnario principal) dclenche lanimation si lutilisateur clique sur ce bouton :
// cette fonction est appele en cas de clic sur le bouton Elle provoque // lexcution de lanimation de la bicyclette. function playAnimation(event:MouseEvent):void { bicycle.play(); } // Enregistremen de la fonctions comme couteur auprs du bouton startButton.addEventListener(MouseEvent.CLICK, playAnimation);

Avance rapide et rembobinage


Les mthodes play() et stop() ne sont pas les seules mthodes commandant lanimation dun clip. Vous pouvez galement avancer et reculer manuellement la tte de lecture laide des mthodes nextFrame() et prevFrame(). Lappel de lune de ces deux mthodes arrte la lecture et fait avancer le clip ou le rembobine dune image. Lutilisation de la mthode play() revient appeler nextFrame() chaque fois quun vnement enterFrame est dclench pour cet objet clip. Vous pouvez donc envisager danimer le clip bicycle en arrire en ajoutant un couteur pour lvnement enterFrame et en indiquant bicycle, dans la fonction couteur, de reculer dune image, comme suit :
// cette fonction est appele lors du dclenchement de lvnement // enterFrame, elle est donc appele une fois par image. function everyFrame(event:Event):void { if (bicycle.currentFrame == 1) { bicycle.gotoAndStop(bicycle.totalFrames); } else { bicycle.prevFrame(); } } bicycle.addEventListener(Event.ENTER_FRAME, everyFrame);
Contrle de la lecture dun clip 525

En lecture normale, si un clip contient plusieurs images, il tourne en boucle lors de la lecture, cest--dire quil revient limage 1 une fois quil a pass la dernire image. Si vous utilisez prevFrame() ou nextFrame(), ce comportement ne se produit pas automatiquement (lappel de prevFrame() lorsque la tte de lecture est sur limage 1 ne dplace pas la tte de lecture la dernire image). La condition if dans lexemple ci-dessus vrifie si le clip est revenu la premire image et fait alors passer le clip la dernire image, crant ainsi une boucle continue de lecture en arrire.

Dplacement vers une autre image et utilisation des tiquettes dimage


Le dplacement dun clip une nouvelle image est une opration simple. Il suffit dappeler gotoAndPlay() ou gotoAndStop() en spcifiant le numro de limage cible comme paramtre. Vous pouvez galement transmettre une chane correspondant au nom de ltiquette dimage. Il est possible dattribuer une tiquette toute image du scnario. Pour ce faire, slectionnez une image du scnario, puis tapez un nom dans le champ Etiquette dimage de linspecteur de proprits. Lutilisation des tiquettes dimage plutt que des numros prsente des avantages vidents pour crer un clip complexe. Si le nombre dimages, de calques et dinterpolation dune animation est lev, envisagez dtiqueter les images importantes de manire vocatrice, en faisant rfrence aux changements de comportement dans le clip (par exemple dpart , marche ou course ). Cette technique permet damliorer la lisibilit du code et offre plus de souplesse, puisque les appels ActionScript destins une image tiquete pointent sur une rfrence uniquement (ltiquette) plutt que sur une image numrote. Si vous dcidez par la suite de dplacer un segment de lanimation vers une autre image, il ne sera pas ncessaire de modifier le code ActionScript si vous conservez les mmes tiquettes pour toutes les images au nouvel emplacement. Pour reprsenter des tiquettes en code, ActionScript 3.0 comporte la classe FrameLabel. Chaque instance de cette classe reprsente une tiquette dimage unique, et possde une proprit name qui reprsente le nom de ltiquette tel quil a t indiqu dans linspecteur de proprits, ainsi quune proprit frame qui reprsente le numro de limage pour laquelle ltiquette est place dans le scnario. Pour permettre daccder aux instances de FrameLabel associes une instance de clip, la classe MovieClip comporte deux proprits qui renvoient directement des objets FrameLabel. La proprit currentLabels renvoie un tableau compos de tous les objets FrameLabel prsents sur lensemble du scnario dun clip. La proprit currentLabel renvoie un objet FrameLabel unique, celui rencontr le plus rcemment dans le scnario.

526

Utilisation des clips

Supposons que vous avez cr un clip nomm Robot et que vous avez tiquet les diffrents tats de lanimation. Vous pouvez dfinir une condition pour vrifier la proprit currentLabel afin daccder ltat actuel de Robot, comme dans le code suivant :
if (robot.currentLabel.name == "walking" { // action }

Utilisation des squences


Dans lenvironnement de cration Flash, vous pouvez utiliser les squences pour dmarquer une srie de scnarios quun fichier SWF doit suivre. Grce au second paramtre de la mthode gotoAndPlay() ou gotoAndStop(), vous pouvez spcifier la squence sur laquelle la tte de lecture doit se placer. Tous les fichiers FLA commencent par une squence, laquelle vous pouvez ajouter le nombre de squences de votre choix. Lutilisation des squences nest pas toujours conseille, car elle prsente un certain nombre dinconvnients. Un document Flash qui contient de nombreuses squences peut tre difficile grer, en particulier dans les environnements multi-auteurs. Un nombre lev de squences peut galement savrer inefficace de point de vue de la bande passante, car le processus de publication implique la fusion de toutes les squences en un seul scnario. Lensemble des squences est alors tlcharg en mode progressif, mme si elles ne sont jamais lues. Cest pourquoi lutilisation de plusieurs squences est largement dconseille, moins quelle soit ncessaire lorganisation de plusieurs animations bases sur des scnarios. La proprit scenes de la classe MovieClip renvoie un tableau des objets Scene reprsentant toutes les squences du fichier SWF. La proprit currentScene renvoie un objet Scene reprsentant la squence qui est en cours de lecture. La classe Scene a des proprits qui contiennent des informations sur la squence. La proprit labels renvoie un tableau des objets FrameLabel utiliss au sein de la squence. La proprit name renvoie le nom de la squence sous forme de chane. La proprit numFrames renvoie un entier reprsentant le nombre total dimages dans la squence.

Contrle de la lecture dun clip

527

Cration dobjets MovieClip laide dActionScript


Lajout de contenu seffectue dans Flash en faisant glisser des lments de la bibliothque sur la scne. Mais il ne sagit pas l de la seule mthode. Pour des projets plus complexes, les dveloppeurs expriments prfrent souvent crer les clips par programmation. Cette approche prsente plusieurs avantages : rutilisation facile du code, vitesse de compilation accrue et disponibilit de modifications plus sophistiques rserves ActionScript. La nouvelle API de liste daffichage dActionScript 3.0 simplifie le processus de cration dynamique dobjets MovieClip. La possibilit dinstancier directement une instance de MovieClip, sparment de son ajout la liste daffichage, offre beaucoup de souplesse et de simplicit sans sacrifier tout contrle. En ActionScript 3.0, lorsquune instance de clip (ou de tout autre objet daffichage) est cre par code, elle est invisible tant quelle na pas t ajoute la liste daffichage laide de la mthode addChild() ou addChildAt() dun conteneur dobjets daffichage Vous pouvez ainsi crer un clip et dfinir ses proprits, et mme appeler ses mthodes, avant quil apparaisse lcran. Pour plus dinformations sur lutilisation de la liste daffichage, consultez la section Utilisation des conteneurs dobjets daffichage , la page 407.

Exportation des symboles de bibliothque pour ActionScript


Par dfaut, il est impossible de crer dynamiquement des instances de symboles de clips dans la bibliothque dun document Flash (cest--dire de les crer entirement en ActionScript). En effet, lexportation de chaque symbole pour une utilisation en ActionScript accrot la taille du fichier SWF. Or, les symboles ne sont pas tous destins une utilisation sur la scne. Cest pourquoi, pour quun symbole soit disponible en ActionScript, vous devez indiquer spcifiquement que ce symbole doit tre export pour ActionScript.
Pour exporter un symbole pour ActionScript :
1.

Slectionnez le symbole dans le panneau Bibliothque et ouvrez sa bote de dialogue Proprits. Si ncessaire, activez les paramtres avancs.

2.

528

Utilisation des clips

3.

Dans la bote de dialogue Liaison, activez loption Exporter pour ActionScript. Les champs Classe et Classe de base sont alors activs. Par dfaut, le champ Classe contient le nom du symbole sans espaces (par exemple, un symbole nomm Maison Rouge devient MaisonRouge ). Pour spcifier que le symbole doit utiliser une classe personnalise pour son comportement, saisissez le nom complet de cette classe, paquet compris. Si vous voulez avoir la possibilit de crer des instances du symbole en ActionScript, sans avoir pour autant besoin de comportements supplmentaires, vous pouvez laisser ce nom de classe tel quel. Par dfaut, le champ Classe de base a la valeur flash.display.MovieClip. Si vous voulez que votre symbole tende les fonctionnalits dune autre classe personnalise, vous pouvez remplacer cette valeur par le nom de votre classe, sous rserve que celle-ci tende la classe Sprite (ou MovieClip).

4.

Cliquez sur OK pour enregistrer les changements. Si Flash ne dtecte pas de fichier ActionScript externe contenant la dfinition de la classe spcifie (par exemple, si vous navez pas besoin dajouter un comportement supplmentaire pour le symbole), un message davertissement apparat : Le chemin de classe ne contient pas de dfinition pour cette classe. Une dfinition sera gnre automatiquement dans le fichier SWF lors de lexportation. Vous pouvez ignorer cet avertissement si le symbole de bibliothque ne requiert pas de fonctionnalits en dehors de celles de la classe MovieClip.

Si vous nindiquez pas de classe pour votre symbole, Flash cre pour lui une classe du type de celle-ci :
package { import flash.display.MovieClip; public class ExampleMovieClip extends MovieClip { public function ExampleMovieClip() { } } }

Cration dobjets MovieClip laide dActionScript

529

Si vous ne souhaitez pas ajouter des fonctionnalits ActionScript au symbole, ajoutez les proprits et mthodes ncessaires cette structure. Supposons par exemple que vous disposez dun symbole de clip contenant un cercle de 50 pixels de diamtre, dont le paramtre de liaison est Exporter pour ActionScript et dont la classe est Circle. Le code suivant, lorsquil est plac dans un fichier Circle.as, tend la classe MovieClip et fournit au symbole les mthodes supplmentaires getArea() et getCircumference() :
package { import flash.display.MovieClip; public class Circle extends MovieClip { public function Circle() { } public function getArea():Number { // la formule est Pi * rayon * 2. return Math.PI * Math.pow((width / 2), 2); } public function getCircumference():Number { // la formule est Pi * diamtre. return Math.PI * width; } } }

Le code suivant, plac dans une image-cl limage 1 du document Flash, cre une instance du symbole et laffiche sur la scne :
var c:Circle = new Circle(); addChild(c); trace(c.width); trace(c.height); trace(c.getArea()); trace(c.getCircumference());

Ce code montre comment utiliser une instanciation en ActionScript au lieu de faire glisser des lments individuels vers la scne. Il cre un cercle qui prsente toutes les proprits dun clip et possde les mthodes personnalises dfinies dans votre classe Circle. Il sagit dun exemple tout fait lmentaire ; un symbole de bibliothque peut spcifier un nombre illimit de proprits et de mthodes dans sa classe.

530

Utilisation des clips

Linstanciation en ActionScript est un processus puissant, car il permet de crer dynamiquement de nombreuses instances quil serait particulirement laborieux de crer manuellement. Elle vous apporte en outre une grande souplesse parce que vous pouvez personnaliser les proprits de chaque instance ds sa cration. Pour saisir limportance de ces avantages, vous pouvez utiliser une boucle pour crer dynamiquement plusieurs instances de Circle. Aprs avoir ajout le symbole Circle et la classe correspondante, tels que dcrits prcdemment, dans la bibliothque de votre document Flash, placez le code suivant dans une image-cl limage 1 :
import flash.geom.ColorTransform; var totalCircles:uint = 10; var i:uint; for (i = 0; i < totalCircles; i++) { // crer une nouvelle instance de Circle. var c:Circle = new Circle(); // positionner le nouvel objet Circle une coordonne x qui espacera // les cercles de faon rgulire sur la scne. c.x = (stage.stageWidth / totalCircles) * i; // placer linstance de Circle au centre vertical de la scne. c.y = stage.stageHeight / 2; // donner linstance de Circle une couleur alatoire c.transform.colorTransform = getRandomColor(); // ajouter linstance de Circle au scnario actif. addChild(c); } function getRandomColor():ColorTransform { // gnrer des valeurs alatoires pour les canaux rouge, vert et bleu. var red:Number = (Math.random() * 512) - 255; var green:Number = (Math.random() * 512) - 255; var blue:Number = (Math.random() * 512) - 255; // crer et renvoyer un objet ColorTransform avec ces couleurs alatoires. return new ColorTransform(1, 1, 1, 1, red, green, blue, 0); }

Cet exemple illustre la rapidit avec laquelle vous pouvez crer et personnaliser plusieurs instances dun symbole laide de code. Chaque instance est positionne en fonction du compteur de boucle. Ensuite une couleur lui est attribue au hasard laide de la proprit transform (dont Circle hrite en tendant la classe MovieClip).

Cration dobjets MovieClip laide dActionScript

531

Chargement dun fichier SWF externe


En ActionScript 3.0, les fichiers SWF sont chargs avec la classe Loader. Pour charger un fichier SWF externe, vous devez dfinir quatre tapes en ActionScript :
1. 2. 3.

Crer un objet URLRequest avec ladresse URL du fichier. Crer un objet Loader. Appeler la mthode load() de lobjet Loader en lui passant en paramtre linstance de lobjet URLRequest. Appeler la mthode addChild() pour un conteneur dobjet daffichage (par exemple le scnario principal dun document Flash) afin dajouter linstance de Loader la liste daffichage

4.

Le code final se prsente ainsi :


var request:URLRequest = new URLRequest(http://www.[yourdomain].com/ externalSwf.swf); var loader:Loader = new Loader() loader.load(request); addChild(loader);

Le mme code peut tre utilis pour charger un fichier image externe (image JPEG, GIF ou PNG) en spcifiant ladresse URL de ce fichier la place de celle dun fichier SWF. Contrairement un fichier image, un fichier SWF peut contenir du code ActionScript. Ainsi, bien que le processus de chargement dun fichier SWF soit identique celui dune image, le fichier SWF lorigine du chargement et le fichier SWF charg doivent se trouver dans le mme sandbox de scurit si vous souhaitez utiliser ActionScript pour communiquer avec le fichier SWF externe. En outre, si ce fichier externe contient des classes qui partagent le mme espace de nom que les classes du fichier SWF qui le charge, il peut savrer ncessaire de crer un nouveau domaine dapplication pour le fichier charg afin dviter dventuels conflits despace de nom. Pour plus dinformations sur la scurit et le domaine dapplication, reportez-vous aux sections Utilisation de la classe ApplicationDomain , la page 736 et Chargement de fichiers SWF et dimages , la page 818. Une fois que le fichier SWF externe est charg, il devient accessible via la proprit Loader.content. Si ce fichier est publi en ActionScript 3.0, il sagira soit dun clip, soit dun sprite, selon la classe quil tend.

532

Utilisation des clips

Considrations relatives au chargement de fichiers SWF de version ancienne


Si un fichier SWF externe a t publi dans une version antrieure dActionScript, dimportantes restrictions doivent tre prises en compte. Contrairement un fichier SWF ActionScript 3.0 qui sexcute dans AVM2 (ActionScript Virtual Machine 2), un fichier SWF publi en ActionScript 1.0 ou 2.0 sexcute dans AVM1 (ActionScript Virtual Machine 1). Lorsque le chargement dun fichier SWF AVM1 russit, lobjet charg (la proprit Loader.content) sera un objet AVM1Movie. Une instance dAVM1Movie nest pas identique une instance de MovieClip. Cest un objet daffichage qui, contrairement un clip, ne comporte pas de mthodes ni de proprits lies au scnario. Le fichier SWF AVM2 parent ne pourra pas accder ses proprits, mthodes ou objets. Dautres restrictions sappliquent un fichier SWF AVM1 charg par un fichier SWF AVM2 : Pour plus dinformations, reportez-vous la description de la classe AVM1Movie dans la Rfrence du langage et des composants ActionScript 3.0.

Exemple : RuntimeAssetsExplorer
La fonctionnalit Exporter pour ActionScript prsente des avantages particuliers lorsque des bibliothques peuvent tre rutilises sur plusieurs projets. Les symboles exports vers ActionScript sont disponibles pour ce fichier SWF mais aussi pour tout fichier SWF au sein du mme sandbox de scurit qui le charge. De cette manire, un seul document Flash peut gnrer un fichier SWF destin uniquement accueillir des lments graphiques. Cette technique est trs utile pour les grands projets dans lesquels les concepteurs graphiques chargs des lments visuels peuvent travailler en parallle avec les dveloppeurs qui crent une enveloppe SWF qui chargera les fichiers SWF des lments graphiques au moment de lexcution. Cette mthode peut vous servir dans la maintenance dun ensemble de versions de fichiers dans lesquelles les lments graphiques sont indpendants du dveloppement par programmation. Lapplication RuntimeAssetsExplorer charge tout fichier SWF qui est une sous-classe de RuntimeAsset et permet de consulter les lments disponibles de ce fichier SWF. Cet exemple illustre les points suivants :

Chargement dun fichier SWF externe laide de Loader.load() Cration dynamique dun symbole de bibliothque export pour ActionScript Contrle de la lecture du MovieClip avec ActionScript

Exemple : RuntimeAssetsExplorer

533

Avant de commencer, notez que tous les fichiers SWF doivent se trouver dans le mme sandbox de scurit. Pour plus dinformations, consultez la section Sandboxes de scurit , la page 812. Pour obtenir les fichiers de cet exemple dapplication, consultez la page www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers de lapplication RuntimeAssetsExplorer se trouvent dans le dossier Samples/Chapters/RuntimeAssetsExplorer. Cette application se compose des fichiers suivants :
Fichier
RuntimeAssetsExample.mxml ou RuntimeAssetsExample.fla GeometricAssets.as GeometricAssets.fla

Description
Interface utilisateur de lapplication pour Flex (MXML) ou Flash (FLA). Classe exemple qui implmente linterface RuntimeAsset. Fichier FLA li la classe GeometricAssets (classe de document du fichier FLA) contenant les symboles exports pour ActionScript. Interface qui dfinit les mthodes attendues par tous les fichiers SWF dactifs dexcution qui seront chargs dans lexplorateur. Classe du symbole de bibliothque dont la forme est un rectangle pivotant. Classe du symbole de bibliothque dont la forme est une toile pivotante.

com/example/programmingas3/ runtimeassetsexplorer/RuntimeLibrary.as com/example/programmingas3/ runtimeassetsexplorer/AnimatingBox.as com/example/programmingas3/ runtimeassetsexplorer/AnimatingStar.as

534

Utilisation des clips

tablissement de linterface de bibliothque dexcution


Pour que lexplorateur interagisse convenablement avec une bibliothque SWF, la structure des bibliothques dlments doit tre formalise. Pour ce faire, nous allons crer une interface, que lon pourrait comparer une classe dans la mesure o elle reprsente un modle de dfinition des mthodes qui dfinissent une structure attendue. Par contre, linverse dune classe, elle ne comporte pas les corps des mthodes. Linterface est un moyen de communication pour la bibliothque dlments et lexplorateur. Chaque fichier SWF dlments charg dans le navigateur implmentera cette interface. Pour plus dinformations sur lutilit des interfaces, consultez la section Interfaces , la page 169. Linterface RuntimeLibrary est trs simple, puisque nous avons uniquement besoin dune fonction qui fournit lexplorateur un tableau de chemins de classe pour les symboles exporter disponibles dans la bibliothque. Cette interface utilise pour ce faire une seule mthode : getAssets().
package com.example.programmingas3.runtimeassetexplorer { public interface RuntimeLibrary { function getAssets():Array; } }

Cration de fichiers SWF de bibliothque dactifs


La dfinition de linterface RuntimeLibrary permet de crer plusieurs fichiers SWF de bibliothque dactifs, qui pourront tre chargs dans un autre fichier SWF. Llaboration dune bibliothque SWF dactifs repose sur quatre tches :

Cration dune classe pour le fichier SWF de bibliothque dactifs Cration de classes pour les diffrents lments contenus dans la bibliothque Cration des lments graphiques eux-mmes Association des lments graphiques des classes et publication du fichier SWF de bibliothque

Exemple : RuntimeAssetsExplorer

535

Cration dune classe pour implmenter linterface RuntimeLibrary


Nous allons ensuite crer la classe GeometricAssets qui implmente linterface RuntimeLibrary. et sera la classe du document FLA. Le code de cette classe est trs proche de celui de linterface RuntimeLibrary, la diffrence tant que la dfinition de classe comporte le corps de la mthode getAssets().
package { import flash.display.Sprite; import com.example.programmingas3.runtimeassetexplorer.RuntimeLibrary; public class GeometricAssets extends Sprite implements RuntimeLibrary { public function GeometricAssets() { } public function getAssets():Array { return [ "com.example.programmingas3.runtimeassetexplorer.AnimatingBox", "com.example.programmingas3.runtimeassetexplorer.AnimatingStar" ]; } } }

Si nous devions crer une deuxime bibliothque dexcution, nous pourrions crer un autre fichier FLA reposant sur une autre classe (AnimationAssets, par exemple) qui assure sa propre implmentation de getAssets().

Cration de classes pour chaque lment MovieClip


Pour les besoins de cet exemple, nous tendrons simplement la classe MovieClip, sans ajouter de fonctionnalit aux actifs personnaliss. Le code suivant destin AnimatingStar est semblable celui de AnimatingBox :
package com.example.programmingas3.runtimeassetexplorer { import flash.display.MovieClip; public class AnimatingStar extends MovieClip { public function AnimatingStar() { } } }

536

Utilisation des clips

Publication de la bibliothque
Nous allons maintenant connecter les actifs de classe MovieClip la nouvelle classe en crant un nouveau fichier FLA et en entrant GeometricAssets dans le champ Classe du document de linspecteur des proprits. Pour les besoins de cet exemple, nous allons crer deux formes trs simples qui utilisent une interpolation de scnario pour effectuer une rotation horaire sur 360 images. Les deux symboles animatingBox et animatingStar sont dfinis pour lexportation vers ActionScript et leurs champs Classe correspondent aux chemins de classe respectifs spcifis dans limplmentation de getAssets(). La classe de base par dfaut flash.display.MovieClip est conserve, puisque nous voulons crer des sous-classes pour les mthodes MovieClip standard. Aprs dfinition des paramtres dexportation de votre symbole, publiez le fichier FLA. Vous disposez maintenant de votre premire bibliothque dexcution. Ce fichier SWF pourrait tre charg dans un autre fichier SWF AVM2, dans lequel les symboles AnimatingBox et AnimatingStar seraient disponibles.

Chargement de la bibliothque dans un autre fichier SWF


Le dernier lment fonctionnel traiter est linterface utilisateur de lexplorateur. Dans cet exemple, le chemin daccs la bibliothque dexcution est cod en dur dans la variable ASSETS_PATH. Vous pourriez galement utiliser la classe FileReference, par exemple pour crer une interface qui recherche un fichier SWF particulier sur le disque dur. Une fois que la bibliothque dexcution est charge, Flash Player appelle la mthode
runtimeAssetsLoadComplete(). private function runtimeAssetsLoadComplete(event:Event):void { var rl:* = event.target.content; var assetList:Array = rl.getAssets(); populateDropdown(assetList); stage.frameRate = 60; }

Exemple : RuntimeAssetsExplorer

537

Dans cette mthode, la variable rl reprsente le fichier SWF charg. Le code appelle la mthode getAssets() du fichier SWF charg, obtient la liste des lments disponibles et remplit un composant ComboBox avec cette liste en appelant la mthode populateDropDown(). Cette mthode enregistre le chemin de classe complet de chaque lment. Si lutilisateur clique sur le bouton Add, linterface dclenche la mthode addAsset() :
private function addAsset():void { var className:String = assetNameCbo.selectedItem.data; var AssetClass:Class = getDefinitionByName(className) as Class; var mc:MovieClip = new AssetClass(); ... }

qui obtient le chemin de classe de llment actuellement slectionn dans la ComboBox (assetNameCbo.selectedItem.data), et utilise la fonction getDefinitionByName() (du paquet flash.utils) pour obtenir une rfrence la classe de llment afin de crer une nouvelle instance de celui-ci.

538

Utilisation des clips

CHAPITRE 17

Utilisation de texte
Avec ActionScript 3.0, le texte est gnralement affich au sein dun champ texte mais peut parfois apparatre comme proprit dun lment de la liste daffichage (par exemple, le libell dun composant dinterface). Ce chapitre explique comment programmer le contenu dun champ texte et comment utiliser les saisies de lutilisateur, du texte dynamique dun fichier ou du texte statique dfini dans Adobe Flash CS3 Professional. En tant que programmeur en ActionScript 3.0, vous pouvez tablir le contenu spcifique de champs texte ou dsigner la source du texte, puis dfinir laspect de ce texte laide de styles et de formats. Vous pouvez aussi rpondre aux vnements utilisateur (saisie de texte ou clic sur un lien hypertexte).

17

Sommaire
Les bases de lutilisation du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 Affichage du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .543 Slection et manipulation de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .547 Capture de la saisie de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 Restriction de la saisie de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 Formatage du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551 Fonctions avances daffichage de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .556 Utilisation de texte statique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .558 Exemple : formatage du texte dans le style journal . . . . . . . . . . . . . . . . . . . . . . . 560

539

Les bases de lutilisation du texte


Introduction lutilisation du texte
Pour afficher du texte dans Flash Player, il est ncessaire dutiliser une instance de la classe TextField. La classe TextField est la base des autres composants dvolus au texte (par exemple les composants TextArea ou TextInput) dans la structure Adobe Flex et lenvironnement de cration Flash. Pour plus dinformations sur lutilisation de composants texte dans lenvironnement de cration Flash, consultez la section sur les contrles de type texte dans le guide Utilisation de Flash. Le contenu des champs texte peut tre spcifi lavance dans le fichier SWF, charg partir dune source externe (fichier texte ou base de donnes) ou saisi par lutilisateur dans votre application. Au sein du champ lui-mme, le texte peut tre du contenu HTML, avec des images incorpores. Une fois que vous avez tabli une occurrence de champ texte, vous pouvez utiliser les classes du package flash.text, telles que TextFormat et StyleSheet, pour contrler laspect du texte. Le paquet flash.text contient presque toutes les classes lies la cration, la gestion et le formatage du texte en ActionScript. Pour mettre en forme du texte, il est ncessaire de crer un objet TextFormat et de laffecter au champ texte. Si le champ texte contient du texte en HTML, vous pouvez lui appliquer un objet StyleSheet pour affecter des styles des lments spcifiques du texte. Lobjet TextFormat ou StyleSheet contient des proprits qui dfinissent laspect du texte, par exemple sa couleur, sa taille et sa graisse. Lobjet TextFormat attribue des proprits lensemble du contenu dun champ texte, ou une partie du texte seulement. Par exemple, au sein du mme champ texte, une phrase peut tre en gras et en rouge, puis la suivante en italique et en bleu. Pour plus dinformations sur les formats de texte, voir Attribution de formats texte , la page 551. Pour plus dinformations sur le texte HTML dans les champs texte, voir Affichage du texte HTML , la page 545. Pour plus dinformations sur les feuilles de style, voir Application de feuilles de style en cascade , la page 552. Outre les classes du paquet flash.text, la classe flash.events.TextEvent permet de rpondre aux actions de lutilisateur lies au texte.

540

Utilisation de texte

Tches courantes dutilisation du texte


Voici quelques tches courantes relatives au texte qui sont prsentes dans ce chapitre :

Modification du contenu dun champ texte Utilisation de HTML dans des champs texte Utilisation dimages dans des champs texte Slection de texte et actions sur le texte slectionn par lutilisateur Capture de texte saisi par lutilisateur Restriction de la saisie de texte Applcation dune mise en forme et de styles CSS du texte Contrle de la nettet, de lpaisseur et du lissage Manipulation de champs texte statique en ActionScript

Concepts importants et terminologie


La liste de rfrence suivante numre les termes importants que vous rencontrerez dans ce chapitre :

CSS (feuilles de style en cascade) : syntaxe standardise permettant de dfinir des styles et une mise en forme pour du texte structur en XML et en HTML. Police de priphrique : police installe sur lordinateur de lutilisateur. Champ texte dynamique : champ texte dont le contenu peut tre modifi en ActionScript, mais pas par lutilisateur. Police incorpore : police de caractres dont les donnes, sous forme vectorielle, sont enregistres dans le fichier SWF de lapplication. Texte HTML : texte insr dans un champ texte en ActionScript et comportant des balises HTML de mise en forme, outre le contenu lui-mme. Champ de saisie de texte : champ texte dont le contenu peut tre modifi soit en ActionScript, soit par lutilisateur. Champ texte statique : champ texte cr avec lenvironnement de cration Flash, et dont le contenu ne peut pas tre modifi pendant lexcution du fichier SWF. Mtrique des lignes de texte : mesure de la taille des diverses parties du texte contenu dans un champ texte : ligne de base du texte, hauteur du sommet des caractres, taille des jambages (la partie de certaines minuscules qui stend sous la ligne de base), etc.

Les bases de lutilisation du texte

541

Utilisation des exemples des chapitres


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Etant donn que ce chapitre traite de lutilisation de champs texte dans ActionScript, pratiquement tous les exemples de code de ce chapitre impliquent la manipulation dun objet TextField (cr et plac sur la scne dans loutil de programmation Flash, ou cr laide dActionScript). Pour tester un exemple, il est ncessaire dafficher le rsultat dans Flash Player pour voir leffet du code sur le champ texte. Les exemples de ce chapitre sont de deux types. Le premier type dexemple manipule un objet TextField sans le crer explicitement. Pour tester les exemples de code de ce chapitre :
1. 2. 3. 4. 5.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code de lexemple dans la fentre de script : Avec loutil Texte, crez un champ texte dynamique sur la scne. Laissez ce champ texte slectionn et, dans linspecteur Proprits, donnez-lui un nom doccurrence. Le nom doit correspondre au nom utilis pour le champ texte dans lexemple de code (par exemple, si le code manipule un champ texte myTextField, vous devez appeler votre champ texte myTextField galement). Choisissez Contrle > Tester lanimation pour excuter le programme. Vous verrez lcran le rsultat du code de lexemple sur le champ texte.

6.

Lautre type dexemple de code comporte la dfinition dune classe destine servir de classe de document pour le fichier SWF. Dans ces listings, une instance de TextField est cre par le code de lexemple, il nest donc pas ncessaire de la crer sparment. Pour tester les listings de ce type de code :
1. 2.

Crez un nouveau document Flash, puis enregistrez-le. Crez un nouveau fichier ActionScript et enregistrez-le dans le mme rpertoire que le document Flash. Le nom du fichier doit correspondre au nom de la classe du code. Par exemple, si le listing dfinit une classe nomme TextFieldTest , enregistrez le fichier ActionScript sous le nom TextFieldTest . Copiez le code dans le fichier ActionScript et enregistrez celui-ci. Dans le document Flash, cliquez sur une partie vide de la scne ou de lespace de travail afin dactiver linspecteur Proprits du document. Dans le champ Classe du document de linspecteur Proprits, tapez le nom de la classe ActionScript que vous avez copie.

3. 4.

5.

542

Utilisation de texte

6.

Choisissez Contrle > Tester lanimation pour excuter le programme. Les rsultats de lexemple apparaissent lcran.

Diverses autres techniques permettant de tester les exemples de code sont expliques dans la section Test des exemples de code contenus dans un chapitre , la page 67.

Affichage du texte
Bien que les outils de cration tels que Adobe Flex Builder et Flash offrent plusieurs options daffichage du texte (composants lis au texte ou outils texte) la principale mthode daffichage de texte par programmation passe par un champ texte.

Types de texte
Le type de texte dun champ texte est caractris par sa source :

Texte dynamique Le texte dynamique correspond au contenu charg partir dune source externe, telles quun fichier texte ou xml, ou un service Web. Pour plus dinformations, consultez la section Types de texte , la page 543.

Texte saisi Le texte saisi est le texte entr par lutilisateur ou du texte dynamique que lutilisateur peut modifier. Vous pouvez dfinir une feuille de style pour formater le texte saisi, ou utiliser la classe flash.text.TextFormat pour attribuer au champ texte des proprits destines au texte saisi. Pour plus dinformations, consultez la section Capture de la saisie de texte , la page 549.

Texte statique Le texte statique peut uniquement tre cr par le biais de loutil de cration Flash. Vous ne pouvez pas crer dinstance de texte statique en ActionScript 3.0. Cependant, les classes ActionScript StaticText et TextSnapshot permettent de manipuler une instance de texte statique existante. Pour plus dinformations, consultez la section Utilisation de texte statique , la page 558.

Affichage du texte

543

Modification du contenu dun champ texte


Vous pouvez dfinir du texte dynamique en affectant une chane la proprit flash.text.TextField.text. La chane est directement affecte la proprit, comme suit :
myTextField.text = Hello World;

Vous pouvez galement affecter la proprit text une valeur issue dune variable dfinie dans votre code, comme dans lexemple suivant :
package { import flash.display.Sprite; import flash.text.*; public class TextWithImage extends Sprite { private var myTextBox:TextField = new TextField(); private var myText:String = "Hello World"; public function TextWithImage() { addChild(myTextBox); myTextBox.text = myText; } } }

Vous pouvez galement affecter la proprit text une valeur issue dune variable distante. Le chargement de valeurs textuelles partir de sources distantes peut se faire de trois manires :

Les classes flash.net.URLLoader et flash.net.URLRequest chargent des variables partir demplacements locaux ou distants. Lattribut FlashVars est incorpor dans la page HTML qui hberge le fichier SWF et peut contenir des valeurs destines aux variables de texte. La classe flash.net.SharedObject gre le stockage persistant des valeurs. Pour plus dinformations, consultez la section Stockage des donnes locales , la page 702.

544

Utilisation de texte

Affichage du texte HTML


La proprit htmlText de la classe flash.text.TextField permet dindiquer que la chane de texte contient des balises HTML de formatage du contenu. Comme le montre lexemple suivant, vous devez affecter votre chane la proprit htmlText (et non la proprit text) pour que Flash Player puisse afficher le texte sous forme HTML :
var myText:String = "<p>This is <b>some</b> content to <i>render</i> as <u>HTML</u> text.</p>"; myTextBox.htmlText = myText;

Pour la proprit htmlText, Flash Player prend en charge un sous-ensemble de balises et dentits HTML. La description de la proprit flash.text.TextField.htmlText dans la Rfrence du langage et des composants ActionScript 3.0 fournit des informations dtailles sur les balises et entits HTML prises en charge. Une fois que vous avez spcifi votre contenu laide de la proprit htmlText, vous pouvez utiliser des feuilles de style ou la balise textformat pour grer le formatage. Pour plus dinformations, consultez la section Formatage du texte , la page 551.

Utilisation dimages dans des champs texte


Laffichage du contenu sous forme de texte HTML prsente un autre avantage : vous pouvez inclure des images dans le champ texte. Il est possible de rfrencer une image, locale ou distante, grce la balise img et de la faire apparatre dans le champ texte associ. Lexemple suivant cre un champ texte nomm myTextBox et incorpore au texte une image JPG reprsentant un il, image stocke dans le mme rpertoire que le fichier SWF :
package { import flash.display.Sprite; import flash.text.*; public class TextWithImage extends Sprite { private var myTextBox:TextField; private var myText:String = "<p>This is <b>some</b> content to <i>test</i> and <i>see</i></p><p><img src='eye.jpg' width='20' height='20'></p><p>what can be rendered.</p><p>You should see an eye image and some <u>HTML</u> text.</p>";

Affichage du texte

545

public function TextWithImage() { myTextBox.width = 200; myTextBox.height = 200; myTextBox.multiline = true; myTextBox.wordWrap = true; myTextBox.border = true; addChild(myTextBox); myTextBox.htmlText = myText; } } }

La balise img prend en charge les fichiers JPEG, GIF, PNG et SWF.

Dfilement du texte dans un champ texte


Dans bien des cas, votre texte savrera plus long que le champ texte qui le contient. Il se peut galement quun champ de saisie permette lutilisateur de saisir plus de caractres quil ne peut en afficher en une seule fois. Les proprits de dfilement de la classe flash.text.TextField permettent de grer du contenu long, que ce soit verticalement ou horizontalement. Ces proprits sont les suivantes :TextField.scrollV, TextField.scrollH, et maxScrollV et maxScrollH. Utilisez-les pour rpondre des vnements tels quun clic de souris ou une pression sur une touche. Lexemple ci-aprs cre un champ texte de taille fixe et contenant plus de texte que le champ ne peut afficher en une seule fois. Lorsque lutilisateur clique sur le champ texte, le texte dfile verticalement.
package { import flash.display.Sprite; import flash.text.*; import flash.events.MouseEvent; public class TextScrollExample extends Sprite { private var myTextBox:TextField = new TextField(); private var myText:String = "Hello world and welcome to the show. It's really nice to meet you. Take your coat off and stay a while. OK, show is over. Hope you had fun. You can go home now. Don't forget to tip your waiter. There are mints in the bowl by the door. Thank you. Please come again.";

546

Utilisation de texte

public function TextScrollExample() { myTextBox.text = myText; myTextBox.width = 200; myTextBox.height = 50; myTextBox.multiline = true; myTextBox.wordWrap = true; myTextBox.background = true; myTextBox.border = true; var format:TextFormat = new TextFormat(); format.font = "Verdana"; format.color = 0xFF0000; format.size = 10; myTextBox.defaultTextFormat = format; addChild(myTextBox); myTextBox.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownScroll); } public function mouseDownScroll(event:MouseEvent):void { myTextBox.scrollV++; } } }

Slection et manipulation de texte


Vous pouvez slectionner du texte, quil soit dynamique ou saisi. Les proprits et mthodes de slection de texte de la classe TextField utilise des positions dindex pour dterminer ltendue du texte manipuler. Vous pouvez donc programmer la slection du texte saisi ou dynamique mme si vous nen connaissez pas le contenu.
R EM A R Q U E

Dans loutil de cration Flash, si vous activez loption slectionnable pour un champ texte statique, le champ texte export et plac dans la liste daffichage est un champ texte dynamique normal.

Slection et manipulation de texte

547

Slection de texte
La proprit flash.text.TextField.selectable a la valeur true par dfaut. Vous pouvez en outre slectionner du texte par code laide de la mthode setSelection(). Par exemple, pour slectionner un texte spcifique dans un champ texte lorsque lutilisateur clique dans ce dernier :
var myTextField:TextField = new TextField(); myTextField.text = "No matter where you click on this text field the TEXT IN ALL CAPS is selected."; myTextField.autoSize = TextFieldAutoSize.LEFT; addChild(myTextField); addEventListener(MouseEvent.CLICK, selectText); function selectText(event:MouseEvent):void { myTextField.setSelection(49, 65); }

De mme, pour que le texte dun champ texte soit slectionn ds son affichage initial, crez une fonction de gestion dvnement qui sera appele lorsque le champ texte sera ajout la liste daffichage.

Capture du texte slectionn par lutilisateur


Les proprits selectionBeginIndex et selectionEndIndex de la classe TextField, qui sont en lecture seule (et ne peuvent donc pas tre utilises laide de code pour slectionner du texte), permettent galement de capturer la slection actuelle effectue par lutilisateur. Par ailleurs, les champs texte saisi peuvent utiliser la proprit caretIndex. Par exemple, ce code renvoie les valeurs dindex du texte slectionn par lutilisateur :
var myTextField:TextField = new TextField(); myTextField.text = "Please select the TEXT IN ALL CAPS to see the index values for the first and last letters."; myTextField.autoSize = TextFieldAutoSize.LEFT; addChild(myTextField); addEventListener(MouseEvent.MOUSE_UP, selectText); function selectText(event:MouseEvent):void { trace("First letter index position: " + myTextField.selectionBeginIndex); trace("Last letter index position: " + myTextField.selectionEndIndex); }

Vous pouvez galement appliquer un ensemble de proprits de lobjet TextFormat la slection pour modifier laspect du texte. Pour en savoir plus sur lapplication des proprits TextFormat au texte slectionn, voir Formatage de plages de texte au sein dun champ texte , la page 555.
548 Utilisation de texte

Capture de la saisie de texte


Par dfaut, la proprit type dun champ texte la valeur dynamic. Si vous attribuez cette proprit type la valeur input laide de la classe TextFieldType, vous pouvez recueillir la saisie de lutilisateur et enregistrer cette valeur pour lutiliser dans dautres zones de lapplication. Les champs texte saisi sont utiles dans les formulaires et toute autre application qui demande lutilisateur de dfinir une valeur de texte utiliser ailleurs dans le programme. Par exemple, le code suivant cre un champ texte de saisie appel myTextBox. Lorsque lutilisateur saisit du texte dans le champ, lvnement textInput est dclench. Un gestionnaire dvnements appel textInputCapture capture la chane de texte saisie et lattribue une variable. Flash Player affiche le nouveau texte dans un autre champ texte appel myOutputBox.
package { import import import import

flash.display.Sprite; flash.display.Stage; flash.text.*; flash.events.*;

public class CaptureUserInput extends Sprite { private var myTextBox:TextField = new TextField(); private var myOutputBox:TextField = new TextField(); private var myText:String = "Type your text here."; public function CaptureUserInput() { captureText(); } public function captureText():void { myTextBox.type = TextFieldType.INPUT; myTextBox.background = true; addChild(myTextBox); myTextBox.text = myText; myTextBox.addEventListener(TextEvent.TEXT_INPUT, textInputCapture); } public function textInputCapture(event:TextEvent):void { var str:String = myTextBox.text; createOutputBox(str); } public function createOutputBox(str:String):void

Capture de la saisie de texte

549

{ myOutputBox.background = true; myOutputBox.x = 200; addChild(myOutputBox); myOutputBox.text = str; } } }

Restriction de la saisie de texte


Les champs texte de saisie sont souvent utiliss dans les formulaires et les botes de dialogue des applications. Il peut donc tre judicieux de limiter le type de caractres que lutilisateur peut saisir, ou mme de masquer la saisie (pour un mot de passe par exemple). La classe flash.text.TextField possde une proprit displayAsPassword et une proprit restrict qui permettent de contrler la saisie par lutilisateur. La proprit displayAsPassword masque simplement le texte (en laffichant sous forme dastrisques) mesure que lutilisateur le saisit. Lorsque displayAsPassword a la valeur true, les commandes Couper et Copier et les raccourcis clavier correspondants ne fonctionnent pas. Comme le montre lexemple suivant, vous pouvez attribuer la proprit displayAsPassword comme vous le feriez pour des proprits darrire-plan et de couleur :
myTextBox.type = TextFieldType.INPUT; myTextBox.background = true; myTextBox.displayAsPassword = true; addChild(myTextBox);

La proprit restrict est lgrement plus complique, puisque vous devez spcifier les caractres que lutilisateur peut saisir dans le champ texte. Il est possible dautoriser la saisie de lettres spcifiques et de nombres, mais aussi de plages de lettres, de nombres et de caractres. Le code ci-aprs permet lutilisateur de saisir uniquement des lettres majuscules (pas de nombres, ni de caractres spciaux) dans le champ texte :
myTextBox.restrict = A-Z;

ActionScript 3.0 utilise le tiret pour dfinir les plages de caractres et le caractre circonflexe pour exclure des caractres. Pour plus dinformations sur la dfinition de restrictions pour un champ texte de saisie, reportez-vous lentre flash.text.TextField.restrict dans la Rfrence du langage et des composants ActionScript 3.0.

550

Utilisation de texte

Formatage du texte
Plusieurs options permettent de programmer le formatage du texte afficher. You can set properties directly on the TextField instancefor example, the TextFIeld.thickness, TextField.textColor, and TextField.textHeight properties. Vous pouvez aussi dsigner le contenu du champ texte laide de la proprit htmlText et utiliser des balises HTML prises en charge, telles que b, i et u. Vous pouvez enfin appliquer des objets TextFormat aux champs texte contenant du texte brut, ou des objets StyleSheet aux champs contenant la proprit htmlText. Les objets TextFormat et StyleSheet offrent un meilleur contrle et davantage de cohrence sur laspect du texte pour lensemble de lapplication. Il est possible de dfinir un objet TextFormat ou StyleSheet et de lappliquer une partie ou lensemble des champs texte de lapplication.

Attribution de formats texte


La classe TextFormat permet de dfinir diffrentes proprits daffichage du texte et de les appliquer tout le contenu dun objet TextField, ou une plage de texte. Lexemple suivant applique un objet TextFormat un objet TextField complet, puis un second objet TextFormat une plage de texte de cet objet TextField :
var tf:TextField = new TextField(); tf.text = "Hello Hello"; var format1:TextFormat = new TextFormat(); format1.color = 0xFF0000; var format2:TextFormat = new TextFormat(); format2.font = "Courier"; tf.setTextFormat(format1); var startRange:uint = 6; tf.setTextFormat(format2, startRange); addChild(tf);

La mthode TextField.setTextFormat() naffecte que le texte qui est dj affich dans le champ texte. Si le contenu de lobjet TextField change, il peut tre ncessaire dappeler nouveau la mthode TextField.setTextFormat() pour r-appliquer le formatage. Vous pouvez galement utiliser la proprit defaultTextFormat de lobjet TextField pour spcifier le format utiliser pour le texte saisi par lutilisateur.

Formatage du texte

551

Application de feuilles de style en cascade


Les champs texte peuvent contenir du texte brut ou du texte au format HTML. Le texte brut est stock dans la proprit text de linstance, et le texte HTML dans la proprit htmlText. Vous pouvez utiliser des dclarations de styles CSS pour dfinir des styles de texte appliquer ensuite diffrents champs texte. Une dclaration de style CSS peut tre cre par code ou charge lors de lexcution partir dun fichier CSS externe. Cest la classe flash.text.StyleSheet qui gre les styles CSS. La classe StyleSheet ne reconnat quun nombre limit de proprits CSS. La liste des proprits de style prises en charge par la classe StyleSheet figure dans lentre flash.textStylesheet du manuel Rfrence du langage et des composants ActionScript 3.0. Comme le montre lexemple suivant, vous pouvez crer des feuilles de style CSS et les appliquer du texte HTML au moyen de lobjet StyleSheet :
var style:StyleSheet = new StyleSheet(); var styleObj:Object = new Object(); styleObj.fontSize = "bold"; styleObj.color = "#FF0000"; style.setStyle(".darkRed", styleObj); var tf:TextField = new TextField(); tf.styleSheet = style; tf.htmlText = "<span class = 'darkRed'>Red</span> apple"; addChild(tf);

Aprs la cration de lobjet StyleSheet, le code cre un objet simple pour contenir un jeu de proprits de dclaration de style. IL appelle ensuite la mthode StyleSheet.setStyle(), qui ajoute le nouveau style la feuille de style sous le nom darkred . Puis il applique les formats de la feuille de styles en affectant lobjet StyleSheet la proprit styleSheet de lobjet TextField. Pour que les styles CSS puissent prendre effet, il est ncessaire dappliquer la feuille de style un objet TextField avant de dfinir la proprit htmlText. Par essence, un champ texte dot dune feuille de style nest pas modifiable. Si vous attribuez une feuille de style un champ texte saisi, le champ texte affiche les proprits de la feuille de style, mais le champ texte ne permet pas lutilisateur de saisir du texte. En outre, vous ne pouvez pas utiliser les mthodes ActionScript suivantes sur un champ texte dot dune feuille de style :

La mthode TextField.replaceText() La mthode TextField.replaceSelectedText()

552

Utilisation de texte

La proprit TextField.defaultTextFormat La mthode TextField.setTextFormat()

Si un champ texte est dot dune feuille de style mais que par la suite la proprit TextField.styleSheet reoit la valeur null, TextField.text et TextField.htmlText ajoutent des balises et des attributs leurs contenus afin dincorporer le formatage de la feuille de style prcdemment attribue. Pour prserver la proprit htmlText dorigine, enregistrezla dans une variable avant dattribuer la valeur null la feuille de style.

Chargement de fichiers CSS externes


Lutilisation de feuilles de style CSS pour la mise en forme offre plus de possibilits sil est possible de charger les informations de CSS partir dun fichier externe lors de lexcution. Si les donnes CSS sont externes lapplication, il est possible de changer le style visuel du texte sans devoir modifier le code source ActionScript 3.0. En effet, aprs le dploiement de lapplication, vous pouvez encore modifier le fichier CSS externe pour obtenir un nouvel aspect, sans devoir redployer le fichier SWF de lapplication. La mthode StyleSheet.parseCSS() convertit une chane contenant des donnes CSS en dclarations de style dans lobjet StyleSheet. Lexemple suivant montre comment lire un fichier CSS externe et appliquer ses dclarations de style un objet TextField. Voici le contenu du fichier CSS charger. Il est nomm example.css :
p { font-family: Times New Roman, Times, _serif; font-size: 14; } h1 { font-family: Arial, Helvetica, _sans; font-size: 20; font-weight: bold; } .bluetext { color: #0000CC; }

Formatage du texte

553

Voici maintenant le code ActionScript dune classe qui charge le fichier example.css et en applique les styles au contenu de lobjet TextField :
package { import import import import import import import

flash.display.Sprite; flash.events.Event; flash.net.URLLoader; flash.net.URLRequest; flash.text.StyleSheet; flash.text.TextField; flash.text.TextFieldAutoSize;

public class CSSFormattingExample extends Sprite { var loader:URLLoader; var field:TextField; var exampleText:String = "<h1>This is a headline</h1> + <p>This is a line of text. <span class='bluetext'> + This line of text is colored blue.</span></p>"; public function CSSFormattingExample():void { field = new TextField(); field.width = 300; field.autoSize = TextFieldAutoSize.LEFT; field.wordWrap = true; addChild(field); var req:URLRequest = new URLRequest("example.css"); loader = new URLLoader(); loader.addEventListener(Event.COMPLETE, onCSSFileLoaded); loader.load(req); } public function onCSSFileLoaded(event:Event):void { var sheet:StyleSheet = new StyleSheet(); sheet.parseCSS(loader.data); field.styleSheet = sheet; field.htmlText = exampleText; } } }

Lorsque les donnes de CSS sont charges, la mthode onCSSFileLoaded() sexcute et appelle la mthode StyleSheet.parseCSS() pour transfrer les dclarations de style lobjet StyleSheet.

554

Utilisation de texte

Formatage de plages de texte au sein dun champ texte


La classe flash.text.TextField contient une mthode particulirement utile, setTextFormat(). La mthode setTextFormat() permet daffecter des proprits spcifiques une partie du contenu dun champ texte en rponse une action de lutilisateur, par exemple pour rappeler lutilisateur que certains champs dun formulaire doivent tre renseigns, ou encore pour changer laspect dun passage de texte si lutilisateur slectionne une partie de ce texte. Lexemple suivant utilise la mthode TextField.setTextFormat() sur une plage de caractres pour modifier laspect dune partie du contenu de myTextField lorsque lutilisateur clique dans ce champ texte :
var myTextField:TextField = new TextField(); myTextField.text = "No matter where you click on this text field the TEXT IN ALL CAPS changes format."; myTextField.autoSize = TextFieldAutoSize.LEFT; addChild(myTextField); addEventListener(MouseEvent.CLICK, changeText); var myformat:TextFormat = new TextFormat(); myformat.color = 0xFF0000; myformat.size = 18; myformat.underline = true; function changeText(event:MouseEvent):void { myTextField.setTextFormat(myformat, 49, 65); }

Formatage du texte

555

Fonctions avances daffichage de texte


Le paquet flash.text dActionScript 3.0 offre plusieurs classes qui permettent de contrler les proprits du texte affich, notamment les polices incorpores, les paramtres de lissage, le canal alpha et autres paramtres spcifiques. La Rfrence du langage et des composants ActionScript 3.0 fournit des descriptions dtailles de ces classes et de leurs proprits, notamment des classes CSMSettings, Font et TextRenderer.

Utilisation de polices incorpores


Si vous spcifiez une police prcise pour un objet TextField de votre application, Flash Player recherche une police rsidente du mme nom sur lordinateur de lutilisateur. Si cette police nest pas charge sur cet ordinateur, ou sil existe une police de ce nom mais dans une version lgrement diffrente, le texte peut apparatre trs diffrent de ce que vous aviez prvu. Pour que lutilisateur voie exactement la police voulue, vous pouvez incorporer cette police dans le fichier SWF de votre application. Lincorporation des polices prsente de nombreux avantages :

Les caractres des polices incorpores sont lisss, ce qui les rend plus agrables lire, en particulier pour les grandes tailles de texte. Il est possible de faire pivoter les polices incorpores. Il est possible de rendre transparent ou semi-transparent le texte des polices incorpores. Il est possible dutiliser le style CSS kerning (crnage) avec les polices incorpores.

Le principal inconvnient des polices incorpores est laugmentation de la taille du fichier de lapplication. La mthode exacte utiliser pour incorporer un fichier de police dans le fichier SWF de lapplication varie selon lenvironnement de dveloppement. Une fois la police incorpore, il est possible de faire en sorte que lobjet TextField utilise la police correcte :

Mettez la proprit embedFonts de lobjet TextField sur true. Crez un objet TextFormat, donnez sa proprit fontFamily le nom de la police incorpore, et appliquez lobjet TextFormat au TextField. Dans le cas dune police incorpore, la proprit fontFamily ne doit contenir quun seul nom. Elle ne peut pas utiliser une liste de polices spares par des virgules. Si vous utilisez des styles CSS pour les polices dobjets TextFields, donnez la proprit CSS font-family le nom de la police incorpore. Si vous voulez utiliser une police incorpore, la proprit font-family ne doit contenir quun seul nom, et non pas une liste de noms.

556

Utilisation de texte

intgration dune police dans Flash


Loutil de cration Flash permet dincorporer pratiquement toutes les polices TrueType et Postscript Type 1 susceptibles de figurer sur votre ordinateur. Il existe plusieurs faons dintgrer des polices dans une application Flash :

en dfinissant les proprits de police et de style dun objet TextField sur la scne, et en cochant la case Intgration de polices en crant et rfrenant un symbole de police en crant et utilisant une bibliothque dexcution partage contenant des symboles de polices intgres

Pour plus de dtails sur lintgration de polices dans les applications Flash, consultez la section Polices intgres pour des champs texte dynamiques ou de saisie dans le guideUtilisation de Flash.

Contrle de la nettet, de lpaisseur et du lissage


Par dfaut, Flash Player dtermine les paramtres de contrle daffichage du texte (nettet, paisseur et lissage) qui sappliquent lorsque le texte change de taille et de couleur ou saffiche sur diffrents arrire-plans. Dans certains cas, vous pouvez dfinir vos propres paramtres, par exemple si le texte est trs petit ou trs gros, ou sil saffiche sur plusieurs arrire-plans. La classe flash.text.TextRenderer et les classes associes telles que CSMSettings permettent de modifier les paramtres de Flash Player. Elles offrent un contrle prcis de la qualit daffichage du texte incorpor. Pour plus dinformations sur les polices incorpores, consultez la section Utilisation de polices incorpores , la page 556.
REMARQUE L a p r o p r i t flash.text.TextField.antiAliasType d o i t av o i r la v a le u r AntiAliasType.ADVANCED ( v a l e u r p a r d fa u t ) p o u r q u i l s o i t p o s s i b l e d e d fi n i r l a n e t t e t , l p a i s se u r o u l a p r o p r i t gridFitType, o u d u ti li s e r la m t ho d e TextRenderer.setAdvancedAntiAliasingTable().

Fonctions avances daffichage de texte

557

Lexemple suivant applique des proprits personnalises de modulation continue du trait (CSM) et de mise en forme au texte affich, en utilisant la police incorpore myFont. Lorsque lutilisateur clique sur le texte affich, Flash Player applique ces paramtres personnaliss :
var format:TextFormat = new TextFormat(); format.color = 0x336699; format.size = 48; format.font = "myFont"; var myText:TextField = new TextField(); myText.embedFonts = true; myText.autoSize = TextFieldAutoSize.LEFT; myText.antiAliasType = AntiAliasType.ADVANCED; myText.defaultTextFormat = format; myText.selectable = false; myText.mouseEnabled = true; myText.text = "Hello World"; addChild(myText); myText.addEventListener(MouseEvent.CLICK, clickHandler); function clickHandler(event:Event):void { var myAntiAliasSettings = new CSMSettings(48, 0.8, -0.8); var myAliasTable:Array = new Array(myAntiAliasSettings); TextRenderer.setAdvancedAntiAliasingTable("myFont", FontStyle.ITALIC, TextColorType.DARK_COLOR, myAliasTable); }

Utilisation de texte statique


Le texte statique peut uniquement tre cr dans lenvironnement de cration Flash. Il est impossible dinstancier du texte statique en ActionScript. Le texte statique est utile si le contenu textuel est court et ne doit pas changer (contrairement au texte dynamique). Vous pouvez vous reprsenter le texte statique comme un lment graphique, comparable un cercle ou un carr dessin sur la scne de Flash. Bien que le texte statique offre moins de possibilits que le texte dynamique, ActionScript 3.0 permet de lire les valeurs des proprits du texte statique laide de la classe flash.text.StaticText. En outre, vous pouvez utiliser la classe flash.text.TextSnapshot pour extraire des valeurs du texte statique.

558

Utilisation de texte

Accs aux champs texte statique laide de la classe StaticText


On utilise en gnral la classe flash.text.StaticText dans le panneau Actions de Flash afin dagir sur une instance de texte statique place sur la scne. Vous pouvez galement travailler dans des fichiers ActionScript qui interagissent avec le fichier SWF contenant le texte statique. Dans les deux cas, il est impossible de programmer une instance de texte statique. Le texte statique peut uniquement tre cr dans lenvironnement de cration Flash. Pour crer en ActionScript 3.0 une rfrence un champ texte statique existant, vous pouvez effectuer une itration sur les lments de la liste daffichage et affecter une variable. Par exemple :
for (var i = 0; i < this.numChildren; i++) { var displayitem:DisplayObject = this.getChildAt(i); if (displayitem instanceof StaticText) { trace("a static text field is item " + i + " on the display list"); var myFieldLabel:StaticText = StaticText(displayitem); trace("and contains the text: " + myFieldLabel.text); } }

Lorsque ous disposez dune rfrence un champ texte statique, vous pouvez utiliser les proprits de ce champ en ActionScript 3.0. Le code suivant est associ une image du scnario et suppose quune variable nomme myFieldLabel est affecte une rfrence un champ texte statique. Un champ texte dynamique myField est positionn relativement aux valeurs x et y de myFieldLabel et affiche nouveau la valeur de myFieldLabel.
var myField:TextField = new TextField(); addChild(myField); myField.x = myFieldLabel.x; myField.y = myFieldLabel.y + 20; myField.autoSize = TextFieldAutoSize.LEFT; myField.text = "and " + myFieldLabel.text

Utilisation de la classe TextSnapshot


Pour travailler par programmation avec une instance de texte statique existante, utilisez la classe flash.text.TextSnapshot pour modifier la proprit textSnapshot dun objet flash.display.DisplayObjectContainer. En dautre termes, crez une instance de TextSnapshot partir de la proprit DisplayObjectContainer.textSnapshot. Vous pouvez alors appliquer des mthodes cette instance afin dextraire des valeurs ou de slectionner des portions du texte statique.

Utilisation de texte statique

559

Par exemple, placez un champ texte statique contenant le texte TextSnapshot Example sur la scne. Ajoutez le code ActionScript suivant limage 1 du scnario :
var mySnap:TextSnapshot = this.getTextSnapshot(); var count:Number = mySnap.getCount(); mySnap.setSelected(0, 4, true); mySnap.setSelected(1, 2, false); var myText:String = mySnap.getSelectedText(false); trace(myText);

La classe TextSnapshot permet dextraire le texte des champs texte statique dans un fichier SWF charg, au cas o vous souhaiteriez utiliser ce texte comme valeur dans une autre partie de lapplication.

Exemple : formatage du texte dans le style journal


Lexemple News Layout met en forme le texte pour lui donner laspect dun article de journal. Le texte saisi peut contenir un gros titre, un intertitre et le corps de larticle. En fonction dune largeur et dune hauteur daffichage, cet exemple met en forme le gros titre et lintertitre pour quils occupent toute la largeur disponible. Le texte de larticle est rparti sur plusieurs colonnes. Cet exemple illustre les techniques de programmation en ActionScript suivantes :

Extension de la classe TextField Chargement et application dun fichier CSS externe Conversion de styles CSS en objets TextFormat Utilisation de la classe TextLineMetrics pour obtenir des informations sur la taille daffichage du texte

560

Utilisation de texte

Pour obtenir les fichiers de cet exemple dapplication, consultez la page www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers de lapplication News Layout se trouvent dans le dossier Samples/NewsLayout. Lapplication se compose des fichiers suivants :
Fichier
NewsLayout.mxml ou NewsLayout.fla StoryLayout.as

Description
Interface utilisateur de lapplication pour Flex (MXML) ou Flash (FLA). Principale classe ActionScript charge dorganiser les composants dun article pour leur affichage. Sous-classe de la classe TextField, qui gre son propre objet TextFormat. Sous-classe de la classe FormattedTextField, qui ajuste la taille des polices en fonction de la largeur voulue. Classe ActionScript qui rpartit le texte de larticle sur plusieurs colonnes. Fichier CSS dfinissant les styles du texte pour la mise en page. Fichier XML contenant le texte de larticle.

FormattedTextField.as HeadlineTextField.as

MultiColumnTextField.as story.css newsconfig.xml

Lecture du fichier CSS externe


Lapplication News Layout commence par rcuprer le texte de larticle partir dun fichier XML local. Elle lit ensuite un fichier CSS externe contenant les informations de mise en forme pour le gros titre, lintertitre et le texte. Ce fichier CSS dfinit trois styles, un style de paragraphe standard pour larticle et les styles h1 et h2, respectivement pour le gros titre et lintertitre.
p { font-family: Georgia, Times New Roman, Times, _serif; font-size: 12; leading: 2; text-align: justify; }

Exemple : formatage du texte dans le style journal

561

h1 { font-family: Verdana, Arial, Helvetica, _sans; font-size: 20; font-weight: bold; color: #000099; text-align: left; } h2 { font-family: Verdana, Arial, Helvetica, _sans; font-size: 16; font-weight: normal; text-align: left; }

La technique utilise pour lire le contenu du fichier CSS externe est celle qui est dcrite dans la section Chargement de fichiers CSS externes , la page 553. Aprs le chargement du fichier CSS, lapplication excute la mthode onCSSFileLoaded(), reprsente ci-dessous.
public function onCSSFileLoaded(event:Event):void { this.sheet = new StyleSheet(); this.sheet.parseCSS(loader.data); h1Format = getTextStyle("h1", this.sheet); if (h1Format == null) { h1Format = getDefaultHeadFormat(); } h2Format = getTextStyle("h2", this.sheet); if (h2Format == null) { h2Format = getDefaultHeadFormat(); h2Format.size = 16; } displayStory(); }

La mthode onCSSFileLoaded() cre un objet StyleSheet qui analyse les donnes du fichier CSS. Le texte principal de larticle sera affich dans un objet MultiColumnTextField, qui peut utiliser directement un objet StyleSheet. Toutefois, les champs du gros titre utilisent la classe HeadlineTextField, qui utilise un objet TextFormat pour sa mise en forme.

562

Utilisation de texte

La mthode onCSSFileLoaded() appelle deux fois la mthode getTextStyle() pour convertir une dclaration de style CSS en un objet TextFormat destin aux deux objets HeadlineTextField. La mthode getTextStyle() est reproduite ci-dessous :
public function getTextStyle(styleName:String, ss:StyleSheet):TextFormat { var format:TextFormat = null; var style:Object = ss.getStyle(styleName); if (style != null) { var colorStr:String = style.color; if (colorStr != null && colorStr.indexOf("#") == 0) { style.color = colorStr.substr(1); } format = new TextFormat(style.fontFamily, style.fontSize, style.color, (style.fontWeight == "bold"), (style.fontStyle == "italic"), (style.textDecoration == "underline"), style.url, style.target, style.textAlign, style.marginLeft, style.marginRight, style.textIndent, style.leading); if (style.hasOwnProperty("letterSpacing")) { format.letterSpacing = style.letterSpacing; } } return format; }

Les noms de proprits et la signification de leurs valeurs diffrent entre les dclarations de style CSS et les objets TextFormat. La mthode getTextStyle() transforme donc les valeurs des proprits CSS dans les valeurs attendues par lbjet TextFormat.

Exemple : formatage du texte dans le style journal

563

Disposition des lments de larticle sur la page


La classe StoryLayout formate et met en page les champs texte dvolus au gros titre, lintertitre et larticle dans le style dune page de journal. La mthode displayText() cre et place les divers champs.
public function displayText():void { headlineTxt = new HeadlineTextField(h1Format); headlineTxt.wordWrap = true; this.addChild(headlineTxt); headlineTxt.width = 600; headlineTxt.height = 100; headlineTxt.fitText(this.headline, 1, true); subtitleTxt = new HeadlineTextField(h2Format); subtitleTxt.wordWrap = true; subtitleTxt.y = headlineTxt.y + headlineTxt.height; this.addChild(subtitleTxt); subtitleTxt.width = 600; subtitleTxt.height = 100; subtitleTxt.fitText(this.subtitle, 1, false); storyTxt = new MultiColumnTextField(2, 10, 600, 200); storyTxt.y = subtitleTxt.y + subtitleTxt.height + 4; this.addChild(storyTxt); storyTxt.styleSheet = this.sheet; storyTxt.htmlText = loremIpsum; }

Chaque champ est simplement plac sous le champ prcdent, en donnant sa proprit y la valeur de la proprit y du champ prcdent plus la hauteur de celui-ci. Ce calcul dynamique de position est ncessaire, car les objets HeadlineTextField et MultiColumnTextField peuvent changer de hauteur en fonction de leur contenu.

Modification de la taille de la police en fonction de la taille du champ


Sur la base dune largeur en pixels et dun nombre maximum de lignes afficher, lobjet HeadlineTextField modifie la taille de la police pour adapter le texte aux dimensions du champ. Si le texte est court, la police sera de grande taille, crant ainsi un gros titre de style tablode. Si le texte est long, la taille de police sera plus proche de celle dun grand quotidien du soir.

564

Utilisation de texte

La mthode HeadlineTextField.fitText() reproduite ci-dessous est charge du redimensionnement du texte :


public function fitText(msg:String, maxLines:uint = 1, toUpper:Boolean = false, targetWidth:Number = -1):uint { this.text = toUpper ? msg.toUpperCase() : msg; if (targetWidth == -1) { targetWidth = this.width; } var pixelsPerChar:Number = targetWidth / msg.length; var pointSize:Number = Math.min(MAX_POINT_SIZE, Math.round(pixelsPerChar * 1.8 * maxLines)); if (pointSize < 6) { // si la taille (en points) est trop return pointSize; } this.changeSize(pointSize); if (this.numLines > maxLines) { return shrinkText(--pointSize, maxLines); } else { return growText(pointSize, maxLines); } } public function growText(pointSize:Number, maxLines:uint = 1):Number { if (pointSize >= MAX_POINT_SIZE) { return pointSize; } this.changeSize(pointSize + 1);

faible,

Exemple : formatage du texte dans le style journal

565

if (this.numLines > maxLines) { // revenir la taille prcdente this.changeSize(pointSize); return pointSize; } else { return growText(pointSize + 1, maxLines); } } public function shrinkText(pointSize:Number, maxLines:uint=1):Number { if (pointSize <= MIN_POINT_SIZE) { return pointSize; } this.changeSize(pointSize); if (this.numLines > maxLines) { return shrinkText(pointSize - 1, maxLines); } else { return pointSize; } }

La mthode HeadlineTextField.fitText() utilise une technique rcursive simple pour dimensionner le texte. Elle estime dabord un nombre moyen de pixels par caractre pour le texte, puis calcule une taille de dpart. Elle change alors la taille de la police du texte et vrifie si celui-ci a renvoy des mots la ligne et si le nombre maximal de lignes est dpass. Si cest le cas, elle appelle la mthode shrinkText() pour rduire la taille du texte, et teste nouveau. Si le nombre de lignes nest pas trop important, elle appelle la mthode growText() pour augmenter la taille du texte, et teste nouveau. Ce processus simterrompt lorsque laugmentation de taille du texte dun seul point crerait un nombre de lignes trop lev.

566

Utilisation de texte

Rpartition du texte sur plusieurs colonnes


La classe MultiColumnTextField rpartit le texte entre plusieurs objets TextField qui sont organiss comme des colonnes de texte sur une page de journal. Le constructeur de MultiColumnTextField() cre dabord un tableau dobjets TextField, un pour chaque colonne :
for (var i:int = 0; i < cols; i++) { var field:TextField = new TextField(); field.autoSize = TextFieldAutoSize.NONE; field.wordWrap = true; field.styleSheet = this.styleSheet; this.fieldArray.push(field); this.addChild(field); }

Chaque objet TextField est ajout au tableau et la liste daffichage laide de la mthode addChild(). Si la proprit text ou styleSheet de lobjet StoryLayout change, la mthode layoutColumns() est appele pour rafficher le texte. La mthode layoutColumns() appelle la mthode getOptimalHeight() (ci-dessous) pour dterminer la hauteur correcte en pixels ncessaire pour adapter tout le texte en fonction de la largeur disponible.
public function getOptimalHeight(str:String):int { if (fieldArray.length == 0 || str == "" || str == null) { return this.preferredHeight; } else { var colWidth:int = Math.floor( (this.preferredWidth ((this.numColumns - 1) * gutter)) / this.numColumns); var field:TextField = fieldArray[0] as TextField; field.width = colWidth; field.htmlText = str; var linesPerCol:int = Math.ceil(field.numLines / this.numColumns); var metrics:TextLineMetrics = field.getLineMetrics(0); var prefHeight:int = linesPerCol * metrics.height; return prefHeight + 4; } }

Exemple : formatage du texte dans le style journal

567

La mthode getOptimalHeight() calcule dabord la largeur de chaque colonne. Elle dfinit ensuite la proprit htmlText du premier objet TextField du tableau. La mthode getOptimalHeight() utilise ce premier objet TextField pour connatre le nombre total de lignes renvoyes la ligne, et en dduit donc le nombre de lignes optimal pour chaque colonne. Elle appelle ensuite la mthode TextField.getLineMetrics() pour obtenir un objet TextLineMetrics contenant des informations sur la taille du texte de la premire ligne. La proprit TextLineMetrics.height reprsente la hauteur totale (en pixels) dune ligne de texte, avec les mesures ascendantes, descendantes et linterligne. La hauteur optimale de lobjet MultiColumnTextField est donc la hauteur de ligne multiplie par le nombre de lignes par colonne, plus 4 pour prendre en compte la bordure de 2 pixels en haut et en bas de lobjet TextField. Voici le code complet de la mthode layoutColumns() :
public function layoutColumns():void { if (this._text == "" || this._text == null) { return; } if (this.fitToText) { this.preferredHeight = this.getOptimalHeight(this._text); } var colWidth:int = Math.floor( (this.preferredWidth ((numColumns - 1) * gutter)) / numColumns); var field:TextField; var remainder:String = this._text; var fieldText:String = ""; for (var i:int = 0; i < fieldArray.length; i++) { field = this.fieldArray[i] as TextField; field.width = colWidth; field.height = this.preferredHeight; field.x = i * (colWidth + gutter); field.y = 0; field.htmlText = "<p>" + remainder + "</p>"; remainder = ""; fieldText = "";

568

Utilisation de texte

var linesRemaining:int = field.numLines; var linesVisible:int = field.numLines - field.maxScrollV + 1; for (var j:int = 0; j < linesRemaining; j++) { if (j < linesVisible) { fieldText += field.getLineText(j); } else { remainder += field.getLineText(j); } } field.htmlText = "<p>" + fieldText + "</p>"; } }

Lorsque la proprit preferredHeight a t dfinie par un appel la mthode getOptimalHeight, la mthode layoutColumns() parcourt les objets TextField et dfinit la hauteur de chacun avec la valeur preferredHeight. La mthode layoutColumns() distribue ensuite le nombre de lignes de texte adapt chaque champ, de sorte quaucun dfilement ne se produise dans lun deux et que le texte de chaque champ enchane sur celui du champ prcdent.

Exemple : formatage du texte dans le style journal

569

570

Utilisation de texte

CHAPITRE 18

Utilisation des graphismes bitmap


Outre ses possibilits en matire de dessin vectoriel, ActionScript 3.0 permet galement de crer des images bitmap ou de manipuler les donnes de pixels dimages bitmap externes charges dans un fichier SWF. Cette possibilit de lire et modifier des valeurs de pixel individuelles permettent de crer des effets visuels comme ceux des filtres et dutiliser les fonction intgres de gestion du bruit pour crer des textures et des bruits alatoires. Toutes ces techniques sont dcrites dans le prsent chapitre.

18

Sommaire
Les bases de lutilisation des bitmaps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571 Les classes Bitmap et BitmapData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .575 Manipulation des pixels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577 Copie de donnes bitmap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581 Cration de textures avec les fonctions de bruit alatoire . . . . . . . . . . . . . . . . . . . . .582 Dfilement du contenu dimages bitmap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .584 Exemple : animation dobjets Sprite laide dune image bitmap hors cran . . . .585

Les bases de lutilisation des bitmaps


Introduction lutilisation des images bitmap
Tout travail avec des images numriques ncessite de grer deux types de graphismes : les images bitmap et les images vectorielles. Les bitmaps, galement appels graphismes en points, sont composs de petits carrs (les pixels) organiss en une grille rectangulaire. De leur ct, les graphismes vectoriels sont composs de formes gomtriques (lignes, courbes et polygones) gnres laide de formules mathmatiques.

571

Les images bitmap sont dfinies par la largeur et la hauteur de limage, mesures en pixels, et par le nombre de bits contenu dans chaque pixel (ce nombre de bits dfinit le nombre de couleurs que peut comporter limage). Dans le cas dune image bitmap utilisant le modle colorimtrique RVB, les pixels sont composs de trois octets : rouge, vert et bleu. Chaque octet contient une valeur comprise entre 0 et 255. Cest la combinaison de ces octets pour chaque pixel qui produit une couleur, un peu comme le mlange des couleurs de base par un peintre. Par exemple, un pixel contenant les valeurs 255, 102 et 0 respectivement pour les octets dvolus au rouge, au vert et au bleu produira un orange vif. La qualit dune image bitmap est dtermine en combinant la rsolution en pixels de limage avec sa profondeur de couleur exprime en bits ou en octets. La rsolution dfinit le nombre de pixels contenus dans limage. Plus le nombre de pixels est important, plus la rsolution est leve et plus limage semble bien dfinie. La profondeur de couleurs dfinit la quantit dinformations colorimtriques contenues par chaque pixel. Par exemple, une image ayant une profondeur de couleur de 16 bits par pixel ne peut pas reprsenter un nombre de nuances aussi lev quune image ayant une profondeur de couleur de 48 bits. En consquence, limage sur 48 bits aura plus de nuances que la version sur 16 bits. Dans la mesure o les graphismes bitmap dpendent de la rsolution, il est dlicat de modifier leur chelle, ce qui se remarque particulirement avec les images bitmap agrandies, qui perdent beaucoup de dtails et de qualit.

Format des fichiers bitmap


Les images bitmap existent en divers formats de fichier. Ces formats utilisent diffrents types dalgorithmes de compression pour rduire la taille des fichiers et optimiser la qualit de limage en fonction de sa destination. Les formats dimage bitmap pris en charge par Flash Player sont les suivants : GIF, JPG et PNG. GIF Le format GIF (Graphics Interchange Format) fut dvelopp lorigine par CompuServe en 1987, dans le but de transmettre des images en 256 couleurs (codes sur 8 bits). Ce format, qui permet dobtenir des fichiers de petite taille, est trs utilis pour les images sur le Web. Toutefois, en raison de son nombre limit de couleurs, ce format nest pas adapt aux photographies, qui ncessitent en gnral un nombre de nuances plus lev. Les images GIF autorisent la transparence sur un bit, ce qui permet de rendre les couleurs invisibles (ou transparentes). Cest ainsi que sont produits les fonds transparents des images de pages Web.

572

Utilisation des graphismes bitmap

JPEG Dvelopp par le Joint Photographic Experts Group (JPEG), le format dimage JPEG (souvent not JPG) fait appel un algorithme de compression avec perte pour autoriser une profondeur de couleur de 24 bits avec une taille de fichier trs rduite. En raison de la compression avec perte, chaque fois que limage est enregistre elle perd des donnes, donc de la qualit, mais la taille de fichier rsultante en est dautant plus rduite. Le format JPEG est idal pour les photographies, car il permet dafficher des millions de couleurs diffrentes. La possibilit de contrler le taux de compression appliqu limage permet de modifier la qualit de limage et la taille du fichier. PNG Le format PNG (Portable Network Graphics) a t cre comme autre possibilit gratuite (open source) au format de fichier GIF, qui est brevet. Les fichiers PNG acceptent jusqu 64 bits de profondeur de couleur, ce qui permet dobtenir jusqu 16 millions de couleurs. Le format PNG tant relativement rcent, les versions anciennes de certains navigateurs ne grent pas ces fichiers. Contrairement au JPG, le format PNG utilise une compression sans perte, ce qui signifie quaucune donne de limage nest perdue lors de lenregistrement. De plus, les fichiers PNG acceptent galement la transparence alpha, ce qui autorise jusqu 256 niveaux de transparence.

Fichiers bitmap transparents et opaques


Les images bitmap qui utilisent le format GIF ou PNG peuvent comporter pour chaque pixel un octet supplmentaire pour le canal alpha. Cet octet de pixel supplmentaire reprsente la valeur de transparence du pixel. Les images GIF nautorisent la transparence que sur la base dun bit, ce qui ne permet de spcifier la transparence que pour une seule couleur (dans une palette de 256 couleurs). Par contre, les images PNG acceptent jusqu 256 niveaux de transparence. Cette caractristique est particulirement intressante pour fondre les images ou le texte avec larrire-plan. ActionScript 3.0 permet de grer cet octet supplmentaire de transparence laide de la classe BitmapData. Suivant le modle de transparence PNG, la constante BitmapDataChannel.ALPHA permet dobtenir jusqu 256 niveaux de transparence.

Les bases de lutilisation des bitmaps

573

Tches courantes dutilisation des bitmaps


Voici plusieurs tches courantes susceptibles dtre accomplies en cas dutilisation dimages bitmap en ActionScript :

Affichage de bitmaps Rcupration et modification des valeurs de couleur des pixels Copie de donnes bitmap :

cration dune copie exacte dun bitmap copie des donnes dun canal couleur dune image bitmap dans un canal couleur dune autre image bitmap Copie sous forme de bitmap dun objet daffichage apparaissant lcran

Cration de bruit et de textures sous forme dimages bitmap Dfilement du contenu dimages bitmap

Concepts importants et terminologie


La liste suivante numre les termes importants que vous rencontrerez dans ce chapitre :

Alpha : niveau de transparence (ou, plus prcisment, dopacit) dune couleur dune image. La valeur alpha est frquemment appele valeur du canal alpha. Couleur ARVB : modle colorimtrique suivant lequel la couleur de chaque pixel est dfinie selon ses composants rouge, vert et bleu, ainsi que par sa transparence spcifie comme valeur alpha. Canal de couleur : en gnral, les couleurs sont reprsentes par le mlange des couleurs primaires, rouge, vert et bleu. Chaque couleur primaire est considre comme un canal de couleur. Cest le mlange des proportions de chaque canal de couleur qui dtermine la couleur finale. Profondeur de couleur : parfois appele codage des couleurs, cette caractristique dtermine la quantit de mmoire vice dvolue chaque pixel, ce qui, indirectement, dfinit le nombre de couleurs quil est possible dafficher. Pixel : unit dinformation de base pour une image bitmap (en essence, un point color). Rsolution : dimensions dune image en pixels, ce qui dtermine le niveau de dtails fins quil est possible de sparer dans limage. La rsolution est frquemment exprime en nombre de pixels pour la largeur et la hauteur. Couleur RVB : modle colorimtrique suivant lequel la couleur de chaque pixel est dfinie selon ses composants rouge, vert et bleu.

574

Utilisation des graphismes bitmap

Utilisation des exemples des chapitres


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester les exemples de code. Etant donn que ce chapitre dcrit comment crer et manipuler du contenu visuel, le test du code implique lexcution du code et laffichage des rsultats dans le fichier SWF cr. Pour tester les exemples de code de ce chapitre :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code de lexemple dans la fentre de script : Choisissez Contrle > Tester lanimation pour excuter le programme. Les rsultats du code apparaissent dans le fichier SWF cr.

Presque tous les exemples de code crent une image bitmap, vous pouvez donc tester le code directement sans fournir aucun contenu bitmap. Si vous souhaitez tester le code laide de vos propres image, importez celles-ci dans Adobe Flash CS3 Professional ou chargez des image externes dans le fichier test SWF pour utiliser leurs donnes avec le code des exemples. Pour toutes instructions sur le chargement dimages externes, consultez la section Chargement dynamique de contenu afficher , la page 446.

Les classes Bitmap et BitmapData


Les principales classes dActionScript 3.0 permettant de grer des images bitmap sont la classe Bitmap, utilise pour afficher des images bitmap, et la classe BitmapData, qui permet de lire et modifier les donnes brutes dune image bitmap.

Prsentation de la classe Bitmap


Sous-classe de la classe DisplayObject, la classe Bitmap est la principale classe utilise en ActionScript 3.0 pour laffichage dimages bitmap. Ces images peuvent avoir t charges dans Flash via la classe flash.display.Loader, ou cres dynamiquement laide du constructeur Bitmap(). En cas de chargement dune image provenant dune source externe, un objet Bitmap ne peut contenir que des images aux formats GIF, JPEG ou PNG. Linstance de lobjet Bitmap peut tre considre comme enveloppe dun objet BitmapData devant tre affich sur la scne. Une instance de Bitmap tant un objet daffichage, toutes les caractristiques et fonctionnalits des objets daffichage peuent tre utilises pour la manipuler. Pour plus dinformations sur lutilisation des objets daffichage, reportez-vous au Chapitre 12, Programmation de laffichage , la page 395.

Les classes Bitmap et BitmapData

575

Accrochage et lissage des pixels


Outre les fonctionnalits communes tous les objets daffichage, la classe Bitmap dispose de quelques fonctionnalits supplmentaires, propres aux images bitmap. La proprit pixelSnapping de la classe Bitmap, dont leffet est similaire la fonction daccrochage des pixels de lenvironnement Flash, dtermine si un objet Bitmap doit tre aimant par le pixel le plus proche. Cette proprit naccepte que lune des trois constantes dfinies dans la classe PixelSnapping : ALWAYS, AUTO ou NEVER. La syntaxe de laccrochage aux pixels est la suivante :
myBitmap.pixelSnapping = PixelSnapping.ALWAYS;

Lorsque des images bitmap sont redimensionnes, il est frquent quelles deviennent floues et distordues. Pour rduire cette distorsion, utilisez la proprit smoothing de la classe BitmapData. Lorsque cette proprit boolenne a la valeur true, elle adoucit les pixels par un effet danti-crnelage appliqu aux images redimensionnes. Celles-ci ont alors un aspect plus clair, plus naturel.

Prsentation de la classe BitmapData


La classe BitmapData class, qui se trouve dans le paquet flash.display, peut tre compare un clich photographique des pixels dune image bitmap, que celle-ci soit charge ou cre dynamiquement. Ce clich est reprsent par une grille de donnes des pixels de lobjet. La classe BitmapData contient galement une srie de mthodes permettant de crer et modifier des donnes de pixels. Pour instancier un objet BitmapData, utilisez le code suivant :
var myBitmap:BitmapData = new BitmapData(width:Number, height:Number, transparent:Boolean, fillColor:uinit);

Les paramtres width et height permettent dindiquer la largeur et la hauteur du bitmap. Ils acceptent une valeur maximum de 2880 pixels. Le paramtre transparent indique si limage bitmap comporte un canal alpha (true) ou non (false). Le paramtre fillColor est une valeur colorimtrique sur 32 bits qui spcifie la couleur darrire-plan, ainsi que la valeur de la transparence (si cette dernire est true). Lexemple suivant cre un objet BitmapData dont larrire-plan orange est transparent 50 % :
var myBitmap:BitmapData = new BitmapData(150, 150, true, 0x80FF3300);

576

Utilisation des graphismes bitmap

Pour afficher un objet BitmapData nouvellement cr, affectez-le une instance de Bitmap. Pour ce faire, vous pouvez soit passer lobjet BitmapData en paramtre du constructeur de lobjet Bitmap, ou laffecter la proprit bitmapData dune instance de Bitmap existante. Vous devez galement affecter cette instance de Bitmap la liste daffichage en appelant la mthode addChild() ou addChildAt() du conteneur dobjet daffichage qui contiendra cette instance de Bitmap. Pour plus dinformations sur lutilisation de la liste daffichage, consultez la section Ajout dobjets daffichage la liste daffichage , la page 407. Lexemple suivant cre un objet BitmapData avec un remplissage rouge, et laffiche dans une instance de Bitmap :
var myBitmapDataObject:BitmapData = new BitmapData(150, 150, false, 0xFF0000); var myImage:Bitmap = new Bitmap(myBitmapDataObject); addChild(myImage);

Manipulation des pixels


La classe BitmapData contient des mthodes qui permettent de modifier les valeurs des donnes de pixels.

Manipulation individuelle de pixels


Pour modifier une image bitmap au niveau des pixels, il est dabord ncessaire dobtenir les valeurs colorimtriques des pixels de la zone modifier. La mthode getPixel() permet dobtenir ces valeurs de pixels. La mthode getPixel() renvoie les valeurs RVB des coordonnes (de pixels) x et y qui lui sont passes en paramtres. Si lun des pixels comporte des informations de transparence (canal alpha), il est ncessaire dutiliser la mthode getPixel32(). Cette mthode rcupre galement une valeur RVB, mais contrairement ce qui se passe avec getPixel(), la valeur renvoye par getPixel32() contient des donnes supplmentaires qui reprsente la valeur du canal alpha (transparence) du pixel slectionn. Pour simplement modifier la couleur ou la transparence dun pixel contenu dans un bitmap, il est aussi possible dutiliser la mthode setPixel() ou setPixel32(). Pour dfinir la couleur dun pixel, il suffit de passer les coordonnes x et y et la valeur colorimtrique lune de ces mthodes.

Manipulation des pixels

577

Dans lexemple suivant, setPixel() est utilise pour tracer une croix sur un fond vert BitmapData. La mthode getPixel() permet ensuite de rcuprer la valeur colorimtrique du pixel ayant les coordonnes 50, 50 et de suivre la valeur renvoye.
import flash.display.Bitmap; import flash.display.BitmapData; var myBitmapData:BitmapData = new BitmapData(100, 100, false, 0x009900); for (var i:uint = 0; i < 100; i++) { var red:uint = 0xFF0000; myBitmapData.setPixel(50, i, red); myBitmapData.setPixel(i, 50, red); } var myBitmapImage:Bitmap = new Bitmap(myBitmapData); addChild(myBitmapImage); var pixelValue:uint = myBitmapData.getPixel(50, 50); trace(pixelValue.toString(16));

Pour lire la valeur dun groupe de pixels, et non pas dun pixel isol, utilisez la mthode getPixels(). Cette mthode gnre un tableau doctets partir dune zone rectangulaire de donnes de pixels, et le passe en paramtre. Chaque lment du tableau doctets (autrement dit, les valeurs des pixels) est un entier non sign (valeurs non multiplies sur 32 bits).
setPixels().

Inversement, pour modifier (ou dfinir) la valeur dun groupe de pixels, utilisez la mthode Cette mthode attend deux paramtres (rect et inputByteArray), qui sont combins pour produire une zone rectangulaire (rect) de donnes de pixels (inputByteArray).

Au fur et mesure de la lecture (ou de lcriture) des donnes dans inputByteArray, la mthode ByteArray.readUnsignedInt() est appele pour chaque pixel du tableau. Si pour une raison quelconque inputByteArray ne contient pas un rectangle complet de donnes de pixels, la mthode interrompt le traitement des donnes de limage. Il est important de comprendre que pour lire ou modifier des donnes de pixels, le tableau doctets attend les valeurs suivantes sur 32 octets : alpha, rouge, vert, bleu (ARVB).

578

Utilisation des graphismes bitmap

Lexemple suivant utilise les mthodes getPixels() et setPixels() pour copier un groupe de pixels dun objet BitmapData un autre :
import import import import flash.display.Bitmap; flash.display.BitmapData; flash.utils.ByteArray; flash.geom.Rectangle;

var bitmapDataObject1:BitmapData = new BitmapData(100, 100, false, 0x006666FF); var bitmapDataObject2:BitmapData = new BitmapData(100, 100, false, 0x00FF0000); var rect:Rectangle = new Rectangle(0, 0, 100, 100); var bytes:ByteArray = bitmapDataObject1.getPixels(rect); bytes.position = 0; bitmapDataObject2.setPixels(rect, bytes); var bitmapImage1:Bitmap = new Bitmap(bitmapDataObject1); addChild(bitmapImage1); var bitmapImage2:Bitmap = new Bitmap(bitmapDataObject2); addChild(bitmapImage2); bitmapImage2.x = 110;

Dtection de collision au niveau des pixels


La mthode BitmapData.hitTest() effectue une dtection de collision au niveau des pixels entre les donnes bitmap et celles dun autre objet ou dun point. la mthode BitmapData.hitTest() accepte cinq paramtres :

firstPoint

(Point) : ce paramtre rfrence la position du coin suprieur gauche du premier objet BitmapData sur lequel le test de collision doit tre effectu. (uint) : ce paramtre spcifie la valeur la plus leve du canal alpha considr comme tant opaque pour ce test de collision.

firstAlphaThreshold

secondObject (Object) : ce paramtre reprsente la zone dimpact. Lobjet secondObject peut tre un objet de type Rectangle, Point, Bitmap ou BitmapData. Cet objet reprsente la zone dans laquelle doit tre effectue la dtection de collision. secondBitmapDataPoint

(Point) : ce paramtre facultatif dfinit lemplacement dun pixel dans le deuxime objet BitmapData. Utilisez uniquement ce paramtre lorsque la valeur de secondObject est un objet BitmapData. La valeur par dfaut est null.

secondAlphaThreshold (uint) : ce paramtre facultatif reprsente la valeur la plus leve de canal alpha considre comme tant opaque dans le deuxime objet BitmapData. La valeur par dfaut est 1. Utilisez uniquement ce paramtre lorsque la valeur de secondObject est un objet BitmapData et que les deux objets BitmapData sont transparents.

Manipulation des pixels

579

Lors dune dtection de collision sur des images opaques, noubliez pas quActionScript traite limage comme si ctait un rectangle entirement opaque (ou un cadre de slection). Par ailleurs, lors de tests de collision au niveau des pixels pour des images qui sont transparentes, les deux images doivent tre transparentes. De plus, ActionScript utilise les paramtres de seuil alpha pour dterminer le point auquel les pixels passent de transparents opaques. Lexemple suivant cre trois images bitmap et teste une ventuelle collision de pixels en deux diffrents points (lun renvoie false, lautre true) :
import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Point; var bmd1:BitmapData = new BitmapData(100, 100, false, 0x000000FF); var bmd2:BitmapData = new BitmapData(20, 20, false, 0x00FF3300); var bm1:Bitmap = new Bitmap(bmd1); this.addChild(bm1); // Create a red square. var redSquare1:Bitmap = new Bitmap(bmd2); this.addChild(redSquare1); redSquare1.x = 0; // Create a second red square. var redSquare2:Bitmap = new Bitmap(bmd2); this.addChild(redSquare2); redSquare2.x = 150; redSquare2.y = 150; // Define the var pt1:Point // Define the var pt2:Point // Define the var pt3:Point point = new point = new point = new at the top-left corner of the bitmap. Point(0, 0); at the center of redSquare1. Point(20, 20); at the center of redSquare2. Point(160, 160);

trace(bmd1.hitTest(pt1, 0xFF, pt2)); // true trace(bmd1.hitTest(pt1, 0xFF, pt3)); // false

580

Utilisation des graphismes bitmap

Copie de donnes bitmap


Pour copier des donnes bitmap dune image une autre, plusieurs mthodes sont disponibles : clone(), copyPixels(), copyChannel() et draw(). Comme son nom lindique, la mthode clone() permet de cloner, ou chantillonner, des donnes bitmap dun objet BitmapData un autre. Cette mthode renvoie un nouvel objet BitmapData qui est un clone exact de linstance originale. Lexemple suivant clone une copie dun carr orange (parent) et place le clone ct du carr parent original :
import flash.display.Bitmap; import flash.display.BitmapData; var myParentSquareBitmap:BitmapData = new BitmapData(100, 100, false, 0x00ff3300); var myClonedChild:BitmapData = myParentSquareBitmap.clone(); var myParentSquareContainer:Bitmap = new Bitmap(myParentSquareBitmap); this.addChild(myParentSquareContainer); var myClonedChildContainer:Bitmap = new Bitmap(myClonedChild); this.addChild(myClonedChildContainer); myClonedChildContainer.x = 110;

La mthode copyPixels() permet de copier rapidement et aisment des pixels dun objet BitmapData dans un autre. Cette mthode prend un clich rectangulaire (dfini par le paramtre sourceRect) de limage source et le copie dans une autre zone rectangulaire de taille gale. Lemplacement du rectangle ainsi coll est dfini par le paramtre destPoint. La mthode copyChannel() analyse une valeur de canal de couleur prdfini (alpha, rouge, vert ou bleu) dans un objet source BitmapData et la copie dans un canal donn de lobjet BitmapData de destination. Cette mthode naffecte pas les autres canaux de lobjet BitmapData de destination. La mthode draw() dessine, ou affiche, le contenu graphique dun objet daffichage source (Sprite, Clip, etc.) dans un nouveau bitmap. Les paramtres matrix, colorTransform, blendMode et clipRect permettent de modifier laspect du nouveau bitmap. Cette mthode utilise le moteur daffichage vectoriel de Flash Player pour gnrer les donnes. Pour appeler la mthode draw(), vous devez lui passer lobjet source (tout objet daffichage.) comme premier paramtre, comme ci-dessous :
myBitmap.draw(movieClip);

Copie de donnes bitmap

581

Si des transformations (couleur, matrice, etc.) ont t appliques lobjet source aprs son chargement, ces transformations ne sont pas copies dans le nouvel objet. Pour copier les transformations dans le nouveau bitmap, vous devez copier la valeur de la proprit transform de lobjet original dans la proprit transform de lobjet Bitmap qui utilise le nouvel objet BitmapData.

Cration de textures avec les fonctions de bruit alatoire


Pour modifier laspect dun bitmap, vous pouvez lui appliquer un effet de bruit laide de la mthode noise() ou de la mthode perlinNoise(). La neige qui apparat sur lcran dun tlviseur mal rgl est du bruit, ou du souffle. Pour appliquer un effet de bruit un bitmap, utilisez la mthode noise(). Cette mthode applique une valeur colorimtrique alatoire aux pixels de la zone spcifie dune image bitmap. Cette mthode accepte cinq paramtres :

(int) : valeur alatoire de dpart qui dterminera le motif. En dpit du nom de ce paramtre, une mme valeur pour ce nombre produira toujours le mme rsultat. Pour obtenir un rsultat vritablement alatoire, utilisez la mthode Math.random() pour transmettre un nombre alatoire pour ce paramtre.
randomSeed low (uint) : ce paramtre reprsente la valeur la plus faible gnrer pour chaque pixel (de 0 255). Sa valeur par dfaut est 0. Les valeurs les plus basses produisent un motif de bruit sombre, les valeurs les plus leves produisent un motif de plus en plus clair. high (uint) : ce paramtre reprsente la valeur la plus leve gnrer pour chaque pixel (de 0 255). Sa valeur par dfaut est 255. Les valeurs les plus basses produisent un motif de bruit sombre, les valeurs les plus leves produisent un motif de plus en plus clair.

(uint) : ce paramtre indique le canal de couleur de lobjet bitmap auquel le motif de bruit sera appliqu. Ce nombre peut tre une combinaison quelconque des quatre valeurs des canaux de couleur (ARVB). La valeur par dfaut est 7.
channelOptions grayScale (Boolean) : lorsque ce paramtre est activ (true), la valeur de randomSeed est applique aux pixels du bitmap, ce qui donne concrtement un effet de dlav sur toutes les couleurs de limage. Le canal alpha nest pas affect par ce paramtre. La valeur par dfaut est false.

582

Utilisation des graphismes bitmap

Lexemple suivant cre une image bitmap et lui applique un motif de bruit bleu :
import flash.display.Bitmap; import flash.display.BitmapData; var myBitmap:BitmapData = new BitmapData(250, 250,false, 0xff000000); myBitmap.noise(500, 0, 255, BitmapDataChannel.BLUE,false); var image:Bitmap = new Bitmap(myBitmap); addChild(image);

Si vous souhaitez crer une texture daspect plus organique, utilisez la mthode perlinNoise(). La mthode perlinNoise() produit des textures organiques plus ralistes, qui sont idales pour des effets de fume, de nuage, deau, de flamme ou mme dexplosion. Comme la mthode perlinNoise() fait appel un algorithme, elle ncessite moins de mmoire vive que les textures base de bitmaps. Toutefois, elle peut malgr tout consommer beaucoup de ressources processeur, ce qui risque de ralentir le contenu Flash et de provoquer des rafrachissements dcran plus lents que la cadence nominale, en particulier sur les ordinateurs peu rcents. En effet, les algorithmes de cette mthode effectuent des calculs en virgule flottante. Cette mthode accepte neuf paramtres (les six premiers sont obligatoires) :

baseX baseY

(Number) : dtermine la valeur x (taille) des motifs crs. (Number) : dtermine la valeur y (taille) des motifs crs.

numOctaves

(uint) : nombre doctaves ou fonctions de bruit individuelles combiner pour crer ce bruit. Les nombres doctaves levs offrent davantage de dtails mais ncessitent galement un temps de traitement plus important.

(int) : la valeur alatoire de dpart fonctionne exactement comme dans la fonction noise(). Pour obtenir un rsultat vritablement alatoire, utilisez la mthode Math.random() pour transmettre un nombre alatoire pour ce paramtre.
randomSeed stitch (Boolean) : Si la valeur est true, cette mthode tente de lisser les bords de transition de limage pour crer des textures sans bords dfinis, en vue dune utilisation en mosaque.

(Boolean) : ce paramtre concerne les bords des dgrads gnrs par cette mthode. Sil a la valeur true, la mthode gnre un bruit fractal qui adoucit le pourtour. Sil a la valeur false, la mthode gnre des turbulences. Les dgrads dune image cre avec des turbulences prsentent des discontinuits visibles qui permettent de mieux restituer certains effets visuels comme les flammes ou les vagues.
fractalNoise

(uint) : le paramtre channelOptions fonctionne exactement comme dans la mthode noise(). Il indique le canal de couleur de lobjet bitmap auquel le motif de bruit sera appliqu. Ce nombre peut tre une combinaison quelconque des quatre valeurs des canaux de couleur (ARVB). La valeur par dfaut est 7.
channelOptions

Cration de textures avec les fonctions de bruit alatoire

583

grayScale (Boolean) : le paramtre grayScale fonctionne exactement comme dans la mthode noise(). Si ce paramtre est activ (true), la valeur de randomSeed est applique aux pixels du bitmap, ce qui donne concrtement un effet de dlav sur toutes les couleurs de limage. La valeur par dfaut est false. offsets (Array) : tableau de points correspondant aux dcalages x et y pour chaque octave. En modifiant les valeurs de dcalage, vous pouvez faire dfiler en continu les calques dune image. Chaque point du tableau de dcalage affecte une fonction de bruit pour un octave spcifique. La valeur par dfaut est null.

Lexemple suivant cre un objet BitmapData de 150 x 150 pixels qui appelle la mthode perlinNoise() pour gnrer un effet de nuage vert et bleu :
import flash.display.Bitmap; import flash.display.BitmapData; var myBitmapDataObject:BitmapData = new BitmapData(150, 150, false, 0x00FF0000); var seed:Number = Math.floor(Math.random() * 100); var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE myBitmapDataObject.perlinNoise(100, 80, 6, seed, false, true, channels, false, null); var myBitmap:Bitmap = new Bitmap(myBitmapDataObject); addChild(myBitmap);

Dfilement du contenu dimages bitmap


Supposons que vous avez cr une application cartographique. Chaque fois que lutilisateur dplace la carte, vous devez actualiser laffichage (mme si le plan na t dplac que de quelques pixels). Pour obtenir cette fonctionnalit, il est possible de rafficher une nouvelle image contenant le plan actualis chaque dplacement. Mais il est galement possible de crer une grande image globale et dutiliser la mthode scroll(). La mthode scroll() copie une image bitmap affiche et la colle un nouvel emplacement, spcifi par les paramtres x, y. Sil se trouve quune partie de limage est situe hors cran, leffet obtenu est celui dun dfilement de limage. Si cette fonction est combine avec un timer (ou un vnement enterFrame), limage semble anime.

584

Utilisation des graphismes bitmap

Lexemple suivant reprend lexemple prcdent et gnre une image bitmap de grande taille (dont les trois-quarts sont restitus hors scne). La mthode scroll() est alors applique. Grce un couteur pour lvnement enterFrame, limage est dcale dun pixel en diagonale vers le bas. Cette mthode est appele pour chaque nouvelle image dans la scne. Les parties de limage non affiches initialement apparaissent alors peu peu grce ce dfilement.
import flash.display.Bitmap; import flash.display.BitmapData; var myBitmapDataObject:BitmapData = new BitmapData(1000, 1000, false, 0x00FF0000); var seed:Number = Math.floor(Math.random() * 100); var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE; myBitmapDataObject.perlinNoise(100, 80, 6, seed, false, true, channels, false, null); var myBitmap:Bitmap = new Bitmap(myBitmapDataObject); myBitmap.x = -750; myBitmap.y = -750; addChild(myBitmap); addEventListener(Event.ENTER_FRAME, scrollBitmap); function scrollBitmap(event:Event):void { myBitmapDataObject.scroll(1, 1); }

Exemple : animation dobjets Sprite laide dune image bitmap hors cran
De nombreux jeux sous Flash ncessitent lanimation simultane de centaines dimages lcran. Cet exemple danimation base de bitmaps trace plusieurs centaines de petits bitmaps (sprites) dans une image bitmap de grandes dimensions hors cran, puis affiche cette dernire lcran, ce qui acclre beaucoup lanimation. Pour lire une description de cet exemple et tlcharger son code source, consultez la page http://www.adobe.com/go/learn_fl_bitmaps_fr.

Exemple : animation dobjets Sprite laide dune image bitmap hors cran

585

586

Utilisation des graphismes bitmap

CHAPITRE 19

Utilisation de la vido
La vido avec Flash est lune des technologies dominantes de lInternet. Toutefois, linterface traditionnelle de la vido, dans un cran rectangulaire avec une barre de progression surmontant des boutons de contrle, nest que lun des usages possibles de la vido dans une application Flash. En ActionScript, il est possible de contrler avec prcision le chargement, la prsentation et la lecture dune vido.

19

Sommaire
Principes de base de la vido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .588 Prsentation du format vido Flash (FLV) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591 Prsentation de la classe Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592 Chargement de fichiers vido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 Contrle de la lecture de la vido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594 Lecture de fichiers vido en flux continu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 Prsentation des points de repre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .597 Cration de mthodes de rappel pour les gestionnaires dvnements onCuePoint et onMetaData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598 Utilisation des points de repre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604 Utilisation des mtadonnes de la vido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 Capture dun signal vido provenant de la camra de lutilisateur . . . . . . . . . . . . . 609 Rubriques avances :. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617 Exemple : Video Jukebox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619

587

Principes de base de la vido


Introduction lutilisation de la vido
La possibilit de lire et manipuler des informations vido en ActionScript, au mme titre que les autres lments multimdia (images, texte, animations, etc.) est lune des importantes caractristiques dAdobe Flash Player. Lorsque vous crez un fichier vido Flash (FLV) dans Adobe Flash CS3 Professional, vous avez la possibilit de slectionner un habillage, ou enveloppe , comportant les contrles de lecture courants. Toutefois, vous ntes pas limit aux options disponibles. ActionScript offre un contrle prcis du chargement, de laffichage et de la lecture de la vido, et vous pouvez crer votre propre enveloppe ou utiliser une vido de faon beaucoup moins traditionnelle. La gestion de la vido en ActionScript ncessite de travailler avec une combinaison de diverses classes :

La classe Video : le contenu vido affich sur la scne est une instance de la classe Video. La classe Video est un objet daffichage, il est donc possible de le manipuler laide des mmes techniques que les autres objets daffichage (positionnement, application de transformations, de filtres et de modes de fusion, etc.) La classe NetStream : Lorsque vous chargez un fichier vido qui doit tre contrl en ActionScript, une instance de NetStream reprsente la source du contenu vido (dans ce cas prcis, un flux de donnes vido). Lutilisation dune instance de NetStream ncessite dutiliser galement un objet NetConnection, qui assure la connexion avec le fichier vido, comme un tunnel quemprunteraient les donnes vido. La classe Camera : Si vous devez grer des donnes provenant dune camra connecte lordinateur de lutilisateur, une instance de Camera reprsente la source du contenu vido (la camra de lutilisateur et les donnes vido quelle transmet).

Pour charger un fichier vido externe, vous pouvez charger ce fichier partir dun serveur Web standard (tlchargement progressif ) ou grer de la vido en flux continu transmise par un serveur spcialis tel que Macromedia Flash Media Server dAdobe.

588

Utilisation de la vido

Tches courantes dutilisation de la vido


Voici quelques tches courantes relatives la vido qui sont prsentes dans ce chapitre :

Affichage et contrle dune vido Chargement de fichiers FLV externes Gestion des mtadonnes et des points de repre dans un fichier vido Capture et affichage dun signal vido provenant de la camra de lutilisateur

Concepts importants et terminologie

Point de repre : marqueur quil est possible de placer en un point spcifique dun fichier vido, par exemple pour lutiliser comme signet pour reprer ce point partir du dbut de la vido ou pour fournir des donnes supplmentaires associes ce moment de la vido. Encodage : processus de conversion de donnes vido dun format dans un autre format ido. Par exemple, la conversion dune source vido en haute rsolution dans un format plus adapt la diffusion sur lInternet. Image : lment de base des informations vido. Chaque image est une image fixe identique un clich photographique reprsentant un moment prcis. La lecture en squence vitesse leve de ces images fixes donne lillusion du mouvement. Image-cl : image vido qui contienr lensemble des informations dimage. Les autres images qui suivent une image-cl ne contiennent que les informations dcrivant leurs diffrences par rapport limage-cl, et non pas les informations dimage compltes. Mtadonnes : informations sur un fichier vido qui peuvent tre intgres ce fichier et lues aprs son chargement. Tlchargement progressif : lorsquun fichier vido est transmis par un serveur Web standard, les donnes vido sont charges en mode progressif, cest--dire en squences. Lavantage est quil est possible de commencer diffuser la vido avant la fin du tlchargement complet. Toutefois, il est alors impossible de passer directement une partie de la vido qui na pas encore t charge. Diffusion continue : pour viter le tlchargement progressif, il est possible dutiliser un serveur vido spcial pour diffuser de la vido sur lInternet selon une technique connue sous le nom de flux continu, ou streaming. Avec la diffusion en flux continu, lordinateur client ne charge jamais toute la vido la fois. Pour acclrer les lais de chargement, lordinateur na besoin, un moment donn, que dune partie de lensemble des informations vido. Comme un serveur spcial contrle la diffusion du contenu vido, une partie quelconque de celle-ci peut tre transmise tout moment, et il nest donc pas ncessaire dattendre quelle soit charge pour y accder.

Principes de base de la vido

589

Utilisation des exemples des chapitres


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Etant donn que ce chapitre traite de lutilisation de la vido dans ActionScript, un grand nombre dexemples de code de ce chapitre impliquent lutilisation dun objet vido (cr et plac sur la scne dans loutil de programmation Flash, ou cr laide dActionScript). Pour tester un exemple, il est ncessaire dafficher son rsultat dans Flash Player pour voir leffet du code sur la vido. La plupart de ces exemples manipulent un objet Video sans lavoir cr explicitement. Pour tester les exemples de code de ce chapitre :
1. 2. 3. 4. 5. 6.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code de lexemple dans la fentre de script : Si ncessaire, ouvrez le panneau Bibliothque. Dans le menu du panneau Bibliothque, choisissez Nouvelle vido. Dans la bote de dialogue Proprits vido, nommez le symbole vido et, dans le champ Type, choisissez Vido (contrl par ActionScript). Cliquez sur OK pour crer le symbole de lobjet Video. Faites glisser une occurrence de ce symbole du panneau Bibliothque jusqu la scne. Laissez cette occurrence slectionne et, dans linspecteur Proprits, donnez-lui un nom dinstance. Le nom doit correspondre au nom utilis pour loccurrence dans lexemple de code (par exemple, si le code manipule un objet vido vid, vous devez appeler votre instance Stage vid galement). Choisissez Contrle > Tester lanimation pour excuter le programme. Vous verrez lcran le rsultat du code de lexemple.

7. 8.

9.

Outre lexemple de code proprement parler, certains listings de ce chapitre comportent la dfinition dune classe. Dans ces exemples de code, outre les tapes prcdentes, et avant de tester le fichier SWF, vous devrez crer la classe utilise dans lexemple. Pour crer une classe dfinie dans un exemple de code :
1. 2. 3.

Enregistrez le fichier FLA qui sera utilis pour le test. Dans le menu principal, choisissez Fichier > Nouveau. Dans la section Type de la bote de dialogue Nouveau document, choisissez Fichier ActionScript. Cliquez sur OK pour crer le nouveau fichier ActionScript. Copiez dans le document ActionScript le code de dfinition de la classe dans lexemple.

4.

590

Utilisation de la vido

5.

Dans le menu principal, choisissez Fichier > Enregistrer. Enregistrez le fichier dans le mme rpertoire que le document Flash. Le nom du fichier doit correspondre au nom de la classe du code. Par exemple, si le listing dfinit une classe nomme VideoTest , enregistrez le fichier ActionScript sous le nom VideoTest.as . Retournez dans le document Flash. Choisissez Contrle > Tester lanimation pour excuter le programme. Les rsultats de lexemple apparaissent lcran.

6. 7.

Diverses autres techniques permettant de tester les exemples de code sont expliques dans la section Test des exemples de code contenus dans un chapitre , la page 67.

Prsentation du format vido Flash (FLV)


Le format vido FLV contient des donnes audio et vido encodes pour un acheminement via Flash Player. Par exemple, si vous avez un fichier vido QuickTime ou Windows Media, vous utilisez un encodeur (tel que Flash Video Encoder ou Sorensen Squeeze) pour convertir ce fichier en fichier FLV. Vous pouvez crer des fichiers FLV en important la vido dans loutil de cration Flash et en lexportant sous forme dun fichier FLV. Vous pouvez utiliser le module dexportation FLV pour exporter des fichiers FLV partir des applications de montage vido prises en charge. Lutilisation des fichiers FLV externes offre certaines fonctionnalits qui ne sont pas disponibles avec lutilisation de la vido importe :

Les clips vido longs peuvent tre utiliss dans les documents Flash sans ralentir la lecture. Les fichiers FLV externes sont lus laide de la mmoire cache, ce qui signifie que les fichiers volumineux sont enregistrs en petites parties et sont accessibles dynamiquement. Ils ncessitent donc moins de mmoire que les fichiers vido intgrs. Un fichier FLV externe peut avoir une cadence diffrente de celle du document Flash dans lequel il est lu. Par exemple, vous pouvez dfinir la cadence du document Flash sur 30 i/s (images par seconde) et celle de limage vido sur 21 i/s. Ce rglage vous offre un meilleur contrle de la vido que la vido intgre, pour assurer une lecture vido fluide. Il permet aussi de lire les fichiers FLV diffrentes cadences dimages sans avoir altrer un contenu Flash existant. Avec les fichiers FLV externes, la lecture du document Flash na pas besoin dtre interrompue pendant le chargement du fichier vido. Les fichiers vido imports peuvent parfois interrompre la lecture du document pour excuter certaines fonctions, par exemple pour accder un lecteur de CD-ROM. Les fichiers FLV peuvent excuter des fonctions indpendamment du document Flash, ce qui ninterrompt pas la lecture.

Prsentation du format vido Flash (FLV)

591

Le sous-titrage du contenu vido est plus facile avec les fichiers FLV externes, car les gestionnaires dvnements permettent daccder aux mtadonnes de la vido.
C ON S E I L

Pour charger des fichiers FLV partir dun serveur Web, il peut tre ncessaire denregistrer lextension de fichier et le type MIME auprs de votre serveur Web. Pour ce faire, consultez la documentation du serveur. Le type MIME des fichiers FLV est video/x-flv. Pour plus dinformations, consultez la section La configuration de fichier FLV pour lhbergement sur un serveur , la page 618.

Prsentation de la classe Video


La classe Video permet dafficher un flux vido en direct dans une application sans limbriquer dans un fichier SWF. Vous pouvez capturer et lire du contenu vido en direct laide de la mthode Camera.getCamera(). Vous pouvez galement utiliser la classe Video pour lire les fichiers Flash Video (FLV) en HTTP ou sur le systme de fichiers local. Il existe plusieurs faons dutiliser la classe Video dans vos projets.

Chargement dynamique dun fichier FLV laide des classes NetConnection et NetStream, et affichage de la vido dans un objet Video. Capture du signal provenant de la camra de lutilisateur. Utiliser le composant FLVPlayback
Les instances dun objet Video sur la scne sont des instances de la classe Video.

Bien que la classe Video se trouve dans le paquet flash.media, elle hrite de la classe flash.display.DisplayObject, si bien que toutes les fonctionnalits des objets daffichage (transformation de matrice et filtres par exemple) sappliquent aussi aux instances de lobjet Video. Pour plus dinformations, consultez les sections Manipulation des objets daffichage , la page 420, Utilisation de la gomtrie , la page 459 et Filtrage des objets daffichage , la page 495.

592

REMARQUE

Utilisation de la vido

Chargement de fichiers vido


Le chargement de fichiers vido laide des classes NetStream et NetConnection seffectue en plusieurs tapes.
1.

La premire opration consiste crer un objet NetConnection. La classe NetConnection permet de lire des fichiers FLV partir dune adresse HTTP ou dun lecteur local en passant la valeur null la mthode connect(), si vous tes connect un fichier FLV local sans utiliser de serveur tel quAdobe Flash Media Server 2 ou Adobe Flex.
var nc:NetConnection = new NetConnection(); nc.connect(null);

2.

La seconde tape consiste crer un objet NetStream qui reoit en paramtre un objet NetConnection, et spcifier le fichier FLV charger. Le fragment de code ci-dessous connecte un objet NetStream linstance de NetConnection spcifie et charge le fichier FLV video.flv , qui se trouve dans le mme rpertoire que le fichier SWF :
var ns:NetStream = new NetStream(nc); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); ns.play("video.flv"); function asyncErrorHandler(event:AsyncErrorEvent):void { // ignorer une erreur }

3.

La troisime tape consiste crer un objet Video et lui affecter lobjet NetStream prcdemment cr laide de la mthode attachNetStream() de la classe Video. Vous pouvez ensuite ajouter lobjet vido la liste daffichage laide de la mthode addChild(), comme dans lexemple ci-dessous :
var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

Lors de lexcution du code ci-dessus, Flash Player tente de charger le fichier video.flv partir du mme rpertoire que le fichier SWF.
C ON S E I L

Pour charger des fichiers FLV partir dun serveur Web, il peut tre ncessaire denregistrer lextension de fichier et le type MIME auprs de votre serveur Web. Pour ce faire, consultez la documentation du serveur. Le type MIME des fichiers FLV est video/ x-flv. Pour plus dinformations, consultez la section La configuration de fichier FLV pour lhbergement sur un serveur , la page 618.

Chargement de fichiers vido

593

Contrle de la lecture de la vido


La classe NetStream comporte quatre mthodes principales pour contrler la lecture vido :
pause()

: interrompt la lecture dun flux vido. Si la lecture de la vido est dj en pause, lappel de cette mthode na aucun effet.

resume()

: reprend la lecture dun flux vido en pause. Si la vido est en cours de lecture, lappel de cette mthode na aucun effet.

: recherche limage-cl la plus proche de lemplacement spcifi (dcalage, exprim en secondes, par rapport au dbut du flux vido).
seek() togglePause()
REMARQUE 594 REMARQUE

: interrompt ou reprend la lecture dun flux vido.

Il nexiste pas de mthode stop(). Pour arrter la lecture de la vido, il est ncessaire de la mettre en pause et de retourner au dbut du flux vido.

La mthode play() ne reprend pas la lecture, elle est destine au chargement de fichiers vido.

Lexemple suivant montre comment contrler la lecture dune vido laide de divers boutons. Pour excuter cet exemple, crez un document et ajoutez quatre instances de boutons lespace de travail (pauseBtn, playBtn, stopBtn et togglePauseBtn):
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); ns.play("video.flv"); function asyncErrorHandler(event:AsyncErrorEvent):void { // ignorer une erreur } var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid); pauseBtn.addEventListener(MouseEvent.CLICK, pauseHandler); playBtn.addEventListener(MouseEvent.CLICK, playHandler); stopBtn.addEventListener(MouseEvent.CLICK, stopHandler); togglePauseBtn.addEventListener(MouseEvent.CLICK, togglePauseHandler);

Utilisation de la vido

function pauseHandler(event:MouseEvent):void { ns.pause(); } function playHandler(event:MouseEvent):void { ns.resume(); } function stopHandler(event:MouseEvent):void { // mettre la lecture en pause et dplacer la tte de lecture au. // dbut du flux vido. ns.pause(); ns.seek(0); } function togglePauseHandler(event:MouseEvent):void { ns.togglePause(); }

Un clic sur linstance de bouton pauseBtn pendant la lecture de la ido provoque la mise en pause de celle-ci. Si la lecture de la vido est dj en pause, lappel de cette mthode na aucun effet. Un clic sur linstance de playBtn reprend la lecture de la vido si celle-ci tait en pause, sinon ce bouton na aucun effet.

Dtection de la fin dun flux vido


Pour afficher le dbut et la fin dun flux vido, vous devez ajouter linstance de NetStream un couteur pour lvnement netStatus. Lexemple suivant montre comment couter les divers codes pendant la lecture de la vido :
ns.addEventListener(NetStatusEvent.NET_STATUS, statusHandler); function statusHandler(event:NetStatusEvent):void { trace(event.info.code) }

Le code prcdent affiche le rsultat suivant :


NetStream.Play.Start NetStream.Buffer.Empty NetStream.Buffer.Full NetStream.Buffer.Empty NetStream.Buffer.Full NetStream.Buffer.Empty NetStream.Buffer.Full NetStream.Buffer.Flush NetStream.Play.Stop NetStream.Buffer.Empty NetStream.Buffer.Flush

Contrle de la lecture de la vido

595

Les deux codes dvnement quil est ncessaire dcouter sont NetStream.Play.Start et NetStream.Play.Stop , qui signalent le dbut et la fin de la lecture de la vido. Lexemple suivant utilise une instruction switch pour filtrer ces deux codes et mettre un message :
function statusHandler(event:NetStatusEvent):void { switch (event.info.code) { case "NetStream.Play.Start": trace("Start [" + ns.time.toFixed(3) + " secondes]"); break; case "NetStream.Play.Stop": trace("Stop [" + ns.time.toFixed(3) + " secondes]"); break; } }

En coutant lvnement netStatus (NetStatusEvent.NET_STATUS), vous pouvez crer un lecteur vido qui chargera la vido suivante dans une liste de lecture lorsque la vido en cours sera termine.

Lecture de fichiers vido en flux continu


Pour effectuer une lecture en flux continu partir dun serveur Flash Media Server, vous pouvez utiliser les classes NetConnection et NetStream pour tablir la connexion avec une instance du serveur distant et lire le flux spcifi. Pour spcifier un serveur RTMP, il suffit de passer lURL RTMP dsire, par exemple rtmp://localhost/appName/appInstance la mthode NetConnection.connect() au lieu de lui passer la valeur null. Pour lire un flux vido direct ou enregistr partir du serveur Flash Media Server spcifi, passez soit un identifiant (pour le signal vido en direct publi par NetStream.publish()), soir le nom du fichier enregistr, la mthode NetStream.play(). Pour plus dinformations, consultez la documentation de Flash Media Server.

596

Utilisation de la vido

Prsentation des points de repre


Les fichiers FLV ne contiennent pas tous des points de repre. Les points de repre sont gnralement intgrs au fichier FLV durant lencodage FLV, mais des utilitaires permettent den ajouter dans des fichiers FLV existants. Vous pouvez utiliser plusieurs types de points de repre avec Flash Video. ActionScript permet dinteragir avec les points de repre que vous intgrez dans un fichier FLV (lorsque vous crez le fichier FLV), ou que vous crez en ActionScript.

Points de repre de navigation : les points de repre de navigation sont intgrs dans le flux FLV et le paquet de mtadonnes FLV lors de lencodage du fichier FLV. Les points de repre de navigation permettent aux utilisateurs de rechercher une partie spcifique dun fichier. Points de repre dvnements : les points de repre dvnements sont intgrs dans le flux FLV et le paquet de mtadonnes FLV lors de lencodage du fichier FLV. Il est possible dcrire du code pour grer les vnements qui sont dclenchs aux points spcifis pendant la lecture. Points de repre ActionScript : ces points de repre externes sont crs en code ActionScript. Du code permet de dclencher ces points de repre en fonction de la lecture vido. Ces points de repre sont moins prcis que les points de repre intgrs (jusqu un dixime de seconde), car le lecteur vido les analyse sparment.

Les points de repre de navigation crent une image-cl lemplacement spcifi, pour permettre de dplacer la tte de lecture du lecteur vido cet emplacement. Vous pouvez dfinir des points particuliers dans un fichier FLV, pour permettre aux utilisateurs datteindre un emplacement prcis. Par exemple, si votre vido contient plusieurs chapitres et segments, vous pouvez la contrler en intgrant des points de repre de navigation dans le fichier vido. Si vous avez lintention de crer une application dans laquelle il sera possible datteindre un point de repre, crez et intgrez les points de repre lors de lencodage du fichier, au lieu dutiliser des points de repre ActionScript. Il est prfrable dintgrer les points de repre dans le fichier FLV, car ils sont alors plus prcis. Pour plus dinformations sur lencodage de fichiers FLV avec des points de repre, consultez la section Insertion de points de repre du guide Utilisation de Flash. Vous pouvez accder aux paramtres des points de repre laide de code ActionScript. Les paramtres de points de repre font partie de lobjet dvnement reu du gestionnaire de rappel onCuePoint. Le gestionnaire dvnement NetStream.onCuePoint permet de dclencher certaines actions dans votre code lorsque le fichier vido atteint un point de repre spcifique. Pour plus dinformations, consultez la section Cration de mthodes de rappel pour les gestionnaires dvnements onCuePoint et onMetaData , la page 598.

Prsentation des points de repre

597

Cration de mthodes de rappel pour les gestionnaires dvnements onCuePoint et onMetaData


Vous pouvez dclencher des actions dans votre application lorsque des points de repre spcifiques sont atteints, ou lorsque des mtadonnes spcifiques sont reues par le lecteur. Les gestionnaires dvnements onCuePoint et onMetaData permettent de dclencher ces actions. Si vous ne crez pas de mthodes de rappel pour ces gestionnaires, Flash Player est susceptible de gnrer des erreurs. Par exemple, le code ci-dessous lit le fichier FLV video.flv situ dans le mme dossier que le document SWF :
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); ns.play("video.flv"); function asyncErrorHandler(event:AsyncErrorEvent):void { trace(event.text); } var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

Le code ci-dessus charge un fichier FLV local nomm video.flv et attend la diffusion de lvnement asyncError (AsyncErrorEvent.ASYNC_ERROR). Cet vnement est diffus lorsquune exception est renvoye par du code asynchrone. Dans notre cas, elle est diffuse lorsquun fichier FLV contient des mtadonnes ou des informations de point de repre et que les couteurs dvnement appropris nont pas t dfinis. Le code ci-dessus gre lvnement asyncError et ignore lerreur si vous ntes pas intress par les mtadonnes ou les informations de point de repre. Si votre fichier FLV contient des mtadonnes ou des informations de point de repre, les informations suivantes sont recueillies :
Error Error Error Error #2095: #2095: #2095: #2095: flash.net.NetStream flash.net.NetStream flash.net.NetStream flash.net.NetStream was was was was unable unable unable unable to to to to invoke invoke invoke invoke callback callback callback callback onMetaData. onCuePoint. onCuePoint. onCuePoint.

598

Utilisation de la vido

Lerreur est renvoye parce que lobjet NetStream na pas trouv de mthode de rappel pour onMetaData ou onCuePoint. Il existe plusieurs faons de dfinir ces mthodes de rappel dans une application.

Dfinir la proprit client de lobjet NetStream comme Object Crer une classe et dfinir des mthodes pour grer les mthodes de rappel tendre la classe NetStream et lui ajouter des mthodes pour grer les mthodes de rappel tendre la classe NetStream et la rendre dynamique Dfinir la proprit client de lobjet NetStream comme this

Dfinir la proprit client de lobjet NetStream comme Object


En dfinissant la proprit client comme tant soit un object, soit une sous-classe de NetStream, vous pouvez re-router les mthodes de rappel de onMetaData et onCuePoint ou les ignorer totalement. Lexemple suivant montre comment utiliser un objet vide pour ignorer les mthodes de rappel sans couter lvnement asyncError :
var nc:NetConnection = new NetConnection(); nc.connect(null); var customClient:Object = new Object(); var ns:NetStream = new NetStream(nc); ns.client = customClient; ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

Pour couter les mthodes de rappel de onMetaData ou onCuePoint, il est ncessaire de dfinir des mthodes pour les grer, comme dans le code suivant :
var customClient:Object = new Object(); customClient.onMetaData = metaDataHandler; function metaDataHandler(infoObject:Object):void { trace("metadata"); }

Le code ci-dessus coute la mthode de rappel de onMetaData et appelle la mthode metaDataHandler(), qui renvoie une chane. Si Flash Player trouve un point de repre, aucune erreur nest renvoye bien quaucune mthode de rappel de onCuePoint ne soit dfinie.

Cration de mthodes de rappel pour les gestionnaires dvnements onCuePoint et onMetaData

599

Crer une classe et dfinir des mthodes pour grer les mthodes de rappel
Le code suivant dfinit la proprit client de lobjet NetStream comme tant une classe personnalise, CustomClient, qui dfinit des gestionnaires pour les mthodes de rappel :
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.client = new CustomClient(); ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

La classe CustomClient contient le code suivant :


package { public class CustomClient { public function onMetaData(infoObject:Object):void { trace("metadata"); } } }

La classe CustomClient dfinit un gestionnaire pour le rappel de onMetaData. Si un point de repre est dtect et que le gestionnaire de rappel de onCuePoint est appel, un vnement asyncError (AsyncErrorEvent.ASYNC_ERROR) est distribu pour informer que flash.net.NetStream na pas pu appeler de rappel pour onCuePoint. Pour viter lapparition de cette erreur, il est ncessaire de dfinir soit une mthode de rappel de onCuePoint dans la classe CustomClient, soit un gestionnaire dvnement pour lvnement asyncError.

600

Utilisation de la vido

tendre la classe NetStream et lui ajouter des mthodes pour grer les mthodes de rappel
Le code suivant cre une instance de la classe CustomNetStream, qui sera dfinie ultrieurement, ci-dessous :
var ns:CustomNetStream = new CustomNetStream(); ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

Le code suivant dfinit la classe CustomNetStream qui tend la classe NetStream, prend en charge la cration de lobjet NetConnection ncessaire et gre les mthodes de rappel de onMetaData et onCuePoint :
package { import flash.net.NetConnection; import flash.net.NetStream; public class CustomNetStream extends NetStream { private var nc:NetConnection; public function CustomNetStream() { nc = new NetConnection(); nc.connect(null); super(nc); } public function onMetaData(infoObject:Object):void { trace("metadata"); } public function onCuePoint(infoObject:Object):void { trace("cue point"); } } }

Cration de mthodes de rappel pour les gestionnaires dvnements onCuePoint et onMetaData

601

Si vous souhaitez renommer les mthodes onMetaData() et onCuePoint() de la classe CustomNetStream, utilisez le code suivant :
package { import flash.net.NetConnection; import flash.net.NetStream; public class CustomNetStream extends NetStream { private var nc:NetConnection; public var onMetaData:Function; public var onCuePoint:Function; public function CustomNetStream() { onMetaData = metaDataHandler; onCuePoint = cuePointHandler; nc = new NetConnection(); nc.connect(null); super(nc); } private function metaDataHandler(infoObject:Object):void { trace("metadata"); } private function cuePointHandler(infoObject:Object):void { trace("cue point"); } } }

tendre la classe NetStream et la rendre dynamique


Vous pouvez tendre la classe NetStream en crant une sous-classe dynamique afin de pouvoir ajouter dynamiquement les gestionnaires de rappel de onCuePoint et onMetaData. Le code suivant en fait la dmonstration :
var ns:DynamicCustomNetStream = new DynamicCustomNetStream(); ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

602

Utilisation de la vido

La classe DynamicCustomNetStream contient le code suivant :


package { import flash.net.NetConnection; import flash.net.NetStream; public dynamic class DynamicCustomNetStream extends NetStream { private var nc:NetConnection; public function DynamicCustomNetStream() { nc = new NetConnection(); nc.connect(null); super(nc); } } }

Mme sans gestionnaire pour le rappel de onMetaData et onCuePoint, aucune erreur nest renvoye puisque la classe DynamicCustomNetStream est dynamique. Si vous souhaitez dfinir des mthodes pour les gestionnaires de rappel de onMetaData() et onCuePoint(), utilisez le code suivant :
var ns:DynamicCustomNetStream = new DynamicCustomNetStream(); ns.onMetaData = metaDataHandler; ns.onCuePoint = cuePointHandler; ns.play("http://www.helpexamples.com/flash/video/cuepoints.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid); function metaDataHandler(infoObject:Object):void { trace("metadata"); } function cuePointHandler(infoObject:Object):void { trace("cue point"); }

Cration de mthodes de rappel pour les gestionnaires dvnements onCuePoint et onMetaData

603

Dfinir la proprit client de lobjet NetStream comme this


En donnant la proprit client la valeur this, Flash Player recherche dans la porte des mthodes onMetaData() et onCuePoint(). Le code suivant en est un exemple :
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.client = this; ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

Si les gestionnaires de rappel de onMetaData ou onCuePoint sont appels et quil nexiste pas de mthode pour grer le rappel, aucune erreur nest gnre. Pour grer ces gestionnaires de rappel, crez des mthodes onMetaData() et onCuePoint() dans votre code, comme ci-dessous :
function onMetaData(infoObject:Object):void { trace("metadata"); } function onCuePoint(infoObject:Object):void { trace("cue point"); }

Utilisation des points de repre


Lexemple suivant fait appel ne simple boucle for..in pour parcourir toutes les proprits du paramtre infoObject du gestionnaire de rappel onCuePoint et mettre un message lorsque des donnes de point de repre sont reues :
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.client = this; ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid);

604

Utilisation de la vido

function onCuePoint(infoObject:Object):void { var key:String; for (key in infoObject) { trace(key + ": " + infoObject[key]); } }

Le rsultat suivant apparat :


parameters: name: point1 time: 0.418 type: navigation

Ce code utilise lune des diverses techniques disponibles pour dfinir lobjet pour lequel la mthode de rappel a t appele. Vous pouvez prfrer dautres techniques. Pour plus dinformations, consultez la section Cration de mthodes de rappel pour les gestionnaires dvnements onCuePoint et onMetaData.

Utilisation des mtadonnes de la vido


Vous pouvez utiliser le gestionnaire de rappel onMetaData pour afficher les informations de mtadonnes de votre fichier FLV. Ces mtadonnes comprennent des informations sur le fichier FLV (dure, largeur et hauteur dimage et cadence). Les informations de mtadonnes qui sont ajoutes au fichier FLV dpendent du logiciel utilis pour lencoder, ou du logiciel utilis pour lui ajouter ces informations.
var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.client = this; ns.play("video.flv"); var vid:Video = new Video(); vid.attachNetStream(ns); addChild(vid); function onMetaData(infoObject:Object):void { var key:String; for (key in infoObject) { trace(key + ": " + infoObject[key]); } }

Utilisation des mtadonnes de la vido

605

Le code ci-dessus gnre un code similaire celui qui suit, en supposant que le fichier FLV contient des points de repre et de laudio :
width: 320 audiodelay: 0.038 canSeekToEnd: true height: 213 cuePoints: ,, audiodatarate: 96 duration: 16.334 videodatarate: 400 framerate: 15 videocodecid: 4 audiocodecid: 2
C O N S E IL 606

Si la vido ne contient pas de son, les informations de mtadonnes associes laudio (telles que audiodatarate) renvoient undefined, car aucune information audio nest ajoute aux mtadonnes pendant lencodage.

Dans le code ci-dessus, les informations de point de repre ntaient pas affiches. Pour afficher les informations de point de repre, utilisez la fonction suivante, qui affiche de faon rcursive les lments dun objet :
function traceObject(obj:Object, indent:uint = 0):void { var indentString:String = ""; var i:uint; var prop:String; var val:*; for (i = 0; i < indent; i++) { indentString += "\t"; } for (prop in obj) { val = obj[prop]; if (typeof(val) == "object") { trace(indentString + " " + j + ": [Object]"); traceObject(val, indent + 1); } else { trace(indentString + " " + prop + ": " + val); } } }

Utilisation de la vido

Lutilisation du code ci-dessus pour suivre le paramtre infoObject de la mthode onMetaData() produit laffichage suivant :
width: 320 audiodatarate: 96 audiocodecid: 2 videocodecid: 4 videodatarate: 400 canSeekToEnd: true duration: 16.334 audiodelay: 0.038 height: 213 framerate: 15 cuePoints: [Object] 0: [Object] parameters: [Object] lights: beginning name: point1 time: 0.418 type: navigation 1: [Object] parameters: [Object] lights: middle name: point2 time: 7.748 type: navigation 2: [Object] parameters: [Object] lights: end name: point3 time: 16.02 type: navigation

Objets Info pour onMetaData


Le tableau suivant rpertorie les valeurs possibles des mtadonnes vido :
:

Paramtre
audiocodecid audiodatarate audiodelay

Description
Nombre qui indique le codec audio (technique de codage/ dcodage) utilis. Nombre qui indique le taux dencodage du son, en kO/s. Nombre qui indique lheure dans le fichier FLV de la valeur time 0 de ce fichier. Le contenu vido doit tre lgrement retard pour synchroniser correctement laudio.

Utilisation des mtadonnes de la vido

607

Paramtre
canSeekToEnd

Description
Valeur boolenne qui est dfinie sur true si le fichier FLV est cod avec une image-cl sur la dernire image qui permet de rechercher jusqu la fin dun clip tlcharg progressivement. Elle est dfinie sur false si le fichier FLV nest pas cod avec une image-cl sur la dernire image. Tableau dobjets (un par point de repre intgr dans le fichier FLV). Cette valeur nest pas dfinie si le fichier FLV ne contient pas de points de repre. Chaque objet possde les proprits cidessous :

cuePoints

type: chane qui spcifie le type de point de repre ( navigation ou

event ).

name: chane reprsentant le nom du point de repre. time : nombre correspondant au code horaire du point de repre

(en secondes) avec une prcision de trois dcimales (millisecondes).

parameters : objet facultatif possdant des paires nom/valeur dsignes par

lutilisateur lors de la cration des points de repre. duration framerate height videocodecid videodatarate width Nombre indiquant la dure du fichier FLV en secondes. Nombre indiquant la frquence dimages du fichier FLV. Nombre indiquant la hauteur du fichier FLV, en pixels. Nombre indiquant la version du codec utilis pour coder la vido. Nombre indiquant la frquence vido du fichier FLV. Nombre indiquant la largeur du fichier FLV, en pixels.

Le tableau suivant rpertorie les valeurs possibles du paramtre videocodecid :


videocodecid
2 3 4 5

Nom du codec
Sorenson H.263 Screen video (SWF versions 7 et ultrieures uniquement) VP6 (SWF versions 8 et ultrieures uniquement) VP6 avec canal alpha (SWF versions 8 et ultrieures uniquement)

608

Utilisation de la vido

Le tableau suivant rpertorie les valeurs possibles du paramtre audiocodecid :


audiocodecid
0 1 2 5 6

Nom du codec
non compress ADPCM mp3 Nellymoser 8kHz mono Nellymoser

Capture dun signal vido provenant de la camra de lutilisateur


Outre un fichier vido externe, la source des donnes vido peut galement tre une camra connecte lordinateur de lutilisateur. Il est possible de grer en ActionScript laffichage et la manipulation de ces donnes. La classe Camera est le mcanisme intgr ActionScript pour la gestion dune camra relie lordinateur.

Prsentation de la classe Camera


Lobjet Camera permet dtablir une connexion avec la camra locale de lutilisateur et de diffuser le signal vido soit localement ( destination de lutilisateur lui-mme) ou destination dun serveur tel que Flash Media Server. La classe Camera permet daccder aux informations suivantes sur la camra de lutilisateur :

Les camras qui sont installes sur lordinateur et disponibles pour Flash Player Si une camra est installe Si Flash Player est autoris ou non accder la camra de lutilisateur Quelle est la camra active La largeur et la hauteur de la vido en cours de capture, en pixels.

La classe Camera fournit les mthodes et les proprits qui permettent dutiliser les objets Camera. Par exemple, la proprit statique Camera.names contient le tableau des noms des camras actuellement installes sur lordinateur. Par ailleurs, la proprit name permet dafficher le nom de la camra active.

Capture dun signal vido provenant de la camra de lutilisateur

609

Affichage du signal provenant de la camra


Ltablissement dune connexion avec une camra peut ncessiter moins de code que lutilisation des classes NetConnection et NetStream pour charger un fichier FLV. Par contre, lutilisation de la classe Camera peut aussi tre dlicate, car il est ncessaire davoir lautorisation de lutilisateur pour que Flash Player puisse se connecter sa camra et la rendre accessible par code. Le code suivant montre comment utiliser la classe Camera pour tablir une connexion avec la camra de lutilisateur :
var cam:Camera = Camera.getCamera(); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid);
REMARQUE

La classe Camera ne possde pas de mthode constructeur. Pour crer une nouvelle instance de Camera, utilisez la mthode statique Camera.getCamera().

Conception dune application grant une camra locale


Au dbut dune application destine grer la camra de lutilisateur, prenez les prcautions suivantes : Vrifiez quune camra est installe sur lordinateur de lutilisateur. Vrifiez que lutilisateur a explicitement autoris Flash Player accder sa camra. Pour des raisons de scurit, le lecteur Flash affiche la bote de dialogue de paramtrage de Flash Player, qui permet lutilisateur dautoriser ou non laccs sa camra. Flash Player ne peut donc pas tablir une connexion avec la camra dun utilisateur et diffuser un signal vido sans la permission de cet utilisateur. Si lutilisateur clique sur le bouton dautorisation, votre application peut se connecter sa camra. Si lutilisateur clique sur le bouton de refus, votre application ne pourra pas tablir de liaison avec sa camra. Dans les deux cas, votre application doit grer lgamment la rponse.

610

Utilisation de la vido

tablissement dune connexion avec la camra de lutilisateur


Pour tablir une connexion avec la camra de lutilisateur, la premire tape consiste crer une instance de lobjet Camera, en crant une variable du type Camera et en linitialisant avec la valeur renvoye par la mthode statique Camera.getCamera(). Ltape suivante consiste crer un objet Video et lui affecter lobjet Camera. La troisime tape consiste ajouter cet objet Video la liste daffichage. Les tapes 2 et 3 sont ncessaires, car la classe Camera ntend pas la classe DisplayObject, il est donc impossible de lajouter directement la liste daffichage. Pour afficher le signal vido provenant de la camra, vous devez ensuite crer un nouvel objet Video et appeler la mthode attachCamera(). Lexemple suivant illustre ces trois oprations :
var cam:Camera = Camera.getCamera(); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid);

Notez que si aucune camra nest installe sur lordinateur de lutilisateur, Flash Player naffiche rien. Pour une application relle, dautres tches sont ncessaires. Pour plus dinformations, consultez les sections Vrification de la prsence de camras et Dtection de lautorisation daccder la camra.

Vrification de la prsence de camras


Avant de tenter dutiliser les mthodes ou proprits dune instance de Camera, il est prfrable de vrifier quune camra est bien installe. Il existe deux techniques pour vrifier la prsence dune ou plusieurs camras :

Tester la proprit statique Camera.names, qui contient le tableau des noms des camras disponibles. Ce tableau ne comporte en gnral quune seule chane au maximum, car la plupart des utilisateurs ne disposent au mieux que dune seule camra la fois. Le code suivant montre comment tester la proprit Camera.names pour vrifier que lutilisateur dispose dau moins une camra :
if (Camera.names.length > 0) { trace("Pas de camra installe."); } else { var cam:Camera = Camera.getCamera(); // Obtenir la camra par dfaut. }

Capture dun signal vido provenant de la camra de lutilisateur

611

Vrifier la valeur renvoye par la mthode statique Camera.getCamera(). Si aucune camra nest disponible ou installe, la mthode renvoie null, sinon elle renvoie une rfrence un objet Camera. Le code suivant montre comment appeler la mthode Camera.getCamera() pour vrifier que lutilisateur dispose dau moins une camra :
var cam:Camera = Camera.getCamera(); if (cam == null) { trace("Pas de camra installe."); } else { trace("Au moins une camra installe."); }

Comme la classe Camera ntend pas la classe DisplayObject, il est impossible de lajouter directement la liste daffichage laide de la mthode addChild(). Pour afficher le signal vido provenant de la camra, vous devez donc crer un nouvel objet Video et appeler la mthode attachCamera() de linstance de Video. Ce code montre comment tablir la connexion avec la camra sil en existe une. Dans le cas contraire, Flash Player naffiche rien :
var cam:Camera = Camera.getCamera(); if (cam != null) { var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); }

Dtection de lautorisation daccder la camra


Avant quil soit possible dafficher le signal de la camra, il est ncessaire que Flash Player obtienne de lutilisateur lautorisation explicite daccder la camra. Lorsque la mthode attachCamera() est appele, la bote de dialogue Paramtres de Flash Player est affiche pour permettre lutilisateur dautoriser ou refuser Flash Player laccs la camra et au microphone. Si lutilisateur a accord son autorisation, le signal de la camra est affich dans linstance de Video sur la scne. Si lutilisateur a refus, Flash Player ne peut pas se connecter la camra et lobjet Video naffiche rien. Si aucune camra nest installe sur lordinateur de lutilisateur, Flash Player naffiche rien. Si une camra est prsente, la bote de dialogue Paramtres de Flash Player est affiche pour permettre lutilisateur dautoriser ou refuser Flash Player laccs la camra. Si laccs la camra est accord, la vido est affiche sur lcran de lutilisateur, sinon rien nest affich.

612

Utilisation de la vido

Pour dtecter si lutilisateur a accord ou refus laccs la camra, vous pouvez couter lvnement status de la camra (StatusEvent.STATUS), comme dans le code suivant :
var cam:Camera = Camera.getCamera(); if (cam != null) { cam.addEventListener(StatusEvent.STATUS, statusHandler); var vid:Video = new Video(); vid.attachCamera(cam); addChild(vid); } function statusHandler(event:StatusEvent):void { // cet vnement est diffus lorsque lutilisateur clique sur le // bouton Autoriser ou Refuser // dans la bote de dialogue de paramtres de Flash Player. trace(event.code); // Camera.Muted ou Camera.Unmuted }

La fonction statusHandler() est appele ds que lutilisateur clique sur Autoriser ou Refuser . Deux mthodes permettent de dtecter le bouton qui a t cliqu :

Le paramtre event de la fonction statusHandler() contient une proprit code qui contient la chane Camera.Muted ou Camera.Unmuted . Si la valeur est Camera.Muted , lutilisateur a refus lautorisation et Flash Player ne peut pas accder la camra. Le code suivant en est un exemple :
function statusHandler(event:StatusEvent):void { switch (event.code) { case "Camera.Muted": trace("Lutilisateur a cliqu sur Refuser ."); break; case "Camera.Unmuted": trace("Lutilisateur a cliqu sur Accepter ."); break; } }

Capture dun signal vido provenant de la camra de lutilisateur

613

La classe Camera contient une proprit en lecture seule nomme muted qui indique si lutilisateur a refus laccs la camra (true) ou la autoris (false) dans le panneau Confidentialit de Flash Player. Le code suivant en est un exemple :
function statusHandler(event:StatusEvent):void { if (cam.muted) { trace("Lutilisateur a cliqu sur Refuser ."); } else { trace("Lutilisateur a cliqu sur Accepter ."); } }

En consultant lvnement dtat diffuser, vous pouvez rdiger du code pour grer lautorisation ou le refus daccs la camra en consquence. Par exemple, si lutilisateur a refus, vous pouvez afficher un message lui expliquant quil doit donner son autorisation sil veut participer une conversation vido, ou au contraire veiller supprimer lobjet Video de la liste daffichage afin de librer des ressources systme.

Optimisation de la qualit dimage vido


Par dfaut, les nouvelles instances de la classe Vido ont une largeur de 320 pixels sur une hauteur de 240 pixels. Pour optimiser la qualit vido, veillez donner vos objets Video les mmes dimensions que celles de lobjet Camera. Pour obtenir la largeur et la hauteur de lobjet Camera, utilisez les proprits width et height de la classe Camera. Vous pouvez alors adapter les proprits width et height de lobjet Video ces dimensions, ou passer celles-ci la mthode constructeur de la classe Video, comme dans lexemple ci-dessous :
var cam:Camera = Camera.getCamera(); if (cam != null) { var vid:Video = new Video(cam.width, cam.height); vid.attachCamera(cam); addChild(vid); }

614

Utilisation de la vido

Comme la mthode getCamera() renvoie une rfrence un objet Camera (ou null si aucune camra nest prsente), vous pouvez utiliser les mthodes et les proprits de cet objet mme si lutilisateur refuse laccs la camra. Vous pouvez ainsi dfinir les dimensions de linstance de lobjet Video en fonction de celles de la camra.
var vid:Video; var cam:Camera = Camera.getCamera(); if (cam == null) { trace("Impossible de dtecter une camra."); } else { trace("Camra dtecte: " + cam.name); cam.addEventListener(StatusEvent.STATUS, statusHandler); vid = new Video(); vid.attachCamera(cam); } function statusHandler(event:StatusEvent):void { if (cam.muted) { trace("Impossible de se connecter la camra active."); } else { // redimensionner lobjet Video en fonction des dimensions de // limage de la camra et // ajouter lobjet Video la liste daffichage. vid.width = cam.width; vid.height = cam.height; addChild(vid); } // suppression de lcouteur dvnement dtat. cam.removeEventListener(StatusEvent.STATUS, statusHandler); }

Capture dun signal vido provenant de la camra de lutilisateur

615

Suivi des conditions de lecture


La classe Camera contient plusieurs proprits qui permettent de suivre ltat en cours de lobjet Camera. Par exemple, le code ci-dessous affiche plusieurs proprits de la camra laide dun objet Timer et dune instance de champ texte dans la liste daffichage :
var vid:Video; var cam:Camera = Camera.getCamera(); var tf:TextField = new TextField(); tf.x = 300; tf.autoSize = TextFieldAutoSize.LEFT; addChild(tf); if (cam != null) { cam.addEventListener(StatusEvent.STATUS, statusHandler); vid = new Video(); vid.attachCamera(cam); } function statusHandler(event:StatusEvent):void { if (!cam.muted) { vid.width = cam.width; vid.height = cam.height; addChild(vid); t.start(); } cam.removeEventListener(StatusEvent.STATUS, statusHandler); } var t:Timer = new Timer(100); t.addEventListener(TimerEvent.TIMER, timerHandler); function timerHandler(event:TimerEvent):void { tf.text = ""; tf.appendText("activityLevel: " + cam.activityLevel + "\n"); tf.appendText("bandwidth: " + cam.bandwidth + "\n"); tf.appendText("currentFPS: " + cam.currentFPS + "\n"); tf.appendText("fps: " + cam.fps + "\n"); tf.appendText("keyFrameInterval: " + cam.keyFrameInterval + "\n"); tf.appendText("loopback: " + cam.loopback + "\n"); tf.appendText("motionLevel: " + cam.motionLevel + "\n"); tf.appendText("motionTimeout: " + cam.motionTimeout + "\n"); tf.appendText("quality: " + cam.quality + "\n"); }

Tous les 1/10 de seconde (100 millisecondes) lvnement timer de lobjet Timer est diffus et la fonction timerHandler() actualise le contenu du champ texte dans la liste daffichage.

616

Utilisation de la vido

Envoi de vido un serveur


Si vous souhaitez crer des applications plus complexes avec des objets Video ou Camera, Flash Media Server (FMS) offre diverses possibilits de diffusion de flux multimdia ainsi quun environnement de dveloppement pour crer des applications multimdia et les distribuer lintention dun public trs large. Cette combinaison permet aux dveloppeurs de crer des applications du type vido sur demande, diffusion dvnements en direct sur le Web et diffusion en flux continu MP3, mais aussi blog vido, vidomessagerie ou conversation multimdia. Pour plus dinformations, consultez la documentation de Flash Media Server ladresse http://livedocs.macromedia.com/fms/2/docs/.

Rubriques avances :
Les rubriques suivantes abordent certains problmes dutilisation de la vido.

Compatibilit de Flash Player avec les fichiers FLV cods


Flash Player 7 prend en charge les fichiers FLV cods avec le codec vido Sorenson Spark. Flash Player 8 prend en charge les fichiers FLV cods avec lencodeur Sorenson ou On2 VP6 dans Flash Professional 8. Le codec On2 VP6 prend en charge un canal alpha. Le format FLV est pris en charge diffremment suivant la version de Flash. Pour plus dinformations, consultez le tableau suivant :
Codec
Sorenson Spark

Version de fichier SWF (version publie)


6 7

Version Flash Player requise pour la lecture


6, 7 ou 8 7, 8 8* 8 8

On2 VP6

6 7 8

Si votre fichier SWF charge un fichier FLV, vous pouvez utiliser la vido On2 VP6 sans avoir publier de nouveau votre fichier SWF pour Flash Player 8, dans la mesure o les utilisateurs excutent Flash Player 8 pour afficher votre fichier SWF. Seul Flash Player 8 prend en charge la publication et la lecture des vidos On2 VP6.

Rubriques avances :

617

La configuration de fichier FLV pour lhbergement sur un serveur


Pour utiliser des fichiers FLV, il peut tre ncessaire de configurer votre serveur pour le format de fichier FLV. Le protocole MIME (Multipurpose Internet Mail Extensions) est une spcification de donnes normalise qui permet denvoyer des fichiers non ASCII via des connexions Internet. Les navigateurs Web et les clients de courrier lectronique sont configurs pour interprter de nombreux types MIME afin quils puissent envoyer et recevoir de la vido, de laudio, des graphiques et du texte format. Pour charger des fichiers FLV partir dun serveur Web, il peut tre ncessaire denregistrer lextension de fichier et le type MIME auprs de votre serveur Web. Pour plus dinformations, consultez la documentation du serveur. Le type MIME des fichiers FLV est video/x-flv. Les informations compltes du type de fichier FLV se prsentent comme suit :

Type MIME : video/x-flv Extension de fichier : .flv Paramtres requis : aucun Paramtres facultatifs : aucun Considrations sur lencodage : les fichiers FLV sont binaires, et une partie des applications peut ncessiter la dfinition du sous-type application/octet-stream. Problmes de scurit : aucun Spcifications publies : www.adobe.com/go/flashfileformat_fr.

Microsoft a chang la faon dont le multimdia en flux continu est gr par le serveur Web 6.0 IIS (Microsoft Internet Information Services) par rapport ses versions antrieures. Les versions antrieures dIIS ne ncessitent aucune modification pour diffuser en continu de la vido Flash. Dans IIS 6.0, le serveur Web fourni par dfaut avec Windows 2003, le serveur ncessite un type MIME pour reconnatre que les fichiers FLV sont des flux continus multimdia. Lorsque des fichiers SWF qui diffusent des fichiers FLV externes sont placs sur un serveur Microsoft Windows Server 2003 et sont affichs dans un navigateur, le fichier SWF est lu correctement, mais la vido FLV nest pas diffuse en continu. Ce problme affecte tous les fichiers FLV placs sur le serveur Windows Server 2003, y compris les fichiers crs avec des versions antrieures de loutil de cration Flash, le Kit Macromedia Flash Video Kit pour Dreamweaver MX 2004 dAdobe. Ces fichiers fonctionnent correctement si vous les testez avec dautres systmes dexploitation. Pour plus dinformations sur la manire de configurer Microsoft Windows 2003 et Microsoft IIS Server 6.0 pour diffuser en continu de la vido FLV, consultez la page www.adobe.com/go/tn_19439_fr.

618

Utilisation de la vido

Le ciblage des fichiers FLV locaux sur Macintosh


Si vous tentez de lire une vido FLV locale partir dun lecteur non systme sur un ordinateur Apple Macintosh avec un chemin qui utilise une barre oblique (/), elle ne sera pas lue. Les lecteurs non systme sont par exemple les lecteurs de CD-ROM, les disques durs partitionns, les supports de stockage amovibles, les priphriques de stockage connects, etc.
REMARQUE

La raison de cet chec est une limitation du systme dexploitation, et non pas de Flash Player.

Pour quun fichier FLV puisse tre lu partir dun lecteur non systme sur un Macintosh, faites-y rfrence laide dun chemin absolu utilisant une notation deux points (:) au lieu dune notation barres obliques (/). La liste suivante montre la diffrence entre les deux sortes de notation : Syntaxe barre oblique monLecteur/monDossier/monFLV.flv Syntaxe deux points (Mac OS) myDrive:myFolder:myFLV.flv

Vous pouvez aussi crer un fichier de projection pour un CD-ROM que vous voulez utiliser pour la lecture Macintosh. Pour obtenir les dernires informations sur les CD-ROM Macintosh et les fichiers FLV, consultez la page www.adobe.com/go/3121b301.

Exemple : Video Jukebox


Lexemple suivant cre un jukebox vido simple qui charge dynamiquement une liste de fichiers vidos lire en squence. Vous pouvez ainsi crer une application qui permet lutilisateur de parcourir une srie de didacticiels, ou encore qui permet de dfinir des publicits afficher avant la vido demande par lutilisateur. Cet exemple illustre les fonctionnalits suivantes dActionScript 3.0 : Actualisation de la position de la tte de lecture en fonction de la progression dans le fichier vido Dtection et analyse des mtadonnes dun fichier vido Gestion de codes spcifiques dans un flux Internet Chargement, lecture, mise en pause et arrt dun fichier FLV charg dynamiquement Redimensionnement dun objet vido dans la liste daffichage en fonction des mtadonnes du flux reu

Exemple : Video Jukebox

619

Pour obtenir les fichiers de cet exemple dapplication, consultez la page www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers de lapplication Video Jukebox se trouvent dans le dossier Samples/VideoJukebox. Lapplication se compose des fichiers suivants :
Fichier
VideoJukebox.as VideoJukebox.fla playlist.xml

Description
Classe comportant les principales fonctionnalits de lapplication. Fichier dapplication principal pour Flash. Fichier comportant la liste des fichiers vido charger dans le jukebox.

Chargement lune liste de lecture vido externe


Le fichier externe playlist.xml file contient la liste des vidos charger et leur ordre de lecture. Pour charger ce fichier XML, utilisez un objet URLLoader et un objet URLRequest, comme dans le code ci-dessous :
uldr = new URLLoader(); uldr.addEventListener(Event.COMPLETE, xmlCompleteHandler); uldr.load(new URLRequest(PLAYLIST_XML_URL));

Ce code est plac dans le constructeur de la classe VideoJukebox, si bien que le fichier est charg avant lexcution de la suite du code. Ds que le chargement du fichier XML est termin, la mthode xmlCompleteHandler() est appele et analyse le fichier externe dans un objet XML, comme dans le code suivant :
private function xmlCompleteHandler(event:Event):void { playlist = XML(event.target.data); videosXML = playlist.video; main(); }

Lobjet XML de la liste de lecture contient les donnes XML brutes du fichier externe, alors que videosXML est un objet XMLList qui ne contient que les nuds vido. Le code suivant est un exemple de contenu du fichier playlist.xml :
<videos> <video url="video/caption_video.flv" /> <video url="video/cuepoints.flv" /> <video url="video/water.flv" /> </videos>

620

Utilisation de la vido

Enfin, la mthode xmlCompleteHandler() appelle la mthode main() qui dfinit les diverses instances de composants dans la liste daffichage, ainsi que les objets NetConnection et NetStream qui permettent de charger les fichiers FLV externes.

Cration de linterface utilisateur


Pour crer linterface utilisateur, tirez cinq instances de lobjet Button sur la liste daffichage et donnez-leur les noms dinstance suivants : playButton, pauseButton, stopButton, backButton et forwardButton. Pour chacune de ces instances de Button, affectez un gestionnaire de lvnement click, comme dans le code suivant :
playButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); pauseButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); stopButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); backButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); forwardButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);

La mthode buttonClickHandler() utilise une instruction switch pour dterminer linstance de bouton sur laquelle lutilisateur a cliqu, comme dans le code suivant :
private function buttonClickHandler(event:MouseEvent):void { switch (event.currentTarget) { case playButton: ns.resume(); break; case pauseButton: ns.togglePause(); break; case stopButton: ns.pause(); ns.seek(0); break; case backButton: playPreviousVideo(); break; case forwardButton: playNextVideo(); break; } }

Exemple : Video Jukebox

621

Ajoutez ensuite une instance de Slider la liste daffichage, et donnez cette instance le nom volumeSlider. The following code sets the slider instances liveDragging property to true and defines an event listener for the slider instances change event :
volumeSlider.value = volumeTransform.volume; volumeSlider.minimum = 0; volumeSlider.maximum = 1; volumeSlider.snapInterval = 0.1; volumeSlider.tickInterval = volumeSlider.snapInterval; volumeSlider.liveDragging = true; volumeSlider.addEventListener(SliderEvent.CHANGE, volumeChangeHandler);

Ajoutez ensuite une instance de ProgressBar la liste daffichage, et donnez cette instance le nom positionBar. Donnez sa proprit mode la valeur manual , comme ci-dessous :
positionBar.mode = ProgressBarMode.MANUAL;

Enfin, ajoutez une instance de lobjet Label la liste daffichage, et donnez cette instance le nom positionLabel. La valeur de cette instance de lobjet Label sera dfinie par linstance de timer.

Dtection des mtadonnes dun fichier vido


Lorsque Flash Player dtecte des mtadonnes dans lune des vidos charges, le gestionnaire de rappel onMetaData() est appel pour la proprit client de lobjet NetStream. Le code suivant initialise un Object et configure le gestionnaire de rappel spcifi :
client = new Object(); client.onMetaData = metadataHandler;

La mthode metadataHandler() copie ses donnes dans la proprit meta dfinie par code au pralable. Vous pouvez ainsi accder tout moment aux mtadonnes de la vido active, depuis nimporte quel point de lapplication. Lobjet Video sur la scne est ensuite redimensionn selon la taille renvoyes par les mtadonnes. Enfin, linstance positionBar de la barre de progression est dplace et redimensionne en fonction de la taille de la vido en cours. Le code suivant est celui de la mthode metadataHandler() :
private function metadataHandler(metadataObj:Object):void { meta = metadataObj; vid.width = meta.width; vid.height = meta.height; positionBar.move(vid.x, vid.y + vid.height); positionBar.width = vid.width; }

622

Utilisation de la vido

Chargement dynamique dune vido Flash


Pour charger dynamiquement chacune des vidos Flash, lapplication utilise des objets NetConnection et NetStream. Le code suivant cre un objet NetConnection et passe la valeur null la mthode connect(). Cette valeur null signifie que Flash Player va se connecter une vido sur lordinateur local plutt que sur un serveur tel que Flash Media Server. Le code suivant cre les instances de NetConnection et NetStream, dfinit un couteur dvnement pour lvnement netStatus et affecte lobjet client la proprit client :
nc = new NetConnection(); nc.connect(null); ns = new NetStream(nc); ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); ns.client = client;

La mthode netStatusHandler() est appele en cas de changement dtat de la vido. Cest le cas lorsque la lecture de la vido dbute ou sarrte, lorsque le signal est mis en mmoire tampon ou en cas dimpossibilit de trouver un flux vido. Le code suivant liste lvnement netStatusHandler() :
private function netStatusHandler(event:NetStatusEvent):void { try { switch (event.info.code) { case "NetStream.Play.Start": t.start(); break; case "NetStream.Play.StreamNotFound": case "NetStream.Play.Stop": t.stop(); playNextVideo(); break; } } catch (error:TypeError) { // ignorer une erreur } }

Le code ci-dessus value la proprit code de lobjet info et filtre les codes NetStream.Play.Start , NetStream.Play.StreamNotFound et NetStream.Play.Stop . Les autres codes sont ignors. Si le flux Internet dbute, le code dmarre linstance de Timer qui actualise la tte de lecture. Si le flux Internet est intouvable ou est interrompu, linstance de Timer est arrte et lapplication tente de lire la vido suivante dans la liste de lecture.

Exemple : Video Jukebox

623

chaque excution de Timer, linstance de la barre de progression positionBar actualise sa position en appelant la mthode setProgress() de la classe ProgressBar, et linstance de Label positionLabel est actualise avec le temps coul et la dure totale de la vido active.
private function timerHandler(event:TimerEvent):void { try { positionBar.setProgress(ns.time, meta.duration); positionLabel.text = ns.time.toFixed(1) + " of " meta.duration.toFixed(1) + " seconds"; } catch (error:Error) { // ignorer cette erreur } }

Contrle du volume de la vido


Vous pouvez contrler le volume audio de la vido charge dynamiquement par le biais de la proprit soundTransform de lobjet NetStream. Lapplication Video jukebox permet de modifier le volume en changeant la valeur de linstance de Slider volumeSlider. Le code suivant montre comment changer le volume en affectant la valeur du composant Slider un objet SoundTransform qui est lui-mme affect la proprit soundTransform de lobjet NetStream :
private function volumeChangeHandler(event:SliderEvent):void { volumeTransform.volume = event.value; ns.soundTransform = volumeTransform; }

Contrle de la lecture de la vido


Le reste de lapplication contrle la lecture de la vido lorsque la fin du flux vido est atteinte ou lorsque lutilisateur change de vido. La mthode suivante obtienr ladresse URL de la vido partir de lobjet XMLList pour lindex courant :
private function getVideo():String { return videosXML[idx].@url; }

624

Utilisation de la vido

La mthode playVideo() appelle la mthode play() de lobjet NetStream pour charger la vido slectionne :
private function playVideo():void { var url:String = getVideo(); ns.play(url); }

La mthode playPreviousVideo() dcrmente lindex de la vido slectionne, appelle la mthode playVideo() pour charger le nouveau fichier vido et rend la barre de progression visible :
private function playPreviousVideo():void { if (idx > 0) { idx--; playVideo(); positionBar.visible = true; } }

La mthode finale, playNextVideo(), incrmente lindex vido et rappelle la mthode playVideo(). Si la vido en cours est la dernire de la liste de lecture, la mthode clear() est appele pour lobjet Video et la proprit visible de linstance de la barre de progression est mise false :
private function playNextVideo():void { if (idx < (videosXML.length() - 1)) { idx++; playVideo(); positionBar.visible = true; } else { idx++; vid.clear(); positionBar.visible = false; } }

Exemple : Video Jukebox

625

626

Utilisation de la vido

CHAPITRE 20

Utilisation du son
ActionScript est conu pour des applications immersives, interactives - et le son est un lment des applications immersives puissantes souvent ignor. Vous pouvez ajouter des effets de son un jeu vido, une raction acoustique linterface utilisateur dune application, ou mme crer un programme qui analyse des fichiers mp3 chargs sur Internet, avec du son la base de lapplication. Ce chapitre dcrit le chargement de fichiers audio externes et lutilisation de laudio incorpor dans un SWF. Il explique comment contrler laudio, crer des reprsentations visuelles des informations de son et capturer le son du microphone dun utilisateur.

20

Contenu
Principes de base de lutilisation du son . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .628 Prsentation de larchitecture audio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 Chargement de fichiers audio externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .633 Utilisation des sons incorpors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .636 Utilisation de fichiers audio de lecture en continu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 Lecture de sons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .638 Scurit lors du chargement et de la lecture des sons. . . . . . . . . . . . . . . . . . . . . . . .642 Contrle du volume du son et de la balance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .643 Utilisation des mtadonnes audio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .646 Accs aux donnes audio brutes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647 Capture de lentre de son . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651 Exemple : Podcast Player. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .655

627

Principes de base de lutilisation du son


Introduction lutilisation du son
Les ordinateurs peuvent coder non seulement des images dans un format numrique, les stocker et les rcuprer pour les afficher lcran, mais ils peuvent galement capturer et coder laudio numrique (reprsentation des informations de son de lordinateur), le stocker et le rcuprer pour le lire sur des hauts-parleurs qui leur sont connects. Il est possible de lire le son laide dAdobe Flash Player et dActionScript. Lorsque les donnes audio sont converties au format numrique, elles possdent diffrentes caractristiques (volume du son, son stro ou mono). Lorsque vous lisez un son dans ActionScript, vous pouvez rgler ces caractristiques galement (augmenter le volume du son ou faire comme sil provenait dune certaine direction, par exemple). Avant de contrler un son dans ActionScript, les informations de son doivent tre charges dans Flash Player. Vous disposez de quatre faons pour charger des donnes audio dans Flash Player afin de les utiliser avec ActionScript. Vous pouvez charger un fichier de son externe (fichier mp3 dans le SWF); vous pouvez incorporer directement les informations de son dans le fichier SWF lors de sa cration ; vous pouvez obtenir une entre audio laide du microphone connect lordinateur dun utilisateur et vous pouvez accder des donnes audio diffuses depuis un serveur. Lorsque vous chargez des donnes audio depuis un fichier de son externe, vous pouvez commencer par lire le dbut du fichier audio pendant le chargement du reste des donnes audio. Mme sil existe diffrents formats de fichier audio utiliss pour coder laudio numrique, ActionScript 3.0 et Flash Player prennent en charge les fichiers audio stocks au format mp3. Ils ne peuvent pas charger ni lire directement des fichiers audio de formats diffrents (WAV ou AIFF, par exemple). Lorsque vous utilisez du son dans ActionScript, vous utilisez probablement plusieurs classes issues du package flash.media. Utilisez la classe Sound pour accder aux informations audio en chargeant un fichier audio et en dmarrant la lecture. Une fois que vous avez dmarr la lecture dun son, Flash Player vous permet daccder un objet SoundChannel. Etant donn quun fichier audio charg est un son parmi dautres que vous lisez sur lordinateur dun utilisateur, chaque son individuel lu utilise son objet SoundChannel ; cest lentre combine de tous les objets SoundChannel mixs qui est lue sur les haut-parleurs de lordinateur. Vous utilisez linstance SoundChannel pour contrler les proprits du son et arrter sa lecture. Pour finir, si vous souhaitez contrler laudio combin, la classe SoundMixer vous permet de contrler la sortie mixe.

628

Utilisation du son

Vous pouvez galement utiliser dautres classes pour effectuer des tches plus spcifiques lorsque vous utilisez du son dans ActionScript ; pour plus dinformations sur toutes les classes lies au son, voir Prsentation de larchitecture audio , la page 631.

Tches courantes dutilisation du son


Ce chapitre dcrit les tches relatives au son suivantes :

Chargement de fichiers mp3 externes et suivi de la progression Lecture, pause, reprise et arrt des sons Lecture de sons en continu pendant leur chargement Manipulation du volume du son et de la balance Rcupration de mtadonnes ID3 dun fichier mp3 Utilisation de donnes donde acoustique brutes Capture et relecture dune entre de son depuis le microphone dun utilisateur

Concepts et termes importants


La liste de rfrence suivante contient les termes importants que vous rencontrerez dans ce chapitre :

Amplitude : la distance dun point sur la courbe audio partir de la ligne zro ou dquilibre. Dbit : la quantit de donnes codes ou diffuses en continu pour chaque seconde dun fichier audio. Pour les fichiers mp3, le dbit est gnralement exprim en milliers de bits par seconde (kbits/s). Un dbit suprieur est souvent synonyme dune onde acoustique de meilleure qualit. Mise en mmoire tampon : la rception et le stockage de donnes audio avant leur lecture. mp3 : MPEG-1 Audio Layer 3, ou mp3, est un format de compression audio connu. Balance horizontale : le positionnement dun signal audio entre les canaux gauche et droit dans un champ acoustique stro. Crte : le point le plus lev dans une courbe audio. Frquence dchantillonnage : dfinit le nombre dchantillons par seconde extraits dun signal audio analogique pour crer un signal numrique. La frquence dchantillonnage dun CD audio standard est de 44,1 kHz ou 44,100 chantillons par seconde.

Principes de base de lutilisation du son

629

Lecture en continu : processus consistant lire les premires portions dun fichier audio ou dun fichier vido pendant le chargement des dernires portions de ce fichier depuis un serveur. Volume : lintensit dun son. Courbe audio : la forme dun graphique des diffrentes amplitudes dun signal audio au cours du temps.

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Etant donn que ce chapitre traite de lutilisation du son dans ActionScript, de nombreux exemples impliquent lutilisation dun fichier audio (lecture, arrte de la lecture ou rglage du son). Pour tester les exemples de ce chapitre :
1. 2. 3. 4.

Crez un document Flash et enregistrez-le sur votre ordinateur. Dans le scnario, slectionnez la premire image-cl et ouvrez le panneau Actions. Copiez lexemple de code dans le panneau Script. Si le code implique le chargement dun fichier audio externe, il aura une ligne de code du type :
var req:URLRequest = new URLRequest("click.mp3"); var s:Sound = new Sound(req);

o click.mp3 est le nom du fichier audio en cours de chargement. Pour tester ces exemples, vous devez avoir un fichier mp3. Vous devez placer le fichier mp3 dans le mme dossier que votre document Flash. Vous devez ensuite modifier le code et utiliser le nom de votre fichier mp3 au lieu du nom de lexemple de code (par exemple, dans le code cidessus, vous remplaceriez click.mp3 par le nom de votre fichier mp3).
5.

Dans le menu principal, choisissez Contrle > Tester lanimation pour crer le fichier SWF et avoir un aperu du rsultat de lexemple (et lcouter).

Outre la lecture audio, certains exemples affichent des valeurs laide de la fonction trace() ; lorsque vous les testez, les rsultats de ces valeurs saffichent dans le panneau Sortie. Certains exemples dessinent galement un contenu lcran. Par consquent, le contenu pour ces exemples saffiche galement dans la fentre Flash Player. Pour plus dinformations sur le test des exemples de code dans ce manuel, voir Test des exemples de code contenus dans un chapitre , la page 67.

630

Utilisation du son

Prsentation de larchitecture audio


Vos applications peuvent charger des donnes audio partir de quatre sources principales :

Fichiers audio externes chargs lors de lexcution Ressources audio incorpores dans le fichier SWF de lapplication Donnes audio issues dun microphone connect au systme de lutilisateur Donnes audio diffuses en continu depuis une passerelle multimdia telle que Flash Media Server

Vous pouvez charger entirement les donnes audio avant leur lecture, ou bien les lire pendant leur chargement. ActionScript 3.0 et Flash Player prennent en charge les fichiers audio stocks au format mp3. Ils ne peuvent pas charger ni lire directement des fichiers audio de formats diffrents (WAV ou AIFF, par exemple). Vous pouvez utiliser Adobe Flash CS3 Professional pour importer des fichiers audio WAV ou AIFF puis les intgrer dans les fichiers SWF de votre application au format mp3. Loutil de programmation Flash vous permet galement de compresser des fichiers audio intgrs pour rduire leur taille (mais ceci se fait au dtriment de la qualit du son). Pour plus dinformations, voir Importation de sons dans Utilisation de Flash. Larchitecture audio dActionScript 3.0 utilise les classes suivantes dans le package flash.media.
Classe
flash.media.Sound

Description
La classe Sound gre le chargement du son, les proprits de son de base et dmarre une lecture audio. Lorsquune application lit un objet Sound, un objet SoundChannel est cr pour contrler la lecture. Lobjet SoundChannel contrle le volume des canaux de lecture gauche et droit du son. Chaque son lu possde son propre objet SoundChannel. La classe SoundLoaderContext dfinit le nombre de secondes de mise en mmoire tampon utiliser lors du chargement dun son, et indique si Flash Player recherche un fichier de rgulation inter-domaines sur le serveur lors du chargement dun fichier. Un objet SoundLoaderContext est utilis comme paramtre pour la mthode Sound.load().

flash.media.SoundChannel

flash.media.SoundLoaderContext

Prsentation de larchitecture audio

631

Classe
flash.media.SoundMixer

Description
La classe SoundMixer contrle les proprits de lecture et de scurit de tous les sons dans une application. En effet, plusieurs canaux audio sont mixs au moyen dun objet SoundMixer commun. Par consquent, les valeurs de proprit dans lobjet SoundMixer affectent tous les objets SoundChannel en cours de lecture. La classe SoundTransform contient des valeurs qui contrlent le volume du son et la balance. Vous pouvez appliquer un objet SoundTransform un objet SoundChannel individuel, lobjet SoundMixer global, ou un objet Microphone, entre autres. Un objet ID3Info contient des proprits qui reprsentent les informations de mtadonnes ID3 souvent stockes dans des fichiers audio mp3. La classe Microphone reprsente un microphone ou un autre priphrique dentre de son connect lordinateur de lutilisateur. Lentre audio issue dun microphone peut tre achemine vers des hautparleurs locaux ou envoye un serveur distant. Lobjet Microphone contrle le gain, la frquence dchantillonnage et dautres caractristiques de son propre flux de son.

flash.media.SoundTransform

flash.media.ID3Info

flash.media.Microphone

Chaque son charg et lu requiert sa propre instance des classes Sound et SoundChannel. La sortie issue de plusieurs instances SoundChannel est ensuite mixe par la classe SoundMixer globale pendant la lecture. Les classes Sound, SoundChannel, et SoundMixer ne sont pas utilises pour les donnes audio provenant dun microphone ou dune transmission de passerelle multimdia en continu (Flash Media Server, par exemple).

632

Utilisation du son

Chargement de fichiers audio externes


Chaque instance de la classe Sound permet de charger et de dclencher la lecture dune ressource audio spcifique. Une application ne peut pas rutiliser un objet Sound pour charger plusieurs sons. Si elle souhaite charger une nouvelle ressource audio, elle doit crer un objet Sound. Si vous chargez un fichier audio de petite taille (un son clic associer un bouton, par exemple), votre application peut crer un objet Sound qui charge automatiquement le fichier audio, comme indiqu ci-dessous :
var req:URLRequest = new URLRequest("click.mp3"); var s:Sound = new Sound(req);

Le constructeur Sound() accepte un objet URLRequest comme premier paramtre. Lorsquune valeur pour le paramtre URLRequest est fournie, le nouvel objet Sound commence charger automatiquement la ressource audio spcifie. Dans le meilleur des cas, votre application doit surveiller la progression du chargement du son et rechercher les erreurs pendant le chargement. Par exemple, si le son clic est volumineux, il risque de ne pas tre totalement charg lorsque lutilisateur clique sur le bouton qui dclenche le son. Si vous tentez de lire un son non charg, une erreur dexcution risque de se produire. Il est prfrable dattendre la fin du chargement du son avant de permettre aux utilisateurs deffectuer des actions risquant de dmarrer la lecture des sons. Un objet Sound envoie plusieurs vnements diffrents pendant le chargement du son. Votre application peut couter ces vnements pour suivre la progression du chargement et vrifier que le son est compltement charg avant la lecture. Le tableau suivant rpertorie les vnements pouvant tre envoys par un objet Sound.
Evnement
open (Event.OPEN) progress (ProgressEvent.PROGRESS)

Description
Envoy juste avant le dbut du chargement du son. Envoy rgulirement pendant le chargement du son lorsque des donnes sont reues du fichier ou du flux. Envoy lorsque des donnes ID3 sont disponibles pour un son mp3. Envoy lorsque toutes les donnes de la ressource audio ont t charges. Envoy lorsquun fichier audio est introuvable ou lorsque le chargement est interrompu avant la rception de toutes les donnes audio.

id3 (Event.ID3) complete (Event.COMPLETE) ioError (IOErrorEvent.IO_ERROR)

Chargement de fichiers audio externes

633

Le code suivant illustre la lecture dun son aprs son chargement :


import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; var s:Sound = new Sound(); s.addEventListener(Event.COMPLETE, onSoundLoaded); var req:URLRequest = new URLRequest("bigSound.mp3"); s.load(req); function onSoundLoaded(event:Event):void { var localSound:Sound = event.target as Sound; localSound.play(); }

Tout dabord, lexemple de code cre un objet Sound sans lui donner de valeur initiale pour le paramtre URLRequest. Ensuite, il coute lvnement Event.COMPLETE issu de lobjet Sound. La mthode onSoundLoaded() sexcute alors lorsque toutes les donnes audio sont charges. Puis, il appelle la mthode Sound.load() avec une nouvelle valeur URLRequest pour le fichier audio. La mthode onSoundLoaded() sexcute lorsque le chargement du son est termin. La proprit cible de lobjet Event est une rfrence lobjet Sound. Lappel la mthode play() de lobjet Sound dmarre ensuite la lecture du son.

Surveillance du chargement du son


Les fichiers audio peuvent tre trs volumineux et leur chargement trs long. Flash Player permet votre application de lire des sons avant leur chargement complet. Vous pouvez indiquer lutilisateur la quantit de donnes audio ayant t charges et la quantit de son dj lue. La classe Sound envoie deux vnements permettant dafficher la progression du chargement dun son : ProgressEvent.PROGRESS et Event.COMPLETE. Lexemple suivant indique comment utiliser ces vnements pour afficher les informations de progression concernant le son en cours de chargement :
import import import import flash.events.Event; flash.events.ProgressEvent; flash.media.Sound; flash.net.URLRequest;

var s:Sound = new Sound(); s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); s.addEventListener(Event.COMPLETE, onLoadComplete); s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);

634

Utilisation du son

var req:URLRequest = new URLRequest("bigSound.mp3"); s.load(req); function onLoadProgress(event:ProgressEvent):void { var loadedPct:uint = Math.round(100 * (event.bytesLoaded / event.bytesTotal)); trace("The sound is " + loadedPct + "% loaded."); } function onLoadComplete(event:Event):void { var localSound:Sound = event.target as Sound; localSound.play(); } function onIOError(event:IOErrorEvent) { trace("The sound could not be loaded: " + event.text); }

Ce code cre dabord un objet Sound puis lui ajoute des couteurs pour les vnements ProgressEvent.PROGRESS et Event.COMPLETE. Une fois que la mthode Sound.load() a t appele et que les premires donnes sont reues du fichier audio, un vnement ProgressEvent.PROGRESS a lieu et dclenche la mthode onSoundLoadProgress(). Le pourcentage des donnes audio charges est quivalent la valeur de la proprit de lobjet ProgressEvent divis par la valeur de la proprit bytesTotal. Les mmes proprits bytesLoaded et bytesTotal sont disponibles sur lobjet Sound galement. Lexemple ci-dessus indique les messages relatifs la progression du chargement du son, mais vous pouvez facilement utiliser les valeurs bytesLoaded et bytesTotal pour mettre jour les composants de la barre de progression tels que ceux fournis avec Adobe Flex 2 framework ou loutil de cration Flash.
bytesLoaded

Cet exemple indique galement comment une application peut reconnatre et rpondre une erreur lors du chargement des fichiers audio. Par exemple, si un fichier audio avec le nom de fichier donn est introuvable, un vnement Event.IO_ERROR est envoy par lobjet Sound. Dans le code prcdent, la mthode onIOError() sexcute et affiche un message derreur court lorsquune erreur se produit.

Chargement de fichiers audio externes

635

Utilisation des sons incorpors


Utilisez des sons incorpors (au lieu de charger du son depuis un fichier externe) surtout dans le cas de fichiers audio de petite taille servant dindicateurs dans linterface utilisateur de votre application (des sons qui sont lus lorsque vous cliquez sur des boutons, par exemple). Lorsque vous incorporez un fichier audio dans votre application, la taille du fichier SWF rsultant augmente proportionnellement la taille du fichier audio. Ceci signifie que lorsque vous incorporez des fichiers volumineux dans votre application, la taille de votre fichier SWF risque de devenir trop importante. La mthode adopter pour incorporer un fichier audio dans le fichier SWF de votre application varie selon votre environnement de dveloppement.

Utilisation dun fichier audio incorpor dans Flash


Loutil de programmation Flash vous permet dimporter des sons dans un grand nombre de formats audio et de les stocker comme symboles dans la bibliothque. Vous pouvez ensuite les affecter des images dans le scnario ou aux images dun tat de bouton, les utiliser avec des comportements ou directement dans du code ActionScript. Cette section dcrit comment utiliser des sons incorpors dans du code ActionScript avec loutil de programmation Flash. Pour plus dinformations sur les autres faons dutiliser des sons incorpors dans Flash, voir Importation de sons dans Utilisation de Flash.
Pour incorporer un fichier audio dans une animation Flash :
1.

Slectionnez Fichier > Importer > Importer dans la bibliothque, puis slectionnez un fichier audio et importez-le. Cliquez avec le bouton droit de la souris sur le nom du fichier import dans le panneau Bibliothque, et slectionnez Proprits. Activez la case cocher Exporter pour ActionScript. Dans le champ Classe, entrez un nom utiliser lorsque vous faites rfrence ce son incorpor dans ActionScript. Par dfaut, il utilisera le nom du fichier audio dans ce champ. Si le nom du fichier contient un point (comme dans DrumSound.mp3 ), vous devez le remplacer par DrumSound ; ActionScript nautorise pas le caractre point dans les noms de classe. Le champ Classe de base devrait encore afficher flash.media.Sound. Cliquez sur OK. Il se peut quune bote de dialogue indiquant quune dfinition pour cette classe est introuvable dans le chemin de classe apparaisse. Cliquez sur OK et continuez. Si vous avez saisi un nom qui ne correspond pas celui dune classe contenue dans le chemin de classe de votre application, une nouvelle classe qui hrite de la classe flash.media.Sound est gnre automatiquement.

2.

3.

4.

636

Utilisation du son

5.

Pour utiliser le son incorpor, vous rfrencez le nom de classe pour ce son dans ActionScript. Par exemple, le code suivant commence par crer une instance de la classe DrumSound gnre automatiquement :
var drum:DrumSound = new DrumSound(); var channel:SoundChannel = drum.play();

DrumSound est une sous-classe de la classe flash.media.Sound. Par consquent, elle hrite des mthodes et des proprits de la classe Sound, notamment de la mthode play() comme indiqu ci-dessus.

Utilisation de fichiers audio de lecture en continu


Lorsquun fichier audio ou un fichier vido est lu alors que ses donnes sont encore en cours de chargement, il est lu en continu. Les fichiers audio externes chargs depuis un serveur distant sont souvent lus en continu de faon ce que lutilisateur ne doive pas attendre le chargement complet des donnes audio pour couter le son. La proprit SoundMixer.bufferTime reprsente le nombre de millisecondes de donnes audio que Flash Player doit rassembler avant la lecture du son. En dautres termes, si la proprit bufferTime est dfinie sur 5 000, Flash Player charge au moins 5 000 millisecondes de donnes depuis le fichier audio avant le dbut de la lecture du son. La valeur SoundMixer.bufferTime par dfaut est 1 000. Votre application peut ignorer la valeur SoundMixer.bufferTime globale pour un son individuel en spcifiant explicitement une nouvelle valeur bufferTime lors du chargement du son. Pour ignorer la dure du tampon par dfaut, crez dabord une instance de la classe SoundLoaderContext, dfinissez sa proprit bufferTime puis transmettez-la comme paramtre la mthode Sound.load(), comme indiqu ci-dessous :
import flash.media.Sound; import flash.media.SoundLoaderContext; import flash.net.URLRequest; var s:Sound = new Sound(); var req:URLRequest = new URLRequest("bigSound.mp3"); var context:SoundLoaderContext = new SoundLoaderContext(8000, true); s.load(req, context); s.play();

Utilisation de fichiers audio de lecture en continu

637

Pendant la lecture, Flash Player tente de conserver le tampon audio la mme taille ou une taille suprieure. Si le tlchargement des donnes audio est plus rapide que la vitesse de la lecture, cette dernire continue sans interruption. Nanmoins, si la vitesse de chargement des donnes est ralentie en raison des limites du rseau, la tte de lecture peut atteindre la fin du tampon audio. Dans ce cas, la lecture est suspendue mais elle reprend automatiquement lorsque dautres donnes audio sont charges. Pour savoir si la lecture est suspendue car Flash Player attend le chargement des donnes, utilisez la proprit Sound.isBuffering.

Lecture de sons
Lire un son charg peut tre aussi simple quappeler la mthode Sound.play() pour un objet Sound, comme suit :
var snd:Sound = new Sound(new URLRequest("smallSound.mp3")); snd.play();

Lorsque vous lisez des sons laide dActionScript 3.0, vous pouvez effectuer les oprations suivantes :

Lire un son partir dune position de dbut spcifique Interrompre un son et reprendre la lecture ultrieurement partir de la mme position Savoir exactement lorsque la lecture dun son est termine Suivre la progression de la lecture dun son Modifier le volume ou la balance pendant la lecture dun son

Pour effectuer ces oprations pendant la lecture, utilisez les classes SoundChannel, SoundMixer et SoundTransform. La classe SoundChannel contrle la lecture dun seul son. La proprit SoundChannel.position peut tre considre comme une tte de lecture qui indique le point actuel dans les donnes audio en cours de lecture. Lorsquune application appelle la mthode Sound.play(), une instance de la classe SoundChannel est cre pour contrler la lecture. Votre application peut lire un son partir dune position de dbut spcifique en la transmettant, en termes de millisecondes, comme paramtre startTime de la mthode Sound.play(). Elle peut galement spcifier un nombre fixe de rptitions du son en succession rapide en transmettant une valeur numrique dans le paramtre loops de la mthode Sound.play().

638

Utilisation du son

Lorsque la mthode Sound.play() est appele avec un paramtre startTime et un paramtre loops, le son est lu de faon rpte partir du mme point de dbut chaque fois, comme indiqu dans le code suivant :
var snd:Sound = new Sound(new URLRequest("repeatingSound.mp3")); snd.play(1000, 3);

Dans cet exemple, le son est lu partir dun point une seconde aprs le dbut du son, trois fois de suite.

Pause et reprise dun son


Si votre application lit des sons longs (chansons ou balados, par exemple), vous pouvez permettre aux utilisateurs dinterrompre et de reprendre leur lecture. Il est impossible dinterrompre littralement un son pendant la lecture dans ActionScript ; vous pouvez uniquement larrter. Nanmoins, un son peut tre lu partir de nimporte quel point. Vous pouvez enregistrer la position du son au moment de larrt puis le relire ultrieurement partir de cette position. Par exemple, supposons que votre code charge et lit un fichier audio de la faon suivante :
var snd:Sound = new Sound(new URLRequest("bigSound.mp3")); var channel:SoundChannel = snd.play();

Lors de la lecture du son, la proprit SoundChannel.position indique le point dans le fichier audio qui est en cours de lecture. Votre application peut stocker la valeur de position avant darrter la lecture du son, comme suit :
var pausePosition:int = channel.position; channel.stop();

Pour reprendre la lecture du son, transmettez la valeur de position stocke prcdemment pour redmarrer le son partir du mme point darrt prcdent.
channel = snd.play(pausePosition);

Lecture de sons

639

Surveillance de la lecture
Votre application a peut-tre besoin de savoir lorsque la lecture dun son sarrte afin de dmarrer la lecture dun autre son ou deffacer des ressources utilises pendant la lecture prcdente. La classe SoundChannel envoie un vnement Event.SOUND_COMPLETE la fin de la lecture du son. Votre application peut couter cet vnement et effectuer laction approprie, comme indiqu ci-dessous :
import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; var snd:Sound = new Sound("smallSound.mp3"); var channel:SoundChannel = snd.play(); s.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); public function onPlaybackComplete(event:Event) { trace(The sound has finished playing.); }

La classe SoundChannel nenvoie pas dvnements progress pendant la lecture. Pour fournir des informations relatives la progression de la lecture, votre application peut dfinir son propre mcanisme de synchronisation et suivre la position de la tte de lecture du son. Pour calculer le pourcentage dun son lu, vous pouvez diviser la valeur de la proprit SoundChannel.position par la longueur des donnes audio en cours de lecture :
var playbackPercent:uint = 100 * (channel.position / snd.length);

Nanmoins, ce code signale uniquement des pourcentages de lecture prcis si les donnes audio ont t totalement charges avant le dbut de la lecture. La proprit Sound.length indique la taille des donnes audio actuellement charges, et non pas la taille ventuelle du fichier audio entier. Pour suivre la progression de la lecture dun son diffus en continu qui est toujours en cours de chargement, votre application doit estimer la taille ventuelle du fichier audio entier et utiliser cette valeur dans ses calculs. Vous pouvez estimer la longueur ventuelle des donnes audio laide des proprits bytesLoaded et bytesTotal de lobjet Sound, comme suit :
var estimatedLength:int = Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); var playbackPercent:uint = 100 * (channel.position / estimatedLength);

640

Utilisation du son

Le code suivant charge un fichier audio plus volumineux et utilise lvnement Event.ENTER_FRAME comme mcanisme de synchronisation pour afficher la progression de la lecture. Il fournit rgulirement des informations sur le pourcentage de lecture, qui est calcul de la faon suivante : la valeur de position actuelle divise par la longueur totale des donnes audio :
import flash.events.Event; import flash.media.Sound; import flash.net.URLRequest; var snd:Sound = new Sound(); var req:URLRequest = new URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3"); snd.load(req); var channel:SoundChannel; channel = snd.play(); addEventListener(Event.ENTER_FRAME, onEnterFrame); snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); function onEnterFrame(event:Event):void { var estimatedLength:int = Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); var playbackPercent:uint = Math.round(100 * (channel.position / estimatedLength)); trace("Sound playback is " + playbackPercent + "% complete."); } function onPlaybackComplete(event:Event) { trace("The sound has finished playing."); removeEventListener(Event.ENTER_FRAME, onEnterFrame); }

Une fois que le chargement des donnes audio commence, ce code appelle la mthode snd.play() et stocke lobjet SoundChannel rsultant dans la variable channel. Il ajoute ensuite un couteur dvnement lapplication principale pour lvnement Event.ENTER_FRAME et un autre couteur dvnement lobjet SoundChannel pour lvnement Event.SOUND_COMPLETE qui a lieu la fin de la lecture. Chaque fois que lapplication atteint une nouvelle image dans son animation, la mthode onEnterFrame() est appele. La mthode onEnterFrame() estime la longueur totale du fichier audio en fonction de la quantit de donnes dj charges puis calcule et affiche le pourcentage de lecture actuel.

Lecture de sons

641

Une fois que tout le son a t lu, la mthode onPlaybackComplete() sexcute, supprimant lcouteur dvnement pour lvnement Event.ENTER_FRAME de faon ce quil ne tente pas dafficher les mises jour de progression aprs la lecture. Lvnement Event.ENTER_FRAME peut tre envoy plusieurs fois par seconde. Dans certains cas, vous pouvez ne pas afficher la progression de la lecture aussi frquemment. Votre application peut alors dfinir son propre mcanisme de synchronisation laide de la classe flash.util.Timer ; voir Utilisation des dates et heures , la page 205.

Arrt de sons diffuss en continu


Il y a quelque chose dtrange dans le processus de lecture des sons diffuss en continu, cest-dire ceux qui sont lus pendant leur chargement. Lorsque votre application appelle la mthode SoundChannel.stop() sur une instance SoundChannel qui lit un son diffus en continu, la lecture du son sarrte pendant une image puis elle redmarre au dbut du son sur limage suivante. Ceci a lieu car le chargement du son est toujours en cours. Pour arrter la fois le chargement et la lecture dun son diffus en continu, appelez la mthode Sound.close().

Scurit lors du chargement et de la lecture des sons


Laccs aux donnes audio par votre application peut tre limit selon la fonction de scurit de Flash Player. Chaque son est soumis aux restrictions de deux sandbox de scurit diffrents, le sandbox pour le contexte lui-mme (le sandbox de contexte ), et le sandbox pour lapplication ou lobjet qui charge et lit le son (le sandbox propritaire ). Pour plus dinformations sur la fonction de scurit de Flash Player en gnral, et la dfinition des sandbox, voir La scurit dans Flash Player , la page 797. Le sandbox de contexte contrle si des donnes audio dtailles peuvent tre extraites du son laide de la proprit id3 ou de la mthode SoundMixer.computeSpectrum(). Il ne limite pas le chargement ou la lecture du fichier audio lui-mme. Le domaine dorigine du fichier audio dfinit les limites de scurit du sandbox de contexte. Gnralement, si un fichier audio se trouve dans le mme domaine ou dossier que le fichier SWF de lapplication ou de lobjet qui le charge, ce dernier dispose dun accs total ce fichier audio. Si le son provient dun domaine diffrent par rapport lapplication, il peut tre intgr dans le sandbox de contexte laide du fichier de rgulation inter-domaines.

642

Utilisation du son

Votre application peut transmettre un objet SoundLoaderContext avec une proprit checkPolicyFile comme paramtre la mthode Sound.load(). Lorsque vous dfinissez la proprit checkPolicyFile sur true, vous indiquez Flash Player de rechercher un fichier de rgulation inter-domaines sur le serveur partir duquel le son est charg. Si un fichier de rgulation inter-domaines existe et quil autorise laccs au domaine du fichier SWF de chargement, ce dernier peut charger le fichier audio, accder la proprit id3 de lobjet Sound et appeler la mthode SoundMixer.computeSpectrum() pour les sons chargs. Le sandbox propritaire contrle la lecture locale des sons. Lapplication ou lobjet qui dmarre la lecture dun son dfinit le sandbox propritaire. La mthode SoundMixer.stopAll() interrompt les sons dans tous les objets SoundChannel en cours de lecture, tant quils rpondent aux critres suivants :

Les sons ont t dmarrs par des objets se trouvant dans le mme sandbox propritaire. Les sons sont issus dune source avec un fichier de rgulation inter-domaines qui autorise laccs au domaine de lapplication ou de lobjet qui appelle la mthode SoundMixer.stopAll().

Pour savoir si la mthode SoundMixer.stopAll() interrompra tous les sons lus, votre application peut appeler la mthode SoundMixer.areSoundsInaccessible(). Si cette mthode renvoie une valeur true, certains des sons lus ne sont pas sous le contrle du sandbox propritaire actuel et ne seront pas arrts par la mthode SoundMixer.stopAll(). La mthode SoundMixer.stopAll() empche galement la tte de lecture de continuer pour tous les sons chargs partir de fichiers externes. Nanmoins, les sons qui sont incorpors dans des fichiers FLA et associs des images dans le scnario laide de loutil de programmation Flash risquent dtre relus si lanimation sest dplace sur une nouvelle image.

Contrle du volume du son et de la balance


Un objet SoundChannel individuel contrle les canaux stro gauche et droit pour un son. Si un son mp3 est un son mono, les canaux stro gauche et droit de lobjet SoundChannel contiennent des courbes audio identiques. Vous pouvez connatre lamplitude de chaque canal stro du son lu laide des proprits leftPeak et rightPeak de lobjet SoundChannel. Ces proprits indiquent lamplitude de crte de la courbe audio du son. Elles ne reprsentent pas le volume de lecture rel. Le volume de lecture rel est une fonction de lamplitude de londe acoustique et des valeurs de volume dfinies dans lobjet SoundChannel et la classe SoundMixer.

Contrle du volume du son et de la balance

643

Vous pouvez utiliser la proprit pan dun objet SoundChannel pour indiquer un niveau de volume diffrent pour chacun des canaux gauche et droit pendant la lecture. La proprit pan peut avoir une valeur comprise entre -1 et 1, o -1 signifie que le canal gauche lit volume maximal alors que le canal droit est muet, et 1 signifie que le canal droit lit volume maximal alors que le canal gauche est muet. Les valeurs numriques comprises entre -1 et 1 dfinissent des valeurs proportionnelles pour les valeurs des canaux gauche et droit, et une valeur de 0 signifie que les deux canaux lisent un niveau de volume moyen, quilibr. Lexemple de code suivant cre un objet SoundTransform avec une valeur de volume de 0,6 et une valeur de balance horizontale de -1 (volume de canal gauche maximal et aucun volume de canal droit). Il transmet lobjet SoundTransform comme paramtre la mthode play(), qui lapplique au nouvel objet SoundTransform cr pour contrler la lecture.
var snd:Sound = new Sound(new URLRequest("bigSound.mp3")); var trans:SoundTransform = new SoundTransform(0.6, -1); var channel:SoundChannel = snd.play(0, 1, trans);

Vous pouvez modifier le volume et la balance pendant la lecture dun son en dfinissant les proprits pan ou volume dun objet SoundTransform puis en appliquant cet objet comme proprit soundTransform dun objet SoundChannel. Vous pouvez galement dfinir des valeurs de balance et de volume global pour tous les sons la fois laide de la proprit soundTransform de la classe SoundMixer, comme lindique lexemple suivant :
SoundMixer.soundTransform = new SoundTransform(1, -1);

Vous pouvez galement utiliser un objet SoundTransform pour dfinir des valeurs de balance et de volume global pour un objet Microphone (voir Capture de lentre de son , la page 651) et pour des objets Sprite et SimpleButton. Lexemple suivant modifie la balance horizontale du son du canal gauche au canal droit et de nouveau lors de la lecture du son.
import import import import import flash.events.Event; flash.media.Sound; flash.media.SoundChannel; flash.media.SoundMixer; flash.net.URLRequest;

var snd:Sound = new Sound(); var req:URLRequest = new URLRequest("bigSound.mp3"); snd.load(req); var panCounter:Number = 0;

644

Utilisation du son

var trans:SoundTransform; trans = new SoundTransform(1, 0); var channel:SoundChannel = snd.play(0, 1, trans); channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); addEventListener(Event.ENTER_FRAME, onEnterFrame); function onEnterFrame(event:Event):void { trans.pan = Math.sin(panCounter); channel.soundTransform = trans; // or SoundMixer.soundTransform = trans; panCounter += 0.05; } function onPlaybackComplete(event:Event):void { removeEventListener(Event.ENTER_FRAME, onEnterFrame); }

Ce code commence par charger un fichier audio puis cre un objet SoundTransform avec un volume dfini sur 1 (volume maximal) et une balance dfinie sur 0 (balance quilibre entre gauche et droite). Il appelle ensuite la mthode snd.play() en transmettant lobjet SoundTransform comme paramtre. Lors de la lecture du son, la mthode onEnterFrame() sexcute de faon rpte. La mthode onEnterFrame() utilise la fonction Math.sin() pour gnrer une valeur comprise entre -1 et 1 (plage qui correspond aux valeurs acceptables de la proprit SoundTransform.pan). La proprit pan de lobjet SoundTransform est dfinie sur la nouvelle valeur, puis la proprit soundTransform du canal est dfinie pour utiliser lobjet SoundTransform modifi. Pour excuter cet exemple, remplacez le nom de fichier bigSound.mp3 par le nom dun fichier mp3 local. Excutez ensuite lexemple. Le volume du canal gauche devrait augmenter quand celui du canal droit diminue, et vice-versa. Dans cet exemple, le mme effet peut tre obtenu en dfinissant la proprit soundTransform de la classe SoundMixer. Nanmoins, la balance de tous les sons en cours de lecture est affecte (pas seulement le son lu par cet objet SoundChannel).

Contrle du volume du son et de la balance

645

Utilisation des mtadonnes audio


Les fichiers audio qui utilisent le format mp3 peuvent contenir des donnes supplmentaires relatives au son sous la forme de balises ID3. Tous les fichiers mp3 ne contiennent pas de mtadonnes ID3. Lorsquun objet Sound charge un fichier audio mp3, il envoie un vnement Event.ID3 si le fichier audio contient des mtadonnes ID3. Pour viter des erreurs dexcution, votre application doit attendre de recevoir lvnement Event.ID3 avant daccder la proprit Sound.id3 pour un son charg. Le code suivant indique comment savoir si les mtadonnes ID3 pour un fichier audio ont t charges :
import flash.events.Event; import flash.media.ID3Info; import flash.media.Sound; var s:Sound = new Sound(); s.addEventListener(Event.ID3, onID3InfoReceived); s.load("mySound.mp3"); function onID3InfoReceived(event:Event) { var id3:ID3Info = event.target.id3; trace("Received ID3 Info:"); for (var propName:String in id3) { trace(propName + " = " + id3[propName]); } }

Ce code commence par crer un objet Sound et par lui demander dcouter lvnement Event.ID3. Lorsque les mtadonnes ID3 du fichier audio sont charges, la mthode onID3InfoReceived() est appele. La cible de lobjet Event qui est transmise la mthode onID3InfoReceived() est lobjet Sound dorigine. Par consquent, la mthode obtient ensuite la proprit id3 de lobjet Sound puis effectue une itration sur toutes ses proprits nommes pour suivre leurs valeurs.

646

Utilisation du son

Accs aux donnes audio brutes


La mthode SoundMixer.computeSpectrum() permet une application de lire les donnes audio brutes pour la courbe audio en cours de lecture. Si plusieurs objets SoundChannel sont en cours de lecture, la mthode SoundMixer.computeSpectrum() indique les donnes audio combines de chaque objet SoundChannel mix. Les donnes audio sont renvoyes sous la forme dun objet ByteArray contenant 512 octets de donnes (chacun deux contenant une valeur en virgule flottante comprise entre -1 et 1). Ces valeurs reprsentent lamplitude des points dans la courbe audio en cours de lecture. Les valeurs sont fournies en deux groupes de 256 : le premier groupe pour le canal stro gauche et le second pour le canal stro droit. La mthode SoundMixer.computeSpectrum() renvoie des donnes de spectre de frquences plutt que des donnes de courbe audio si le paramtre FT est dfini sur true. Le spectre de frquences indique lamplitude par frquence du son, de la plus basse la plus leve. Une FFT (Fast Fourier Transform - transformation de Fourier rapide) est utilise pour convertir les donnes de courbe audio en donnes de spectre de frquences. Les valeurs de spectre de frquences rsultantes sont comprises entre 0 et 1,414 environ (la racine carre de 2). Le diagramme suivant compare les donnes renvoyes de la mthode computeSpectrum() lorsque le paramtre FFTMode est dfini sur true et lorsquil est dfini sur false. Le son dont les donnes ont t utilises pour ce diagramme contient un son de basse de grande intensit dans le canal gauche et un son de tambour dans le canal droit.

Accs aux donnes audio brutes

647

La mthode computeSpectrum() peut galement renvoyer des donnes qui ont t rchantillonnes un dbit infrieur. Gnralement, ceci entrane des donnes de frquence ou des donnes de courbe audio plus lisses, au profit des dtails. Le paramtre stretchFactor contrle la frquence laquelle les donnes de la mthode computeSpectrum() sont chantillonnes. Lorsque le paramtre stretchFactor est dfini sur 0, par dfaut, les donnes audio sont chantillonnes une frquence de 44,1 KHz. La frquence est diminue de moiti chaque valeur successive du paramtre stretchFactor. Par consquent, une valeur de 1 indique une frquence de 22,05 KHz, une valeur de 2 une frquence de 11,025 KHz, etc. La mthode computeSpectrum() continue renvoyer 256 octets par canal stro lorsquune valeur stretchFactor suprieure est utilise. La mthode SoundMixer.computeSpectrum() comporte des limites :

Etant donn que les donnes audio issues dun microphone ou de flux RTMP ne passent pas par lobjet SoundMixer global, la mthode SoundMixer.computeSpectrum() ne renvoie pas de donnes de ces sources. Si un ou plusieurs sons lus proviennent de sources externes au sandbox de contexte actuel, les restrictions de scurit provoquent le renvoi dune erreur par la mthode SoundMixer.computeSpectrum(). Pour de plus amples informations sur les limites de scurit de la mthode SoundMixer.computeSpectrum(), voir Scurit lors du chargement et de la lecture des sons , la page 642 et Accs aux mdias chargs comme sil sagissait de donnes , la page 826.

Cration dun visualiseur audio simple


Lexemple suivant utilise la mthode SoundMixer.computeSpectrum() pour afficher un diagramme de la courbe audio anime avec chaque image :
import import import import import import flash.display.Graphics; flash.events.Event; flash.media.Sound; flash.media.SoundChannel; flash.media.SoundMixer; flash.net.URLRequest;

const PLOT_HEIGHT:int = 200; const CHANNEL_LENGTH:int = 256; var snd:Sound = new Sound(); var req:URLRequest = new URLRequest("bigSound.mp3"); snd.load(req);

648

Utilisation du son

var channel:SoundChannel; channel = snd.play(); addEventListener(Event.ENTER_FRAME, onEnterFrame); snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); var bytes:ByteArray = new ByteArray(); function onEnterFrame(event:Event):void { SoundMixer.computeSpectrum(bytes, false, 0); var g:Graphics = this.graphics; g.clear(); g.lineStyle(0, 0x6600CC); g.beginFill(0x6600CC); g.moveTo(0, PLOT_HEIGHT); var n:Number = 0; // left channel for (var i:int = 0; i < CHANNEL_LENGTH; i++) { n = (bytes.readFloat() * PLOT_HEIGHT); g.lineTo(i * 2, PLOT_HEIGHT - n); } g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); g.endFill(); // right channel g.lineStyle(0, 0xCC0066); g.beginFill(0xCC0066, 0.5); g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); for (i = CHANNEL_LENGTH; i > 0; i--) { n = (bytes.readFloat() * PLOT_HEIGHT); g.lineTo(i * 2, PLOT_HEIGHT - n); } g.lineTo(0, PLOT_HEIGHT); g.endFill(); } function onPlaybackComplete(event:Event) { removeEventListener(Event.ENTER_FRAME, onEnterFrame); }

Accs aux donnes audio brutes

649

Cet exemple commence par charger et lire un fichier audio puis coute lvnement Event.ENTER_FRAME qui dclenchera la mthode onEnterFrame() lors de la lecture du son. La mthode onEnterFrame() commence par appeler la mthode SoundMixer.computeSpectrum(), qui stocke les donnes donde acoustique dans lobjet ByteArray bytes. La courbe audio est trace laide de lAPI de dessin vectoriel. Une boucle for passe dans les 256 premires valeurs de donnes, reprsentant le canal stro gauche, et trace une ligne entre chaque point au moyen de la mthode Graphics.lineTo(). Une second boucle for passe dans les 256 valeurs suivantes, en les traant cette fois dans lordre inverse, de droite gauche. Les tracs de courbe audio rsultants peuvent produire un effet miroir-image intressant, comme illustr sur limage suivante.

650

Utilisation du son

Capture de lentre de son


La classe Microphone permet votre application de se connecter un microphone ou un autre priphrique dentre de son sur le systme de lutilisateur et de diffuser laudio sur les haut-parleurs de ce systme ou denvoyer les donnes audio un serveur distant (Flash Media Server, par exemple).

Accs un microphone
La classe Microphone ne possde pas de mthode constructeur. A la place, vous utilisez la mthode statique Microphone.getMicrophone() pour obtenir une nouvelle instance Microphone, comme indiqu ci-dessous :
var mic:Microphone = Microphone.getMicrophone();

Lorsque vous appelez la mthode Microphone.getMicrophone() sans paramtre, le premier priphrique dentre de son dtect sur le systme de lutilisateur est renvoy. Un systme peut avoir plusieurs priphriques dentre de son qui lui sont associs. Votre application peut utiliser la proprit Microphone.names pour obtenir un tableau des noms de tous les priphriques dentre de son disponibles. Elle peut ensuite appeler la mthode Microphone.getMicrophone() avec un paramtre index qui correspond la valeur dindex du nom dun priphrique dans le tableau. Il se peut quun systme nait aucun microphone ni priphrique dentre de son qui lui soit associ. Vous pouvez utiliser la proprit Microphone.names ou la mthode Microphone.getMicrophone() pour vrifier si lutilisateur a install un priphrique dentre de son. Si ce nest pas le cas, la longueur du tableau names est zro, et la mthode getMicrophone() renvoie une valeur null. Lorsque votre application appelle la mthode Microphone.getMicrophone(), Flash Player affiche la bote de dialogue des paramtres de Flash Player, qui invite lutilisateur autoriser ou refuser laccs Flash Player la camra et au microphone sur le systme. Une fois que lutilisateur a fait son choix dans cette bote de dialogue, un StatusEvent est envoy. La proprit code de cette instance StatusEvent indique si laccs au microphone a t autoris ou refus, comme indiqu dans cet exemple :
import flash.media.Microphone; var mic:Microphone = Microphone.getMicrophone(); mic.addEventListener(StatusEvent.STATUS, this.onMicStatus);

Capture de lentre de son

651

function onMicStatus(event:StatusEvent):void { if (event.code == "Microphone.Unmuted") { trace("Microphone access was allowed."); } else if (event.code == "Microphone.Muted") ( trace("Microphone access was denied."); } }

La proprit StatusEvent.code contiendra Microphone.Unmuted si laccs a t autoris, ou Microphone.Muted sil a t refus.


REMARQUE 652

La proprit Microphone.muted est dfinie sur true ou sur false lorsque lutilisateur autorise ou refuse laccs au microphone, respectivement. Nanmoins, la proprit muted nest pas dfinie sur linstance Microphone jusqu lenvoi de StatusEvent. Par consquent, votre application doit toujours attendre lenvoi de lvnement StatusEvent.STATUS avant de vrifier la proprit Microphone.muted.

Acheminement de laudio du microphone vers des haut-parleurs locaux


Lentre audio issue dun microphone peut tre achemine vers les haut-parleurs du systme local en appelant la mthode Microphone.setLoopback() avec une valeur de paramtre true. Lorsque le son provenant dun microphone local est achemin vers des haut-parleurs locaux, vous risquez de crez une boucle de raction acoustique pouvant entraner des grincements dune grande intensit et endommager ainsi votre matriel. Vous pouvez appeler la mthode Microphone.setUseEchoSuppression() avec une valeur de paramtre true pour rduire (sans liminer compltement) le risque de raction acoustique. Adobe vous conseille de toujours appeler Microphone.setUseEchoSuppression(true) avant dappeler Microphone.setLoopback(true), moins que vous soyez sr que lutilisateur lit le son laide dun casque ou dun dispositif autre que les haut-parleurs. Le code suivant indique comment acheminer laudio dun microphone local vers les hautparleurs du systme local :
var mic:Microphone = Microphone.getMicrophone(); mic.setUseEchoSuppression(true); mic.setLoopBack(true);

Utilisation du son

Modification de laudio du microphone


Votre application peut modifier les donnes audio provenant dun microphone de deux faons diffrentes. Premirement, elle peut modifier le gain du son entr, qui multiplie les valeurs dentre par une quantit spcifie pour crer un son plus ou moins intense. La proprit Microphone.gain accepte des valeurs numriques comprises entre 0 et 100 inclus. Une valeur de 50 a un rle de multiplicateur de un et spcifie un volume normal. Une valeur de zro agit comme un multiplicateur de zro et interrompt laudio dentre. Les valeurs suprieures 50 indiquent un volume suprieur la normale. Votre application peut galement modifier la frquence dchantillonnage de laudio dentre. Des frquences dchantillonnage suprieures augmentent la qualit du son, mais crent galement des flux de donnes plus denses qui utilisent davantage de ressources pour la transmission et le stockage. La proprit Microphone.rate reprsente la frquence dchantillonnage audio mesure en kilohertz (kHz). La frquence dchantillonnage par dfaut est de 8 kHz. Vous pouvez dfinir la proprit Microphone.rate sur une valeur suprieure 8 kHz si votre microphone prend en charge la frquence suprieure. Par exemple, si vous dfinissez la proprit Microphone.rate sur une valeur de 11, la frquence dchantillonnage est dfinie sur 11 kHz ; si vous la dfinissez sur 22, la frquence dchantillonnage est dfinie sur 22 kHz, et ainsi de suite.

Dtection de lactivit du microphone


Pour conomiser les ressources de traitement et de bande passante, Flash Player tente de dtecter lorsque aucun son nest transmis par un microphone. Lorsque le niveau dactivit du microphone se situe sous le seuil de niveau de silence pendant longtemps, Flash Player arrte la transmission de lentre audio et envoie un simple ActivityEvent la place. Trois proprits de la classe Microphone surveillent et contrlent la dtection dactivit :

La proprit activityLevel en lecture seule indique la quantit de son dtecte par le microphone, sur une chelle de 0 100. La proprit silenceLevel spcifie la quantit de son ncessaire pour activer le microphone et envoie un vnement ActivityEvent.ACTIVITY. La proprit silenceLevel utilise galement une chelle de 0 100, et la valeur par dfaut est 10. La proprit silenceTimeout dcrit le nombre de millisecondes pendant lequel le niveau dactivit doit rester sous le niveau de silence, jusqu ce quun vnement ActivityEvent.ACTIVITY soit envoy pour indiquer que le microphone est maintenant dsactiv. La valeur silenceTimeout par dfaut est 2000.

Capture de lentre de son

653

Les proprits Microphone.silenceLevel et Microphone.silenceTimeout sont en lecture seule, mais vous pouvez modifier leurs valeurs laide de la mthode Microphone.setSilenceLevel(). Dans certains cas, lactivation du microphone alors quune nouvelle activit est dtecte peut entraner un court dlai. Vous pouvez laisser le microphone actif en permanence pour supprimer ces dlais dactivation. Votre application peut appeler la mthode Microphone.setSilenceLevel() avec le paramtre silenceLevel dfini sur zro pour indiquer Flash Player de laisser le microphone actif et de continuer rassembler des donnes audio, mme lorsque aucun son nest dtect. Inversement, lorsque vous dfinissez le paramtre silenceLevel sur 100, le microphone nest pas activ. Lexemple suivant affiche les informations relatives au microphone et aux vnements activity et status envoys par un objet Microphone :
import flash,events.ActivityEvent; import flash,events.StatusEvent; import flash.media.Microphone; var deviceArray:Array = Microphone.names; trace("Available sound input devices:"); for (var i:int = 0; i < deviceArray.length; i++) { trace(" " + deviceArray[i]); } var mic:Microphone = Microphone.getMicrophone(); mic.gain = 60; mic.rate = 11; mic.setUseEchoSuppression(true); mic.setLoopBack(true); mic.setSilenceLevel(5, 1000); mic.addEventListener(ActivityEvent.ACTIVITY, this.onMicActivity); mic.addEventListener(StatusEvent.STATUS, this.onMicStatus); var micDetails:String = "Sound input device name: " + mic.name + '\n'; micDetails += "Gain: " + mic.gain + '\n'; micDetails += "Rate: " + mic.rate + " kHz" + '\n'; micDetails += "Muted: " + mic.muted + '\n'; micDetails += "Silence level: " + mic.silenceLevel + '\n'; micDetails += "Silence timeout: " + mic.silenceTimeout + '\n'; micDetails += "Echo suppression: " + mic.useEchoSuppression + '\n'; trace(micDetails);

654

Utilisation du son

function onMicActivity(event:ActivityEvent):void { trace("activating=" + event.activating + ", activityLevel=" + mic.activityLevel); } function onMicStatus(event:StatusEvent):void { trace("status: level=" + event.level + ", code=" + event.code); }

Lorsque vous excutez lexemple ci-dessus, parlez ou faites du bruit dans votre microphone systme et observez les instructions trace qui apparaissent dans une console ou une fentre de dbogage.

Envoi daudio vers et depuis une passerelle multimdia


Dautres fonctionnalits audio sont disponibles lorsque vous utilisez ActionScript avec une passerelle multimdia de diffusion en continu telle que Flash Media Server. Votre application peut notamment associer un objet Microphone un objet NetStream et transmettre directement des donnes du microphone de lutilisateur au serveur. Les donnes audio peuvent galement tre diffuses en continu du serveur vers une application Flash ou Flex et lues dans le cadre dun MovieClip ou au moyen dun objet Video. Pour plus dinformations, consulter la documentation en ligne relative Flash Media Server ladresse http://livedocs.macromedia.com.

Exemple : Podcast Player


Un balado est un fichier audio distribu sur Internet, sur demande ou sur abonnement. Les balados sont gnralement publis dans un annuaire. Etant donn que les pisodes de balado peuvent durer dune minute plusieurs heures, ils sont gnralement diffuss en continu pendant la lecture. Les pisodes de balado, galement appels lments, sont gnralement fournis au format de fichier mp3. Les balados vido sont galement courants, mais cet exemple dapplication lit uniquement des balados audio utilisant des fichiers mp3. Cet exemple nest pas une application agrgateur de balados comprenant toutes les fonctionnalits. Par exemple, elle ne gre pas les abonnements des balados spcifiques et ne mmorise pas les balados quun utilisateur a couts lors de lexcution suivante de lapplication. Il peut servir de point de dpart pour un agrgateur de balados comprenant toutes les fonctionnalits.

Exemple : Podcast Player

655

Lexemple Podcast Player illustre les techniques de programmation ActionScript suivantes :


Lecture dun fil de syndication et analyse de son contenu XML Cration dune classe SoundFacade pour simplifier le chargement et la lecture des fichiers audio Affichage de la progression de la lecture du son Interruption et reprise de la lecture du son

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers dapplication Podcast Player se trouvent dans le dossier Samples/PodcastPlayer. Cette application se compose des fichiers suivants :
Fichier
PodcastPlayer.mxml ou PodcastPlayer.fla RSSBase.as

Description
Linterface utilisateur pour lapplication pour Flex (MXML) ou Flash (FLA). Une classe de base qui fournit les mthodes et les proprits courantes pour la classe RSSChannel et la classe RSSItem. Une classe ActionScript qui contient des donnes relatives un canal RSS. Une classe ActionScript qui contient des donnes relatives un lment RSS. La classe ActionScript principale pour lapplication. Elle encapsule les mthodes et les vnements des classes Sound et SoundChannel et ajoute une prise en charge pour linterruption et la reprise de la lecture. Une classe ActionScript qui rcupre des donnes dune URL distante. Un fichier XML contenant une liste des fils de syndication qui reprsentent des chanes de balado.

RSSChannel.as RSSItem.as SoundFacade.as

URLService.as playerconfig.xml

656

Utilisation du son

Lecture de donnes RSS pour une chane de balado


Lapplication Podcast Player commence par lire les informations concernant des chanes de balados et leurs pisodes : 1. Lapplication commence par lire un fichier de configuration XML qui contient une liste des chanes de balado et affiche la liste des chanes pour lutilisateur. 2. Lorsque lutilisateur slectionne lune des chanes de balado, il lit le fil de syndication pour la chane et affiche une liste des pisodes de chane. Cet exemple utilise la classe dutilitaire URLLoader pour rcuprer des donnes de texte depuis un emplacement distant ou un fichier local. Lapplication Podcast Player cre dabord un objet URLLoader pour obtenir une liste des fils de syndication au format XML du fichier playerconfig.xml. Ensuite, lorsque lutilisateur slectionne un fil de syndication spcifique dans la liste, un nouvel objet URLLoader est cr pour lire les donnes RSS de lURL de ce fil.

Simplification de la lecture et du chargement du son laide de la classe SoundFacade


Larchitecture audio ActionScript 3.0 est puissante mais complexe. Les applications ncessitant des fonctions de lecture et de chargement de son de base uniquement peuvent utiliser une classe masquant une partie de la complexit en fournissant un ensemble dappels et dvnements plus simple. Dans lunivers des modles de conception de logiciel, une telle classe est appele faade. La classe SoundFacade prsente une seule interface permettant deffectuer les tches suivantes :

Chargement de fichiers audio laide dun objet Sound, dun objet SoundLoaderContext et dune classe SoundMixer Lecture de fichiers audio laide des objets Sound et SoundChannel Envoi dvnements de progression de la lecture Interruption et reprise de la lecture du son laide des objets Sound et SoundChannel

La classe SoundFacade essaie doffrir le meilleur de la fonctionnalit des classes de son ActionScript avec moins de complexit.

Exemple : Podcast Player

657

Le code suivant indique la dclaration de classe, les proprits de classe et la mthode constructeur SoundFacade() :
public class { public var public var public var public var public public public public public public var var var var var var SoundFacade extends EventDispatcher s:Sound; sc:SoundChannel; url:String; bufferTime:int = 1000; isLoaded:Boolean = false; isReadyToPlay:Boolean = false; isPlaying:Boolean = false; isStreaming:Boolean = true; autoLoad:Boolean = true; autoPlay:Boolean = true;

public var pausePosition:int = 0; public static const PLAY_PROGRESS:String = "playProgress"; public var progressInterval:int = 1000; public var playTimer:Timer; public function SoundFacade(soundUrl:String, autoLoad:Boolean = true, autoPlay:Boolean = true, streaming:Boolean = true, bufferTime:int = -1):void { this.url = soundUrl; // Dfinit des valeurs boolennes qui dterminent le comportement // de cet objet this.autoLoad = autoLoad; this.autoPlay = autoPlay; this.isStreaming = streaming; // Prend par dfaut la valeur bufferTime globale if (bufferTime < 0) { bufferTime = SoundMixer.bufferTime; } // Vrifie que la dure du tampon est raisonnable, // entre 0 et 30 secondes this.bufferTime = Math.min(Math.max(0, bufferTime), 30000); if (autoLoad) { load(); } }

658

Utilisation du son

La classe SoundFacade tend la classe EventDispatcher pour quelle puisse envoyer ses propres vnements. Le code de classe dclare dabord les proprits pour un objet Sound et un objet SoundChannel. La classe stocke galement la valeur de lURL du fichier audio et une proprit bufferTime utiliser lors de la lecture du son en continu. De plus, elle accepte des valeurs de paramtre boolennes qui affectent le comportement de lecture et de chargement :

Le paramtre autoLoad indique lobjet que le chargement du son doit commencer ds la cration de cet objet. Le paramtre autoPlay indique que la lecture du son doit commencer ds quune quantit suffisante de donnes audio a t charge. Sil sagit dun son diffus en continu, la lecture commence ds quune quantit suffisante de donnes (comme spcifi par la proprit bufferTime) est charge. Le paramtre streaming indique que ce fichier audio peut commencer la lecture avant la fin du chargement.

Le paramtre bufferTime prend la valeur -1 par dfaut. Si la mthode constructeur dtecte une valeur ngative dans le paramtre bufferTime, elle dfinit la proprit bufferTime sur la valeur de SoundMixer.bufferTime. Ceci permet lapplication de prendre la valeur SoundMixer.bufferTime globale, par dfaut, comme souhait. Si le paramtre autoLoad est dfini sur true, la mthode constructeur appelle immdiatement la mthode load() suivante pour commencer le chargement du fichier audio :
public function load():void { if (this.isPlaying) { this.stop(); this.s.close(); } this.isLoaded = false; this.s = new Sound(); this.s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); this.s.addEventListener(Event.OPEN, onLoadOpen); this.s.addEventListener(Event.COMPLETE, onLoadComplete); this.s.addEventListener(Event.ID3, onID3); this.s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); this.s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onIOError); var req:URLRequest = new URLRequest(this.url); var context:SoundLoaderContext = new SoundLoaderContext(this.bufferTime, true); this.s.load(req, this.slc); }

Exemple : Podcast Player

659

La mthode load() cre un objet Sound puis ajoute des couteurs pour tous les vnements de son importants. Elle indique ensuite lobjet Sound de charger le fichier audio, laide dun objet LoaderContext pour transmettre la valeur bufferTime. Etant donn que la proprit url peut tre modifie, vous pouvez utiliser une instance SoundFacade pour lire diffrents fichiers audio la suite : il vous suffit de modifier la proprit url et dappeler la mthode load() pour charger le nouveau fichier audio. Les trois mthodes dcouteur dvnement suivantes indiquent comment lobjet SoundFacade suit la progression du chargement et dcide quand dmarrer la lecture du son :
public function onLoadOpen(event:Event):void { if (this.isStreaming) { this.isReadyToPlay = true; if (autoPlay) { this.play(); } } this.dispatchEvent(event.clone()); } public function onLoadProgress(event:ProgressEvent):void { this.dispatchEvent(event.clone()); } public function onLoadComplete(event:Event):void { this.isReadyToPlay = true; this.isLoaded = true; this.dispatchEvent(evt.clone()); if (autoPlay && !isPlaying) { play(); } }

La mthode onLoadOpen() sexcute lorsque le chargement du son commence. Si vous pouvez lire le son en mode continu, la mthode onLoadComplete() dfinit immdiatement lindicateur isReadyToPlay sur true. Lindicateur isReadyToPlay dtermine si lapplication peut dmarrer la lecture du son, peut-tre en rponse une action utilisateur (clic sur un bouton de lecture, par exemple). La classe SoundChannel gre la mise en mmoire tampon des donnes audio. Par consquent, il est inutile de vrifier si suffisamment de donnes ont t charges avant dappeler la mthode play().

660

Utilisation du son

La mthode onLoadProgress() sexcute rgulirement pendant le chargement. Elle envoie simplement une copie de son objet ProgressEvent pour le code qui utilise cet objet SoundFacade.
onLoadComplete()

Une fois que les donnes audio ont t compltement charges, la mthode sexcute en appelant la mthode play() pour des sons non diffuss en continu, si ncessaire. La mthode play() est dcrite ci-dessous.

public function play(pos:int = 0):void { if (!this.isPlaying) { if (this.isReadyToPlay) { this.sc = this.s.play(pos); this.sc.addEventListener(Event.SOUND_COMPLETE, onPlayComplete); this.isPlaying = true; this.playTimer = new Timer(this.progressInterval); this.playTimer.addEventListener(TimerEvent.TIMER, onPlayTimer); this.playTimer.start(); } } }

La mthode play() appelle la mthode Sound.play() lorsque le son peut tre lu. Lobjet SoundChannel rsultant est stock dans la proprit sc. La mthode play() cre ensuite un objet Timer qui sera utilis pour envoyer des vnements de progression de la lecture des intervalles rguliers.

Affichage de la progression de la lecture


La cration dun objet Timer pour surveiller la lecture est une opration complexe que vous devez coder une seule fois. Le fait dencapsuler cette logique Timer dans une classe rutilisable telle que la classe SoundFacade permet aux applications dcouter les mmes types dvnements de progression lorsquun son est charg et lorsquil est lu. Lobjet Timer cr par la mthode SoundFacade.play() envoie une instance TimerEvent toutes les secondes. La mthode onPlayTimer() sexcute chaque fois quun nouveau TimerEvent arrive :
public function onPlayTimer(event:TimerEvent):void { var estimatedLength:int = Math.ceil(this.s.length / (this.s.bytesLoaded / this.s.bytesTotal)); var progEvent:ProgressEvent = new ProgressEvent(PLAY_PROGRESS, false, false, this.sc.position, estimatedLength); this.dispatchEvent(progEvent); }
Exemple : Podcast Player 661

La mthode onPlayTimer() met en uvre la technique destimation de la taille dcrite dans la section Surveillance de la lecture , la page 640. Elle cre ensuite une instance ProgressEvent avec un type dvnement de SoundFacade.PLAY_PROGRESS, avec la proprit bytesLoaded dfinie sur la position actuelle de lobjet SoundChannel et la proprit bytesTotal dfinie sur la longueur estime des donnes audio.

Interruption et reprise de la lecture


La mthode SoundFacade.play() dcrite prcdemment accepte un paramtre pos correspondant une position de dbut dans les donnes audio. Si la valeur pos est zro, la lecture du son commence au dbut. La mthode SoundFacade.stop() accepte galement un paramtre pos comme indiqu ici :
public function stop(pos:int = 0):void { if (this.isPlaying) { this.pausePosition = pos; this.sc.stop(); this.playTimer.stop(); this.isPlaying = false; } }

Chaque fois que la mthode SoundFacade.stop() est appele, elle dfinit la proprit pausePosition de faon ce que lapplication sache o positionner la tte de lecture si lutilisateur souhaite reprendre la lecture du mme son. Les mthodes SoundFacade.pause() et SoundFacade.resume() indiques ci-dessous appellent les mthodes SoundFacade.stop() et SoundFacade.play() respectivement, transmettant chaque fois une valeur de paramtre pos.
public function pause():void { stop(this.sc.position); } public function resume():void { play(this.pausePosition); }

La mthode pause() transmet la valeur SoundChannel.position actuelle la mthode play(), qui la stocke dans la proprit pausePosition. La mthode resume() recommence lire le mme son en utilisant la valeur pausePosition comme point de dbut.

662

Utilisation du son

Extension de lexemple Podcast Player


Cet exemple prsente un Podcast Player dpouill qui prsente lutilisation de la classe SoundFacade rutilisable. Vous pouvez ajouter dautres fonctions pour amliorer lutilit de cette application, notamment :

stocker la liste des fils de syndication et des informations dutilisation concernant chaque pisode dans une instance SharedObject pouvant tre utilise la prochaine fois que lutilisateur excute lapplication ; permettre lutilisateur dajouter son fil de syndication la liste des chanes de balado ; mmoriser la position de la tte de lecture lorsque lutilisateur arrte ou quitte un pisode de faon ce quil puisse tre redmarr partir de ce point la prochaine fois que lutilisateur excute lapplication ; tlcharger des fichiers mp3 dpisodes pour les couter hors ligne, lorsque lutilisateur nest pas connect Internet ; ajouter des fonctions dabonnement qui vrifient rgulirement la prsence de nouveaux pisodes dans une chane de balado et mettre jour la liste des pisodes automatiquement ; ajouter une fonctionnalit de recherche de balado laide dune API partir dun service dhbergement de balado tel que Odeo.com.

Exemple : Podcast Player

663

664

Utilisation du son

CHAPITRE 21

Capture des donnes saisies par lutilisateur


Ce chapitre dcrit comment crer une interactivit laide dActionScript 3.0 pour rpondre lactivit de lutilisateur. Il traite des vnements de souris et de clavier puis aborde des rubriques plus avances, notamment la personnalisation du menu contextuel et la gestion du focus. Ce chapitre se termine par WordSearch, un exemple dune application qui rpond aux actions de la souris. Ce chapitre suppose que vous matrisez le modle dvnement dActionScript 3.0. Pour plus dinformations, voir Chapitre 10, Gestion dvnements , la page 335.

21

Contenu
Principes de base de la saisie utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .665 Capture de la saisie au clavier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667 Capture des entres de souris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .670 Exemple : WordSearch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675

Principes de base de la saisie utilisateur


Introduction la capture des donnes saisies par lutilisateur
Linteraction utilisateur, au moyen du clavier, de la souris, de la camra ou dune combinaison de ces priphriques, est la base de linteractivit. Dans ActionScript 3.0, lidentification et la rponse linteraction utilisateur implique principalement lcoute dvnements.

665

La classe InteractiveObject, une sous-classe de la classe DisplayObject, fournit la structure dvnements courante et la fonctionnalit ncessaire la gestion de linteraction utilisateur. Vous ne crez pas directement une instance de la classe InteractiveObject. A la place, les objets daffichage tels que SimpleButton, Sprite, TextField et diffrents composants Flash et Flex hritent de leur modle dinteraction utilisateur de cette classe. Par consquent, ils partagent une structure commune. Cela signifie que les techniques que vous apprenez et le code que vous crivez pour grer linteraction utilisateur dans un objet driv de InteractiveObject sont applicables tous les autres. Les tches dinteraction utilisateur classiques suivantes sont dcrites dans ce chapitre :

Capture de la saisie au clavier lchelle de lapplication Capture de la saisie au clavier sur un objet daffichage spcifique Capture des actions de la souris lchelle de lapplication Capture des actions de la souris sur un objet daffichage spcifique Cration dinteractivit aux actions de glisser-dposer Cration dun curseur de souris personnalis (pointeur de la souris) Ajout de nouveaux comportements au menu contextuel Gestion du focus

Concepts et termes importants


Il est important que vous vous familiarisiez avec les termes dinteraction utilisateur suivants avant de poursuivre :

Code de caractres : un code numrique reprsentant un caractre dans le jeu de caractres actuel (associ une touche tape sur le clavier). Par exemple, D et d ont des codes de caractres diffrents mme si elles sont cres par la mme touche sur un clavier anglais amricain. Menu contextuel : le menu qui apparat lorsquun utilisateur clique avec le bouton droit de la souris ou utilise une combinaison clavier-souris particulire. Les commandes de menu contextuel sappliquent gnralement directement llment sur lequel vous avez cliqu. Par exemple, un menu contextuel pour une image peut contenir une commande pour afficher limage dans une fentre spare et une commande pour la tlcharger. Focus : lindication quun lment slectionn est actif et quil est la cible dune interaction clavier ou souris. Code de touche : un code numrique correspondant une touche physique sur le clavier.

666

Capture des donnes saisies par lutilisateur

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Etant donn que ce chapitre traite de lutilisation des donnes saisies par lutilisateur dans ActionScript, pratiquement tous les exemples de code quil contient impliquent la manipulation dun certain type dobjet daffichage (gnralement un champ texte ou une sous-classe InteractiveObject). Dans le cadre de ces exemples, lobjet daffichage peut avoir t cr et plac sur la scne dans Adobe Flash CS3 Professional ou bien cr laide ActionScript. Le test dun exemple implique laffichage du rsultat dans Flash Player et linteraction avec lexemple pour visualiser les effets du code.
Pour tester les codes de ce chapitre :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code dans le panneau Script. Crez une instance sur la scne :

Si le code fait rfrence un champ texte, utilisez loutil Texte pour crer un champ texte dynamique sur la scne. Autrement, crez une instance de symbole de clip ou de bouton sur la scne.

5.

Slectionnez le champ texte, le bouton ou le clip et attribuez-lui un nom dinstance dans linspecteur Proprits. Le nom doit correspondre au nom de lobjet daffichage dans lexemple de code (par exemple, si le code manipule un objet appel myDisplayObject, nommez votre objet scne myDisplayObject galement). Excutez le programme en slectionnant Contrle > Tester lanimation. A lcran, lobjet daffichage est manipul comme indiqu dans le code.

6.

Capture de la saisie au clavier


Les objets daffichage qui hritent de leur modle dinteraction de la classe InteractiveObject peuvent rpondre des vnements de clavier laide dcouteurs dvnements. Par exemple, vous pouvez placer un couteur dvnement sur la scne pour couter et rpondre une saisie au clavier. Dans le code suivant, un couteur dvnement capture une saisie au clavier et le nom de la touche et les proprits de code de la touche sont affichs :
function reportKeyDown(event:KeyboardEvent):void { trace("Key Pressed: " + String.fromCharCode(event.charCode) + " (character code: " + event.charCode + ")"); } stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);

Capture de la saisie au clavier

667

Certaines touches (Ctrl, par exemple) gnrent des vnements, mme si elles nont pas de reprsentation de glyphes. Dans lexemple de code prcdent, lcouteur dvnement de clavier a captur une saisie au clavier pour la scne entire. Vous pouvez galement crire un couteur dvnement pour un objet daffichage spcifique sur la scne ; cet couteur dvnement est dclench lorsque lobjet a le focus. Dans lexemple suivant, les frappes de touches apparaissent dans le panneau Sortie uniquement lorsque lutilisateur tape dans linstance TextField. Sil maintient la touche Maj enfonce, la couleur du contour du TextField devient temporairement rouge. Ce code suppose quil existe une instance TextField nomme tf sur la scne.
tf.border = true; tf.type = "input"; tf.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); tf.addEventListener(KeyboardEvent.KEY_UP,reportKeyUp); function reportKeyDown(event:KeyboardEvent):void { trace("Key Pressed: " + String.fromCharCode(event.charCode) + " (key code: " + event.keyCode + " character code: " + event.charCode + ")"); if (event.keyCode == Keyboard.SHIFT) tf.borderColor = 0xFF0000; } function reportKeyUp(event:KeyboardEvent):void { trace("Key Released: " + String.fromCharCode(event.charCode) + " (key code: " + event.keyCode + " character code: " + event.charCode + ")"); if (event.keyCode == Keyboard.SHIFT) { tf.borderColor = 0x000000; } }

La classe TextField signale galement un vnement textInput que vous pouvez couter lorsquun utilisateur saisit du texte. Pour plus dinformations, voir Capture de la saisie de texte , la page 549.

668

Capture des donnes saisies par lutilisateur

Prsentation des codes de touches et de caractres


Les proprits keyCode et charCode dun vnement clavier permettent de dterminer la touche utilise et de dclencher dautres actions. La propritkeyCode est une valeur numrique qui correspond la valeur de la touche sur le clavier. La proprit charCode est la valeur numrique de cette touche dans le jeu de caractres actuel. (Le jeu de caractres par dfaut est UTF-8, qui prend en charge ASCII.) La principale diffrence entre le code de touche et les valeurs de caractres est la suivante : la valeur du code de touche reprsente une touche dtermine du clavier (la touche 1 sur le pav numrique est diffrente du 1 sur le clavier central, mais cette dernire permet la fois de gnrer 1 et &) alors que la valeur du caractre reprsente un caractre particulier (les caractres R et r sont diffrents).
REMARQUE

Pour en savoir plus sur le mappage entre les touches et les codes de caractre ASCII correspondants, voir Annexe C, Touches du clavier et valeurs de code correspondantes , la page 767.

Les mappages entre les touches et leurs codes de touches dpendent du priphrique et du systme dexploitation. Cest pourquoi vous ne devez pas utiliser de mappages de touches pour dclencher des actions. A la place, utilisez les valeurs de constante prdfinies fournies par la classe Keyboard pour rfrencer les proprits keyCode appropries. Par exemple, au lieu dutiliser le mappage de touche pour la touche Maj, utilisez la constante Keyboard.SHIFT (comme indiqu dans lexemple de code prcdent).

Prsentation de la priorit de KeyboardEvent


Comme avec dautres vnements, la squence dvnement de clavier est dtermine par la hirarchie dobjet daffichage et non par lordre dans lequel les mthodes addEventListener() sont affectes dans le code. Supposons par exemple que vous placiez un champ texte tf au sein dun clip nomm container et que vous ajoutiez un couteur dvnement pour lvnement de clavier chaque occurrence, comme indiqu dans lexemple suivant :
container.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); container.tf.border = true; container.tf.type = "input"; container.tf.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown);

Capture de la saisie au clavier

669

function reportKeyDown(event:KeyboardEvent):void { trace(event.currentTarget.name + " hears key press: " + String.fromCharCode(event.charCode) + " (key code: " + event.keyCode + " character code: " + event.charCode + ")"); }

Etant donn quil existe un couteur sur le champ texte et sur son conteneur parent, la fonction reportKeyDown() est appele deux fois pour chaque frappe de touche dans le TextField. Notez que pour chaque touche actionne, le champ texte envoie un vnement avant que le clip container distribue un vnement. Le systme dexploitation et le navigateur Web traiteront les vnements de clavier avant Adobe Flash Player. Par exemple, dans Microsoft Internet Explorer, lorsque vous appuyez sur Ctrl+W, vous fermez la fentre du navigateur avant quun fichier SWF contenu distribue un vnement de clavier.

Capture des entres de souris


Les clics de souris crent des vnements souris qui permettent de dclencher une fonctionnalit interactive. Il est possible dajouter un couteur dvnement la scne afin dcouter les vnements de souris qui se produisent tout endroit du fichier SWF. Vous pouvez galement ajouter des couteurs dvnements des objets sur la scne qui hritent de InteractiveObject (par exemple, Sprite ou MovieClip) ; ces couteurs sont dclenchs lorsque vous cliquez sur lobjet. Comme les vnements de clavier, les vnements de souris se propagent vers le haut. Dans lexemple suivant, square tant un enfant de la scne, lvnement est distribu la fois du sprite square et de lobjet scne en cas de clic sur le carr :
var square:Sprite = new Sprite(); square.graphics.beginFill(0xFF0000); square.graphics.drawRect(0,0,100,100); square.graphics.endFill(); square.addEventListener(MouseEvent.CLICK, reportClick); square.x = square.y = 50; addChild(square); stage.addEventListener(MouseEvent.CLICK, reportClick); function reportClick(event:MouseEvent):void { trace(event.currentTarget.toString() + " dispatches MouseEvent. Local coords [" + event.localX + "," + event.localY + "] Stage coords [" + event.stageX + "," + event.stageY + "]"); }

670

Capture des donnes saisies par lutilisateur

Dans lexemple prcdent, vous pouvez remarquer que lvnement de souris contient des informations sur lendroit o le clic sest produit. Les proprits localX et localY indiquent lemplacement du clic sur lenfant le plus bas de la chane daffichage. Par exemple, si vous cliquez dans langle suprieur gauche de square, les coordonnes locales [0,0] sont signales car il sagit du point dalignement de square. Autrement, les proprits stageX et stageY se rfrent aux coordonnes globales du clic sur la scne. Le mme clic signale [50,50] pour ces coordonnes car square y a t dplac. Ces deux paires de coordonnes peuvent tre utiles, selon la faon dont vous souhaitez rpondre linteraction utilisateur. Lobjet MouseEvent contient aussi les proprits boolennes altKey, ctrlKey et shiftKey. Vous pouvez utiliser ces proprits pour vrifier si la touche Alt, Ctrl, ou Shift est appuye galement au moment du clic de la souris.

Cration de fonctionnalit glisser-dposer


La fonctionnalit glisser-dposer permet aux utilisateurs de slectionner un objet tout en maintenant le bouton gauche de la souris enfonc, de dplacer lobjet un nouvel endroit sur lcran et de ly dposer en relchant le bouton gauche de la souris. Le code suivant en est un exemple :
import flash.display.Sprite; import flash.events.MouseEvent; var circle:Sprite = new Sprite(); circle.graphics.beginFill(0xFFCC00); circle.graphics.drawCircle(0, 0, 40); var target1:Sprite = new Sprite(); target1.graphics.beginFill(0xCCFF00); target1.graphics.drawRect(0, 0, 100, 100); target1.name = "target1"; var target2:Sprite = new Sprite(); target2.graphics.beginFill(0xCCFF00); target2.graphics.drawRect(0, 200, 100, 100); target2.name = "target2"; addChild(target1); addChild(target2); addChild(circle); circle.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown)

Capture des entres de souris

671

function mouseDown(event:MouseEvent):void { circle.startDrag(); } circle.addEventListener(MouseEvent.MOUSE_UP, mouseReleased); function mouseReleased(event:MouseEvent):void { circle.stopDrag(); trace(circle.dropTarget.name); }

Pour plus dinformations, voir Cration dinteractions aux actions de glisser-dposer , la page 422.

Personnalisation du curseur de la souris


Le curseur de la souris (pointeur de la souris) peut tre masqu ou remplac pour tout objet daffichage de la scne. Pour masquer ce curseur, appelez la mthode Mouse.hide(). Personnalisez le curseur en appelant Mouse.hide(), en coutant lvnement MouseEvent.MOUSE_MOVE en provenance de la scne et en dfinissant les coordonnes dun objet daffichage (votre curseur personnalis) sur les proprits stageX et stageY de lvnement. Lexemple suivant illustre une excution de base de cette tche :
var cursor:Sprite = new Sprite(); cursor.graphics.beginFill(0x000000); cursor.graphics.drawCircle(0,0,20); cursor.graphics.endFill(); addChild(cursor); stage.addEventListener(MouseEvent.MOUSE_MOVE,redrawCursor); Mouse.hide(); function redrawCursor(event:MouseEvent):void { cursor.x = event.stageX; cursor.y = event.stageY; }

Personnalisation du menu contextuel


Chaque objet issu de la classe InteractiveObject peut possder un menu contextuel exclusif, qui saffiche lorsque lutilisateur clique avec le bouton droit de la souris dans le fichier SWF. Plusieurs commandes sont incluses par dfaut, notamment des commandes davance, de recul, dimpression, de qualit et de zoom.

672

Capture des donnes saisies par lutilisateur

Vous pouvez supprimer toutes les commandes par dfaut du menu, lexception des commandes Settings (Paramtres) et About (A propos). Lorsque vous dfinissez la proprit Stage showDefaultContextMenu sur false, ces commandes sont supprimes du menu contextuel. Pour crer un menu contextuel personnalis pour un objet daffichage particulier, crez une instance de la classe ContextMenu, appelez la mthode hideBuiltInItems() et affectez cette instance la proprit contextMenu de cette instance DisplayObject. Lexemple suivant cre un carr dessin dynamiquement avec une commande de menu contextuel qui permet de modifier sa couleur au hasard :
var square:Sprite = new Sprite(); square.graphics.beginFill(0x000000); square.graphics.drawRect(0,0,100,100); square.graphics.endFill(); square.x = square.y = 10; addChild(square); var menuItem:ContextMenuItem = new ContextMenuItem("Change Color"); menuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,changeColor); var customContextMenu:ContextMenu = new ContextMenu(); customContextMenu.hideBuiltInItems(); customContextMenu.customItems.push(menuItem); square.contextMenu = customContextMenu; function changeColor(event:ContextMenuEvent):void { square.transform.colorTransform = getRandomColor(); } function getRandomColor():ColorTransform { return new ColorTransform(Math.random(), Math.random(), Math.random(),1,(Math.random() * 512) - 255, (Math.random() * 512) -255, (Math.random() * 512) - 255, 0); }

Gestion du focus
Un objet interactif peut recevoir le focus, soit par programmation, soit par le biais dune action utilisateur. Dans les deux cas, la dfinition du focus change la proprit focus de lobjet sur true. En outre, si la proprit tabEnabled a la valeur true, lutilisateur peut transmettre le focus dun objet un autre en appuyant sur la touche Tabulation. La valeur tabEnabled est false par dfaut, except dans les cas suivants :

Pour un objet SimpleButton, la valeur est true. Pour un champ texte dentre, la valeur est true. Pour un objet Sprite ou MovieClip dont buttonMode a la valeur true, la valeur est true.
Capture des entres de souris 673

Dans chacune de ces situations, vous pouvez ajouter un couteur pour FocusEvent.FOCUS_IN ou FocusEvent.FOCUS_OUT pour tendre les comportements possibles lors du changement de focus. Si cette possibilit est pratique pour les champs texte et les formulaires, vous pouvez aussi lutiliser avec les sprites, les clips et tout autre objet qui hrite de la classe InteractiveObject. Lexemple suivant montre comment activer le changement de focus avec la touche de tabulation et comment rpondre lvnement focus qui en dcoule. Dans ce cas, chaque carr change de couleur lorsquil reoit le focus.
REMARQUE 674

Loutil de programmation Flash utilise des raccourcis clavier pour grer le focus ; par consquent, pour simuler correctement la gestion du focus, les fichiers SWF doivent tre tests dans un navigateur plutt que dans Flash.

var rows:uint = 10; var cols:uint = 10; var rowSpacing:uint = 25; var colSpacing:uint = 25; var i:uint; var j:uint; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { createSquare(j * colSpacing, i * rowSpacing, (i * cols) + j); } } function createSquare(startX:Number, startY:Number, tabNumber:uint):void { var square:Sprite = new Sprite(); square.graphics.beginFill(0x000000); square.graphics.drawRect(0, 0, colSpacing, rowSpacing); square.graphics.endFill(); square.x = startX; square.y = startY; square.tabEnabled = true; square.tabIndex = tabNumber; square.addEventListener(FocusEvent.FOCUS_IN, changeColor); addChild(square); } function changeColor(event:FocusEvent):void { e.target.transform.colorTransform = getRandomColor(); }

Capture des donnes saisies par lutilisateur

function getRandomColor():ColorTransform { // gnrer des valeurs alatoires pour les canaux rouge, vert et bleu. var red:Number = (Math.random() * 512) - 255; var green:Number = (Math.random() * 512) - 255; var blue:Number = (Math.random() * 512) - 255; // crer et renvoyer un objet ColorTransform avec ces couleurs alatoires. return new ColorTransform(1, 1, 1, 1, red, green, blue, 0); }

Exemple : WordSearch
Cet exemple illustre linteraction utilisateur en grant des vnements de souris. Les utilisateurs crent autant de mots que possible partir dune grille alatoire de lettres, en se dplaant horizontalement ou verticalement dans la grille, mais en nutilisant jamais deux fois la mme lettre. Cet exemple dmontre les fonctions suivantes dActionScript 3.0 :

Elaboration dynamique dune grille de composants Rponse aux vnements souris Suivi du score en fonction de linteraction utilisateur

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers dapplication WordSearch se trouvent dans le dossier Samples/WordSearch. Cette application se compose des fichiers suivants :
Fichier
WordSearch.as WordSearch.fla dictionary.txt

Description
La classe qui fournit la fonctionnalit principale de lapplication. Le fichier dapplication principal pour Flash. Un fichier utilis pour dterminer si les mots sont crits correctement.

Chargement dun dictionnaire


Pour crer un jeu qui implique la recherche de mots, un dictionnaire est ncessaire. Lexemple inclut un fichier texte appel dictionary.txt, qui contient une liste de mots spars par des retours la ligne. Aprs avoir cr un tableau appel words, la fonction loadDictionary() requiert ce fichier. Une fois charg, celui-ci devient une longue chane. Vous pouvez convertir cette chane en un tableau de mots grce la mthode split(), qui sarrte chaque instance dun retour la ligne (code de caractre 10). Cette analyse a lieu dans la fonction dictionaryLoaded() :
words = dictionaryText.split(String.fromCharCode(10));

Exemple : WordSearch

675

Cration de linterface utilisateur


Une fois les mots stocks, vous pouvez laborer linterface utilisateur. Crez deux instances de bouton : lune permet de soumettre un mot, lautre deffacer le mot en cours de saisie. Dans chaque cas, vous devez rpondre la saisie utilisateur en coutant lvnement MouseEvent.CLICK que le bouton diffuse et en appelant ensuite une fonction. Dans la fonction setupUI(), ce code cre les couteurs sur les deux boutons :
submitWordButton.addEventListener(MouseEvent.CLICK,submitWord); clearWordButton.addEventListener(MouseEvent.CLICK,clearWord);

Gnration dun tableau de jeu


Le tableau de jeu est une grille de lettres alatoires. Dans la fonction generateBoard(), une grille en deux dimensions est cre en imbriquant une boucle dans une autre. La premire boucle incrmente les lignes et la seconde le nombre totale de colonnes par ligne. Chaque cellule cre par ces lignes et ces colonnes contient un bouton qui reprsente une lettre sur le tableau.
private function generateBoard(startX:Number, startY:Number, totalRows:Number, totalCols:Number, buttonSize:Number):void { buttons = new Array(); var colCounter:uint; var rowCounter:uint; for (rowCounter = 0; rowCounter < totalRows; rowCounter++) { for (colCounter = 0; colCounter < totalCols; colCounter++) { var b:Button = new Button(); b.x = startX + (colCounter*buttonSize); b.y = startY + (rowCounter*buttonSize); b.addEventListener(MouseEvent.CLICK, letterClicked); b.label = getRandomLetter().toUpperCase(); b.setSize(buttonSize,buttonSize); b.name = "buttonRow"+rowCounter+"Col"+colCounter; addChild(b); buttons.push(b); } } }

Mme si un couteur est ajout pour un vnement MouseEvent.CLICK sur une seule ligne (car il est dans une boucle for), il est affect chaque instance de bouton. Chaque bouton reoit un nom driv de la position de sa ligne et de sa colonne, ce qui permet de rfrencer facilement la ligne et la colonne de chaque bouton ultrieurement dans le code.
676 Capture des donnes saisies par lutilisateur

Cration de mots partir de la saisie utilisateur


Les mots peuvent tre crits en slectionnant des lettres adjacentes verticalement ou horizontalement, mais jamais en utilisant deux fois la mme lettre. Chaque clic gnre un vnement de souris au niveau duquel le mot qucrit lutilisateur doit tre vrifi pour sassurer quil se poursuit correctement partir de lettres cliques prcdemment. Si ce nest pas le cas, le mot prcdent est supprim et un nouveau est commenc. Cette vrification seffectue dans la mthode isLegalContinuation().
private function isLegalContinuation(prevButton:Button, currButton:Button):Boolean { var currButtonRow:Number = Number(currButton.name.charAt(currButton.name. indexOf("Row") + 3)); var currButtonCol:Number = Number(currButton.name.charAt(currButton.name.indexOf("Col") + 3)); var prevButtonRow:Number = Number(prevButton.name.charAt(prevButton.name.indexOf("Row") + 3)); var prevButtonCol:Number = Number(prevButton.name.charAt(prevButton.name.indexOf("Col") + 3)); return ((prevButtonCol == currButtonCol && Math.abs(prevButtonRow currButtonRow) <= 1) || (prevButtonRow == currButtonRow && Math.abs(prevButtonCol currButtonCol) <= 1)); }

Les mthodes charAt() et indexOf() de la classe String rcuprent les lignes et les colonnes du bouton sur lequel lutilisateur clique actuellement et celui sur lequel il vient de cliquer. La mthode isLegalContinuation() renvoie true si la ligne ou la colonne est la mme et que la ligne ou la colonne qui a chang se trouve un seul incrment de la prcdente. Si vous souhaitez modifier les rgles du jeu et autoriser une lecture diagonale, vous pouvez supprimer la vrification de la ligne ou de la colonne inchange. Dans ce cas, la ligne finale serait la suivante :
return (Math.abs(prevButtonRow - currButtonRow) <= 1) && Math.abs(prevButtonCol - currButtonCol) <= 1));

Exemple : WordSearch

677

Vrification des mots soumis


Pour terminer le code pour le jeu, des mcanismes permettant de vrifier des mots soumis et de grer le score sont ncessaires. La mthode searchForWord() permet ces deux oprations :
private function searchForWord(str:String):Number { if (words && str) { var i:uint = 0 for (i = 0; i < words.length; i++) { var thisWord:String = words[i]; if (str == words[i]) { return i; } } return -1; } else { trace("WARNING: cannot find words, or string supplied is null"); } return -1; }

Cette fonction analyse en boucle tous les mots du dictionnaire. Si le mot de lutilisateur correspond un mot du dictionnaire, sa position dans le dictionnaire est renvoye. La mthode submitWord() vrifie la rponse et met jour le score si la position est valide.

Personnalisation
Il existe plusieurs constantes au dbut de la classe. Vous pouvez modifier ce jeu en changeant ces variables. Il est par exemple possible de modifier le temps de jeu disponible en augmentant la variable TOTAL_TIME. Si vous augmentez lgrement la variable PERCENT_VOWELS, vous pouvez accrotre la probabilit de trouver des mots.

678

Capture des donnes saisies par lutilisateur

CHAPITRE 22

Rseau et communication
Ce chapitre explique comment permettre votre fichier SWF de communiquer avec des fichiers externes et dautres instances dAdobe Flash Player 9. Il dcrit galement comment charger des donnes partir de sources externes, envoyer des messages entre le serveur Java et Flash Player et effectuer des chargements et tlchargements de fichier laide des classes FileReference et FileReferenceList.

22

Contenu
Principes de base de la mise en rseau et de la communication . . . . . . . . . . . . . . .679 Utilisation de donnes externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .683 Connexion dautres instances Flash Player. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690 Connexions socket. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .697 Stockage des donnes locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .702 Utilisation des chargements et tlchargements de fichiers . . . . . . . . . . . . . . . . . .706 Exemple : cration dun client Telnet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717 Exemple : chargement et tlchargement de fichiers . . . . . . . . . . . . . . . . . . . . . . . . 721

Principes de base de la mise en rseau et de la communication


Introduction la mise en rseau et la communication
Llaboration dapplications ActionScript plus complexes vous oblige souvent communiquer avec des scripts ct serveur ou charger des donnes partir de fichier XML ou texte externes. Le package flash.net contient des classes qui permettent denvoyer et de recevoir des donnes sur Internet (par exemple, pour charger du contenu partir dune URL distante, communiquer avec dautres instances de Flash Player et se connecter des sites Web distants).

679

Dans ActionScript 3.0, ce sont les classes URLLoader et URLRequest qui permettent de le faire. Vous utilisez ensuite une classe spcifique pour accder aux donnes, selon le type de donnes charges. Par exemple, si le contenu distant se prsente sous forme de paires nomvaleur, vous pouvez utiliser la classe URLVariables pour analyser les rsultats du serveur. Autrement, si le fichier charg laide des classes URLLoader et URLRequest est un document XML distant, vous pouvez lanalyser au moyen du constructeur de la classe XML, de celui de la classe XMLDocument ou de la mthode XMLDocument.parseXML(). Cela vous permet de simplifier votre code ActionScript puisque le code utilis pour le chargement de fichiers externes est le mme, que vous utilisiez les classes URLVariables, XML ou toute autre classe pour analyser et utiliser les donnes distantes. Le package flash.net contient galement des classes pour dautres types de communication distante. Elles comprennent la classe FileReference pour le tlchargement des fichiers depuis un serveur, les classes Socket et XMLSocket qui permettent de communiquer directement avec des ordinateurs distants laide de connexions socket, et les classes NetConnection et NetStream utilises pour communiquer avec des ressources serveur propres Flash (serveurs Flash Media Server et Flash Remoting, par exemple) et pour charger des fichiers vido. Pour finir, le package flash.net contient des classes pour la communication sur lordinateur local de lutilisateur. Celles-ci comprennent la classe LocalConnection, qui permet de communiquer entre deux ou plusieurs fichiers SWF excuts sur un seul ordinateur, et la classe SharedObject, qui permet de stocker des donnes sur lordinateur dun utilisateur et de les rcuprer ultrieurement lorsquelles sont renvoyes votre application.

Tches courantes de mise en rseau et de communication


La liste suivante dcrit les tches les plus courantes que vous souhaiterez effectuer concernant la communication externe depuis ActionScript. Elles sont traites dans ce chapitre :

Chargement de donnes dun fichier externe ou dun script serveur Envoi de donnes un script serveur Communication avec dautres fichiers SWF locaux Utilisation de connexions socket binaires Communication avec des sockets XML Stockage des donnes locales persistantes Chargement de fichiers sur un serveur Chargement de fichiers dun serveur la machine de lutilisateur

680

Rseau et communication

Concepts et termes importants


La liste de rfrence suivante contient les termes importants que vous rencontrerez dans ce chapitre :

Donnes externes : donnes stockes sous une certaine forme en dehors du fichier SWF et tlcharges dans ce dernier lorsque ncessaire. Ces donnes peuvent tre stockes dans un fichier tlcharg directement, dans une base de donnes ou sous une autre forme rcupre en appelant des scripts ou des programmes excuts sur un serveur. Variables codes URL : le format cod URL permet de reprsenter plusieurs variables (paires de valeurs et de noms de variable) dans une seule chane de texte. Les variables individuelles sont crites dans le format name=value. Chaque variable (cest--dire chaque paire nom-valeur) est spare par des caractres esperluettes, de la faon suivante : variable1=value1&variable2=value2. De cette faon, un nombre infini de variables peut tre envoy sous la forme dun seul message. Type MIME : code standard utilis pour identifier le type dun fichier donn dans une communication Internet. Tous les types de fichier ont un code spcifique utilis pour les identifier. Lors de lenvoi dun fichier ou dun message, un ordinateur (un serveur Web ou linstance Flash Player dun utilisateur, par exemple) spcifie le type de fichier envoy. HTTP : Hypertext Transfer Protocolformat standard de livraison de pages Web et de diffrents types de contenu envoys sur Internet. Mthode de requte : lorsquun programme tel que Flash Player ou un navigateur Web envoie un message (appel requte HTTP) un serveur Web, les donnes envoyes peuvent tre intgres dans la requte de deux faons diffrentes : les mthodes de requtes GET et POST. Ct serveur, le programme qui reoit la requte doit pouvoir rechercher les donnes dans la portion approprie de la requte. Cest pourquoi la mthode de requte utilise pour envoyer des donnes dActionScript doit correspondre celle utilise pour lire ces donnes sur le serveur. Connexions socket : une connexion persistante pour la communication entre deux ordinateurs. Charger : envoyer un fichier un autre ordinateur. Tlcharger : rcuprer un fichier dun autre ordinateur.

Principes de base de la mise en rseau et de la communication

681

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans ce chapitre, vous pouvez tester les exemples de code. Plusieurs codes du chapitre chargent des donnes externes ou excutent dautres types de communication ; ces exemples comprennent souvent les appels de la fonction trace(). Par consquent, les rsultats de lexcution de lexemple sont affichs dans le panneau Sortie. Dautres exemples effectuent une fonction telle que le chargement dun fichier sur un serveur. Le test de ces exemples impliquera linteraction avec le SWF et la confirmation quils excutent laction attendue. Les exemples de code peuvent tre classs en deux catgories. Certains exemples sont crits en supposant que le code est un script autonome (li une image-cl dans un document Flash, par exemple). Pour tester ces exemples :
1. 2. 3. 4.

Crez un nouveau document Flash. Slectionnez limage-cl sur limage 1 du scnario puis ouvrez le panneau Actions. Copiez le code dans le panneau Script. Dans le menu principal, choisissez Contrle > Tester lanimation pour crer le fichier SWF et tester lexemple.

Dautres exemples de code sont crits comme une classe ; on sattend ce que la classe exemple serve de classe de document pour le document Flash. Pour tester ces exemples :
1. 2.

Crez un document Flash vide et enregistrez-le sur votre ordinateur Crez un fichier ActionScript et enregistrez-le dans le mme rpertoire que le document Flash. Le nom du fichier doit correspondre au nom de la classe du code. Par exemple, si le code dfinit une classe nomme UploadTest , enregistrez le fichier ActionScript sous la forme UploadTest.as . Copiez le code dans le fichier ActionScript et enregistrez le fichier. Dans le document Flash, cliquez sur une partie vide de la scne ou de lespace de travail pour activer linspecteur Proprits du document. Dans linspecteur Proprits, dans le champ Classe du document, saisissez le nom de la classe ActionScript que vous avez copie du texte. Excutez le programme en slectionnant Contrle > Tester lanimation et testez lexemple.

3. 4.

5.

6.

Pour finir, certains exemples fournis dans ce chapitre impliquent linteraction avec un programme excut sur un serveur. Ces exemples comprennent un code qui peut tre utilis pour crer le programme serveur ncessaire au test de lexemple ; vous devrez configurer les applications appropries sur un ordinateur de serveur Web afin de tester ces exemples.

682

Rseau et communication

Utilisation de donnes externes


ActionScript 3.0 comprend des mcanismes permettant de charger des donnes depuis des sources externes. Ces sources peuvent tre du contenu statique tel que des fichiers de texte ou du contenu dynamique tel quun script Web qui rcupre des donnes dune base de donnes. Les donnes peuvent tre formates de plusieurs faons, et ActionScript fournit une fonctionnalit pour dcoder les donnes et y accder. Vous pouvez galement envoyer des donnes au serveur externe lors de leur rcupration.

Utilisation des classes URLLoader et URLVariables


ActionScript 3.0 utilise les classes URLLoader et URLVariables pour charger des donnes externes. La classe URLLoader tlcharge des donnes partir dune URL, sous forme de texte, de donnes binaires ou de variables de code URL. La classe URLLoader est utile pour le tlchargement des fichiers texte et XML, ou dautres informations destines des applications ActionScript dynamiques et orientes donnes. La classe URLLoader tire avantage du modle de gestion des vnements dActionScript 3.0 qui permet dcouter des vnements tels quecomplete, httpStatus, ioError, open, progress et securityError. Le nouveau modle de gestion des vnements constitue une avance considrable par rapport ActionScript 2.0 pour les gestionnaires dvnements LoadVars.onData, LoadVars.onHTTPStatus et LoadVars.onLoad parce quil permet une gestion plus efficace des erreurs et des vnements. Pour plus dinformations sur la gestion des vnements, voir Chapitre 10, Gestion dvnements Comme dans le cas des classes XML et LoadVars dans les versions antrieures dActionScript, les donnes obtenues par URLLoader ne sont disponibles quune fois le tlchargement termin. Vous pouvez suivre la progression du tlchargement (nombre doctets chargs et nombre total) en coutant lvnement flash.events.ProgressEvent.PROGRESS qui doit tre distribu. Toutefois, si le chargement du fichier seffectue trop rapidement, il est possible que lvnement ProgressEvent.PROGRESS ne soit pas distribu. Une fois que le tlchargement dun fichier est termin, lvnement flash.events.Event.COMPLETE est distribu. Les donnes charges sont dcodes du format UTF-8 ou UTF-16 en chanes.
REMARQUE

Si aucune valeur nest dfinie pour URLRequest.contentType, les valeurs sont envoyes sous la forme application/x-www-form-urlencoded.

Utilisation de donnes externes

683

La mthode URLLoader.load() (et ventuellement le constructeur de la classe URLLoader) prend un seul paramtre, request, qui correspond une instance URLRequest. Une instance URLRequest contient toutes les informations dune requte HTTP unique, telles que lURL cible, la mthode de requte (GET ou POST), les informations den-tte supplmentaires et le type MIME (si vous chargez du contenu XML par exemple). Pour charger un paquet XML dans un script ct serveur, par exemple, vous pouvez utiliser le code ActionScript 3.0 ci-aprs :
var secondsUTC:Number = new Date().time; var dataXML:XML = <login> <time>{secondsUTC}</time> <username>Ernie</username> <password>guru</password> </login>; var request:URLRequest = new URLRequest("http://www.yourdomain.com/ login.cfm"); request.contentType = "text/xml"; request.data = dataXML.toXMLString(); request.method = URLRequestMethod.POST; var loader:URLLoader = new URLLoader(); try { loader.load(request); } catch (error:ArgumentError) { trace("An ArgumentError has occurred."); } catch (error:SecurityError) { trace("A SecurityError has occurred."); }

Lextrait ci-dessus cre une instance XML nomme dataXML, qui contient un paquet XML envoyer au serveur. Ensuite, attribuez la proprit contentType dURLRequest la valeur "text/xml" et la proprit data le contenu du paquet XML. Ces valeurs sont alors converties en chanes laide de la mthode XML.toXMLString(). Enfin, crez une nouvelle instance URLLoader et envoyez la requte au script distant laide de la mthode URLLoader.load(). Vous pouvez spcifier les paramtres transmettre dans la requte URL de trois manires :

Au sein du constructeur URLVariables Au sein de la mthode URLVariables.decode() Sous forme dune proprit particulire au sein de lobjet URLVariables lui-mme

684

Rseau et communication

Lorsque vous dfinissez des variables au sein du constructeur URLVariables ou de la mthode URLVariables.decode(), vous devez veiller encoder lesperluette au format URL parce que ce caractre revt un sens particulier et joue le rle de dlimiteur. Par exemple, lorsque vous transmettez une esperluette, vous devez lencoder en remplaant & par %26.

Chargement de donnes partir de documents externes


Lorsque vous laborez une application dynamique avec ActionScript 3.0, il est judicieux de charger les donnes partir de fichiers externes ou de scripts ct serveur. Cela vous permet de construire vos applications dynamiques sans avoir modifier ou recompiler vos fichiers ActionScript. Par exemple, si vous crez une application conseil du jour , vous pouvez crire un script ct serveur qui rcupre un conseil au hasard dans une base de donnes et lenregistre dans un fichier texte une fois par jour. Votre application ActionScript peut ensuite charger le contenu du fichier texte statique au lieu denvoyer une requte la base de donnes chaque fois. Lextrait de code suivant cre un objet URLRequest et URLLoader, qui charge le contenu dun fichier texte externe nomm params.txt :
var request:URLRequest = new URLRequest("params.txt"); var loader:URLLoader = new URLLoader(); loader.load(request);

Vous pouvez simplifier cet extrait de code de la manire suivante :


var loader:URLLoader = new URLLoader(new URLRequest("params.txt"));

Par dfaut, si vous ne dfinissez aucune mthode de requte, Flash Player charge le contenu laide de la mthode HTTP GET. Si vous souhaitez envoyer des donnes avec la mthode POST, vous devez lui attribuer la proprit request.method laide de la constante statique URLRequestMethod.POST, comme le montre le code suivant :
var request:URLRequest = new URLRequest("sendfeedback.cfm"); request.method = URLRequestMethod.POST;

Le document externe params.txt, qui est charg au moment de lexcution, contient les donnes suivantes :
monthNames=January,February,March,April,May,June,July,August,September,Octo ber,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday, Friday,Saturday

Utilisation de donnes externes

685

Le fichier contient deux paramtres, monthNames et dayNames. Chacun des paramtres contient une liste spare par des virgules qui est analyse sous forme de chane. Vous pouvez transformer cette liste en tableau laide de la mthode String.split().
CO NS EIL

Evitez dutiliser des mots rservs ou des lments de langage comme noms de variables dans les fichiers de donnes externes, car cela complique la lecture et le dbogage du code.

Une fois les donnes charges, lvnement Event.COMPLETE est distribu et le contenu du document externe peut alors tre utilis dans la proprit data de URLLoader, comme lillustre le code suivant :
private function completeHandler(event:Event):void { var loader2:URLLoader = URLLoader(event.target); trace(loader2.data); }

Si le document distant contient des paires nom-valeur, vous pouvez analyser les donnes laide de la classe URLVariables en transmettant le contenu du fichier charg, comme suit :
private function completeHandler(event:Event):void { var loader2:URLLoader = URLLoader(event.target); var variables:URLVariables = new URLVariables(loader2.data); trace(variables.dayNames); }

Chaque paire nom-valeur issue du fichier externe devient une nouvelle proprit de lobjet URLVariables. Chaque proprit de cet objet dans lexemple de code prcdent est trait comme une chane. Si la valeur de la paire nom-valeur est une liste dlments, vous pouvez convertir la chane en tableau en appelant la mthode String.split(), comme suit :
var dayNameArray:Array = variables.dayNames.split(",");
C ON S E I L 686

Si vous devez charger des donnes numriques partir de fichiers externes, vous devez les convertir en valeurs numriques laide dune fonction de niveau suprieur, telle que int(), uint() ou Number().

Au lieu de charger le contenu du fichier distant sous forme de chane et de crer un nouvel objet URLVariables, vous pouvez attribuer la proprit URLLoader.dataFormat la valeur de lune des proprits statiques de la classe URLLoaderDataFormat. Les trois valeurs possibles de URLLoader.dataFormat sont les suivantes :
URLLoaderDataFormat.BINARY : la proprit URLLoader.data contient des donnes binaires stockes dans un objet ByteArray.

Rseau et communication

URLLoaderDataFormat.TEXT :

la proprit URLLoader.data contient du texte sous

forme dobjet String.

URLLoaderDataFormat.VARIABLES

: la proprit URLLoader.data contient des variables encodes au format URL issues dun objet URLVariables.

Le code suivant montre comment vous pouvez automatiquement analyser les donnes charges dans un objet URLVariables en attribuant la proprit URLLoader.dataFormat la valeur URLLoaderDataFormat.VARIABLES.
package { import import import import import

flash.display.Sprite; flash.events.*; flash.net.URLLoader; flash.net.URLLoaderDataFormat; flash.net.URLRequest;

public class URLLoaderDataFormatExample extends Sprite { public function URLLoaderDataFormatExample() { var request:URLRequest = new URLRequest("http:// www.[yourdomain].com/params.txt"); var variables:URLLoader = new URLLoader(); variables.dataFormat = URLLoaderDataFormat.VARIABLES; variables.addEventListener(Event.COMPLETE, completeHandler); try { variables.load(request); } catch (error:Error) { trace("Unable to load URL: " + error); } } private function completeHandler(event:Event):void { var loader:URLLoader = URLLoader(event.target); trace(loader.data.dayNames); } } }
REMARQUE

La valeur par dfaut de URLLoader.dataFormat est URLLoaderDataFormat.TEXT.

Utilisation de donnes externes

687

Comme le montre lexemple suivant, le chargement de donnes XML partir dun fichier externe seffectue comme le chargement de donnes URLVariables. Vous pouvez crer une instance URLRequest et une instance URLLoader et vous en servir pour tlcharger un document XML distant. Lorsque le fichier est compltement tlcharg, lvnement Event.COMPLETE est distribu et le contenu du fichier externe est converti en instance XML, que vous pouvez analyser avec les mthodes et proprits XML.
package { import import import import import

flash.display.Sprite; flash.errors.*; flash.events.*; flash.net.URLLoader; flash.net.URLRequest;

public class ExternalDocs extends Sprite { public function ExternalDocs() { var request:URLRequest = new URLRequest("http:// www.[yourdomain].com/data.xml"); var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, completeHandler); try { loader.load(request); } catch (error:ArgumentError) { trace("An ArgumentError has occurred."); } catch (error:SecurityError) { trace("A SecurityError has occurred."); } } private function completeHandler(event:Event):void { var dataXML:XML = XML(event.target.data); trace(dataXML.toXMLString()); } } }

688

Rseau et communication

Communication avec des scripts externes


Outre le chargement de fichiers de donnes externes, la classe URLVariables permet denvoyer des variables un script ct serveur et de traiter la rponse du serveur. Cela savre utile, par exemple, si vous programmez un jeu et souhaitez envoyer le score de lutilisateur un serveur afin de vrifier sil faut lajouter la liste des scores les plus levs ; ou encore envoyer les informations de connexion de lutilisateur au serveur pour validation. Un script ct serveur peut traiter le nom dutilisateur et le mot de passe, les compare une base de donnes et confirmer en retour la validit des informations fournies par lutilisateur. Lextrait de code ci-aprs cre un objet URLVariables nomm variables, qui gnre une nouvelle variable appele name. Ensuite, un objet URLRequest est cr pour spcifier lURL du script ct serveur laquelle doivent tre envoyes les variables. Vous pouvez alors dfinir la proprit method de lobjet URLRequest pour envoyer les variables sous forme de requte HTTP POST. Pour ajouter lobjet URLVariables la requte URL, dfinissez la proprit data de lobjet URLRequest sur lobjet URLVariables cr plus tt. Enfin, linstance URLLoader est cre et la mthode URLLoader.load() appele ; cette dernire lance la requte.
var variables:URLVariables = new URLVariables("name=Franklin"); var request:URLRequest = new URLRequest(); request.url = "http://www.[yourdomain].com/greeting.cfm"; request.method = URLRequestMethod.POST; request.data = variables; var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListener(Event.COMPLETE, completeHandler); try { loader.load(request); } catch (error:Error) { trace("Unable to load URL"); } function completeHandler(event:Event):void { trace(event.target.data.welcomeMessage); }

Le code suivant reprend le contenu du document Adobe ColdFusion greeting.cfm utilis dans lexemple prcdent :
<cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0> <cfset Form.Name = "Stranger" /> </cfif> <cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)# </cfoutput>

Utilisation de donnes externes

689

Connexion dautres instances Flash Player


La classe LocalConnection vous permet de communiquer avec diffrentes instances de Flash Player, par exemple un fichier SWF dans un conteneur HTML ou dans un lecteur intgr ou autonome. Vous pouvez ainsi laborer des applications trs polyvalentes, capables de partager des donnes entre plusieurs instances de Flash Player, par exemple des fichiers SWF excuts dans un navigateur Web ou incorpors dans des applications de bureau.

Classe LocalConnection
La classe LocalConnection permet de dvelopper des fichiers SWF qui peuvent changer des instructions avec dautres fichiers SWF sans utiliser la mthode fscommand() ni JavaScript. Les objets LocalConnection peuvent uniquement communiquer entre des fichiers SWF excuts sur le mme ordinateur client, mais ils peuvent concerner diffrentes applications. Par exemple, un fichier SWF excut dans un navigateur et un fichier SWF de projection peuvent partager des informations, le fichier de projection se chargeant de maintenir les informations locales et le fichier SWF du navigateur se connectant distance. (Un fichier de projection est un fichier SWF enregistr dans un format tel quil peut sexcuter de manire autonome ; il nest donc pas ncessaire de disposer de Flash Player pour le lire car il est incorpor dans le fichier excutable.) Les objets LocalConnection peuvent tre utiliss pour communiquer entre des SWF utilisant diffrentes versions dActionScript :

Les objets LocalConnection crs dans ActionScript 1.0 ou 2.0 peuvent communiquer avec les objets LocalConnection crs dans ActionScript 3.0. les objets LocalConnection crs dans ActionScript 1.0 ou 2.0 peuvent communiquer avec les objets LocalConnection crs dans ActionScript 3.0.

Flash Player gre automatiquement les communications entre les objets LocalConnection de versions diffrentes.

690

Rseau et communication

La meilleure faon dutiliser un objet LocalConnection est dautoriser la communication uniquement entre des objets LocalConnection se trouvant dans le mme domaine. Ainsi, vous vitez les problmes de scurit. Toutefois, si vous devez autoriser la communication entre les domaines, vous pouvez procder de diffrentes faons pour mettre en uvre vos mesures de scurit. Pour plus dinformations, reportez-vous la section consacre au paramtre connectionName de la mthode send() et aux entres allowDomain() et domain dans la liste de la classe LocalConnection dans la Rfrence du langage et des composants ActionScript 3.0.
C ON S E I L

Il est possible dutiliser des objets LocalConnection pour envoyer et recevoir des donnes au sein dun fichier SWF unique. Toutefois, Adobe ne recommande pas cette pratique. Vous devriez plutt utiliser des objets partags.

Les mthodes de rappel peuvent tre ajoutes aux objets LocalConnection de trois manires : Crer des sous-classes de LocalConnection et ajouter des mthodes Dfinir la proprit LocalConnection.client sur un objet qui met en uvre ces mthodes Crer une classe dynamique qui tend la classe LocalConnection et y joindre dynamiquement des mthodes

La premire manire dajouter des mthodes de rappel est dtendre la classe LocalConnection. Vous pouvez dfinir les mthodes au sein de la classe personnalise, plutt que de les ajouter dynamiquement linstance LocalConnection. Ceci est illustr par le code suivant :
package { import flash.net.LocalConnection; public class CustomLocalConnection extends LocalConnection { public function CustomLocalConnection(connectionName:String) { try { connect(connectionName); } catch (error:ArgumentError) { // serveur dj cr/connect } } public function onMethod(timeString:String):void { trace("onMethod called at: " + timeString); } } }
Connexion dautres instances Flash Player 691

Pour crer une nouvelle instance de la classe DynamicLocalConnection, vous pouvez utiliser le code suivant :
var serverLC:CustomLocalConnection; serverLC = new CustomLocalConnection("serverName");

La deuxime manire dajouter des mthodes de rappel consiste utiliser la proprit LocalConnection.client. Il sagit de crer une classe personnalise et daffecter une nouvelle instance la proprit client, comme le montre le code suivant :
var lc:LocalConnection = new LocalConnection(); lc.client = new CustomClient();

La proprit LocalConnection.client indique les mthodes de rappel dobjet appeler. Dans le code prcdent la proprit client tait dfinie sur une nouvelle instance de la classe personnalise CustomClient. La valeur par dfaut de la proprit client est linstance LocalConnection actuelle. Vous pouvez utiliser la proprit client si vous disposez de deux gestionnaires de donnes dots du mme jeu de mthodes mais qui agissent diffremment ; par exemple, dans une application o un bouton situ dans une fentre permet dafficher le contenu dune deuxime fentre. Pour crer la classe CustomClient, vous pouvez utiliser le code suivant :
package { public class CustomClient extends Object { public function onMethod(timeString:String):void { trace("onMethod called at: " + timeString); } } }

La troisime manire dajouter des mthodes de rappel consiste crer une classe dynamique et dy joindre dynamiquement des mthodes. Elle se rapproche de lutilisation de la classe LocalConnection dans les versions prcdentes dActionScript, comme le montre le code suivant :
import flash.net.LocalConnection; dynamic class DynamicLocalConnection extends LocalConnection {}

692

Rseau et communication

Les mthodes de rappel peuvent tre ajoutes dynamiquement cette classe laide du code suivant :
var connection:DynamicLocalConnection = new DynamicLocalConnection(); connection.onMethod = this.onMethod; // Insertion du code ici. public function onMethod(timeString:String):void { trace("onMethod called at: " + timeString); }

Cette manire dajouter des mthodes de rappel est dconseille, car le code nest pas vraiment portable. En outre, cette mthode de cration de connexions locales pourrait prsenter des problmes de performance car laccs aux proprits dynamiques prend bien plus de temps que laccs aux proprits scelles.

Envoi de messages entre deux instances de Flash Player


La classe LocalConnection permet de communiquer entre diffrentes instances de Flash Player. Par exemple, vous pouvez utiliser plusieurs instances de Flash Player sur une mme page Web ou vous servir dune instance de Flash Player pour rcuprer des donnes dans une instance de Flash Player affiche dans une fentre distincte. Le code suivant dfinit lobjet LocalConnection qui joue le rle de serveur et accepte les appels entrants en provenance dautres instances de Flash Player :
package { import flash.net.LocalConnection; import flash.display.Sprite; public class ServerLC extends Sprite { public function ServerLC() { var lc:LocalConnection = new LocalConnection(); lc.client = new CustomClient1(); try { lc.connect("conn1"); } catch (error:Error) { trace("error:: already connected"); } } } }

Connexion dautres instances Flash Player

693

Ce code cre un objet LocalConnection nomm lc et dfinit la proprit client sur une classe personnalise, CustomClient1. Lorsquune autre instance de Flash Player appelle une mthode dans cette instance LocalConnection, Flash Player recherche la mthode dans la classe CustomClient1. Ds quune instance Flash Player se connecte ce fichier SWF et essaie dappeler lune des mthodes de la connexion local, la requte est envoye la classe spcifie par la proprit client, savoir la classe CustomClient1 :
package { import flash.events.*; import flash.system.fscommand; import flash.utils.Timer; public class CustomClient1 extends Object { public function doMessage(value:String = ""):void { trace(value); } public function doQuit():void { trace("quitting in 5 seconds"); this.close(); var quitTimer:Timer = new Timer(5000, 1); quitTimer.addEventListener(TimerEvent.TIMER, closeHandler); } public function closeHandler(event:TimerEvent):void { fscommand("quit"); } } }

Pour crer un serveur LocalConnection, appelez la mthode LocalConnection.connect() et fournissez un nom de connexion unique. Si une connexion est dj ouverte avec le nom choisi, une erreur ArgumentError est gnre, ce qui indique que la tentative de connexion a chou parce que lobjet tait dj connect. Lextrait de code suivant illustre comment crer une nouvelle connexion de socket nomme conn1 :
try { connection.connect("conn1"); } catch (error:ArgumentError) { trace("Error! Server already exists\n"); }

694

Rseau et communication

La connexion au fichier SWF principal partir dun fichier SWF secondaire ncessite que vous criez un objet LocalConnection dans lobjet LocalConnection denvoi, puis que vous appeliez la mthode LocalConnection.send() avec le nom de la connexion et le nom de la mthode excuter. Par exemple, pour connecter un objet LocalConnection cr prcdemment, vous pouvez utiliser le code suivant :
sendingConnection.send("conn1", "doQuit");

Ce code tablit une connexion conn1 lobjet LocalConnection existant, puis appelle la mthode doQuit() dans le fichier SWF distant. Si vous souhaitez envoyer des paramtres au fichier SWF distant, spcifiez les arguments supplmentaires aprs le nom de la mthode send(), comme le montre lextrait de code suivant :
sendingConnection.send("conn1", "doMessage", "Hello world");

Connexion des documents SWF de domaines diffrents


Pour autoriser uniquement les communications issues de domaines prcis, appelez la mthode allowDomain() ou allowInsecureDomain() de la classe LocalConnection et transmettez la liste des domaines autoriss accder cet objet LocalConnection. Dans les versions antrieures dActionScript, LocalConnection.allowDomain() et taient des mthodes de rappel que les dveloppeurs devaient mettre en uvre et qui devaient renvoyer une valeur boolenne. Dans ActionScript 3.0, LocalConnection.allowDomain() et LocalConnection.allowInsecureDomain() sont deux mthodes intgres, que les dveloppeurs peuvent appeler de la mme faon que Security.allowDomain() et Security.allowInsecureDomain(), en transmettant un ou plusieurs noms de domaines autoriser.
LocalConnection.allowInsecureDomain()

Deux valeurs spciales peuvent tre transmises aux mthodes LocalConnection.allowDomain() et LocalConnection.allowInsecureDomain() : * et localhost. Lastrisque (*) permet daccder tous les domaines. La chane localhost permet dappeler le fichier SWF partir des fichiers SWF installs localement.

R E M A R QU E

Dans les versions prcdentes dActionScript, la mthode LocalConnection.connect() renvoie une valeur boolenne si le nom de connexion est dj utilis. Dans ActionScript 3.0, une erreur est gnre.

Connexion dautres instances Flash Player

695

Dans Flash Player 8, des restrictions de scurit relatives aux fichiers SWF locaux ont t introduites. Un fichier SWF autoris accder Internet na pas accs au systme de fichiers local. Si vous spcifiez localhost, tout fichier SWF local peut accder ce fichier SWF. Si la mthode LocalConnection.send() essaie de communiquer avec un fichier SWF partir dun sandbox de scurit auquel le code dappel na pas accs, un vnement securityError (SecurityErrorEvent.SECURITY_ERROR) est distribu. Pour rsoudre lerreur, vous pouvez spcifier le domaine de lappelant dans la mthode LocalConnection.allowDomain() de la cible. Si vous mettez en uvre la communication uniquement entre les fichiers SWF du mme domaine, vous pouvez spcifier un paramtre connectionName qui ne commence pas par un trait de soulignement (_) et ne renvoie pas un nom de domaine (par exemple myDomain:connectionName). Utilisez la mme chane dans la commande LocalConnection.connect(connectionName). Si vous mettez en uvre la communication entre les fichiers SWF de diffrents domaines, spcifiez un paramtre connectionName qui commence par un trait de soulignement. Lajout dun trait de soulignement amliore la portabilit entre domaines du fichier SWF contenant lobjet LocalConnection de rception. Voici deux cas de figures possibles :

Si la chane associe connectionName ne commence pas par un trait de soulignement, Flash Player ajoute un prfixe au nom de superdomaine et deux-points (par exemple, myDomain:connectionName). Vous avez ainsi la garantie que votre connexion nentrera pas en conflit avec les connexions de mme nom dans dautres domaines, mais tous les objets LocalConnection denvoi doivent spcifier ce superdomaine (par exemple, myDomain:connectionName). Si le fichier SWF associ lobjet LocalConnection de rception est dplac vers un autre domaine, le lecteur modifie le prfixe afin quil reflte le nouveau superdomaine (par exemple, anotherDomain:connectionName). Tous les objets LocalConnection denvoi doivent tre modifis manuellement pour pointer vers le nouveau superdomaine. Si la chane associe connectionName commence par un trait de soulignement (par exemple, _connectionName), Flash Player ne lui ajoute pas de prfixe. Cela signifie que les objets LocalConnection de rception et denvoi utilisent des chanes identiques pour connectionName. Si lobjet de rception utilise LocalConnection.allowDomain() pour spcifier que les connexions seront acceptes partir de tous les domaines, le fichier SWF contenant lobjet LocalConnection de rception peut tre dplac vers un autre domaine, sans quil soit ncessaire de modifier les objets LocalConnection denvoi.

696

Rseau et communication

Connexions socket
ActionScript 3.0 permet dutiliser deux types de connexions socket : les connexions socket XML et binaires. Un socket XML vous permet de vous connecter un serveur distant et de crer une connexion serveur qui reste ouverte jusqu sa fermeture explicite. Vous pouvez ainsi changer des donnes XML entre un serveur et un client sans avoir ouvrir chaque fois une nouvelle connexion serveur. Autre avantage de lutilisation dun serveur socket XML : lutilisateur na pas besoin de demander explicitement les donnes. Vous pouvez envoyer des donnes du serveur sans requte pralable, et ce chaque client connect au serveur socket XML. Une connexion socket binaire est semblable un socket XML la diffrence que le client et le serveur nont pas besoin dchanger obligatoirement des paquets XML. La connexion peut en effet transfrer des donnes au format binaire. Vous pouvez ainsi vous connecter une large gamme de services, notamment des serveurs de messagerie (POP3, SMTP et IMAP) et dinformations (NNTP).

Classe Socket
Nouveaut dActionScript 3.0, la classe Socket permet au code dtablir des connexions socket et de lire et dcrire des donnes binaires brutes. Elle est semblable la classe XMLSocket mais nimpose pas de contrainte quant au format des donnes reues ou transmises. La classe Socket est utile si vous utilisez des serveurs faisant appel des protocoles binaires. Grce aux connexions socket binaires, vous pouvez crire du code permettant linteraction entre diffrents protocoles Internet, par exemple POP3, SMTP, IMAP et NNTP. En change, cela permet Flash Player de se connecter des serveurs de messagerie et dinformations. Flash Player peut communiquer directement avec un serveur en utilisant directement le protocole binaire de ce serveur. Certains serveurs utilisent lordre doctets gros-boutiste , dautres lordre petit-boutiste . La plupart des serveurs sur Internet utilise lordre grosboutiste car il sagit de lordre doctets du rseau. Lordre petit-boutiste sest rpandu en raison de son utilisation par larchitecture Intel x86. Vous devez utiliser lordre doctets correspondant au serveur qui envoie et reoit les donnes. Toutes les oprations sont effectues par les interfaces IDataInput et IDataOutput, et les classes qui les mettent en uvre (ByteArray, Socket et URLStream) sont par dfaut encodes au format gros-boutiste (loctet le plus significatif en premier). On vise ainsi respecter Java et lordre doctets officiel des rseaux. Pour modifier lordre doctets utiliser, vous pouvez dfinir la proprit endian sur Endian.BIG_ENDIAN ou Endian.LITTLE_ENDIAN.
CONSEIL

La classe Socket hrite de toutes les mthodes mises en uvre par les interfaces IDataInput et IDataOutput (dans le package flash.utils). Ces mthodes sont utiliser pour lcriture et la lecture de la classe Socket.

Connexions socket

697

Classe XMLSocket
ActionScript fournit une classe XMLSocket intgre qui vous permet dtablir une connexion continue avec un serveur. Cette connexion ouverte supprime les priodes dattente et sert souvent dans des applications en temps rel telles que les dialogues en ligne ou les jeux multijoueurs. Une solution de dialogue en ligne par HTTP classique interroge rgulirement le serveur et tlcharge de nouveaux messages laide dune requte HTTP. A linverse, une solution de dialogue en ligne XMLSocket maintient une connexion ouverte au serveur, permettant celui-ci denvoyer immdiatement des messages entrants sans requte du client. Pour crer une connexion socket, vous devez crer une application ct serveur qui attendra la requte de connexion socket et enverra une rponse au fichier SWF. Ce type dapplication ct serveur peut tre crit dans un langage tel que Java, Python ou Perl. Pour utiliser la classe XMLSocket, lordinateur serveur doit excuter un dmon qui comprend le protocole utilis par la classe XMLSocket. Le protocole est dcrit dans la liste suivante :

Les messages XML sont envoys via une connexion socket flux TCP/IP bidirectionnel simultan. Chaque message XML est un document XML complet, termin par un octet nul (0). Un nombre illimit de messages XML peut tre envoy et reu via une connexion XMLSocket.
La classe XMLSocket ne peut pas automatiquement tunneler travers les pare-feux parce que, contrairement au protocole RTMP (Real-Time Messaging Protocol), le XMLSocket na pas de capacit de tunneling HTTP. Si vous devez utiliser le tunneling HTTP, envisagez lutilisation de Flash Remoting ou Flash Media Server (qui prend en charge RTMP).

Les restrictions suivantes sappliquent au mode et lemplacement de connexion dun objet XMLSocket :

698

REMARQUE

La mthode XMLSocket.connect() permet une connexion uniquement des numros de port TCP suprieurs ou gaux 1024. Une consquence de cette restriction est que les dmons du serveur qui communiquent avec lobjet XMLSocket doivent galement tre attribus des numros de port suprieurs ou gaux 1024. Des numros de port infrieurs 1024 sont souvent utiliss par des services systme tels que FTP (21), Telnet (23), HTTP (80) et POP3 (110) ; les objets XMLSocket sont donc interdits daccs ces ports pour des raisons de scurit. La restriction du numro de port limite les possibilits daccs ces ressources et leur mauvaise utilisation.

Rseau et communication

La mthode XMLSocket.connect() permet une connexion uniquement aux ordinateurs se trouvant dans le domaine de rsidence du fichier SWF. Cette restriction ne sapplique pas aux fichiers SWF sexcutant en local. (Cette restriction est identique aux rgles de scurit de URLLoader.load().) Pour se connecter un dmon de serveur sexcutant dans un domaine diffrent du domaine de rsidence du fichier SWF, vous pouvez crer sur le serveur un fichier de rgulation de scurit qui permette un accs partir de domaines spcifiques.
La configuration dun serveur en vue de la communication avec un objet XMLSocket peut tre difficile raliser. Si votre application ne requiert pas dinteractivit en temps rel, utilisez la classe URLLoader, plutt que la classe XMLSocket.

Vous pouvez utiliser les mthodes XMLSocket.connect() et XMLSocket.send() de la classe XMLSocket pour transfrer un objet XML vers et partir dun serveur sur une connexion socket. La mthode XMLSocket.connect() tablit une connexion socket avec le port dun serveur Web. La mthode XMLSocket.send() transmet un objet XML au serveur spcifi dans la connexion socket. Lorsque vous invoquez la mthode XMLSocket.connect(), Flash Player ouvre une connexion TCP/IP avec le serveur et garde cette connexion ouverte jusqu ce que lun des vnements suivants se produise :

REMARQUE

La mthode XMLSocket.close() de la classe XMLSocket est appele. Il nexiste plus aucune rfrence lobjet XMLSocket. Flash Player se ferme. La connexion est interrompue (le modem est dconnect, par exemple).

Connexions socket

699

Cration et connexion un serveur socket XML Java


Le code suivant illustre un simple serveur XMLSocket crit en langage Java qui accepte les connexion entrantes et affichent les messages reus dans la fentre dinvite de commande. Par dfaut, un nouveau serveur est cr sur le port 8080 de votre machine locale, mais vous pouvez spcifier un numro de port diffrent en lanant le serveur partir de la ligne de commande. Crez un document texte et ajoutez-y le code suivant :
import java.io.*; import java.net.*; class SimpleServer { private static SimpleServer server; ServerSocket socket; Socket incoming; BufferedReader readerIn; PrintStream printOut; public static void main(String[] args) { int port = 8080; try { port = Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { // Intercepter lexception et poursuivre. } server = new SimpleServer(port); } private SimpleServer(int port) { System.out.println(">> Starting SimpleServer"); try { socket = new ServerSocket(port); incoming = socket.accept(); readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream())); printOut = new PrintStream(incoming.getOutputStream()); printOut.println("Enter EXIT to exit.\r"); out("Enter EXIT to exit.\r"); boolean done = false;

700

Rseau et communication

while (!done) { String str = readerIn.readLine(); if (str == null) { done = true; } else { out("Echo: " + str + "\r"); if(str.trim().equals("EXIT")) { done = true; } } incoming.close(); } } catch (Exception e) { System.out.println(e); } } private void out(String str) { printOut.println(str); System.out.println(str); } }

Enregistrez le document sur le disque dur sous le nom SimpleServer.java et compilez-le laide dun compilateur Java, qui cre un fichier de classe Java nomm SimpleServer.class.
SimpleServer.

Vous pouvez lancer le serveur XMLSocket via la ligne de commande en tapant java Le fichier SimpleServer.class peut se situer tout emplacement sur lordinateur local ou le rseau ; il nest pas ncessaire de le placer dans le rpertoire racine du serveur Web.
C ON S E I L

Si vous ne pouvez pas lancer le serveur parce que des fichiers ne se trouvent pas dans le chemin de classe Java, essayez de le faire avec java -classpath. SimpleServer.

Connexions socket

701

Pour tablir une connexion au serveur XMLSocket partir de votre application ActionScript, vous devez crer une nouvelle instance de la classe XMLSocket et appelez la mthode XMLSocket.connect() tout en transfrant le nom dhte et le numro de port, comme suit :
var xmlsock:XMLSocket = new XMLSocket(); xmlsock.connect("127.0.0.1", 8080);

Un vnement securityError (flash.events.SecurityErrorEvent) se produit si un appel XMLSocket.connect() essaie dtablir une connexion soit un serveur en dehors du sandbox de scurit de lappelant, soit sur un numro de port infrieur 1024. Ds que vous recevez des donnes du serveur, lvnement data (flash.events.DataEvent.DATA) est distribu :
xmlsock.addEventListener(DataEvent.DATA, onData); private function onData(event:DataEvent):void { trace("[" + event.type + "] " + event.data); }

Pour envoyer des donnes au serveur XMLSocket, utilisez la mthode XMLSocket.send() et transmettez un objet XML ou une chane. Flash Player convertit le paramtre fourni en objet String et envoie au serveur XMLSocket son contenu suivi dun octet nul (0) :
xmlsock.send(xmlFormattedData);

La mthode XMLSocket.send() ne renvoie pas de valeur indiquant si les donnes ont bien t transmises. Si une erreur se produit pendant la tentative denvoi des donnes, une erreur IOError est renvoye.
C ON S E I L 702

Chaque message que vous envoyez au serveur socket doit se terminer par un caractre de changement de ligne (\n).

Stockage des donnes locales


Un objet partag, parfois appel cookie Flash est un fichier de donnes qui peut tre cr sur votre ordinateur par les sites que vous visitez. Les objets partags servent le plus souvent amliorer votre navigation sur le Web, par exemple en vous permettant de personnaliser laspect dun site Web que vous consultez frquemment. Pris isolment, les objets partags ne peuvent interagir avec les donnes de votre ordinateur. Point important : les objets partags ne peuvent en aucun cas accder votre adresse lectronique (ou autre information personnelle) ni la conserver sans votre consentement expresse.

Rseau et communication

Il est possible de crer des instances dobjets partags laide des mthodes statiques SharedObject.getLocal() ou SharedObject.getRemote(). La mthode getLocal() essaie de charger un objet partag persistant localement, disponible uniquement sur le client actuel. A linverse, la mthode getRemote() tente de charger un objet partag distant, susceptible dtre partag par plusieurs clients au moyen dun serveur tel que Flash Media Server. Sil nexiste aucun objet partag local ou distant, les mthodes getLocal() et getRemote() crent une nouvelle instance SharedObject. Le code suivant essaie de charger un objet partag local nomm test. Si cet objet nexiste pas, un objet partag est cr avec le mme nom.
var so:SharedObject = SharedObject.getLocal("test"); trace("SharedObject is " + so.size + " bytes");

Si aucun objet partag nomm test nest trouv, un objet est cr, dune taille de 0 octet. Si lobjet partag existait prcdemment, sa taille actuelle (en octets) est rtablie. Vous pouvez stocker des donnes dans un objet partag en attribuant des valeurs lobjet de donnes, comme le montre lexemple suivant :
var so:SharedObject = SharedObject.getLocal("test"); so.data.now = new Date().time; trace(so.data.now); trace("SharedObject is " + so.size + " bytes");

Sil existe dj un objet partag nomm test avec le paramtre now, la valeur existante est remplace. La proprit SharedObject.size vous permet de dterminer si un objet partag existe dj, comme illustr ci-aprs :
var so:SharedObject = SharedObject.getLocal("test"); if (so.size == 0) { // Lobjet partag nexiste pas. trace("created..."); so.data.now = new Date().time; } trace(so.data.now); trace("SharedObject is " + so.size + " bytes");

Stockage des donnes locales

703

Le code prcdent utilise le paramtre size afin de dterminer si linstance dobjet partag du nom spcifi existe dj. Si vous testez le code suivant, vous remarquerez qu chaque excution, lobjet partag est recr. Pour enregistrer un objet partag sur le disque dur de lutilisateur, vous devez explicitement appeler la mthode SharedObject.flush(), comme dans lexemple ci-aprs :
var so:SharedObject = SharedObject.getLocal("test"); if (so.size == 0) { // Lobjet partag nexiste pas. trace("created..."); so.data.now = new Date().time; } trace(so.data.now); trace("SharedObject is " + so.size + " bytes"); so.flush();

Si vous utilisez la mthode flush() pour crire des objets partags sur le disque dur de lordinateur, vous devez vrifier avec soin si lutilisateur a explicitement dsactiv le stockage local laide du Gestionnaire de paramtres de Flash Player (www.macromedia.com/support/ documentation/en/flashplayer/help/settings_manager07.html), comme illustr dans cet exemple :
var so:SharedObject = SharedObject.getLocal("test"); trace("Current SharedObject size is " + so.size + " bytes."); so.flush();

Il est possible de rcuprer des valeurs dans un objet partag en spcifiant le nom de la proprit dans la proprit data de lobjet partag. Par exemple, si vous excutez le code suivant, Flash Player affiche depuis combien de minutes linstance SharedObject a t cre :
var so:SharedObject = SharedObject.getLocal("test"); if (so.size == 0) { // Lobjet partag nexiste pas. trace("created..."); so.data.now = new Date().time; } var ageMS:Number = new Date().time - so.data.now; trace("SharedObject was created " + Number(ageMS / 1000 / 60).toPrecision(2) + " minutes ago"); trace("SharedObject is " + so.size + " bytes"); so.flush();

A la premire excution du code prcdent, une nouvelle instance SharedObject nomme test est cre, avec une taille initiale de 0 octet. Parce que la taille initiale est nulle, linstruction if renvoie la valeur true et une nouvelle proprit now est ajoute lobjet partag local. Lanciennet de lobjet partag est calcule par soustraction de la valeur de la proprit now de lheure actuelle. A chaque excution suivante du code ci-dessus, la taille de lobjet partag doit tre suprieure zro ; le code peut effectuer un suivi du nombre de minutes coules depuis la cration de lobjet partag.
704 Rseau et communication

Affichage du contenu dun objet partag


Des valeurs sont stockes dans un objet partag, au sein de la proprit data. Vous pouvez passer en boucle chaque valeur dune instance dobjet partag laide de for..in, comme le montre lexemple suivant :
var so:SharedObject = SharedObject.getLocal("test"); so.data.hello = "world"; so.data.foo = "bar"; so.data.timezone = new Date().timezoneOffset; for (var i:String in so.data) { trace(i + ":\t" + so.data[i]); }

Cration dun SharedObject scuris


Lorsque vous crez un SharedObject local ou distant laide de getLocal() ou getRemote(), un paramtre facultatif nomm secure dtermine si laccs lobjet partag se limite aux fichiers SWF diffuss via une connexion HTTPS. Si ce paramtre a la valeur true et que votre fichier SWF est diffus sur HTTPS, Flash Player cre un nouvel objet scuris ou obtient une rfrence un objet partag scuris existant. Cet objet partag scuris peut uniquement tre lu ou crit par des fichiers SWF reus via des connexions HTTPS appelant SharedObject.getLocal() avec le paramtre secure rgl sur true. Si ce paramtre a la valeur false et que votre fichier SWF est diffus sur HTTPS, Flash Player cre un nouvel objet partag ou obtient une rfrence un objet partag existant. Cet objet partag peut tre lu ou crit par des fichiers SWF reus via des connexions autres que HTTPS. Si votre fichier SWF est diffus via une connexion autre que HTTPS et que vous essayez de rgler ce paramtre sur true, la cration dun objet partag (ou laccs un objet partag scuris prcdemment cr) choue, une erreur est renvoye et lobjet partag devient null. Si vous tentez dexcuter lextrait de code suivant partir dun connexion non HTTPS, la mthode SharedObject.getLocal() renvoie une erreur :
try { var so:SharedObject = SharedObject.getLocal("contactManager", null, true); } catch (error:Error) { trace("Unable to create SharedObject."); }

Quelle que soit la valeur de ce paramtre, les objets partags crs sont pris en compte dans la quantit despace disque totale autorise pour un domaine.

Stockage des donnes locales

705

Utilisation des chargements et tlchargements de fichiers


La classe FileReference permet de charger et tlcharger des fichiers entre un client et un serveur. Les utilisateurs sont invits slectionner le fichier charger ou lemplacement cible de tlchargement dans une bote de dialogue (telle que la bote de dialogue Ouvrir dans le systme dexploitation Windows). Chaque objet FileReference que vous crez avec ActionScript se rapporte un seul fichier sur le disque dur de lutilisateur. Lobjet a des proprits qui informent sur la taille, le type, le nom et les dates de cration et de modification du fichier.
REMARQUE

La proprit creator est prise en charge sur Mac OS uniquement. Toutes les autres plates-formes renvoient la valeur null.

Vous pouvez crer une occurrence de la classe FileReference de deux faons. Utilisez loprateur new, comme dans lexemple suivant :
import flash.net.FileReference; var myFileReference:FileReference = new FileReference();

Vous pouvez aussi appeler la mthode FileReferenceList.browse(), qui ouvre une bote de dialogue sur le systme de lutilisateur pour inviter ce dernier slectionner un fichier transfrer, puis cre un tableau dobjets FileReference si lutilisateur slectionne un ou plusieurs fichiers avec succs. Chaque objet FileReference reprsente un fichier slectionn par lutilisateur partir de la bote de dialogue. Un objet FileReference ne contient aucune donne dans les proprits FileReference (par exemple, name, size ou modificationDate) jusqu ce que lun des vnements suivants se produisent : La mthode FileReference.browse() ou FileReferenceList.browse() a t appele et lutilisateur a effectu une slection dans le slecteur de fichiers. La mthode FileReference.download() a t appele et lutilisateur a effectu une slection dans le slecteur de fichiers.
Lors dun tlchargement, seule la proprit FileReference.name est remplie avant la fin du tlchargement. Une fois que le fichier est tlcharg, toutes les proprits sont disponibles.

Pendant lexcution dun appel la mthode FileReference.browse(), FileReferenceList.browse() ou FileReference.download(), la plupart des lecteurs poursuivent la lecture du fichier SWF.

706

REMARQUE

Rseau et communication

Classe FileReference
La classe FileReference permet de charger et tlcharger des fichiers entre lordinateur dun utilisateur et le serveur. Une bote de dialogue du systme dexploitation invite lutilisateur slectionner un fichier pour le charger ou choisir un emplacement pour le tlcharger. Chaque objet FileReference fait rfrence un fichier unique sur le disque dur de lutilisateur et inclut des proprits contenant des informations sur la taille, le type, le nom, la date de cration, la date de modification et le crateur du fichier. Les instances FileReference se crent de deux faons :

A laide de loprateur new avec le constructeur FileReference, comme dans lexemple qui suit :
var myFileReference:FileReference = new FileReference();

En appelant FileReferenceList.browse(), ce qui cre un tableau dobjets FileReference

Pour les oprations de chargement ou tlchargement, un fichier SWF peut uniquement accder aux fichiers de son propre domaine, ce qui comprend tous les domaines spcifis par un fichier de rgulation interdomaine. Vous devez placer un fichier de rgulation sur le serveur si le fichier SWF qui lance le chargement ou le tlchargement ne provient pas du mme domaine que le serveur de fichiers.
REMARQUE

Vous ne pouvez excuter quune seule mthode browse() ou download() la fois, car une seule bote de dialogue peut tre ouverte un moment donn.

Le script serveur qui gre le chargement doit attendre une requte HTTP POST comportant les lments suivants :
Content-Type

avec la valeur multipart/form-data.

avec comme attribut name Filedata et comme attribut filename le nom du fichier dorigine. Pour spcifier un attribut name, transmettez une valeur pour le paramtre uploadDataFieldName dans la mthode FileReference.upload().
Content-Disposition

Le contenu binaire du fichier.

Utilisation des chargements et tlchargements de fichiers

707

Voici un exemple de requte HTTP POST :


POST /handler.asp HTTP/1.1 Accept: text/* Content-Type: multipart/form-data; boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 User-Agent: Shockwave Flash Host: www.mydomain.com Content-Length: 421 Connection: Keep-Alive Cache-Control: no-cache ------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 Content-Disposition: form-data; name="Filename" sushi.jpg ------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 Content-Disposition: form-data; name="Filedata"; filename="sushi.jpg" Content-Type: application/octet-stream Test File ------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 Content-Disposition: form-data; name="Upload" Submit Query ------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 (actual file data,,,)

Lexemple suivant de requte HTTP POST envoie trois variables POST : api_sig, api_key et auth_token. Pour le chargement, elle utilise en outre la valeur de champ de donnes photo :
POST /handler.asp HTTP/1.1 Accept: text/* Content-Type: multipart/form-data; boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 User-Agent: Shockwave Flash Host: www.mydomain.com Content-Length: 421 Connection: Keep-Alive Cache-Control: no-cache ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="Filename" sushi.jpg ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="api_sig" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="api_key"

708

Rseau et communication

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="auth_token" XXXXXXXXXXXXXXXXXXXXXXX ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="photo"; filename="sushi.jpg" Content-Type: application/octet-stream (actual file data,,,) ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 Content-Disposition: form-data; name="Upload" Submit Query ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

Chargement de fichiers sur un serveur


Pour charger des fichiers sur un serveur, commencez par appeler la mthode browse() pour permettre lutilisateur de slectionner un ou plusieurs fichiers. Aprs appel de la mthode FileReference.upload(), le fichier slectionn est transfr sur le serveur. Si lutilisateur slectionne plusieurs fichiers laide de la mthode FileReferenceList.browse(), Flash Player cre un tableau de fichiers slectionns appel FileReferenceList.fileList. Vous pouvez alors utiliser la mthode FileReference.upload() pour charger chaque fichier individuellement.
REMARQUE

Lutilisation de la mthode FileReference.browse() vous permet de charger un seul fichier. Pour que lutilisateur puisse charger plusieurs fichiers, vous devez utiliser la mthode FileReferenceList.browse().

Par dfaut, la bote de dialogue de slection de fichiers du systme dexploitation permet lutilisateur de choisir tout type de fichier sur lordinateur local. Les dveloppeurs peuvent toutefois filtrer les types de fichier laide de la classe FileFilter, en transmettant un tableau dinstances de filtres de fichiers la mthode browse() :
var imageTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); var textTypes:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); var allTypes:Array = new Array(imageTypes, textTypes); var fileRef:FileReference = new FileReference(); fileRef.browse(allTypes);

Utilisation des chargements et tlchargements de fichiers

709

Une fois que lutilisateur a slectionn les fichiers et cliqu sur le bouton Ouvrir du slecteur de fichier du systme, lvnement Event.SELECT est distribu. Si la mthode utilise pour slectionner le fichier charger tait FileReference.browse(), il faut utiliser le code suivant pour envoyer le fichier au serveur Web :
var fileRef:FileReference = new FileReference(); fileRef.addEventListener(Event.SELECT, selectHandler); fileRef.addEventListener(Event.COMPLETE, completeHandler); try { var success:Boolean = fileRef.browse(); } catch (error:Error) { trace("Unable to browse for files."); } function selectHandler(event:Event):void { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/ fileUploadScript.cfm") try { fileRef.upload(request); } catch (error:Error) { trace("Unable to upload file."); } } function completeHandler(event:Event):void { trace("uploaded"); }
C ON S E I L

Avec la mthode FileReference.upload(), vous pouvez envoyer des donnes au serveur en utilisant les proprits URLRequest.method et URLRequest.data pour envoyer des variables laide des mthodes POST ou GET.

Si vous essayez de charger un fichier laide de la mthode FileReference.upload(), lun des vnements suivants peut tre distribu :
Event.OPEN

: distribu lors du dmarrage dune opration de chargement. : distribu rgulirement pendant le chargement du fichier. : distribu lorsquun chargement choue en : distribu en cas de russite de lopration de chargement.

ProgressEvent.PROGRESS Event.COMPLETE

SecurityErrorEvent.SECURITY_ERROR

raison dune violation de scurit.

710

Rseau et communication

HTTPStatusEvent.HTTP_STATUS

: distribu lorsquun chargement choue en raison

dune erreur HTTP.

IOErrorEvent.IO_ERROR

: distribu si le chargement choue pour lune des raisons

suivantes :

Une erreur dentre/sortie se produit dans Flash Player pendant la lecture, lcriture ou la transmission du fichier. Le fichier SWF tente de charger un fichier sur un serveur ncessitant une authentification (un nom dutilisateur et un mot de passe, par exemple). Au cours du chargement, Flash Player ne permet pas aux utilisateurs dentrer des mots de passe. Le paramtre url contient un protocole incorrect. La mthode FileReference.upload() doit utiliser HTTP ou HTTPS.
Flash Player noffre pas une prise en charge complte des serveurs ncessitant une authentification. Seuls les fichiers SWF sexcutant dans un navigateur, via le module externe du navigateur ou le contrle Microsoft ActiveX, peuvent fournir une bote de dialogue pour inviter lutilisateur entrer un nom et un mot de passe dauthentification, et ce uniquement pour les tlchargements. Le transfert de fichiers choue si le chargement est effectu laide du module externe ou du contrle ActiveX, ou si un chargement/tlchargement est effectu par le biais du lecteur autonome ou externe.

Si vous crez un script serveur dans ColdFusion de manire accepter les chargements de fichier en provenance de Flash Player, vous pouvez utiliser un code semblable celui-ci :
<cffile action="upload" filefield="Filedata" destination="#ExpandPath('./ ')#" nameconflict="OVERWRITE" />

Ce code ColdFusion charge le fichier envoy par Flash Player et lenregistre dans le mme rpertoire que le modle ColdFusion, en crasant tout fichier existant du mme nom. Cet exemple prsente le minimum de code ncessaire lacceptation du chargement dun fichier ; ce script ne doit pas tre utilis dans un environnement de production. Dans lidal, il faudrait ajouter un mcanisme de validation des donnes pour garantir que les utilisateurs chargent uniquement des types de fichiers autoriss, par exemple une image plutt quun script ct serveur potentiellement dangereux. Le code ci-aprs prsente le chargement de fichiers via PHP, avec validation des donnes. Le script limite le nombre de fichiers chargs dans le rpertoire cible 10, vrifie que le fichier fait moins de 200 Ko et autorise uniquement le chargement et lenregistrement de fichiers JPEG, GIF ou PNG.

C O N S E IL

Utilisation des chargements et tlchargements de fichiers

711

<?php $MAXIMUM_FILESIZE = 1024 * 200; // 200KB $MAXIMUM_FILE_COUNT = 10; // keep maximum 10 files on server echo exif_imagetype($_FILES['Filedata']); if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) { move_uploaded_file($_FILES['Filedata']['tmp_name'], "./temporary/ ".$_FILES['Filedata']['name']); $type = exif_imagetype("./temporary/".$_FILES['Filedata']['name']); if ($type == 1 || $type == 2 || $type == 3) { rename("./temporary/".$_FILES['Filedata']['name'], "./images/ ".$_FILES['Filedata']['name']); } else { unlink("./temporary/".$_FILES['Filedata']['name']); } } $directory = opendir('./images/'); $files = array(); while ($file = readdir($directory)) { array_push($files, array('./images/'.$file, filectime('./images/ '.$file))); } usort($files, sorter); if (count($files) > $MAXIMUM_FILE_COUNT) { $files_to_delete = array_splice($files, 0, count($files) $MAXIMUM_FILE_COUNT); for ($i = 0; $i < count($files_to_delete); $i++) { unlink($files_to_delete[$i][0]); } } print_r($files); closedir($directory); function sorter($a, $b) { if ($a[1] == $b[1]) { return 0; } else { return ($a[1] < $b[1]) ? -1 : 1; } } ?>

712

Rseau et communication

Vous pouvez transmettre des variables supplmentaires au script de chargement laide de la mthode de requte POST ou GET. Pour envoyer des variables POST au script de chargement, vous pouvez utiliser le code suivant :
var fileRef:FileReference = new FileReference(); fileRef.addEventListener(Event.SELECT, selectHandler); fileRef.addEventListener(Event.COMPLETE, completeHandler); fileRef.browse(); function selectHandler(event:Event):void { var params:URLVariables = new URLVariables(); params.date = new Date(); params.ssid = "94103-1394-2345"; var request:URLRequest = new URLRequest("http://www.yourdomain.com/ FileReferenceUpload/fileupload.cfm"); request.method = URLRequestMethod.POST; request.data = params; fileRef.upload(request, "Custom1"); } function completeHandler(event:Event):void { trace("uploaded"); }

Lexemple prcdent cre un objet URLVariables transmettre au script ct serveur distant. Dans les versions prcdentes dActionScript, il tait possible de transmettre des variables au script de chargement en passant des valeurs dans la chane de requte. ActionScript 3.0 vous permet de transmettre des variables au script distant laide de lobjet URLRequest. Vous pouvez ainsi transmettre des donnes laide de la mthode POST ou GET, ce qui simplifie et rationalise le transfert de gros volumes de donnes. Pour spcifier si les variables sont transmises laide de la mthode de requte GET ou POST, il est possible de dfinir la proprit URLRequest.method sur URLRequestMethod.GET ou URLRequestMethod.POST, respectivement. ActionScript 3.0 vous permet de remplacer le nom de champ par dfaut du fichier charger (Filedata) en ajoutant un deuxime paramtre la mthode upload(), comme illustr dans lexemple prcdent (dans lequel la valeur par dfaut Filedata est remplace par Custom1).

Utilisation des chargements et tlchargements de fichiers

713

Par dfaut, Flash Player nessaie pas deffectuer un chargement de test ; vous pouvez toutefois le faire en transmettant la valeur true comme troisime paramtre de la mthode upload(). Lobjectif du test est de vrifier que le chargement vritable se fera sans problme et que lauthentification du serveur, si ncessaire, russira.
REMARQUE 714

Pour lheure, le test de chargement seffectue uniquement dans les version Windows de Flash Player.

Tlchargement de fichiers partir dun serveur


Vous pouvez autoriser les utilisateurs tlcharger des fichiers partir dun serveur grce la mthode FileReference.download(), qui prend deux paramtres : request et defaultFileName. Le premier paramtre est lobjet URLRequest contenant lURL du fichier tlcharger. Le second est facultatif ; il permet de spcifier un nom de fichier par dfaut qui apparatra dans la bote de dialogue de tlchargement. Si vous ignorez le second paramtre, defaultFileName, le nom de fichier utilis est driv de lURL. Le code suivant tlcharge un fichier nomm index.xml partir du mme rpertoire que le document SWF :
var request:URLRequest = new URLRequest("index.xml"); var fileRef:FileReference = new FileReference(); fileRef.download(request);

Pour utiliser currentnews.xml comme nom par dfaut au lieu de index.xml, spcifiez le paramtre defaultFileName, comme le montre lextrait de code suivant :
var request:URLRequest = new URLRequest("index.xml"); var fileToDownload:FileReference = new FileReference(); fileToDownload.download(request, "currentnews.xml");

Le changement de nom du fichier peut savrer trs utile si le nom du fichier sur le serveur est peu vocateur ou sil a t gnr automatiquement. Il est galement judicieux de spcifier le paramtre defaultFileName lorsque vous tlchargez un fichier laide dun script ct serveur, au lieu deffectuer un tlchargement direct. Par exemple, il est ncessaire de spcifier le paramtre defaultFileName si vous utilisez un script ct serveur qui tlcharge des fichiers en fonction des variables URL qui lui sont transmises. Autrement, le nom par dfaut du fichier tlcharg est le nom du script ct serveur.

Rseau et communication

Vous pouvez galement envoyer des donnes au serveur avec lappel de la mthode download() en ajoutant des paramtres lURL pour que le script serveur les analyse. Lextrait de code ActionScript 3.0 ci-aprs tlcharge un document en fonction des paramtres transmis un script ColdFusion :
package { import import import import import

flash.display.Sprite; flash.net.FileReference; flash.net.URLRequest; flash.net.URLRequestMethod; flash.net.URLVariables;

public class DownloadFileExample extends Sprite { private var fileToDownload:FileReference; public function DownloadFileExample() { var request:URLRequest = new URLRequest(); request.url = "http://www.[yourdomain].com/downloadfile.cfm"; request.method = URLRequestMethod.GET; request.data = new URLVariables("id=2"); fileToDownload = new FileReference(); try { fileToDownload.download(request, "file2.txt"); } catch (error:Error) { trace("Unable to download file."); } } } }

Le code suivant prsente le script ColdFusion download.cfm, qui tlcharge lun des deux fichiers stocks sur le serveur en fonction de la valeur dune variable URL :
<cfparam name="URL.id" default="1" /> <cfswitch expression="#URL.id#"> <cfcase value="2"> <cfcontent type="text/plain" file="#ExpandPath('two.txt')#" deletefile="No" /> </cfcase> <cfdefaultcase> <cfcontent type="text/plain" file="#ExpandPath('one.txt')#" deletefile="No" /> </cfdefaultcase> </cfswitch>

Utilisation des chargements et tlchargements de fichiers

715

Classe FileReferenceList
La classe FileReferenceList permet lutilisateur de slectionner un ou plusieurs fichiers charger dans un script ct serveur. Le chargement de fichiers est gr par la mthode FileReference.upload(), qui doit tre appele pour chaque fichier slectionn. Le code suivant cre deux objets FileFilter (imageFilter et textFilter) et les transmet sous forme de tableau la mthode FileReferenceList.browse(). Ainsi, la bote de dialogue du systme dexploitation propose deux types de fichiers possibles.
var imageFilter:FileFilter = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); var textFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); var fileRefList:FileReferenceList = new FileReferenceList(); try { var success:Boolean = fileRefList.browse(new Array(imageFilter, textFilter)); } catch (error:Error) { trace("Unable to browse for files."); }

Lutilisation de la classe FileReferenceList pour autoriser le chargement de fichiers est semblable lutilisation de FileReference.browse(), sauf que FileReferenceList permet de slectionner plusieurs fichiers. En cas de slection de fichiers multiples, il est ncessaire de charger chacun des fichiers choisis laide de FileReference.upload(), comme le montre le code suivant :
var fileRefList:FileReferenceList = new FileReferenceList(); fileRefList.addEventListener(Event.SELECT, selectHandler); fileRefList.browse(); function selectHandler(event:Event):void { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/ fileUploadScript.cfm"); var file:FileReference; var files:FileReferenceList = FileReferenceList(event.target); var selectedFileArray:Array = files.fileList; for (var i:uint = 0; i < selectedFileArray.length; i++) { file = FileReference(selectedFileArray[i]); file.addEventListener(Event.COMPLETE, completeHandler); try { file.upload(request); }

716

Rseau et communication

catch (error:Error) { trace("Unable to upload files."); } } } function completeHandler(event:Event):void { trace("uploaded"); }

Etant donn que lvnement Event.COMPLETE sajoute chaque objet FileReference dans le tableau, Flash Player appelle la mthode completeHandler() la fin du chargement de chacun des fichiers.

Exemple : cration dun client Telnet


Lexemple Telnet illustre les techniques de connexion un serveur distant et de transmission des donnes laide de la classe Socket. Cet exemple tudie les techniques suivantes :

Cration dun client Telnet personnalis laide de la classe Socket Envoi de texte au serveur distant laide de lobjet ByteArray Gestion des donnes reues dun serveur distant

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers dapplication Telnet se trouvent dans le dossier Samples/Telnet. Cette application se compose des fichiers suivants :
Fichier
TelnetSocket.mxml com/example/programmingas3/Telnet/ Telnet.as

Description
Fichier dapplication principal correspondant linterface utilisateur MXML. Fournit la fonctionnalit client Telnet lapplication, par exemple pour la connexion un serveur distant et lenvoi, la rception et laffichage des donnes.

Exemple : cration dun client Telnet

717

Prsentation de lapplication socket Telnet


Le fichier principal TelnetSocket.mxml se charge de crer linterface utilisateur (IU) de lapplication entire. Outre lIU, ce fichier dfinit deux mthodes, login() et sendCommand(), qui permettent la connexion de lutilisateur au serveur spcifi. Lexemple suivant rpertorie le code ActionScript du fichier dapplication principal :
import com.example.programmingas3.socket.Telnet; private var telnetClient:Telnet; private function connect():void { telnetClient = new Telnet(serverName.text, int(portNumber.text), output); console.title = "Connecting to " + serverName.text + ":" + portNumber.text; console.enabled = true; } private function sendCommand():void { var ba:ByteArray = new ByteArray(); ba.writeMultiByte(command.text + "\n", "UTF-8"); telnetClient.writeBytesToSocket(ba); command.text = ""; }

La premire ligne de code importe la classe Telnet partir du package personnalis com.example.programmingas.socket. La deuxime dclare une instance de la classe Telnet, telnetClient, qui sera initialise ultrieurement par la mthode connect(). Ensuite, la mthode connect() est dclare et initialise la variable telnetClient dclare auparavant. Cette mthode transmet le nom du serveur Telnet spcifi par lutilisateur, le port de ce serveur et une rfrence un composant TextArea dans la liste daffichage, qui sert afficher les rponses textuelles reues du serveur socket. Les deux dernires lignes de la mthode connect() dfinissent la proprit title du composant Panel et active celui-ci, ce qui permet lutilisateur denvoyer les donnes au serveur distant. La mthode finale du fichier dapplication principal, sendCommand(), permet denvoyer les commandes de lutilisateur au serveur distant sous forme dobjet ByteArray.

718

Rseau et communication

Prsentation de la classe Telnet


La classe Telnet se charge dtablir la connexion au serveur distant Telnet et denvoyer et de recevoir les donnes. La classe Telnet dclare les variables prives suivantes :
private private private private private var var var var var serverURL:String; portNumber:int; socket:Socket; ta:TextArea; state:int = 0;

La premire variable, serverURL, contient ladresse du serveur auquel se connecter, spcifie par lutilisateur. La deuxime variable, portNumber, correspond au numro de port sur lequel le serveur Telnet sexcute actuellement. Par dfaut, le service Telnet utilise le port 23. La troisime variable, socket, est une instance Socket qui essaiera dtablir une connexion au serveur dfini par les variables serverURL et portNumber. La quatrime variable, ta, est une rfrence linstance du composant TextArea sur la scne. Ce composant sert afficher les rponses provenant du serveur Telnet distant ou les ventuels messages derreur. La dernire variable, state, est une valeur numrique utilise pour dterminer les options prises en charge par le client Telnet. Comme vous lavez vu prcdemment, la fonction constructeur de la classe Telnet est appele par la mthode connect() dans le fichier dapplication principal. Le constructeur Telnet prend trois paramtres : server, port et output. Les paramtres server et port spcifient le nom et le numro de port du serveur Telnet. Le dernier paramtre, output, est une rfrence loccurrence de composant TextArea sur la scne, o safficheront les rsultats du serveur pour lutilisateur.
public function Telnet(server:String, port:int, output:TextArea) { serverURL = server; portNumber = port; ta = output; socket = new Socket(); socket.addEventListener(Event.CONNECT, connectHandler); socket.addEventListener(Event.CLOSE, closeHandler); socket.addEventListener(ErrorEvent.ERROR, errorHandler); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler); Security.loadPolicyFile("http://" + serverURL + "/crossdomain.xml");

Exemple : cration dun client Telnet

719

try { msg("Trying to connect to " + serverURL + ":" + portNumber + "\n"); socket.connect(serverURL, portNumber); } catch (error:Error) { msg(error.message + "\n"); socket.close(); } }

Ecriture de donnes dans un socket


Pour crire des donnes sur une connexion Socket, vous pouvez appeler nimporte laquelle des mthodes dcriture de la classe Socket (par exemple writeBoolean(), writeByte(), writeBytes() ou writeDouble()), puis purger les donnes dans le tampon de sortie laide de la mthode flush(). Sur le serveur Telnet, les donnes sont crites sur la connexion Socket laide de la mthode writeBytes(), qui prend comme paramtre le tableau doctets et lenvoie au tampon de sortie. La mthode writeBytesToSocket() se prsente comme suit :
public function writeBytesToSocket(ba:ByteArray):void { socket.writeBytes(ba); socket.flush(); }

Cette mthode est appele par la mthode sendCommand() du fichier dapplication principal.

Affichage des messages provenant du serveur socket


Ds quun message est reu du serveur socket ou quun vnement survient, la mthode personnalise msg() est appele. Cette mthode ajoute une chane au composant TextArea sur la scne et appelle une mthode setScroll() personnalise, qui provoque le dfilement vers le bas du composant TextArea. La mthode msg() se prsente comme suit :
private function msg(value:String):void { ta.text += value; setScroll(); }

Si vous nappliquez pas le dfilement automatique au contenu du composant TextArea, les utilisateurs devront le faire manuellement pour consulter la dernire rponse du serveur.

720

Rseau et communication

Dfilement du contenu dun composant TextArea


La mthode setScroll() contient une seule ligne de code ActionScript qui permet de faire dfiler verticalement le contenu du composant TextArea de manire que lutilisateur puisse voir la dernire ligne de texte renvoy. Lextrait de code suivant illustre la mthode setScroll() :
public function setScroll():void { ta.verticalScrollPosition = ta.maxVerticalScrollPosition; }

Cette mthode dfinit la proprit verticalScrollPosition, qui correspond au numro de la ligne de caractre suprieure actuellement affiche, puis lui attribue la valeur de la proprit maxVerticalScrollPosition.

Exemple : chargement et tlchargement de fichiers


Lexemple FileIO prsente les techniques de chargement et de tlchargement de fichiers dans Flash Player. Ces techniques sont les suivantes :

Tlchargement de fichiers vers lordinateur de lutilisateur Chargement de fichiers de lordinateur de lutilisateur sur un serveur Annulation dun tlchargement en cours Annulation dun chargement en cours

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/ learn_programmingAS3samples_flash_fr. Les fichiers dapplication FileIO se trouvent dans le dossier Samples/FileIO. Cette application se compose des fichiers suivants :
Fichier
FileIO.fla ou FileIO.mxml com/example/programmingas3/fileio/ FileDownload.as com/example/programmingas3/fileio/ FileUpload.as

Description
Le fichier dapplication principal dans Flash (FLA) ou Flex (MXML). Classe incluant les mthodes de tlchargement de fichiers partir dun serveur. Classe incluant les mthodes de chargement de fichiers sur un serveur.

Exemple : chargement et tlchargement de fichiers

721

Prsentation de lapplication FileIO


Lapplication FileIO contient linterface utilisateur qui permet de charger ou tlcharger des fichiers laide de Flash Player. Lapplication commence par dfinir deux composants personnaliss, FileUpload et FileDownload, qui se trouvent dans le package com.example.programmingas3.fileio. Une fois que chaque composant a distribu son vnement contentComplete, la mthode init() de chacun est appele et transmet les rfrences des occurrences de composant ProgressBar et Button, qui permettent lutilisateur de suivre la progression du chargement/tlchargement ou dannuler le transfert de fichier en cours. Le code en question dans le fichier FileIO.mxml se prsente comme suit (notez que dans la version Flash version, le fichier FLA contient des composants placs sur la scne, dont les noms correspondent ceux des composants Flex dcrits dans cette tape) :
<example:FileUpload id="fileUpload" creationComplete="fileUpload.init(uploadProgress, cancelUpload);" /> <example:FileDownload id="fileDownload" creationComplete="fileDownload.init(downloadProgress, cancelDownload);" />

Le code suivant correspond au panneau de chargement du fichier, qui contient une barre de progression et deux boutons. Le premier bouton, startUpload, appelle la mthode FileUpload.startUpload(), qui elle-mme appelle la mthode FileReference.browse(). Lextrait suivant prsente le code du panneau de chargement du fichier :
<mx:Panel title="Upload File" paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"> <mx:ProgressBar id="uploadProgress" label="" mode="manual" /> <mx:ControlBar horizontalAlign="right"> <mx:Button id="startUpload" label="Upload..." click="fileUpload.startUpload();" /> <mx:Button id="cancelUpload" label="Cancel" click="fileUpload.cancelUpload();" enabled="false" /> </mx:ControlBar> </mx:Panel>

Ce code place une instance de composant ProgressBar et deux instances de composant Button sur la scne. Lorsque lutilisateur clique sur le bouton de chargement startUpload, une bote de dialogue du systme dexploitation saffiche pour permettre lutilisateur de slectionner le fichier charger sur le serveur distant. Lautre bouton, cancelUpload, est dsactiv par dfaut ; cependant, lorsque lutilisateur commence le chargement du fichier, ce bouton devient actif et lui permet de mettre fin tout moment au transfert de fichier.

722

Rseau et communication

Le code du panneau de tlchargement du fichier est le suivant :


<mx:Panel title="Download File" paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"> <mx:ProgressBar id="downloadProgress" label="" mode="manual" /> <mx:ControlBar horizontalAlign="right"> <mx:Button id="startDownload" label="Download..." click="fileDownload.startDownload();" /> <mx:Button id="cancelDownload" label="Cancel" click="fileDownload.cancelDownload();" enabled="false" /> </mx:ControlBar> </mx:Panel>

Ce code est trs semblable au code de chargement de fichier. Lorsque lutilisateur clique sur le bouton de tlchargement startDownload, la mthode FileDownload.startDownload() est appele. Celle-ci dbute le tlchargement du fichier spcifi dans la variable FileDownload.DOWNLOAD_URL. Pendant le tlchargement du fichier, la barre de progression sactualise pour indiquer le pourcentage du fichier dj tlcharg. Lutilisateur peut annuler lopration tout moment en cliquant sur le bouton cancelDownload, qui arrte immdiatement le tlchargement de fichier en cours.

Tlchargement de fichiers partir dun serveur distant


Le tlchargement de fichier partir dun serveur distant est gr par la classe flash.net.FileReference et la classe personnalise com.example.programmingas3.fileio.FileDownload. Lorsque lutilisateur clique sur le bouton de tlchargement, Flash Player commence tlcharger le fichier spcifi dans la variable com.example.programmingas3.fileio.FileDownload class de la classe FileDownload. La classe FileDownload commence par dfinir quatre variables au sein du package com.example.programmingas3.fileio, comme le montre le code suivant :
/** * Coder lURL du fichier tlcharger sur lordinateur de lutilisateur. */ private const DOWNLOAD_URL:String = "http://www.yourdomain.com/ file_to_download.zip"; /** * Crer une instance FileReference pour grer le tlchargement du fichier. */ private var fr:FileReference;

Exemple : chargement et tlchargement de fichiers

723

/** * Dfinir une rfrence au composant de tlchargement ProgressBar. */ private var pb:ProgressBar; /** * Dfinir une rfrence au bouton dannulation qui arrte immdiatement * le tlchargement en cours. */ private var btn:Button;

La premire variable, DOWNLOAD_URL, contient le chemin daccs au fichier qui est tlcharg sur lordinateur de lutilisateur lorsque celui-ci clique sur le bouton de tlchargement dans le fichier dapplication principal. La deuxime variable, fr, est un objet FileReference qui est initialis dans la mthode FileDownload.init() et grera le tlchargement du fichier distant sur lordinateur de lutilisateur. Les deux dernires variables, pb et btn, contiennent les rfrences aux instances de composant ProgressBar et Button sur la scne, qui sont initialises par la mthode FileDownload.init().

Initialisation du composant FileDownload


Le composant FileDownload est initialis par lappel de la mthode init() de la classe FileDownload. Cette mthode prend deux paramtres, pb et btn, qui sont des occurrences de composant ProgressBar et Button, respectivement. Le code de la mthode init() se prsente comme suit :
/** * Dfinir des rfrences aux composants et ajouter des couteurs pour les vnements OPEN, * PROGRESS et COMPLETE. */ public function init(pb:ProgressBar, btn:Button):void { // Dfinir des rfrences la barre de progression et // au bouton dannulation, // qui sont transmises partir du script dappel. this.pb = pb; this.btn = btn; fr = new FileReference(); fr.addEventListener(Event.OPEN, openHandler); fr.addEventListener(ProgressEvent.PROGRESS, progressHandler); fr.addEventListener(Event.COMPLETE, completeHandler); }

724

Rseau et communication

Lancement du tlchargement dun fichier


Lorsque lutilisateur clique sur le bouton de tlchargement sur la scne, la mthode startDownload() doit initialiser le processus de tlchargement de fichier. Lextrait suivant illustre la mthode startDownload() :
/** * Lancez le tlchargement du fichier spcifi dans la constante DOWNLOAD_URL. */ public function startDownload():void { var request:URLRequest = new URLRequest(); request.url = DOWNLOAD_URL; fr.download(request); }

Dabord, la mthode startDownload() cre un objet URLRequest et dfinit lURL cible sur la valeur dfinie par la variable DOWNLOAD_URL. Ensuite, la mthode FileReference.download() est appele et lobjet URLRequest cr est transmis comme paramtre. Le systme dexploitation affiche alors une bote de dialogue qui invite lutilisateur slectionner un emplacement cible pour le document demand. Une fois lemplacement choisi, lvnement open (Event.OPEN) est transmis et la mthode openHandler() appele. La mthode openHandler() dfinit le format de texte de la proprit label du composant ProgressBar et active le bouton dannulation, qui permet lutilisateur darrter immdiatement le tlchargement en cours. La mthode openHandler() se prsente comme suit :
/** * Une fois lvnement OPEN distribu, modifier le libell de la barre de progression * et activer le bouton dannulation, qui permet lutilisateur de mettre fin * au tlchargement. */ private function openHandler(event:Event):void { pb.label = "DOWNLOADING %3%%"; btn.enabled = true; }

Exemple : chargement et tlchargement de fichiers

725

Surveillance de la progression du tlchargement dun fichier


Pendant le tlchargement dun fichier du serveur distant sur lordinateur de lutilisateur, lvnement progress (ProgressEvent.PROGRESS) est distribu intervalles rguliers. Ds distribution de lvnement progress, la mthode progressHandler() est appele et le composant ProgressBar sur la scne est actualis. Le code de la mthode progressHandler() se prsente comme suit :
/** * Pendant le tlchargement du fichier, mettez jour le statut de la barre de progression. */ private function progressHandler(event:ProgressEvent):void { pb.setProgress(event.bytesLoaded, event.bytesTotal); }

Lvnement progress contient deux proprits : bytesLoaded et bytesTotal, qui sont utilises pour mettre jour le composant ProgressBar sur la scne. Lutilisateur reoit ainsi une indication de la quantit de donnes dj tlcharge et du restant. Il peut mettre fin au transfert de fichier tout moment en cliquant sur le bouton dannulation situ sous la barre de progression. Si le tlchargement russit, lvnement complete (Event.COMPLETE) appelle la mthode completeHandler(), qui avertit lutilisateur de la fin de lopration et dsactive le bouton dannulation. Le code de la mthode completeHandler() se prsente comme suit :
/** * A la fin du tlchargement, modifiez une * dernire fois le libell de la barre de progression et dsactivez le bouton dannulation car le tlchargement est * termin. */ private function completeHandler(event:Event):void { pb.label = "DOWNLOAD COMPLETE"; btn.enabled = false; }

726

Rseau et communication

Annulation du tlchargement dun fichier


Lutilisateur peut tout moment mettre fin au transfert de fichiers et empcher le tlchargement doctets supplmentaires en cliquant sur le bouton dannulation de la scne. Lextrait suivant prsente le code dannulation du tlchargement :
/** * Annulez le tlchargement du fichier actuel. */ public function cancelDownload():void { fr.cancel(); pb.label = "DOWNLOAD CANCELLED"; btn.enabled = false; }

Tout dabord, le code arrte immdiatement le transfert du fichier, empchant ainsi le tlchargement de donnes supplmentaires. Ensuite, la proprit Label de la barre de progression sactualise pour confirmer lutilisateur lannulation du tlchargement. Enfin, le bouton dannulation est dsactiv, pour empcher lutilisateur de recliquer dessus tant quune autre tentative de tlchargement nest pas lance.

Chargement de fichiers sur un serveur distant


Le processus de chargement de fichier est trs semblable au tlchargement. La classe FileUpload dclare les quatre mmes variables, comme le montre le code suivant :
private const UPLOAD_URL:String = "http://www.yourdomain.com/ your_upload_script.cfm"; private var fr:FileReference; private var pb:ProgressBar; private var btn:Button;

A la diffrence de la variable FileDownload.DOWNLOAD_URL, UPLOAD_URL contient lURL du script ct serveur qui chargera le fichier partir de lordinateur de lutilisateur. Les trois autres variables ont le mme comportement que leurs quivalents dans la classe FileDownload.

Exemple : chargement et tlchargement de fichiers

727

Initialisation du composant FileUpload


Le composant FileUpload contient une mthode init(), qui est appele partir de lapplication principale. Cette mthode prend deux paramtres, pb et btn, qui sont des rfrences aux composants ProgressBar et Button sur la scne. Ensuite, la mthode init() initialise lobjet FileReference dfini plus tt par la classe FileUpload. Enfin, la mthode attribue quatre couteurs dvnements lobjet FileReference. Le code de la mthode init() se prsente comme suit :
public function init(pb:ProgressBar, btn:Button):void { this.pb = pb; this.btn = btn; fr = new FileReference(); fr.addEventListener(Event.SELECT, selectHandler); fr.addEventListener(Event.OPEN, openHandler); fr.addEventListener(ProgressEvent.PROGRESS, progressHandler); fr.addEventListener(Event.COMPLETE, completeHandler); }

Lancement du chargement dun fichier


Le chargement du fichier est initialis lorsque lutilisateur clique sur le bouton de chargement de la scne, qui appelle la mthode FileUpload.startUpload(). Celle-ci appelle la mthode browse() de la classe FileReference qui entrane laffichage par le systme dexploitation dune bote de dialogue invitant lutilisateur slectionner le fichier charger sur le serveur distant. Lextrait suivant prsente le code de la mthode startUpload() :
public function startUpload():void { fr.browse(); }

Une fois que lutilisateur a slectionn un fichier charger, lvnement select (Event.SELECT) est distribu, appelant ainsi la mthode selectHandler(). La mthode selectHandler() cr un objet URLRequest et attribue la proprit URLRequest.url la valeur de la constante UPLOAD_URL dfinie plus haut dans le code. Enfin, lobjet FileReference charge le fichier slectionn dans le script ct serveur spcifi. Le code de la mthode selectHandler() se prsente comme suit :
private function selectHandler(event:Event):void { var request:URLRequest = new URLRequest(); request.url = UPLOAD_URL; fr.upload(request); }

728

Rseau et communication

Le reste du code de la classe FileUpload est identique au code dfini dans la classe FileDownload. Si lutilisateur souhaite mettre fin au chargement, il peut cliquer tout moment sur le bouton dannulation qui dfinit le libell de la barre de progression et arrte immdiatement le transfert du fichier. La barre de progression est actualise ds que lvnement progress (ProgressEvent.PROGRESS) est distribu. De mme, une fois que le chargement est termin, la barre de progression sactualise pour confirmer lutilisateur la russite du chargement. Le bouton dannulation est alors dsactiv jusqu ce que lutilisateur lance un nouveau transfert de fichier.

Exemple : chargement et tlchargement de fichiers

729

730

Rseau et communication

CHAPITRE 23

Environnement du systme client


Ce chapitre explique comment interagir avec le systme utilisateur. Il vous montre comment dterminer les fonctions prises en charge et comment construire des fichiers SWF multilingues laide de lditeur de la mthode dentre installe de lutilisateur (IME) (le cas chant). Il vous prsente enfin les utilisations typiques des domaines dapplication.

23

Contenu
Principes de base de lenvironnement du systme client . . . . . . . . . . . . . . . . . . . . . 731 Utilisation de la classe System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734 Utilisation de la classe Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735 Utilisation de la classe ApplicationDomain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736 Utilisation de la classe IME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .740 Exemple : dtection des capacits du systme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .746

Principes de base de lenvironnement du systme client


Introduction lenvironnement du systme client
Au fur et mesure que vous crez des applications ActionScript plus avances, il se peut que vous souhaitiez en savoir plus sur les systmes dexploitation de vos utilisateurs et leurs fonctions daccs. Lenvironnement du systme client est un ensemble de classes dans le package flash.system qui permettent daccder des fonctionnalits au niveau du systme, telles que :

Dtermination de lapplication et du domaine de scurit dans lesquels un SWF est excut Dtermination des fonctionnalits du Flash Player de lutilisateur (taille de lcran rsolution) et des fonctionnalits disponibles (audio mp3, par exemple)

731

Cration de sites multilingues utilisant lIME Interaction avec le conteneur de Flash Player (qui doit tre une page HTML ou une application de conteneur) Enregistrement dinformations dans le presse-papiers de lutilisateur

Le package flash.system comprend aussi les classes IMEConversionMode et SecurityPanel. Ces classes contiennent des constantes statiques que vous pouvez utiliser avec les classes IME et de scurit, respectivement.

Tches courantes de lenvironnement du systme client


Les tches courantes suivantes qui utilisent le systme client avec ActionScript sont dcrites dans ce chapitre :

Dtermination de la quantit de mmoire utilise par votre application Copie de texte dans le presse-papiers de lutilisateur Dtermination des fonctionnalits de lordinateur de lutilisateur telles que :

Rsolution de lcran, couleur, PPP et proportions en pixel Systme dexploitation Prise en charge pour les sons en flux continu, la vido en flux continu et la lecture mp3 Vrification de la version de Flash Player installe pour savoir sil sagit dune version de dbogage Dfinition dun domaine dapplication Sparation de code de fichiers SWF en domaines dapplication Dterminer si un IME est install Dterminer le mode de conversion IME et le dfinir Dsactiver lIME pour des champs texte Dtecter lorsquune conversion IME a lieu

Utilisation de domaines dapplication :


Utilisation dun IME dans votre :


732

Environnement du systme client

Concepts et termes importants


La liste de rfrence suivante contient les termes importants utiliss dans ce chapitre :

Systme dexploitation : le programme principal qui est excut sur un ordinateur, dans lequel toutes les autres applications sont excutes (Microsoft Windows, Mac OS X ou Linux, par exemple). Presse-papiers : le conteneur du systme dexploitation qui contient du texte ou des lments qui sont copis ou coups, et partir duquel des lments sont colls dans des applications. Domaine dapplication : un mcanisme permettant de sparer les classes utilises dans diffrents fichiers SWF de faon ce que si les fichiers SWF comprennent diffrentes classes ayant le mme nom, elles ne sont pas supprimes. IME (input method editor - diteur de mthode dentre) : un programme (ou outil de systme dexploitation) utilis pour entrer des caractres complexes ou des symboles utilisant un clavier standard. Systme client : en termes de programmation, un client est la partie dune application (ou lapplication entire) excute sur un ordinateur et utilise par un seul utilisateur. Le systme client est le systme dexploitation sous-jacent sur lordinateur de lutilisateur.

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans le chapitre, vous pouvez tester des exemples de code. Tous les codes fournis dans ce chapitre comprennent lappel de la fonction trace() appropri pour crire les valeurs testes. Pour tester les codes de ce chapitre :
1. 2. 3. 4.

Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code dans le panneau Script. Excutez le programme en slectionnant Contrle > Tester lanimation. Les rsultats des fonctions trace() des codes saffichent dans le panneau Sortie.

Certains des prochains codes sont plus complexes et sont crits sous la forme dune classe. Pour tester ces exemples :
1. 2.

Crez un document Flash vide et enregistrez-le sur votre ordinateur. Crez un nouveau fichier ActionScript et enregistrez-le dans le mme rpertoire que le document Flash. Le nom du fichier doit correspondre au nom de la classe du code. Par exemple, si le code dfinit une classe SystemTest, enregistrez le fichier ActionScript sous le nom SystemTest.as.

Principes de base de lenvironnement du systme client

733

3. 4.

Copiez le code dans le fichier ActionScript et enregistrez le fichier. Dans le document Flash, cliquez sur une partie vide de la scne ou de lespace de travail pour activer linspecteur Proprits du document. Dans linspecteur Proprits, dans le champ Classe du document, saisissez le nom de la classe ActionScript que vous avez copie du texte. Excutez le programme en slectionnant Contrle > Tester lanimation Les rsultats de lexemple saffichent dans le panneau de sortie.

5.

6.

Les techniques de test des exemples de code sont dcrites de faon plus dtaille dans Test des exemples de code contenus dans un chapitre , la page 67.

Utilisation de la classe System


La classe System contient des mthodes et des proprits qui vous permettent dinteragir avec le systme dexploitation de lutilisateur et de rcuprer lutilisation mmoire actuelle pour Adobe Flash Player. Les mthodes et les proprits de la classe System vous permettent aussi dcouter les vnements imeComposition, dindiquer Flash Player de charger des fichiers texte externes laide de la page de code active de lutilisateur ou dUnicode, ou de dfinir le contenu du presse-papiers de lutilisateur.

Obtention de donnes sur le systme de lutilisateur pendant lexcution


En vrifiant la proprit System.totalMemory, vous pouvez dterminer la quantit de mmoire (en octets) que Flash Player utilise actuellement. Cette proprit vous permet de surveiller lutilisation mmoire et doptimiser vos applications en fonction de ses variations. Par exemple, si un effet visuel particulier utilise une quantit de mmoire importante, vous pouvez envisager de le modifier ou de le supprimer entirement. La proprit System.ime est une rfrence lIME actuellement install. Elle vous permet dcouter les vnements imeComposition (flash.events.IMEEvent.IME_COMPOSITION) laide de la mthode addEventListener(). La troisime proprit dans la classe System est useCodePage. Lorsque useCodePage est dfini sur true, Flash Player utilise la page de code traditionnelle du systme dexploitation qui excute le lecteur pour charger des fichiers texte. Si vous lui attribuez la valeur false, vous indiquez Flash Player dinterprter le fichier externe avec Unicode.

734

Environnement du systme client

Si vous dfinissez System.useCodePage sur true, souvenez-vous que la page de code classique du systme dexploitation excutant le lecteur doit inclure les caractres utiliss dans votre fichier texte externe afin dafficher le texte. Par exemple, si vous chargez un fichier texte externe contenant des caractres chinois, ceux-ci ne peuvent safficher sur un systme qui utilise la page de code anglaise de Windows car elle ne comprend pas les caractres chinois. Pour que les utilisateurs de toutes les plates-formes puissent afficher les fichiers texte externes utiliss dans vos fichiers SWF, vous devez coder tous les fichiers texte externes en Unicode et conserver la valeur par dfaut false de la proprit System.useCodePage. Ainsi, Flash Player interprte le texte en Unicode.

Enregistrement du texte dans le presse-papiers


La classe System inclut une mthode appele setClipboard() qui permet Flash Player de placer une chane spcifique dans le presse-papiers de lutilisateur. Pour des raisons de scurit, il nexiste pas de mthode Security.getClipboard() car elle donnerait la possibilit daccder aux dernires donnes copies dans le presse-papiers de lutilisateur. Le code suivant illustre comment un message derreur peut tre copi dans le presse-papiers de lutilisation lorsquune erreur de scurit survient. Le message derreur permettra lutilisateur de signaler un bogue potentiel dans une application.
private function securityErrorHandler(event:SecurityErrorEvent):void { var errorString:String = "[" + event.type + "] " + event.text; trace(errorString); System.setClipboard(errorString); }

Utilisation de la classe Capabilities


La classe Capabilities permet aux dveloppeurs de dterminer lenvironnement dans lequel le fichier SWF est excut. A laide des diverses proprits de la classe Capabilities, vous pouvez dterminer la rsolution et la langue du systme de lutilisateur, savoir si ce systme prend en charge les logiciels daccessibilit et identifier la version de Flash Player actuellement installe. La vrification des proprits de la classe Capabilities vous autorise personnaliser votre application pour un fonctionnement optimale sur lenvironnement de lutilisateur. Par exemple, si vous vrifiez les proprits Capabilities.screenResolutionX et Capabilities.screenResolutionY, vous pouvez dterminer la rsolution daffichage du systme de lutilisateur et dcider de la taille de vido la plus approprie. Vous pouvez aussi vrifier la proprit Capabilities.hasMP3 pour voir si le systme de lutilisateur prend en charge la lecture du format mp3 avant dessayer de charger un fichier mp3 externe.

Utilisation de la classe Capabilities

735

Le code ci-aprs utilise une expression rgulire pour analyser la version de Flash Player utilise sur le client :
var versionString:String = Capabilities.version; var pattern:RegExp = /^(\w*) (\d*),(\d*),(\d*),(\d*)$/; var result:Object = pattern.exec(versionString); if (result != null) { trace("input: " + result.input); trace("platform: " + result[1]); trace("majorVersion: " + result[2]); trace("minorVersion: " + result[3]); trace("buildNumber: " + result[4]); trace("internalBuildNumber: " + result[5]); } else { trace("Unable to match RegExp."); }

Si vous souhaitez envoyer les capacits du systme de lutilisateur un script ct serveur afin de stocker les informations dans une base de donnes, vous pouvez utiliser le code ActionScript suivant :
var url:String = "log_visitor.cfm"; var request:URLRequest = new URLRequest(url); request.method = URLRequestMethod.POST; request.data = new URLVariables(Capabilities.serverString); var loader:URLLoader = new URLLoader(request);

Utilisation de la classe ApplicationDomain


Le rle de la classe ApplicationDomain est de stocker un tableau des dfinitions ActionScript 3.0. Lensemble du code dun fichier SWF est dfini de sorte exister dans un domaine dapplication. Les domaines dapplication vous servent partitionner les classes qui se trouvent dans un mme domaine de scurit. Ainsi, plusieurs dfinitions de la mme classe peuvent exister et les enfants peuvent rutiliser les dfinitions des parents.

736

Environnement du systme client

Vous pouvez utiliser les domaines dapplication lors du chargement, au moyen de la classe Loader, dun fichier SWF externe crit en ActionScript 3.0. (Notez que vous ne pouvez pas utiliser les domaines dapplication lorsque vous chargez une image ou un fichier SWF crit en ActionScript 1.0 ou ActionScript 2.0.) Toutes les dfinitions ActionScript 3.0 contenues dans la classe charge sont stockes dans le domaine dapplication. Lorsque vous chargez un fichier SWF, vous devez indiquer que le fichier doit tre inclus dans le mme domaine dapplication que lobjet Loader en attribuant au paramtre applicationDomain de lobjet LoaderContext la valeur ApplicationDomain.currentDomain. Si vous placez le fichier SWF charg dans le mme domaine dapplication, vous bnficiez dun accs direct ses classes. Cela savre pratique si vous chargez un fichier SWF qui contient des mdias incorpors auxquels vous pouvez accder via les noms de classe associs, ou si vous voulez accder aux mthodes du fichier SWF charg, comme le montre lexemple suivant :
package { import import import import import import

flash.display.Loader; flash.display.Sprite; flash.events.*; flash.net.URLRequest; flash.system.ApplicationDomain; flash.system.LoaderContext;

public class ApplicationDomainExample extends Sprite { private var ldr:Loader; public function ApplicationDomainExample() { ldr = new Loader(); var req:URLRequest = new URLRequest("Greeter.swf"); var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); ldr.load(req, ldrContext); } private function completeHandler(event:Event):void { ApplicationDomain.currentDomain.getDefinition("Greeter"); var myGreeter:Greeter = Greeter(event.target.content); var message:String = myGreeter.welcome("Tommy"); trace(message); // Hello, Tommy } } }

Utilisation de la classe ApplicationDomain

737

Voici dautres points garder lesprit lorsque vous utilisez les domaines dapplication :

Lensemble du code dun fichier SWF est dfini de sorte exister dans un domaine dapplication. Votre application principale sexcute dans le domaine dapplication en cours. Le domaine du systme contient tous les domaines dapplication, y compris le domaine en cours ; il contient donc toutes les classes Flash Player. A lexception du domaine du systme, tous les domaines dapplication sont associs un domaine parent. Le domaine parent du domaine de votre application principale est le domaine du systme. Les classes charges ne sont dfinies que si leur parent ne les dfinit pas encore. Vous ne pouvez pas remplacer une dfinition de classe charge par une dfinition plus rcente.

Le schma suivant figure une application qui charge du contenu partir de divers fichiers SWF au sein dun domaine unique, domain1.com. Selon le contenu charg, diffrents domaines dapplication peuvent tre utiliss. Le texte suivant dcrit la logique utilise pour dfinir le domaine dapplication appropri pour chaque fichier SWF de lapplication.
Scne Domaine de scurit : domain1.com

Domaine dapplication 1

application1.swf

mx.core.Application module1.swf

Loader Application Loader Loader Loader

Module
Domaine dapplication 3

Utilisation B

module3.swf Module

Utilisation C

Domaine dapplication 2

mx.core.Application application2.swf Module

Utilisation A

738

Environnement du systme client

Le fichier principal dapplication est application1.swf. Il contient des objets Loader qui chargent du contenu partir dautres fichiers SWF. Dans ce scnario, le domaine en cours est Application domain 1. Lutilisation A, lutilisation B et lutilisation C illustrent les diffrentes techniques permettent de dfinir le domaine dapplication appropri pour chaque fichier SWF de lapplication.
Utilisation A

: Partitionnez le fichier enfant SWF en crant un enfant du domaine du systme. Dans le schma, le domaine dapplication 2 est cr comme enfant du domaine du systme. Le fichier application2.swf est charg dans le domaine dapplication 2 et ses dfinitions de classe sont ainsi partitionnes partir des classes dfinies dans application1.swf. Cette technique sappliquera par exemple lorsquune ancienne application doit charger dynamiquement une nouvelle version de la mme application sans crer de conflits. Les conflits sont limins parce que mme si les noms de classe sont les mmes, ils sont rpartis dans diffrents domaines dapplication. Le code suivant cr un domaine dapplication qui constitue un enfant du domaine du systme :

request.url = "application2.swf"; request.applicationDomain = new ApplicationDomain(); Utilisation B : Ajoutez de nouvelles dfinitions de classe aux dfinitions actuelles. Le domaine dapplication module1.swf est dfini sur le domaine actif (application domain 1). Vous pouvez alors ajouter au jeu actuel de dfinitions de classe de lapplication de nouvelles dfinitions de classe. Cela pourrait servir pour une bibliothque dexcution partage appartenant lapplication principale. Le fichier SWF est trait comme une bibliothque partage distante (RSL, remote shared library). Utilisez cette technique pour charger des RSL laide dun fichier de prchargement avant le lancement de lapplication.

Le code suivant dfinit un domaine dapplication au domaine actuel :


request.url = "module1.swf"; request.applicationDomain = ApplicationDomain.currentDomain; Utilisation C : Utilisez les dfinitions de classe du parent en ajoutant un nouveau domaine enfant au domaine actif. Le domaine dapplication de module3.swf est un enfant du domaine actuel, qui utilise pour toutes les classes les versions du parent. Cette technique peut sappliquer un module dune application Internet riche (RIA, Rich Internet Application) plusieurs crans, qui serait charg comme enfant de lapplication principale et utiliserait les types de cette dernire. Si vous pouvez garantir que toutes les classes sont toujours mises jour pour rester compatibles avec les anciennes versions et que lapplication de chargement est toujours plus rcente que les contenus quelle charge, les enfants utiliseront les versions des parents. Lutilisation dun nouveau domaine dapplication vous permet de dcharger toutes les dfinitions de classe en vue du nettoyage, condition de veiller ce quil ne subsiste aucune rfrence au fichier SWF enfant.

Utilisation de la classe ApplicationDomain

739

Cette technique autorise les modules chargs partager les objets Singleton et les membres de classe statiques de lobjet Loader. Le code suivant cre un nouveau domaine enfant du domaine actif :
request.url = "module3.swf"; request.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);

Utilisation de la classe IME


La classe IME vous permet de manipuler lIME du systme dexploitation au sein de Flash Player. A laide dActionScript, vous pouvez dterminer les lments suivants :

Si un IME est install sur lordinateur de lutilisateur (Capabilities.hasIME) Si lIME est activ ou dsactiv sur lordinateur de lutilisateur (IME.enabled) Le mode de conversion utilis par lIME actif (IME.conversionMode)

Vous pouvez associer un champ de saisie de texte un contexte IME particulier. Lorsque vous passez dun champ dentre un autre, vous pouvez galement changer lIME pour utiliser les caractres Hiragana (japonais), des nombres pleine chasse, des nombres demi-chasse, la saisie directe, etc. Un IME permet aux utilisateurs dentrer des caractres de texte non ASCII des langues codes sur plusieurs octets, telles que le chinois, le japonais et le coren. Pour plus dinformations sur les IME, reportez-vous la documentation du systme dexploitation correspondant la plate-forme pour laquelle vous dveloppez lapplication. Pour davantage de ressources, consultez galement les sites Web suivants :

http://www.microsoft.com/globaldev/default.mspx http://developer.apple.com/documentation/ http://java.sun.com/


Si aucun IME nest actif sur lordinateur de lutilisateur, les appels de mthodes ou proprits IME chouent lexception de Capabilities.hasIME. Aprs activation manuelle dun IME, les appels ActionScript des mthodes et proprits IME fonctionneront normalement. Par exemple, si vous utilisez un IME japonais, vous devez lactiver avant dappeler une mthode ou une proprit IME.

740

REMARQUE

Environnement du systme client

Confirmation de linstallation et de lactivation dun IME


Avant dappeler des mthodes ou proprits IME, vous devez toujours vrifier si un IME est install et activ sur lordinateur de lutilisateur. Le code suivant montre comment vrifier que lutilisateur dispose dun IME install et activ avant dappeler une mthode :
if (Capabilities.hasIME) { if (IME.enabled) { trace("LIME est install et activ."); } else { trace("LIME est install mais pas activ. Activez votre IME et ressayez."); } } else { trace("LIME nest pas install. Installez un IME et ressayez."); }

Le code prcdent vrifie dabord si lutilisateur a un IME install laide de la proprit Capabilities.hasIME. Si la valeur de la proprit est true, le code vrifie ensuite si lIME est activ laide de la proprit IME.enabled.

Identification du mode de conversion IME activ


Lorsque vous construisez une application multilingue, il peut tre ncessaire de dterminer le mode de conversion actif dans le systme dexploitation. Le code suivant montre comment vrifier si lutilisateur dispose dun IME install et, le cas chant, quel mode de conversion IME est activ :
if (Capabilities.hasIME) { switch (IME.conversionMode) { case IMEConversionMode.ALPHANUMERIC_FULL: tf.text = "Le mode de conversion actuel est alphanumrique (pleine largeur)."; break; case IMEConversionMode.ALPHANUMERIC_HALF: tf.text = "Le mode de conversion actuel est alphanumrique (demi-largeur)."; break;

Utilisation de la classe IME

741

case IMEConversionMode.CHINESE: tf.text = "Le mode de conversion actuel est Chinois."; break; case IMEConversionMode.JAPANESE_HIRAGANA: tf.text = "Le mode de conversion actuel est Hiragana japonais."; break; case IMEConversionMode.JAPANESE_KATAKANA_FULL: tf.text = "Le mode de conversion actuel est Katakana japonais (pleine largeur)."; break; case IMEConversionMode.JAPANESE_KATAKANA_HALF: tf.text = "Le mode de conversion actuel est Katakana japonais (demilargeur)."; break; case IMEConversionMode.KOREAN: tf.text = "Le mode de conversion actuel est Coren."; break; default: tf.text = "Le mode de conversion actuel est " + IME.conversionMode + "."; break; } } else { tf.text = "Installez un IME et ressayez."; }

Le code prcdent vrifie dabord si lutilisateur a un IME install. Ensuite, il vrifie le mode de conversion actuellement utilis par lIME en comparant la proprit IME.enabled chacune des constantes de la classe IMEConversionMode.

Dfinition du mode de conversion IME


Lorsque vous modifiez le mode de conversion de lIME de lutilisateur, vous devez veiller envelopper le code dans un bloc try..catch. En effet, si lIME est incapable de dfinir le mode de conversion, lutilisation de la proprit conversionMode peut renvoyer une erreur. Le code ci-aprs montre comment utiliser un bloc try..catch lors de la dfinition de la proprit IME.conversionMode :

742

Environnement du systme client

var statusText:TextField = new TextField; statusText.autoSize = TextFieldAutoSize.LEFT; addChild(statusText); if (Capabilities.hasIME) { try { IME.enabled = true; IME.conversionMode = IMEConversionMode.KOREAN; statusText.text = "Le mode de conversion est " + IME.conversionMode + "."; } catch (error:Error) { statusText.text = "Impossible de dfinir le mode de conversion.\n" + error.message; } }

Le code prcdent cre dabord un champ texte utilis pour afficher un message dtat lutilisateur. Ensuite, si lIME est install, le code lactive et dfinit le mode de conversion coren. Si lordinateur de lutilisateur ne dispose pas dun IME coren, une erreur est renvoye par Flash Player et intercepte par le bloc try..catch. Le bloc try..catch affiche le message derreur dans le champ texte cr prcdemment.

Dsactivation de lIME pour certains champs texte


Dans certains cas, il peut tre ncessaire de dsactiver lIME de lutilisateur pendant que ce dernier saisit des caractres. Par exemple, si un champ texte accepte uniquement des caractres numriques, il peut tre prfrable dviter lintervention de lIME pour ne pas ralentir la saisie des donnes. Lexemple suivant montre comment couter les vnements FocusEvent.FOCUS_IN et FocusEvent.FOCUS_OUT et dsactiver lIME de lutilisateur en consquence :
var phoneTxt:TextField = new TextField(); var nameTxt:TextField = new TextField(); phoneTxt.type = TextFieldType.INPUT; phoneTxt.addEventListener(FocusEvent.FOCUS_IN, focusInHandler); phoneTxt.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler); phoneTxt.restrict = "0-9"; phoneTxt.width = 100; phoneTxt.height = 18; phoneTxt.background = true; phoneTxt.border = true; addChild(phoneTxt);

Utilisation de la classe IME

743

nameField.type = TextFieldType.INPUT; nameField.x = 120; nameField.width = 100; nameField.height = 18; nameField.background = true; nameField.border = true; addChild(nameField); function focusInHandler(event:FocusEvent):void { if (Capabilities.hasIME) { IME.enabled = false; } } function focusOutHandler(event:FocusEvent):void { if (Capabilities.hasIME) { IME.enabled = true; } }

Cet exemple cre deux champs texte dentre, phoneTxt et nameTxt, puis ajoute deux couteurs dvnements au champ texte phoneTxt. Lorsque lutilisateur place le focus sur le champ phoneTxt, un vnement FocusEvent.FOCUS_IN est distribu et lIME est dsactiv. Lorsque le focus est retir du champ phoneTxt, lvnement FocusEvent.FOCUS_OUT est distribu pour ractiver lIME.

Ecoute des vnements IME composition


Les vnements IME composition sont distribus lors de la dfinition dune chane de composition. Par exemple, si lIME de lutilisateur est activ et que lutilisateur saisit une chane en japonais, lvnement IMEEvent.IME_COMPOSITION est distribu ds que lutilisateur slectionne la chane de composition. Pour couter lvnement IMEEvent.IME_COMPOSITION, vous devez ajouter un couteur dvnements la proprit statique ime de la classe System (flash.system.System.ime.addEventListener(...)), comme le montre lexemple suivant :
var inputTxt:TextField; var outputTxt:TextField; inputTxt = new TextField(); inputTxt.type = TextFieldType.INPUT; inputTxt.width = 200; inputTxt.height = 18; inputTxt.border = true;

744

Environnement du systme client

inputTxt.background = true; addChild(inputTxt); outputTxt = new TextField(); outputTxt.autoSize = TextFieldAutoSize.LEFT; outputTxt.y = 20; addChild(outputTxt); if (Capabilities.hasIME) { IME.enabled = true; try { IME.conversionMode = IMEConversionMode.JAPANESE_HIRAGANA; } catch (error:Error) { outputTxt.text = "Unable to change IME."; } System.ime.addEventListener(IMEEvent.IME_COMPOSITION, imeCompositionHandler); } else { outputTxt.text = "Installez lIME et ressayez."; } function imeCompositionHandler(event:IMEEvent):void { outputTxt.text = "vous avez tap: " + event.text; }

Le code prcdent cre deux champs texte et les ajoute la liste daffichage. Le premier champ, inputTxt, est un champ de saisie de texte qui permet lutilisateur dentrer du texte japonais. Le second champ, outputTxt, est un champ texte dynamique qui affiche des messages derreur lutilisateur ou reprend la chane japonaise que lutilisateur saisit dans le champ inputTxt.

Utilisation de la classe IME

745

Exemple : dtection des capacits du systme


Lexemple CapabilitiesExplorer vous montre comment utiliser la classe flash.system.Capabilities pour dterminer les fonctions prises en charge par le systme de lutilisateur. Cet exemple tudie les techniques suivantes :

Dtection des capacits prises en charge par la version Flash Player de lutilisateur laide de la classe Capabilities Utilisation de la classe ExternalInterface pour dtecter les paramtres de navigation pris en charge par le navigateur de lutilisateur

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/ learn_programmingAS3samples_flash_fr. Les fichiers dapplication CapabilitiesExplorer se trouvent dans le dossier Samples/CapabilitiesExplorer. Cette application se compose des fichiers suivants :
Fichier
CapabilitiesExplorer.fla ou CapabilitiesExplorer.mxml com/example/programmingas3/ capabilities/CapabilitiesGrabber.as

Description
Le fichier dapplication principal dans Flash (FLA) ou Flex (MXML). Classe fournissant la principale fonctionnalit de lapplication, notamment lajout des capacits du systme dans un tableau, le tri des lments et lextraction des capacits du navigateur laide de la classe ExternalInterface. Conteneur HTML comprenant le code JavaScript ncessaire la communication avec lAPI externe.

capabilities.html

Prsentation de CapabilitiesExplorer
Le fichier CapabilitiesExplorer.mxml se charge de dfinir linterface utilisateur de lapplication CapabilitiesExplorer. Les capacits de la version Flash Player de lutilisateur saffichent dans une occurrence du composant DataGrid sur la scne. Les capacits du navigateur sont galement affiches si lapplication est excute partir dun conteneur HTML et si lAPI externe est disponible.

746

Environnement du systme client

Une fois que lvnement creationComplete du fichier de lapplication principale est distribu, la mthode initApp() est appele. La mthode initApp() appelle la mthode getCapabilities() partir de la classe com.example.programmingas3.capabilities.CapabilitiesGrabber. Le code de la mthode initApp() se prsente comme suit :
private function initApp():void { var dp:Array = CapabilitiesGrabber.getCapabilities(); capabilitiesGrid.dataProvider = dp; }

La mthode CapabilitiesGrabber.getCapabilities() renvoie un tableau tri contenant les capacits de Flash Player et du navigateur, qui est alors affect la proprit dataProvider de loccurrence du composant DataGrid capabilitiesGrid sur la scne.

Prsentation de la classe CapabilitiesGrabber


La mthode statique getCapabilities() de la classe CapabilitiesGrabber ajoute chaque proprit de la classe flash.system.Capabilities dans un tableau (capDP). Elle appelle ensuite la mthode statique getBrowserObjects() de la classe CapabilitiesGrabber. La mthode getBrowserObjects() utilise lAPI externe pour passer en boucle sur lobjet navigator du navigateur, qui contient les capacits du navigateur. La mthode getCapabilities() se prsente comme suit :
public static function getCapabilities():Array { var capDP:Array = new Array(); capDP.push({name:"Capabilities.avHardwareDisable", value:Capabilities.avHardwareDisable}); capDP.push({name:"Capabilities.hasAccessibility", value:Capabilities.hasAccessibility}); capDP.push({name:"Capabilities.hasAudio", value:Capabilities.hasAudio}); ... capDP.push({name:"Capabilities.version", value:Capabilities.version}); var navArr:Array = CapabilitiesGrabber.getBrowserObjects(); if (navArr.length > 0) { capDP = capDP.concat(navArr); } capDP.sortOn("name", Array.CASEINSENSITIVE); return capDP; }

Exemple : dtection des capacits du systme

747

La mthode getBrowserObjects() renvoie un tableau de toutes les proprits de lobjet navigator du navigateur. Si ce tableau contient un lment ou plus, le tableau des capacits du navigateur (navArr) sajoute au tableau des capacits de Flash Player (capDP) et le tableau rsultant est tri par ordre alphabtique. Enfin, le tableau tri est renvoy au fichier de lapplication principale, qui ensuite remplit la grille de donnes. Le code de la mthode getBrowserObjects() se prsente comme suit :
private static function getBrowserObjects():Array { var itemArr:Array = new Array(); var itemVars:URLVariables; if (ExternalInterface.available) { try { var tempStr:String = ExternalInterface.call("JS_getBrowserObjects"); itemVars = new URLVariables(tempStr); for (var i:String in itemVars) { itemArr.push({name:i, value:itemVars[i]}); } } catch (error:SecurityError) { // ignore } } return itemArr; }

Si lAPI externe est disponible dans lenvironnement de lutilisateur, Flash Player appelle la mthode JavaScript JS_getBrowserObjects(), qui passe en boucle sur lobjet navigator du navigateur et renvoie une chane de valeurs au format URL ActionScript. Cette chane est alors convertie en un objet URLVariables (itemVars) et ajoute au tableau itemArr, qui est renvoy au script appelant.

Communication avec JavaScript


La dernire tape dans la construction de lapplication CapabilitiesExplorer consiste crire le code JavaScript ncessaire au passage en boucle chaque lment de lobjet navigator du navigateur et lajout dune paire nom-valeur dans un tableau temporaire. Le code de la mthode JavaScript JS_getBrowserObjects() dans le fichier container.html est le suivant :

748

Environnement du systme client

<script language="JavaScript"> function JS_getBrowserObjects() { // Crez un tableau pour tous les lments du navigateur. var tempArr = new Array(); // Passez en boucle sur chaque lment dans lobjet navigator // du navigateur. for (var name in navigator) { var value = navigator[name]; // Si la valeur actuelle est une chane ou un objet Boolean, // ajoutez-le au tableau, autrement ignorez llment. switch (typeof(value)) { case "string": case "boolean": // Crez une chane provisoire qui sera ajoute au tableau. // Vrifiez que les valeurs sont codes au format URL laide // de la fonction escape() de JavaScript. var tempStr = "navigator." + name + "=" + escape(value); // Placez la paire nom/valeur code au format URL dans // le tableau. tempArr.push(tempStr); break; } } // Passez en boucle sur chaque lment dans lobjet screen // du navigateur. for (var name in screen) { var value = screen[name]; // Si la valeur actuelle est un nombre, ajoutez-la au tableau, // autrement ignorez llment. switch (typeof(value)) { case "number": var tempStr = "screen." + name + "=" + escape(value); tempArr.push(tempStr); break; } } // Renvoyez le tableau en tant que chane code au format URL // de paires nom_valeur. return tempArr.join("&"); } </script>

Exemple : dtection des capacits du systme

749

Le code commence par crer un tableau provisoire qui contiendra toutes les paires nom-valeur dans lobjet navigator. Ensuite, lobjet navigator est pass en boucle laide de for..in et le type de donnes de la valeur actuelle est valu afin de filtrer les valeurs non dsires. Dans cette application, seules les valeurs String ou Boolean nous intressent. Les autres types de donnes (par exemple les fonctions ou les tableaux) sont ignors. Chaque valeur String ou Boolean de lobjet navigator est ajout au tableau tempArr. Ensuite, lobjet screen du navigateur est pass en boucle laide de for..in et chaque valeur numrique est ajoute au tableau tempArr. Enfin, le tableau temporaire est converti en chane laide de la mthode Array.join(). Ce tableau utilise lesperluette (1) comme dlimiteur, ce qui permet ActionScript danalyser facilement les donnes laide de la classe URLVariables.

750

Environnement du systme client

CHAPITRE 24

Impression
Adobe Flash Player 9 peut communiquer avec linterface dimpression du systme dexploitation, ce qui vous permet de transmettre des pages au spooler de limprimante. Chaque page que Flash Player envoie au spooler peut comprendre du contenu visible, dynamique ou invisible pour lutilisateur lcran, y compris des valeurs de base de donnes et du texte dynamique. En outre, Flash Player dfinit les proprits de la classe flash.printing.PrintJob en fonction des paramtres de limprimante utilise, pour que vous puissiez formater les pages correctement. Ce chapitre tudie en dtail les stratgies dutilisation des mthodes et proprits de la classe flash.printing.PrintJob en vue de crer une tche dimpression, de lire les paramtres de limprimante utilise et de les ajuster la tche dimpression en fonction des informations renvoyes par Flash Player et le systme dexploitation de lutilisateur.

24

Contenu
Principes de base de limpression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752 Impression dune page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753 Tches Flash Player et impression systme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .755 Dfinition de la taille, de lchelle et de lorientation . . . . . . . . . . . . . . . . . . . . . . . . . . 758 Exemple : Impression sur plusieurs pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761 Exemple : Redimensionnement, recadrage et ajustement . . . . . . . . . . . . . . . . . . . .764

751

Principes de base de limpression


Introduction limpression
Dans ActionScript 3.0, vous utilisez la classe PrintJob pour crer des instantans de contenu daffichage convertir en reprsentation encre-et-papier dans une impression. Dans certains cas, dfinir le contenu imprimer revient le dfinir pour un affichage lcranvous positionnez et dimensionnez des lments pour crer la disposition souhaite. Nanmoins, limpression a des caractristiques qui la diffrencient de la disposition lcran. Par exemple, les imprimantes utilisent une rsolution diffrente des crans dordinateur ; le contenu dun cran dordinateur est dynamique et peut changer, alors que le contenu imprim est statique ; et lorsque vous planifiez une impression, vous devez prendre en compte les contraintes de taille de page fixe et la possibilit dimprimer plusieurs pages. Mme si ces diffrences peuvent sembler videntes, il est important de les avoir en tte lors de la configuration de limpression avec ActionScript. Etant donn que limpression prcise dpend dune combinaison des valeurs que vous spcifiez et des caractristiques de limprimante de lutilisateur, la classe PrintJob comprend des proprits qui vous permettent de dterminer les caractristiques importantes de limprimante de lutilisateur et que vous devrez pendre en considration.

Tches dimpression courantes


Les tches dimpression courantes suivantes sont dcrites dans ce chapitre :

Dmarrage dune tche dimpression Ajout de pages une tche dimpression Dtermination de lannulation dune tche dimpression par lutilisateur Spcification de lutilisation de bitmap ou de rendu vectoriel Dfinition de la taille, de lchelle et de lorientation dune page Spcification de la zone imprimable du contenu Conversion de la taille cran en taille de page Impression de plusieurs tches dimpression

752

Impression

Concepts et termes importants


La liste de rfrence suivante contient les termes importants utiliss dans ce chapitre :

Spouleur : une partie du systme dexploitation ou du logiciel du pilote dimprimante qui effectue le suivi des pages en attente dimpression et les envoie limprimante au moment appropri. Orientation de page : la rotation du contenu imprim par rapport au papier (horizontale paysage ou verticale - portrait). Tche dimpression : la page ou jeu de pages constituant une seule impression.

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans ce chapitre, vous pouvez tester les exemples de code. Un grand nombre des codes fournis dans ce chapitre sont de petites portions de code plutt que des exemples complets dimpression ou des codes qui vrifient des valeurs. Le test des exemples implique la cration dlments imprimer et lutilisation des codes avec ces lments. Les deux derniers exemples du chapitre sont des exemples complets dimpression. Ils comprennent le code qui dfinit le contenu imprimer ainsi que lexcution des tches dimpression. Pour tester les exemples de code :
1. 2. 3. 4.

Crez un nouveau document Flash. Slectionnez limage-cl sur limage 1 du scnario puis ouvrez le panneau Actions. Copiez le code dans le panneau Script. Dans le menu principal, choisissez Contrle > Tester lanimation pour crer le fichier SWF et tester lexemple.

Impression dune page


Vous utilisez une instance de la classe PrintJob pour grer limpression. Pour imprimer une page de base avec Flash Player, vous utilisez quatre instructions la suite :

new PrintJob()

: cre une nouvelle occurrence de tche dimpression avec le nom que

vous spcifiez.

: initialise le processus dimpression pour le systme dexploitation (en appelant la bote de dialogue dimpression destine lutilisateur) et dfinit les proprits en lecture seule de la tche dimpression.
PrintJob.start()

Impression dune page

753

PrintJob.addPage() : comprend les dtails du contenu de la tche dimpression, notamment lobjet Sprite (et ses ventuels enfants), la taille de la zone dimpression et le mode dimpression dimage (vectoriel ou bitmap) que limprimante doit utiliser. Vous pouvez effectuer plusieurs appels successifs de addPage() afin dimprimer plusieurs sprite sur plusieurs pages. PrintJob.send()

: envoie les pages limprimante du systme dexploitation.

Voici donc un exemple de script simple de tche dimpression (qui inclut les instructions package, import et class en vue de la compilation) :
package { import flash.printing.PrintJob; import flash.display.Sprite; public class BasicPrintExample extends Sprite { var myPrintJob:PrintJob = new PrintJob(); var mySprite:Sprite = new Sprite(); public function BasicPrintExample() { myPrintJob.start(); myPrintJob.addPage(mySprite); myPrintJob.send(); } } }

Si vous devez cependant purger les proprits dun objet PrintJob, utilisez la variable PrintJob null (par exemple myPrintJob = null).

754

REMARQUE

Cet exemple vise illustrer les lments de base dun script de tche dimpression et ne contient aucun dispositif de gestion des erreurs. Pour construire un script qui rponde convenablement lannulation dune tche dimpression pour lutilisateur, voir Utilisation des exceptions et des renvois , la page 755.

Impression

Tches Flash Player et impression systme


Flash Player transmet des pages linterface dimpression du systme dexploitation ; il est donc important de comprendre la rpartition des tches gres par Flash Player et de celles gres par linterface dimpression du systme dexploitation Flash Player peut initialiser une tche dimpression, lire certains des paramtres de page de limprimante, transmettre le contenu dune tche dimpression au systme dexploitation et vrifier si lutilisateur ou le systme annule une tche. Dautres processus, tels que laffichage de botes de dialogue spcifiques limprimante, lannulation dune tche dimpression mise en file dattente ou lindication de ltat de limprimante, sont superviss par le systme dexploitation. Si Flash Player est capable de ragir en cas de problme lors de linitialisation ou du formatage dune tche dimpression, il peut uniquement tablir des rapports sur certaines proprits ou conditions transmises par linterface dimpression du systme dexploitation. Cest le rle du dveloppeur dlaborer un code susceptible de rpondre ces proprits ou conditions.

Utilisation des exceptions et des renvois


Avant dappeler addPage() et send(), il est recommand de vrifier que la mthode PrintJob.start() renvoie la valeur true, au cas o lutilisateur aurait annul la tche dimpression. Une manire simple de vrifier si ces mthodes ont t annules avant de poursuivre consiste les intgrer une instruction if, comme suit :
if (myPrintJob.start()) { // Instructions addPage() et send() ici }

Si PrintJob.start() renvoie true, cest--dire si lutilisateur a slectionn Print (ou Flash Player a initialis une commande Print), les mthodes addPage() et send() peuvent tre appeles. En outre, pour faciliter la gestion du processus dimpression, Flash Player transmet dsormais des exceptions pour la mthode PrintJob.addPage(). Vous pouvez ainsi intercepter les erreurs et fournir des informations et des options lutilisateur. Si une mthode PrintJob.addPage() choue, il est galement possible dappeler une autre fonction ou darrter la tche dimpression en cours. Pour intercepter ces exceptions, incorporez des appels addPage() dans une instruction try..catch, comme illustr ci-aprs. Dans cet exemple, [params] constitue une balise demplacement pour les paramtres spcifiant le contenu rel imprimer :

Tches Flash Player et impression systme

755

if (myPrintJob.start()) { try { myPrintJob.addPage([params]); } catch (error:Error) { // En cas derreur, } myPrintJob.send(); }

Une fois la tche dimpression lance, vous pouvez ajouter le contenu PrintJob.addPage() pour voir sil gnre une exception (par exemple si lutilisateur a annul la tche dimpression). Si cest le cas, vous pouvez soit ajouter une logique linstruction catch pour fournir lutilisateur (ou Flash Player) des informations et des options, soit arrter la tche dimpression en cours. Si lajout de page russit, vous pouvez procder lenvoi des pages vers limprimante laide de PrintJob.send(). Si Flash Player rencontre des problmes lors de lenvoi de la tche dimpression limprimante (par exemple si limprimante est dconnecte), vous pouvez galement intercepter cette exception et fournir lutilisateur (ou Flash Player) des informations ou des options supplmentaires (telles que laffichage dun message ou lmission dune alerte dans lanimation Flash). Vous pouvez par exemple associer un nouveau texte un champ texte dans une instruction if..else, comme le montre le code suivant :
if (myPrintJob.start()) { try { myPrintJob.addPage([params]); } catch (error:Error) { // En cas derreur. } myPrintJob.send(); } else { myAlert.text = "Print job canceled"; }

Pour un exemple pratique, voir Exemple : Redimensionnement, recadrage et ajustement , la page 764.

756

Impression

Utilisation des proprits de page


Lorsque lutilisateur clique sur OK dans la bote de dialogue dimpression et que PrintJob.start() renvoie true, vous pouvez accder aux proprits dfinies par les paramtres de limprimante. Il sagit notamment de la largeur et de la hauteur du papier (pageHeight et pageWidth) et de lorientation du contenu sur la feuille. En provenance de limprimante, ces paramtres, que Flash Player ne contrle pas, ne peuvent tre modifis. Vous pouvez en revanche les utiliser pour disposer le contenu envoyer limprimante. Pour plus dinformations, voir Dfinition de la taille, de lchelle et de lorientation , la page 758.

Dfinition du rendu vectoriel ou bitmap


Vous avez la possibilit de dfinir la tche dimpression de manire transmettre chaque page sous forme dimage vectorielle ou bitmap. Dans certains cas, limpression vectorielle produit un fichier de file dattente plus rduit et une image de meilleure qualit que limpression bitmap. Toutefois, si le contenu inclut une image bitmap et que vous souhaitiez prserver la transparence alpha ou tout autre effet de couleur, il est recommand de choisir limpression bitmap pour cette page. En outre, une imprimante non PostScript convertit automatiquement les graphiques vectoriels en images bitmap. Limpression bitmap se spcifie dans le troisime paramtre de PrintJob.addPage(), par transmission dun objet PrintJobOptions dont le paramtre printAsBitmap a la valeur true, comme suit :
var options:PrintJobOptions = new PrintJobOptions(); options.printAsBitmap = true; myPrintJob.addPage(mySprite, null, options);

Si vous ne spcifiez aucune valeur pour le troisime paramtre, la tche dimpression utilise le paramtre par dfaut, soit limpression vectorielle.
REMARQUE

Si vous ne souhaitez pas spcifier de valeur pour printArea (le deuxime paramtre) mais en dfinir une pour limpression bitmap, utilisez la valeur null pour printArea.

Tches Flash Player et impression systme

757

Temporisation des instructions de tche dimpression


Contrairement aux versions prcdentes, ActionScript 3.0 ne limite pas un objet PrintJob une image unique. Cependant, comme le systme dexploitation indique ltat de limpression aprs que lutilisateur a cliqu sur le bouton OK dans la bote de dialogue dimpression, appelez PrintJob.addPage() et PrintJob.send() ds que possible pour envoyer les pages au spouleur. Si laccs limage contenant lappel PrintJob.send() est soumis un dlai, le processus dimpression est galement retard. Dans ActionScript 3.0, le dlai de script est de 15 secondes. Par consquent, lintervalle entre chaque instruction essentielle de la squence de tche dimpression ne peut dpasser 15 secondes. En dautres termes, la limite de 15 secondes concerne les intervalles suivants :

Entre PrintJob.start() et la premire instruction PrintJob.addPage() Entre PrintJob.addPage() et linstruction PrintJob.addPage() suivante Entre la dernire instruction PrintJob.addPage() et PrintJob.send()

Si lun des intervalles ci-dessus excde 15 secondes, lappel suivant de la mthode PrintJob.start() pour loccurrence de PrintJob renvoie false et lappel suivant de la mthode PrintJob.addPage() pour loccurrence de PrintJob entrane le renvoi dune exception dexcution par Flash Player.

Dfinition de la taille, de lchelle et de lorientation


La section Impression dune page , la page 753 dcrit en dtails les tapes dune tche dimpression de base, dans laquelle la sortie reproduit directement le sprite spcifi, selon sa taille daffichage et sa position lcran. Nanmoins, les imprimantes utilisent diffrentes rsolutions dimpression et certains de leurs paramtres peuvent altrer laspect du sprite imprim. Si Flash Player peut lire les paramtres dimpression dun systme dexploitation, notez que ces proprits sont en lecture seule : vous pouvez vous adapter leur valeur, mais pas les modifier. Par exemple, il est possible de dterminer le paramtre de format de page de limprimante et dajuster votre contenu en fonction. Vous pouvez de mme identifier les paramtres de marge de limprimante ainsi que lorientation des pages. Pour rpondre aux paramtres de limprimante, il peut savrer ncessaire de spcifier une zone dimpression, deffectuer un ajustement pour tenir compte de la diffrence entre la rsolution de lcran et la mesure de points de limprimante, ou de faire correspondre le contenu aux paramtres de taille et dorientation de limprimante.

758

Impression

Dfinition de la zone dimpression laide de rectangle


La mthode PrintJob.addPage() vous permet de spcifier la partie du sprite que vous souhaitez imprimer. Le deuxime paramtre, printArea prend la forme dun objet Rectangle. Vous pouvez fournir la valeur de ce paramtre de trois manires :

Crez un objet Rectangle dot de proprits spcifiques, puis utilisez-le dans lappel addPage(), comme dans lexemple suivant :
private var rect1:Rectangle = new Rectangle(0, 0, 400, 200); myPrintJob.addPage(sheet, rect1);

Si vous navez pas dj spcifi lobjet Rectangle, vous pouvez le faire dans lappel luimme, comme illustr ci-dessous :
myPrintJob.addPage(sheet, new Rectangle(0, 0, 100, 100));

Si vous prvoyez de fournir des valeurs pour le troisime paramtre de lappel addPage() sans pour autant spcifier un objet Rectangle, utilisez la valeur null pour le deuxime paramtre, comme suit :
myPrintJob.addPage(sheet, null, options);

Comparaison entre les points et les pixels


La largeur et la hauteur dun rectangle correspondent des valeurs en pixels. Une imprimante utilise le point comme unit de mesure. Les points ont une taille physique fixe (1/72e de pouce), mais la taille dun pixel lcran varie selon la rsolution de ce dernier. De ce fait, le taux de conversion entre les pixels et les points dpend de la configuration de limprimante et du redimensionnement ventuel du sprite. Un sprite non redimensionn dune largeur de 72 pixels mesure un pouce de large lorsquil est imprim, un point correspondant un pixel, quelle que soit la rsolution de lcran. Vous pouvez utiliser les quivalences suivantes pour convertir les pouces ou les centimtres en twips ou points (un twip correspond 1/20e de point) :

Si vous omettez le paramtre printArea ou sil est transmis de faon incorrecte, la zone entire du sprite est imprime.

REMARQUE

Si vous envisagez de spcifier un rectangle pour dfinir les dimensions dimpression, rappelez-vous dimporter la classe flash.display.Rectangle.

1 point = 1/72e de pouce = 20 twips 1 pouce = 72 points = 1 440 twips 1 centimtre = 567 twips

Dfinition de la taille, de lchelle et de lorientation

759

Redimensionnement
Si vous souhaitez redimensionner un objet Sprite avant de limprimer, dfinissez les proprits de redimensionnement (voir Redimensionnement et mise lchelle des objets , la page 428) avant dappeler la mthode PrintJob.addPage(), puis rtablissez leurs valeurs dorigine aprs limpression. Lchelle dun objet Sprite ne dpend pas de la proprit printArea. En dautres termes, si vous spcifiez une zone dimpression de 50 pixels par 50 pixels, 2 500 pixels sont imprims. Si vous redimensionnez lobjet Sprite, les 2 500 pixels sont imprims, mais lobjet est imprim lchelle retenue. Pour un exemple, voir Exemple : Redimensionnement, recadrage et ajustement , la page 764.

Impression en mode paysage ou portrait


Flash Player tant capable de dtecter les paramtres dorientation, vous pouvez insrer dans votre code ActionScript une logique permettant dajuster la taille du contenu ou son orientation en fonction des paramtres de limprimante, comme illustr dans lexemple ciaprs.
if (myPrintJob.orientation == PrintJobOrientation.LANDSCAPE) { mySprite.rotation = 90; }
REMARQUE 760

Si vous prvoyez de lire le paramtre systme dorientation du contenu sur le papier, rappelez-vous dimporter la classe PrintJobOrientation de la manire suivante :
import flash.printing.PrintJobOrientation;

La classe PrintJobOrientation fournit des valeurs constantes qui dfinissent lorientation du contenu sur la page.

Ajustement de la hauteur et de la largeur au format du papier


Par lutilisation dune stratgie semblable la gestion des paramtres dorientation de limprimante, vous pouvez lire les paramtres de hauteur et de largeur de page, puis en tenir compte en intgrant une logique dans une instruction if. Le code suivant illustre cette situation :
if (mySprite.height > myPrintJob.pageHeight) { mySprite.scaleY = .75; }

Impression

En outre, il est possible de dterminer les paramtres de marge dune page par comparaison des dimensions de cette page celle du papier, comme illustr ci-aprs :
margin_height = (myPrintJob.paperHeight - myPrintJob.pageHeight) / 2; margin_width = (myPrintJob.paperWidth - myPrintJob.pageWidth) / 2;

Exemple : Impression sur plusieurs pages


Si vous devez imprimer plusieurs pages de contenu, vous pouvez associer chaque page un sprite diffrent (dans le cas prsent, sheet1 et sheet2). Utilisez ensuite PrintJob.addPage() pour chaque sprite. Le code suivant illustre cette technique :
package { import import import import import import import

flash.display.MovieClip; flash.printing.PrintJob; flash.printing.PrintJobOrientation; flash.display.Stage; flash.display.Sprite; flash.text.TextField; flash.geom.Rectangle;

public class PrintMultiplePages extends MovieClip { private var sheet1:Sprite; private var sheet2:Sprite; public function PrintMultiplePages():void { init(); printPages(); } private function init():void { sheet1 = new Sprite(); createSheet(sheet1, "Once upon a time...", {x:10, y:50, width:80, height:130}); sheet2 = new Sprite(); createSheet(sheet2, "There was a great story to tell, and it ended quickly.\n\nThe end.", null); } private function createSheet(sheet:Sprite, str:String, imgValue:Object):void { sheet.graphics.beginFill(0xEEEEEE); sheet.graphics.lineStyle(1, 0x000000);

Exemple : Impression sur plusieurs pages

761

sheet.graphics.drawRect(0, 0, 100, 200); sheet.graphics.endFill(); var txt:TextField = new TextField(); txt.height = 200; txt.width = 100; txt.wordWrap = true; txt.text = str; if (imgValue != null) { var img:Sprite = new Sprite(); img.graphics.beginFill(0xFFFFFF); img.graphics.drawRect(imgValue.x, imgValue.y, imgValue.width, imgValue.height); img.graphics.endFill(); sheet.addChild(img); } sheet.addChild(txt); } private function printPages():void { var pj:PrintJob = new PrintJob(); var pagesToPrint:uint = 0; if (pj.start()) { if (pj.orientation == PrintJobOrientation.LANDSCAPE) { throw new Error("Page is not set to an orientation of portrait."); } sheet1.height = pj.pageHeight; sheet1.width = pj.pageWidth; sheet2.height = pj.pageHeight; sheet2.width = pj.pageWidth; try { pj.addPage(sheet1); pagesToPrint++; } catch (error:Error) { // Rpondre lerreur. }

762

Impression

try { pj.addPage(sheet2); pagesToPrint++; } catch (error:Error) { // Rpondre lerreur. } if (pagesToPrint > 0) { pj.send(); } } } } }

Exemple : Impression sur plusieurs pages

763

Exemple : Redimensionnement, recadrage et ajustement


Dans certains cas, il peut savrer utile dajuster la taille (ou dautres proprits) dun objet daffichage imprimer afin de tenir compte des diffrences entre son aspect lcran et le rendu sur papier. Lorsque vous modifiez les proprits dun objet daffichage avant limpression (par exemple laide des proprits scaleX et scaleY), noubliez pas que lobjet redimensionn reste plus grand que le rectangle dfini comme zone dimpression, lobjet subira un recadrage. Il est galement judicieux denvisager de rtablir les proprits aprs limpression des pages. Le code suivant modifie les dimensions de lobjet daffichage txt (sans altrer la zone darrire-plan verte). Pour finir, le champ texte est recadr en fonction des dimensions du rectangle spcifi. Aprs limpression, le champ texte reprend sa taille originale daffichage lcran. Si lutilisateur annule la tche dimpression dans la bote de dialogue dimpression du systme dexploitation, le contenu de Flash Player se modifie pour avertir lutilisateur de cette annulation.
package { import import import import import

flash.printing.PrintJob; flash.display.Sprite; flash.text.TextField; flash.display.Stage; flash.geom.Rectangle;

public class PrintScaleExample extends Sprite { private var bg:Sprite; private var txt:TextField; public function PrintScaleExample():void { init(); draw(); printPage(); } private function printPage():void { var pj:PrintJob = new PrintJob(); txt.scaleX = 3; txt.scaleY = 2; if (pj.start()) { trace(">> pj.orientation: " + pj.orientation);

764

Impression

trace(">> trace(">> trace(">> trace(">>

pj.pageWidth: " + pj.pageWidth); pj.pageHeight: " + pj.pageHeight); pj.paperWidth: " + pj.paperWidth); pj.paperHeight: " + pj.paperHeight);

try { pj.addPage(this, new Rectangle(0, 0, 100, 100)); } catch (error:Error) { // Ne fait rien. } pj.send(); } else { txt.text = "Print job canceled"; } // Rtablit les proprits dchelle de txt. txt.scaleX = 1; txt.scaleY = 1; } private function init():void { bg = new Sprite(); bg.graphics.beginFill(0x00FF00); bg.graphics.drawRect(0, 0, 100, 200); bg.graphics.endFill(); txt = new TextField(); txt.border = true; txt.text = "Hello World"; } private function draw():void { addChild(bg); addChild(txt); txt.x = 50; txt.y = 50; } } }

Exemple : Redimensionnement, recadrage et ajustement

765

766

Impression

CHAPITRE 25

Utilisation de lAPI externe


LAPI externe ActionScript 3.0 permet une communication simple entre ActionScript et lapplication conteneur dans laquelle Adobe Flash Player 9 sexcute. LAPI externe peut vous tre utile dans plusieurs cas de figure, par exemple si vous crez une interaction entre un document SWF et JavaScript dans une page HTML ou si vous construisez une application de bureau qui affiche un fichier SWF laide de Flash Player. Ce chapitre dcrit comment utiliser lAPI externe pour interagir avec une application conteneur, comment transmettre des donnes entre ActionScript et JavaScript dans une page HTML et comment tablir une communication et changer des donnes entre ActionScript et une application de bureau.
R E M A R QU E

25

Ce chapitre traite uniquement de la communication entre ActionScript dans un SWF et lapplication qui contient une rfrence linstance de Flash Player dans laquelle le fichier SWF est charg. Toute autre utilisation de Flash Player dans une application nest pas traite dans cette documentation. Flash Player est conu pour tre utilis comme plug-in de navigation ou projection (application autonome). Les autres scnarios dutilisation peuvent avoir une prise en charge limite.

Contenu
Principes de base de lutilisation de lAPI externe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768 Avantages de lAPI externe et conditions requises . . . . . . . . . . . . . . . . . . . . . . . . . . . 772 Utilisation de la classe ExternalInterface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773 Exemple : utilisation de lAPI externe dans un conteneur de page Web . . . . . . . . 779 Exemple : utilisation de lAPI externe avec un conteneur ActiveX. . . . . . . . . . . . . . 787

767

Principes de base de lutilisation de lAPI externe


Introduction lutilisation de lAPI externe
Mme si dans certains cas, un fichier SWF peut sexcuter tout seul (par exemple, si vous crez un fichier de projection SWF), gnralement, une application SWF sexcute comme un lment intgr dans une autre application. De faon gnrale, le conteneur dans lequel le fichier SWF est intgr est un fichier HTML ; un fichier SWF est utilis, moins frquemment, pour une partie ou lintgralit de linterface utilisateur dune application de bureau. Au fur et mesure que vous utilisez des applications plus avances, il se peut que vous souhaitiez dfinir une communication entre le fichier SWF et lapplication du conteneur. Par exemple, il est courant pour une page Web dafficher du texte ou dautres informations en HTML, et dinclure un fichier SWF pour afficher du contenu visuel dynamique (diagramme ou vido). Dans ce cas, vous souhaitez peut-tre que lorsque les utilisateurs cliquent sur un bouton de la page Web, le fichier SWF soit modifi. ActionScript contient un mcanisme connu sous le nom dAPI externe, qui facilite ce type de communication entre ActionScript dans un fichier SWF et dautre code dans lapplication conteneur.

Tches dAPI externe courantes


Les tches dAPI externe courantes suivantes sont dcrites dans ce chapitre :

Obtention dinformations sur lapplication conteneur Utilisation dActionScript pour appeler un code dans une application conteneur, y compris une page Web ou une application de bureau Appel de code ActionScript depuis un code dans une application conteneur Cration dun proxy pour simplifier lappel de code ActionScript depuis une application conteneur

768

Utilisation de lAPI externe

Concepts et termes importants


La liste de rfrence suivante contient les termes importants utiliss dans ce chapitre :

Conteneur ActiveX : une application conteneur (pas un navigateur Web) qui comprend une instance du contrle ActiveX Flash Player pour afficher le contenu SWF dans lapplication. Application conteneur : lapplication dans laquelle Flash Player excute un fichier SWF (un navigateur Web et une page HTML qui comprend un contenu Flash Player, par exemple). Fichier de projection : un fichier SWF qui a t converti en un fichier excutable autonome comprenant Flash Player et le contenu du fichier SWF. Un fichier de projection peut tre cr dans Adobe Flash CS3 Professional ou laide du Flash Player autonome. Les fichiers de projection sont gnralement utiliss pour distribuer des fichiers SWF par CD-ROM ou dans des situations semblables, lorsque le volume tlcharger nest pas un problme et que lauteur du SWF souhaite tre sr que lutilisateur pourra excuter le fichier SWF, indpendamment du fait que Flash Player est install sur lordinateur de lutilisateur. Proxy : un code ou une application intermdiaire qui appelle du code dans une application (l application externe ) au nom dune autre application (l application appelante ), et renvoie des valeurs lapplication appelante. Un proxy peut tre utilis pour diffrentes raisons, notamment :

Pour simplifier le processus dexcution dappels de fonction externe en convertissant des appels de fonction native dans lapplication appelante au format compris par lapplication externe Pour contourner les limites de scurit ou autres qui empchent lappelant de communiquer directement avec lapplication externe

Srialiser : convertir des objets ou des valeurs de donnes en un format qui peut tre utilis pour transmettre les valeurs dans des messages entre deux systmes de programmation (par exemple, sur Internet ou entre deux applications diffrentes sexcutant sur un seul ordinateur).

Principes de base de lutilisation de lAPI externe

769

Utilisation des exemples fournis dans le chapitre


Au fur et mesure que vous avancez dans ce chapitre, vous pouvez tester les exemples de code. Un grand nombre des codes fournis dans ce chapitre sont de petite taille des fins de dmonstration, plutt que des exemples complets ou des codes qui vrifient des valeurs. Etant donn que lutilisation de lAPI externe exige (par dfinition) lcriture de code ActionScript ainsi que de code dans une application conteneur, le test des exemples implique la cration dun conteneur (par exemple, une page Web contenant le SWF) et lutilisation des codes pour interagir avec le conteneur.
Pour tester un exemple de communication ActionScript-vers-JavaScript :
1. 2. 3.

Crez un document Flash et enregistrez-le sur votre ordinateur. Dans le menu principal, choisissez Fichier > Paramtres de publication. Dans longlet Formats de la bote de dialogue Paramtres de publication, vrifiez que les cases cocher Flash et HTML sont slectionnes. Cliquez sur le bouton Publier. Ceci gnre un fichier SWF et un fichier HTML dans le mme dossier et avec le mme nom que vous avez utilis pour enregistrer le document Flash. Fermez la bote de dialogue Paramtres de publication en cliquant sur le bouton OK. Dslectionnez la case cocher HTML. Une fois que la page HTML est gnre, vous pouvez la modifier pour ajouter le code JavaScript appropri. Lorsque vous dslectionnez la case cocher HTML, vous vous assurez quaprs avoir modifi la page HTML, Flash ncrasera pas vos changements avec une nouvelle page HTML lors de la publication du fichier SWF. Fermez la bote de dialogue Paramtres de publication en cliquant sur le bouton OK. Avec une application dditeur de texte ou HTML, ouvrez le fichier HTML cr par Flash lorsque vous avez publi le SWF. Dans le code source HTML, ajoutez un lment de script et copiez-y le code JavaScript issu de lexemple de code. Enregistrez le fichier HTML et revenez Flash. Slectionnez limage-cl sur limage 1 du scnario puis ouvrez le panneau Actions. le code ActionScript dans le panneau Script. Dans le menu principal, choisissez Fichier > Publier pour mettre jour le fichier SWF avec les changements que vous avez effectus. un navigateur Web pour ouvrir la page HTML que vous avez modifie afin dafficher la page et de tester la communication entre ActionScript et la page HTML.

4.

5.

6. 7.

8. 9.

10. Copiez 11.

12. Utilisez

770

Utilisation de lAPI externe

Pour tester un exemple de communication de conteneur ActionScript-versActiveX :


1.

Crez un document Flash et enregistrez-le sur votre ordinateur. Vous pouvez lenregistrer dans le dossier dans lequel votre application conteneur sattend trouver le fichier SWF. Dans le menu principal, choisissez Fichier > Paramtres de publication. Dans longlet Formats de la bote de dialogue Paramtres de publication, vrifiez que seule la case cocher Flash est slectionne. Dans le champ Fichier situ en regard de la case cocher Flash, cliquez sur licne de dossier pour slectionner le dossier dans lequel votre fichier SWF sera publi. Dfinissez lemplacement de votre fichier SWF pour pouvoir (par exemple) conserver le document Flash dans un dossier, mais placer le fichier SWF publi dans un autre (le dossier contenant le code source pour lapplication conteneur, par exemple). Slectionnez limage-cl sur limage 1 du scnario puis ouvrez le panneau Actions. Copiez le code ActionScript pour lexemple dans le panneau Script. Dans le menu principal, choisissez Fichier > Publier pour publier de nouveau le fichier SWF. Crez et excutez votre application conteneur afin de tester la communication entre elle et ActionScript.

2. 3.

4.

5. 6. 7.

8.

Les deux exemples fournis la fin de ce chapitre sont des exemples complets dutilisation de lAPI externe pour communiquer avec une page HTML et une application de bureau C#, respectivement. Ces exemples comprennent le code entier (y compris le code ActionScript et de vrification des erreurs du conteneur) que vous devez utiliser lorsque vous crivez le code laide de lAPI externe. Pour consulter un autre exemple complet dutilisation de lAPI externe, voir lexemple de classe pour la classe ExternalInterface dans la Rfrence du langage et des composants ActionScript 3.0.

Principes de base de lutilisation de lAPI externe

771

Avantages de lAPI externe et conditions requises


LAPI externe correspond la partie dActionScript qui fournit le mcanisme de communication entre ActionScript et le code excut dans une application dite externe, cest-dire qui joue le rle de conteneur pour Flash Player (en gnral un navigateur Web ou une application de projection autonome). Dans ActionScript 3.0, la fonctionnalit de lAPI externe est assure par la classe ExternalInterface. Dans les versions de Flash Player antrieures Flash Player 8, laction fscommand() tait utilise pour tablir les communications avec lapplication conteneur. La classe ExternalInterface vient remplacer fscommand() ; son utilisation est recommande pour toutes les communications entre JavaScript et ActionScript.
REMARQUE

Si vous devez utiliser lancienne fonction fscommand() (par exemple pour maintenir la compatibilit avec danciennes applications ou pour interagir avec une application conteneur SWF tiers ou le lecteur autonome Flash Player), elle est disponible au niveau du package flash.system.

La classe ExternalInterface est un sous-systme qui simplifie les communications dActionScript et Flash Player avec JavaScript dans une page HTML ou avec toute application de bureau qui incorpore une instance de Flash Player. La classe ExternalInterface nest que disponible dans les circonstances suivantes : Dans toutes les versions prises en charge dInternet Explorer pour Windows (5.0 et ultrieure) Dans une application conteneur telle quune application de bureau utilisant une instance du contrle ActiveX Flash Player Dans tout navigateur prenant en charge linterface NPRuntime, lheure actuelle les navigateurs suivants : Firefox 1.0 et versions ultrieures Mozilla 1.7.5 et versions ultrieures Netscape 8.0 et versions ultrieures Safari 1.3 et versions ultrieures

Dans tous les autres cas de figure (par exemple excution dans un lecteur autonome), la proprit ExternalInterface.available renvoie la valeur false.

772

Utilisation de lAPI externe

Depuis ActionScript, vous pouvez appeler une fonction JavaScript sur la page HTML. LAPI externe apporte les amliorations fonctionnelles suivantes grce fscommand() :

Vous pouvez utiliser toutes les fonctions JavaScript, pas seulement les fonctions compatibles avec fscommand(). Vous pouvez transmettre nimporte quel nombre darguments, avec nimporte quels noms ; vous ntes pas limit une commande et une chane dargument. LAPI externe offre donc bien plus de souplesse que fscommand(). Vous pouvez transmettre divers types de donnes (Boolean, Number et String) notamment ; vous ntes plus limit aux paramtres String. Vous pouvez recevoir la valeur dun appel, et cette valeur retourne immdiatement ActionScript (comme la valeur de retour dun appel que vous faites).
Si le nom donn linstance de Flash Player dans une page HTML (lattribut id de la balise object) inclut un trait dunion (-) ou dautres caractres dfinis comme des oprateurs dans JavaScript (par exemple, +, *, /, \, ., etc.), les appels ExternalInterface issus dActionScript ne fonctionneront pas lorsque la page Web de conteneur est affiche dans Internet Explorer. Ces appels ne fonctionnent pas non plus si les balises HTML qui dfinissent linstance Flash Player (object et embed) sont imbriques dans une balise HTML form.

Utilisation de la classe ExternalInterface


La communication entre ActionScript et lapplication conteneur peut se faire de deux faons : soit ActionScript appelle un lment de code (par exemple une fonction JavaScript) dfini dans le conteneur, soit le code du conteneur appelle une fonction ActionScript dfinie comme pouvant tre appele. Dans les deux cas, des informations peuvent tre envoyes au code appel et les rsultats renvoys au code appelant. Pour faciliter la communication, la classe ExternalInterface comprend deux proprits statiques et deux mthodes statiques galement. Ces proprits et mthodes servent obtenir des informations sur la connexion linterface externe, excuter le code dans le conteneur partir dActionScript et de rendre disponibles les fonctions ActionScript que le conteneur doit appeler.

A V E R T IS S E M E N T

Utilisation de la classe ExternalInterface

773

Obtention dinformations sur le conteneur externe


La proprit ExternalInterface.available indique si Flash Player se trouve dans un conteneur offrant une interface externe. Si linterface externe est disponible, cette proprit a la valeur true ; sinon, sa valeur est false. Avant dutiliser toute autre fonctionnalit de la classe ExternalInterface, vous devez toujours vrifier que le conteneur actif prend en charge la communication avec linterface externe, comme suit :
if (ExternalInterface.available) { // Appeler les mthodes ExternalInterface ici. }
REMARQUE 774

La proprit ExternalInterface.available indique si le conteneur actif prend en charge la connectivit ExternalInterface. Elle ne vous dit pas si JavaScript est activ dans le navigateur actif.

La proprit ExternalInterface.objectID vous permet de dterminer lidentifiant unique de linstance Flash Player (cest--dire, lattribut id de la balise object dans Internet Explorer ou lattribut name de la balise embed dans les navigateurs utilisant linterface NPRuntime). Cet identifiant unique reprsente le document SWF actif dans le navigateur et permet dy faire rfrence, par exemple si vous appelez une fonction JavaScript dans une page HTML conteneur. Si le conteneur Flash Player nest pas un navigateur Web, la proprit est null.

Appel de code externe partir dActionScript


La mthode ExternalInterface.call() excute le code dans lapplication conteneur. Elle requiert au moins un paramtre, une chane contenant le nom de la fonction appeler dans cette application. Tout paramtre supplmentaire transmis la mthode ExternalInterface.call() est retransmis au conteneur comme paramtres de lappel de fonction.
// Appelle la fonction externe "addNumbers". // Transmission de deux paramtres et affectation du rsultat // de cette fonction la variable "result". var param1:uint = 3; var param2:uint = 7; var result:uint = ExternalInterface.call("addNumbers", param1, param2);

Utilisation de lAPI externe

Si le conteneur est une page HTML, la mthode appelle la fonction JavaScript avec le nom spcifi, qui doit tre dfini dans un lment script de la page HTML. La valeur de retour de la fonction JavaScript est retransmise ActionScript.
<script language="JavaScript"> // ajoute deux nombres et envoie le rsultat ActionScript function addNumbers(num1, num2) { return (num1 + num2); } </script>

Si le conteneur est un autre conteneur ActiveX, le contrle ActiveX Flash Player distribue alors son vnement FlashCall. Flash Player srialise le nom de fonction spcifi et les ventuels paramtres dans une chane XML. Le conteneur peut accder ces informations dans la proprit request de lobjet vnement, puis les utiliser pour dterminer comment il doit excuter son propre code. Pour renvoyer une valeur ActionScript, le code conteneur appelle la mthode SetReturnValue() de lobjet ActiveX et transmet le rsultat (srialis dans une chane XML) comme paramtre de cette mthode. Pour plus dinformations sur le format XML utilis pour cette communication, voir Format XML de lAPI externe , la page 777. Que le conteneur soit un navigateur Web ou un autre conteneur ActiveX, si lappel choue ou que la mthode conteneur ne spcifie aucune valeur de retour, la valeur null est alors renvoye. La mthode ExternalInterface.call() renvoie une exception SecurityError si lenvironnement conteneur appartient un sandbox de scurit auquel le code appelant na pas accs. Vous pouvez contourner ce problme en attribuant allowScriptAccess une valeur adapte dans lenvironnement conteneur. Par exemple, vous changez la valeur de allowScriptAccess dans une page HTML, vous devez modifier lattribut appropri dans les balises object et embed.

Appel du code ActionScript partir du conteneur


Un conteneur peut uniquement appeler du code ActionScript compris dans une fonction, et aucun autre code ActionScript. Pour appeler une fonction ActionScript partir de lapplication conteneur, deux oprations sont ncessaires : enregistrer la fonction auprs de la classe ExternalInterface, puis lappeler partir du code du conteneur. Dans un premier temps, vous devez enregistrer votre fonction ActionScript pour indiquer quelle doit tre mise disposition du conteneur. Pour ce faire, utilisez la mthode ExternalInterface.addCallback() comme suit :
function callMe(name:String):String { return "busy signal"; } ExternalInterface.addCallback("myFunction", callMe);
Utilisation de la classe ExternalInterface 775

La mthode addCallback() prend deux paramtres : le premier, un nom de fonction sous forme de chane, correspond au nom de la fonction pour le conteneur. Le second paramtre est la fonction ActionScript elle-mme, qui doit sexcuter lorsque le conteneur appelle le nom de fonction dfini. Comme ces noms sont diffrents, le nom que le conteneur utilise peut tre diffrent du vritable nom de la fonction ActionScript. Cela vous servira particulirement si vous ne connaissez pas le nom de la fonction, par exemple si une fonction anonyme est spcifie ou si la fonction appeler est dtermine au moment de lexcution. Une fois que la fonction ActionScript a t enregistre auprs de la classe ExternalInterface, le conteneur peut alors appeler la fonction. La procdure dappel varie en fonction du type de conteneur. Par exemple, si le conteneur est du code JavaScript dans un navigateur, la fonction ActionScript est appele avec le nom de fonction enregistr, comme sil sagissait dune mthode de lobjet de navigateur Flash Player (cest--dire une mthode de lobjet JavaScript reprsentant la balise object ou embed). En dautres termes, les paramtres sont transmis et le rsultat est renvoy comme si une fonction locale tait appele.
<script language="JavaScript"> // callResult gets the value "busy signal" var callResult = flashObject.myFunction("my name"); </script> ... <object id="flashObject"...> ... <embed name="flashObject".../> </object>

Si vous appelez une fonction ActionScript dans un fichier SWF excut dans une application de bureau, le nom de fonction enregistr et les ventuels paramtres doivent tre srialiss dans une chane au format XML. Lappel seffectue alors sur la mthode CallFunction() du contrle ActiveX avec comme paramtre la chane XML obtenue. Pour plus dinformations sur le format XML utilis pour cette communication, voir Format XML de lAPI externe , la page 777. Dans les deux cas, la valeur de retour de la fonction ActionScript est retransmise au code du conteneur, directement sous forme de valeur si lappelant est un code JavaScript dans un navigateur ou sous forme de chane XML sil sagit dun conteneur ActiveX.

776

Utilisation de lAPI externe

Format XML de lAPI externe


La communication entre ActionScript et une application hbergeant le contrle Active X Shockwave Flash requiert un format XML spcifique qui servira convertir les appels de fonction et les valeurs. Le format XML utilis par lAPI externe se divise en deux parties. Lune est destine reprsenter les appels de fonction. Lautre sert reprsenter des valeurs individuelles ; ce format sapplique aux paramtres des fonctions comme aux valeurs de retour. Le format XML des appels de fonction est utilis pour les appels en provenance et destination dActionScript. Pour un appel de fonction issu dActionScript, Flash Player transmet les informations XML au conteneur ; pour un appel provenant du conteneur, Flash Player attend de lapplication une chane XML du mme format. Lextrait XML suivant donne un exemple dappel de fonction format :
<invoke name="functionName" returntype="xml"> <arguments> ... (individual argument values) </arguments> </invoke>

Le nud racine est le nud invoke. Il possde deux attributs : name indique le nom de la fonction appeler et returntype a toujours la valeur xml. Si lappel de fonction inclut des paramtres, le nud invoke possde un nud enfant arguments, dont les enfants seront les valeurs de paramtres formates laide du format de valeur individuelle expliqu ci-aprs. Les valeurs individuelles, notamment les paramtres de fonction et les valeurs de retour, utilisent un format qui comprend des informations sur le type de donnes, en plus des valeurs elles-mmes : Le tableau suivant rpertorie les classes ActionScript et le format XML utilis pour coder des valeurs de ce type de donnes :
Classe/valeur Classe/ ActionScript valeur C#
null Boolean true Boolean false String nul bool true bool false string

Format
<null/> <true/> <false/> <string>string value</string> <number>27.5</number> <number>-12</number>

Commentaires

Number, int, uint single, double, int, uint

Utilisation de la classe ExternalInterface

777

Classe/valeur Classe/ ActionScript valeur C#


Array (combinaison possible de divers types dlments)

Format

Commentaires
Le nud property dfinit des lments individuels et lattribut id est lindex numrique en base zro. Le nud property dfinit des proprits individuelles et lattribut id est le nom de la proprit (une chane). ActionScript convertit les autres objets en valeur null ou en objet vide. Dans les deux cas, toutes les valeurs de proprit sont perdues.

Une collection <array> <property id="0"> qui accepte des <number>27.5</number> lments de </property> <property id="1"> plusieurs types, <string>Hello there!</string> ex. ArrayList ou </property> object[] ...
</array>

Object

Un dictionnaire <object> <property id="name"> contenant des <string>John Doe</string> cls de chane </property> <property id="age"> et des valeurs <string>33</string> dobjet, ex. </property> HashTable ... </object> avec cls de chanes
<null/> ou <object></object>

Autres classe intgres ou personnalises

Lorsque vous crez vos propres applications laide de lAPI externe avec une application conteneur ActiveX, il est commode dcrire un proxy qui effectuera la tche de conversion des appels de fonction native au format XML srialis. Pour consulter un exemple de classe proxy crite dans C#, voir Fonctionnement interne de la classe ExternalInterfaceProxy , la page 793.

778

REMARQUE

Par le biais dexemple, ce tableau indique des classes C# quivalentes en plus des classes ActionScript ; nanmoins, lAPI externe peut tre utilise pour communiquer avec un langage ou une excution de programmation prenant en charge les contrles ActiveX, et nest pas limite aux applications C#.

Utilisation de lAPI externe

Exemple : utilisation de lAPI externe dans un conteneur de page Web


Cette application exemple illustre les techniques de communication possibles entre ActionScript et JavaScript au sein dun navigateur Web. Il sagit dune application de messagerie instantane qui permet lutilisateur de discuter avec lui-mme (do le nom de lapplication : Introvert IM, ou messagerie instantane introvertie ). LAPI externe permet denvoyer les messages entre un formulaire HTML dans la page Web et une interface SWF. Les techniques dcrites dans cet exemple sont les suivantes :

Vrification de la disponibilit du navigateur avant dtablir la communication afin de garantir une initialisation correcte Vrification de la prise en charge de lAPI externe par le conteneur Appel des fonctions JavaScript partir dActionScript, transmission des paramtres et rception des valeurs en retour Mise disposition des mthodes ActionScript que JavaScript doit appeler et excution de ces appels

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/ learn_programmingAS3samples_flash_fr. Les fichiers de lapplication Introvert IM se trouvent dans le dossier Samples/IntrovertIM_HTML. Cette application se compose des fichiers suivants :
Fichier
IntrovertIMApp.fla ou IntrovertIMApp.mxml com/example/programmingas3/ introvertIM/IMManager.as com/example/programmingas3/ introvertIM/IMMessageEvent.as

Description
Le fichier dapplication principal pour Flash (FLA) ou Flex (MXML) Classe tablissant et grant les communications entre ActionScript et le conteneur. Type dvnement personnalis distribu par la classe IMManager la rception dun message du conteneur.

Exemple : utilisation de lAPI externe dans un conteneur de page Web

779

Fichier
com/example/programmingas3/ introvertIM/IMStatus.as html-flash/IntrovertIMApp.html ou html-template/index.template.html

Description
Enumration dont les valeurs reprsentent les diffrents statuts de disponibilit pouvant tre slectionns dans lapplication. La page HTML pour lapplication pour Flash (html-flash/IntrovertIMApp.html) ou le modle utilis pour crer la page HTML du conteneur pour lapplication pour Adobe Flex (htmltemplate/index.template.html). Ce fichier contient toutes les fonctions JavaScript qui constitue le conteneur de lapplication.

Prparation de la communication entre ActionScript et le navigateur


LAPI externe est le plus souvent utilise pour permettre aux applications ActionScript de communiquer avec le navigateur Web. Grce elle, les mthodes ActionScript peuvent appeler du code crit dans JavaScript, et inversement. En raison de la complexit des navigateurs et de leurs processus internes de rendu des pages, il est impossible de garantir quun document SWF pourra enregistrer ses rappels avant lexcution du premier code JavaScript de la page HTML. Par consquent, avant dappeler les fonctions du document SWF partir de JavaScript, le document SWF doit toujours appeler la page HTML pour lui indiquer quil est prt accepter des connexions.

780

Utilisation de lAPI externe

Par exemple, grce une srie dtapes effectues par la classe IMManager, Introvert IM dtermine si le navigateur est prt communiquer et prpare le fichier SWF la communication. La premire tape, qui vrifie que le navigateur est prt communiquer, a lieu dans le constructeur IMManager, comme suit :
public function IMManager(initialStatus:IMStatus) { _status = initialStatus; // Vrifiez si le conteneur peut utiliser lAPI externe. if (ExternalInterface.available) { try { // Appelle la mthode isContainerReady() qui, son tour, appelle // le conteneur pour voir si Flash Player a t charg et si le // conteneur est prt recevoir des appels du fichier SWF. var containerReady:Boolean = isContainerReady(); if (containerReady) { // Si le conteneur est prt, enregistrez les fonctions SWF. setupCallbacks(); } else { // Si le conteneur nest pas prt, dfinissez un minuteur Timer // pour appeler le conteneur des intervalles de 100 ms. // Quand le conteneur rpond quil est prt, le minuteur sarrte. var readyTimer:Timer = new Timer(100); readyTimer.addEventListener(TimerEvent.TIMER, timerHandler); readyTimer.start(); } } ... } else { trace("Linterface externe nest pas disponible pour ce conteneur."); } }

Exemple : utilisation de lAPI externe dans un conteneur de page Web

781

Tout dabord, le code vrifie si lAPI externe est disponible dans le conteneur actuel laide de la proprit ExternalInterface.available. Si cest le cas, le processus de mise en place de la communication commence. Pour parer aux ventuelles exceptions de scurit et autres erreurs qui peuvent se produire pendant les communications avec une application externe, le code est envelopp dans un bloc try (les blocs catch correspondants ont t omis de lexemple pour plus de concision). Le code appelle ensuite la mthode isContainerReady(), prsente ici :
private function isContainerReady():Boolean { var result:Boolean = ExternalInterface.call("isReady"); return result; }

La mthode isContainerReady() utilise son tour la mthode ExternalInterface.call() pour appeler la fonction JavaScript isReady(), comme suit :
<script language="JavaScript"> <!-// ------- Private vars ------var jsReady = false; ... // ------- functions called by ActionScript ------// appeles pour vrifier si la page a t initialise et JavaScript // et si JavaScript est disponible function isReady() { return jsReady; } ... // appele par lvnement onload de la balise <body> function pageInit() { // Enregistre que JavaScript est prt. jsReady = true; } ... //--> </script>

782

Utilisation de lAPI externe

La fonction isReady() renvoie simplement la valeur de la variable jsReady. Cette variable a au dpart la valeur false. Une fois que lvnement onload de la page Web est dclench, la valeur de la variable devient true. En dautres termes, si ActionScript appelle la fonction isReady() avant que la page soit charge, JavaScript renvoie la valeur false ExternalInterface.call("isReady"), la suite de quoi la mthode ActionScript isContainerReady() renvoie la valeur false. Une fois la page charge, la fonction JavaScript isReady() renvoie la valeur true, donc la mthode ActionScript isContainerReady() renvoie aussi la valeur true. Dans le constructeur IMManager, deux solutions sont possibles en fonction de la disponibilit du conteneur. Si isContainerReady() renvoie la valeur true, le code appelle simplement la mthode setupCallbacks(), qui achve la mise en place de la communication avec JavaScript. Dans lautre cas, si isContainerReady() renvoie la valeur false, le processus est pratiquement mis en attente. Un objet Timer est cr pour appeler la mthode timerHandler() toutes les 100 millisecondes, comme suit :
private function timerHandler(event:TimerEvent):void { // Vrifiez si le conteneur est prt. var isReady:Boolean = isContainerReady(); if (isReady) { // Si cest le cas, il nest pas ncessaire de vrifier nouveau, // vous pouvez donc arrter le minuteur. Timer(event.target).stop(); // Dfinir les mthodes ActionScript qui doivent tre // appeles par le conteneur. setupCallbacks(); } }

Chaque fois que la mthode timerHandler() est appele, elle vrifie nouveau le rsultat de la mthode isContainerReady(). Lorsque le conteneur est initialis, la mthode renvoie la valeur true. Le code arrte alors le minuteur et appelle la mthode setupCallbacks() pour finir la mise en place de la communication avec le navigateur.

Exemple : utilisation de lAPI externe dans un conteneur de page Web

783

Prsentation des mthodes ActionScript JavaScript


Comme le montre lexemple ci-avant, une fois que le code tablit que le navigateur est prt, la mthode setupCallbacks() est appele. Cette mthode prpare ActionScript pour recevoir des appels partir de JavaScript, comme le montre cet exemple :
private function setupCallbacks():void { // Enregistrer les fonctions client SWF auprs du conteneur ExternalInterface.addCallback("newMessage", newMessage); ExternalInterface.addCallback("getStatus", getStatus); // Avertir le conteneur que le fichier SWF est prt tre appel. ExternalInterface.call("setSWFIsReady"); }

La mthode setCallBacks() achve la prparation de la communication avec le conteneur en appelant ExternalInterface.addCallback() afin denregistrer deux mthodes qui pourront tre appeles par JavaScript. Dans ce code, le premier paramtre (le nom qui sert dsigner la mthode dans JavaScript, soit "newMessage" et "getStatus") est identique au nom de la mthode dans ActionScript. (Dans ce cas, il ny avait pas dintrt utiliser des noms diffrents, on a donc rutilis les mmes noms par souci de simplification.) Enfin, la mthode ExternalInterface.call() est utilise pour appeler la fonction JavaScript setSWFIsReady(), qui avertit le conteneur que les fonctions ActionScript ont t enregistres.

Communication dActionScript vers le navigateur


Lapplication Introvert IM met en vidence plusieurs exemples dappel de fonctions JavaScript dans la page conteneur. Dans le cas le plus simple (un exemple issu de la mthode setupCallbacks()), la fonction JavaScript setSWFIsReady() est appele sans transmettre de paramtres ni recevoir de valeur en retour :
ExternalInterface.call("setSWFIsReady");

Dans un autre exemple issu de la mthode isContainerReady(), ActionScript appelle la fonction isReady() et reoit une valeur boolenne en rponse :
var result:Boolean = ExternalInterface.call("isReady");

784

Utilisation de lAPI externe

Vous pouvez galement transmettre des paramtres aux fonctions JavaScript laide de lAPI externe. Considrez par exemple la mthode sendMessage() de la classe IMManager, qui est appele lorsque lutilisateur envoie un nouveau message son interlocuteur .
public function sendMessage(message:String):void { ExternalInterface.call("newMessage", message); }

L encore, ExternalInterface.call() sert appeler la fonction JavaScript dsigne pour avertir le navigateur du nouveau message. En outre, le message lui-mme est transmis comme paramtre supplmentaire ExternalInterface.call(). Il est ensuite transmis comme paramtre la fonction JavaScript newMessage().

Appel du code ActionScript partir de JavaScript


Une communication se fait normalement de manire bidirectionnelle, ce que respecte lapplication Introvert IM. Dun ct, le client de messagerie Flash Player appelle JavaScript pour envoyer des messages, de lautre, le formulaire HTML appelle le code JavaScript pour envoyer des messages au fichier SWF et recevoir de celui-ci des informations. Par exemple, lorsque le fichier SWF avertit le conteneur quil a tabli le contact et peut communiquer, la premire action du navigateur consiste appeler la mthode getStatus() de la classe IMManager pour recevoir du client de messagerie SWF le statut de disponibilit de lutilisateur initial. Cela se fait dans la page Web, avec la fonction updateStatus(), comme illustr ci-aprs :
<script language="JavaScript"> ... function updateStatus() { if (swfReady) { var currentStatus = getSWF("IntrovertIMApp").getStatus(); document.forms["imForm"].status.value = currentStatus; } } ... </script>

Exemple : utilisation de lAPI externe dans un conteneur de page Web

785

Le code vrifie la valeur de la variable swfReady, qui vrifie si le fichier SWF a averti le navigateur quil avait enregistr ses mthodes auprs de la classe ExternalInterface. Si le fichier SWF est prt recevoir la communication, la ligne suivante (var currentStatus = ...) appelle la mthode getStatus() dans la classe IMManager. Trois oprations se produisent dans cette ligne de code :

La fonction JavaScript getSWF() est appele et renvoie une rfrence lobjet JavaScript reprsentant le fichier SWF. Le paramtre transmis getSWF() dtermine si lobjet de navigateur est renvoy, au cas o il y aurait plus dun fichier SWF dans la page HTML. La valeur transmise ce paramtre doit correspondre lattribut id de la balise object et lattribut name de la balise embed, toutes deux utilises pour inclure le fichier SWF. Avec la rfrence au fichier SWF, la mthode getStatus() est appele comme sil sagissait dune mthode de lobjet SWF. Dans ce cas, le nom de fonction getStatus est utilis car cest le nom sous lequel la fonction ActionScript a t enregistre laide de ExternalInterface.addCallback(). La mthode ActionScript getStatus() renvoie une valeur qui est attribue la variable currentStatus, laquelle devient ensuite le contenu (la valeur value) du champ texte status.

La fonction JavaScript sendMessage() illustre la transmission dun paramtre la fonction ActionScript. (sendMessage() est la fonction appele lorsque lutilisateur appuie sur le bouton Send (Envoyer) de la page HTML.)
<script language="JavaScript"> ... function sendMessage(message) { if (swfReady) { ... getSWF("IntrovertIMApp").newMessage(message); } } ... </script>

La mthode ActionScript newMessage() attend un seul paramtre. De ce fait, la variable JavaScript message est transmise ActionScript en lutilisant comme paramtre dans lappel de la mthode newMessage() du code JavaScript.

786

Utilisation de lAPI externe

Dtection du type de navigateur


Laccs au contenu varie dun navigateur lautre. Pour cette raison, il est important de toujours utiliser JavaScript pour dtecter le navigateur utilis et accder ensuite la squence selon la syntaxe propre au navigateur laide de lobjet de fentre ou de document, comme le montre la fonction JavaScript getSWF() de cet exemple :
<script language="JavaScript"> ... function getSWF(movieName) { if (navigator.appName.indexOf("Microsoft") != -1) { return window[movieName]; } else { return document[movieName]; } } ... </script>

Si votre script ne dtecte pas le type de navigateur de lutilisateur, ce dernier peut noter un comportement inattendu lors de la lecture des fichiers SWF dans un conteneur HTML.

Exemple : utilisation de lAPI externe avec un conteneur ActiveX


Cet exemple illustre lutilisation de lAPI externe pour communiquer entre ActionScript et une application de bureau utilisant le contrle ActiveX. Il rutilise lapplication Introvert IM, y compris le code ActionScript et le fichier SWF. Pour cette raison, aucune description de lutilisation de lAPI externe dans ActionScript nest fournie. Il est recommand de se familiariser avec lexemple prcdent pour mieux comprendre celui-ci. Lapplication de bureau de cet exemple est crite en C# laide de Microsoft Visual Studio .NET. Ltude se concentre sur les techniques propres lutilisation de lAPI externe conjointement avec le contrle ActiveX. Cet exemple prsente les points suivants :

Appel des fonctions ActionScript partir dune application de bureau hbergeant le contrle ActiveX Flash Player Rception des appels de fonction partir dActionScript et traitement de ces appels dans un conteneur ActiveX Utilisation dune classe proxy pour masquer les dtails du format XML srialis que Flash Player utilise pour les messages envoys au conteneur ActiveX
Exemple : utilisation de lAPI externe avec un conteneur ActiveX 787

Pour obtenir les fichiers dapplication pour cet exemple, voir www.adobe.com/go/learn_programmingAS3samples_flash_fr. Les fichiers de lapplication Introvert IM C# se trouvent dans le dossier Samples/IntrovertIM_CSharp. Cette application se compose des fichiers suivants :
Fichier
AppForm.cs bin/Debug/IntrovertIMApp.swf ExternalInterfaceProxy/ ExternalInterfaceProxy.cs

Description
Fichier dapplication principal contenant linterface de Windows Forms C#. Fichier SWF charg par cette application. Classe servant denveloppe au contrle ActiveX pour la communication avec linterface externe. Elle fournit les mcanismes dappel et de rception des appels issus dActionScript. Classe charge de la conversion des messages au format XML de Flash Player en objets .NET. Fichier dfinissant deux types (classes) C# : une classe delegate personnalise et une classe event arguments, utilises par la classe ExternalInterfaceProxy pour notifier un couteur un appel de fonction provenant dActionScript. Cette classe est un objet valeur reprsentant un appel de fonction dActionScript vers le conteneur ActiveX, avec des proprits destines au nom de fonction et aux paramtres. Fichier SWF charg par cette application.

ExternalInterfaceProxy/ ExternalInterfaceSerializer.cs ExternalInterfaceProxy/ ExternalInterfaceEventArgs.cs

ExternalInterfaceProxy/ ExternalInterfaceCall.cs

bin/Debug/IntrovertIMApp.swf

obj/AxInterop.ShockwaveFlashObjects.dll, Ensembles denveloppes crs par Visual obj/Interop.ShockwaveFlashObjects.dll Studio .NET et requis pour accder au contrle ActiveX Flash Player (Adobe Shockwave Flash) partir du code gr.

788

Utilisation de lAPI externe

Prsentation de lapplication Introvert IM C#


Cette application exemple est constitue de deux programmes client de messagerie instantane qui communiquent entre eux ; lun rside dans un fichier SWF et lautre est labor dans Windows Forms. Linterface utilisateur comprend une instance du contrle ActiveX Shockwave Flash, dans laquelle le fichier SWF contenant le client de messagerie ActionScript est charg. Linterface inclut galement plusieurs champs texte qui constituent le client de messagerie Windows Forms : un champ permet dentrer des messages (MessageText), un autre affiche la transcription des messages changs par les clients (Transcript) et un troisime (Status) affiche le statut de disponibilit affich dans le client de messagerie SWF.

Intgration du contrle ActiveX Shockwave Flash


Pour intgrer le contrle ActiveX Shockwave Flash dans votre application Windows Forms, vous devez dabord lajouter aux outils de Microsoft Visual Studio.
Pour ajouter le contrle la bote outils :
1. 2.

Ouvrez la bote outils Visual Studio. Cliquez du bouton droit sur la section Windows Forms de Visual Studio 2003 ou toute section de Visual Studio 2005. Dans le menu contextuel, slectionnez Ajouter/Supprimer des lments dans Visual Studio 2003 (Choisir des lments dans Visual Studio 2005). La bote de dialogue Personnaliser la bote outils (2003) / Choisir les lments de la bote outils (2005) souvre.

3.

Slectionnez longlet Composants COM, qui rpertorie tous les composants COM disponibles sur votre ordinateur, y compris le contrle ActiveX Flash Player. Localisez loption Objet Shockwave Flash et slectionnez-la. Si cette option napparat pas, vrifiez que le contrle ActiveX Flash Player est install sur votre systme.

4.

Exemple : utilisation de lAPI externe avec un conteneur ActiveX

789

Prsentation de la communication dActionScript vers le conteneur ActiveX


La communication entre lAPI externe et une application conteneur ActiveX est semblable celle tablie avec un navigateur Web, avec cependant une importante diffrence. Comme dcrit plus haut, lorsque ActionScript communique avec un navigateur Web, du point de vue du dveloppeur les fonctions sont appeles directement. Les dtails du formatage des appels de fonction et des rponses en vue de leur transmission entre le lecteur et le navigateur sont masqus. Toutefois, lorsque lAPI externe sert communiquer avec une application conteneur ActiveX, Flash Player envoie des messages (appels de fonction et valeurs de retour) lapplication dans un format XML spcifique. Elle attend ensuite des appels de fonction et des valeurs de retour dun format identique de la part de lapplication conteneur. Le dveloppeur de lapplication conteneur ActiveX doit imprativement crire un code capable de comprendre et de crer des appels de fonction et des rponses dans le format appropri. Lexemple Introvert IM C# inclut un jeu de classes qui permet dviter le formatage des messages. Vous pouvez alors utiliser les types de donnes standard pour lappel de fonctions ActionScript et la rception dappels de fonction partir dActionScript. Cette fonctionnalit est fournie par la classe ExternalInterfaceProxy, ainsi que dautres classes daide. Ces classes peuvent sutiliser dans tout projet .NET afin de faciliter la communication avec lAPI externe. Les sections de code suivant, extraites du formulaire principal de lapplication (AppForm.cs), illustrent de manire simplifie linteraction obtenue grce la classe ExternalInterfaceProxy :
public class AppForm : System.Windows.Forms.Form { ... private ExternalInterfaceProxy proxy; ... public AppForm() { ... // Enregistrer cette application pour quelle soit notifie lorsque // le proxy reoit un appel dActionScript. proxy = new ExternalInterfaceProxy(IntrovertIMApp); proxy.ExternalInterfaceCall += new ExternalInterfaceCallEventHandler(proxy_ExternalInterfaceCall); ... } ...

790

Utilisation de lAPI externe

Lapplication dclare et cre une instance ExternalInterfaceProxy nomme proxy en transmettant une rfrence au contrle ActiveX Shockwave Flash qui se trouve dans linterface utilisateur (IntrovertIMApp). Ensuite, le code enregistre la mthode proxy_ExternalInterfaceCall() afin quelle reoive lvnement ExternalInterfaceCall du proxy. Cet vnement est distribu par la classe ExternalInterfaceProxy lorsquun appel de fonction provient de Flash Player. La souscription cet vnement permet au code C# de recevoir et rpondre aux appels de fonction issus dActionScript. Lorsquun appel de fonction provient dActionScript, linstance ExternalInterfaceProxy (proxy) reoit lappel, le convertit au format XML et notifie les objets dsigns comme couteurs de lvnement ExternalInterfaceCall du proxy. Dans le cas de la classe AppForm, la mthode proxy_ExternalInterfaceCall() gre cet vnement, comme suit :
/// <summary> /// Called by the proxy when an ActionScript ExternalInterface call /// est mis par le fichier SWF /// </summary> private object proxy_ExternalInterfaceCall(object sender, ExternalInterfaceCallEventArgs e) { switch (e.FunctionCall.FunctionName) { case "isReady": return isReady(); case "setSWFIsReady": setSWFIsReady(); return null; case "newMessage": newMessage((string)e.FunctionCall.Arguments[0]); return null; case "statusChange": statusChange(); return null; default: return null; } } ...

Une instance ExternalInterfaceCallEventArgs (nomme e dans cet exemple) est transmise la mthode. Cet objet possde alors une proprit FunctionCall qui est une instance de la classe ExternalInterfaceCall.

Exemple : utilisation de lAPI externe avec un conteneur ActiveX

791

Une instance ExternalInterfaceCall est un simple objet valeur avec deux proprits. La proprit FunctionName contient le nom de fonction spcifi dans linstruction ExternalInterface.Call() ActionScript. Si des paramtres sont ajouts dans ActionScript, ils sont inclus dans la proprit Arguments de lobjet ExternalInterfaceCall. Dans ce cas, la mthode qui gre lvnement est une simple instruction switch qui agit comme gestionnaire de trafic. La valeur de la proprit FunctionName (e.FunctionCall.FunctionName) dtermine quelle mthode de la classe AppForm est appele. Dans lexemple de code ci-avant, les branches de linstruction switch illustrent des scnarios courants dappel de fonction. Par exemple, toute mthode doit renvoyer une valeur ActionScript (ex. lappel de mthode isReady()) ou renvoyer la valeur null (comme illustr dans les autres appels de mthode). Laccs aux paramtres transmis partir dActionScript est illustr par lappel de la mthode newMessage() (qui transmet un paramtre e.FunctionCall.Arguments[0], le premier lment du tableau Arguments). Lappel dune fonction ActionScript partir de C# laide de la classe ExternalInterfaceProxy se fait de manire encore plus directe que la rception dun appel de fonction partir dActionScript. Pour appeler une fonction ActionScript, vous utilisez la mthode Call() de la classe ExternalInterfaceProxy, comme suit :
/// <summary> /// Appele lorsque le bouton Send est activ ; la valeur du /// champ MessageText est transmise comme paramtre. /// </summary> /// <param name="message">Message envoyer.</param> private void sendMessage(string message) { if (swfReady) { ... // Appelle la fonction newMessage dans ActionScript. proxy.Call("newMessage", message); } } ... /// <summary> /// Appeler la fonction ActionScript pour connatre le statut actuel /// de disponibilit et lcrire dans le champ texte. /// </summary> private void updateStatus() { Status.Text = (string)proxy.Call("getStatus"); } ... }

792

Utilisation de lAPI externe

Comme le montre cet exemple, la mthode Call() de la classe ExternalInterfaceProxy est trs semblable son quivalent dans ActionScript, ExternalInterface.Call(). Le premier paramtre est une chane, le nom de la fonction appeler. Tout autre paramtre supplmentaire (non illustr ici) est transmis dans la fonction ActionScript. Si cette fonction renvoie une valeur, cette dernire est renvoye par la mthode Call() (comme le montre lexemple ci-dessus).

Fonctionnement interne de la classe ExternalInterfaceProxy


Lutilisation de lenveloppe proxy autour du contrle ActiveX nest pas toujours pratique ou vous prfrerez parfois crire votre propre classe proxy (par exemple dans un langage de programmation diffrent ou destination dune autre plate-forme). Bien que cette section naborde pas tous les dtails de la cration dune telle classe, il est intressant de comprendre le fonctionnement interne de la classe proxy prsente dans cet exemple. La mthode CallFunction() du contrle ActiveX Shockwave Flash vous permet dappeler une fonction ActionScript partir du conteneur ActiveX via lAPI externe. Cette procdure est illustre dans cet extrait tir de la mthode Call() de la classe ExternalInterfaceProxy :
// Appeler une fonction ActionScript du SWF dans "_flashControl", // qui est un contrle ActiveX Shockwave Flash. string response = _flashControl.CallFunction(request);

Dans cet extrait de code, _flashControl est le contrle ActiveX Shockwave Flash. Les appels de fonction ActionScript seffectuent au moyen de la mthode CallFunction(). Cette mthode prend un seul paramtre (request dans cet exemple) qui correspond une chane contenant les instructions au format XML, cest--dire le nom de la fonction ActionScript appeler et les paramtres ventuels. Toute valeur renvoye par ActionScript est convertie en une chane au format XML puis renvoye comme valeur de retour de lappel CallFunction(). Dans cet exemple, la chane XML est stocke dans la variable response.

Exemple : utilisation de lAPI externe avec un conteneur ActiveX

793

La rception dun appel de fonction issu dActionScript est un processus en plusieurs tapes. Les appels de fonction issus dActionScript provoquent la distribution de lvnement FlashCall du contrle ActiveX Shockwave Flash. Ainsi, une classe (telle que ExternalInterfaceProxy) destine recevoir des appels dun fichier SWF doit dfinir un gestionnaire pour cet vnement. Dans la classe ExternalInterfaceProxy, la fonction gestionnaire dvnements est nomme _flashControl_FlashCall() et enregistre dans le constructeur de classe pour couter lvnement, comme suit :
private AxShockwaveFlash _flashControl; public ExternalInterfaceProxy(AxShockwaveFlash flashControl) { _flashControl = flashControl; _flashControl.FlashCall += new _IShockwaveFlashEvents_FlashCallEventHandler(_flashControl_FlashCall); } ... private void _flashControl_FlashCall(object sender, _IShockwaveFlashEvents_FlashCallEvent e) { // Utiliser la proprit request de lobjet vnement ("e.request") // pour excuter une action. ... // Renvoyer une valeur ActionScript ; // la valeur renvoye doit au pralable tre convertie en une chane // au format XML. _flashControl.SetReturnValue(encodedResponse); }

Lobjet vnement (e) a une proprit request (e.request) qui correspond une chane contenant des informations sur lappel de fonction, telles que le nom de fonction et les paramtres, au format XML. Ces informations sont utilises par le conteneur pour dterminer le code excuter. Dans la classe ExternalInterfaceProxy, la requte est convertie du format XML en un objet ExternalInterfaceCall, qui fournit les mmes lments, mais sous une forme plus accessible. La mthode SetReturnValue() du contrle ActiveX est utilise pour renvoyer un rsultat de fonction au code ActionScript appelant ; l encore, le paramtre de rsultat doit tre converti au format XML utilis par lAPI externe.

794

Utilisation de lAPI externe

La communication entre ActionScript et une application hbergeant le contrle Active X Shockwave Flash requiert un format XML spcifique qui servira convertir les appels de fonction et les valeurs. Dans lexemple Introvert IM C# example, la classe ExternalInterfaceProxy permet au code dans le formulaire de lapplication dagir directement sur des valeurs envoyes ou reues dActionScript, et dignorer les dtails du format XML utilis par Flash Player. Pour cela, la classe ExternalInterfaceProxy utilise les mthodes de la classe ExternalInterfaceSerializer pour effectuer la conversion des messages XML en objets .NET. La classe ExternalInterfaceSerializer possde quatre mthodes publiques :

EncodeInvoke() : convertit un nom de fonction et une liste dinstruction C# ArrayList au format XML appropri. EncodeResult()

: convertit une valeur de rsultat au format XML appropri.

DecodeInvoke() : dcode un appel de fonction issu dActionScript. La proprit request de lobjet vnement FlashCall est transmise la mthode DecodeInvoke() et convertit lappel en objet ExternalInterfaceCall. DecodeResult()

: dcode la chane XML reue comme rsultat de lappel dune fonction

ActionScript. Ces mthodes convertissent des valeurs C# au format XML de lAPI externe et dcodent le XML en objets C#. Pour plus dinformations sur le format XML utilis par Flash Player, voir Format XML de lAPI externe , la page 777.

Exemple : utilisation de lAPI externe avec un conteneur ActiveX

795

796

Utilisation de lAPI externe

CHAPITRE 26

La scurit dans Flash Player


La scurit est une proccupation essentielle pour Adobe, les utilisateurs, les propritaires de sites Web et les dveloppeurs de contenu. Pour cette raison, Adobe Flash Player 9 inclut un ensemble de rgles de scurit et de contrles qui protgent lutilisateur, le propritaire de site Web et le dveloppeur de contenu. Ce chapitre explique comment travailler avec le modle de scurit de Flash Player lors du dveloppement dapplications Flash. Sauf indication contraire, tous les fichiers SWF tudis dans ce chapitre sont censs tre publis avec ActionScript 3.0 (pour une excution dans Flash Player 9 ou version ultrieure). Ce chapitre vise offrir une prsentation gnrale de la scurit et non apporter une explication exhaustive de tous les dtails de mise en uvre, des scnarios dexploitation ou des ramifications de lutilisation de certaines API. Pour une tude dtaille des concepts de scurit de Flash Player, reportez-vous la prsentation technique Scurit dans Flash Player 9 sur le site www.adobe.com/go/fp9_0_security_fr.

26

Contenu
La scurit dans Flash Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797 Prsentation des contrles dautorisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801 Sandboxes de scurit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 812 Restriction des API de rseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815 Scurit du mode plein cran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817 Chargement de contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818 Programmation croise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .822 Accs aux mdias chargs comme sil sagissait de donnes . . . . . . . . . . . . . . . . .826 Chargement des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .829 Chargement de contenu incorpor partir de fichiers SWF imports dans un domaine de scurit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .832 Utilisation de contenus existants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .833 Dfinition des autorisations LocalConnection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .833 Contrle de laccs aux scripts dans une page Web hte. . . . . . . . . . . . . . . . . . . . .834

797

Objets partags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .836 Accs la camra, au microphone, au presse-papiers, la souris et au clavier. . . . . 838

Prsentation de la scurit dans Flash Player


Lessentiel de la scurit de Flash Player repose sur le domaine dorigine des fichiers SWF, mdias et autres actifs chargs. Un fichier SWF issu dun domaine Internet particulier, tel www.exemple.com, peut toujours accder lensemble des donnes de ce domaine. Ces actifs sont placs dans le mme groupe de scurit, appel sandbox de scurit. (Pour plus dinformations, voir Sandboxes de scurit , la page 812.) Par exemple, un fichier SWF peut charger des fichiers SWF, bitmap, audio, texte et tout autre actif appartenant au mme domaine. Par ailleurs, la programmation croise entre deux fichiers SWF du mme domaine est toujours autorise, condition que les deux fichiers soient crits avec ActionScript 3.0. La programmation croise est la capacit dun fichier SWF dutiliser ActionScript pour accder des proprits, des mthodes et des objets se trouvant dans un autre fichier SWF. Elle nest pas prise en charge si les fichiers sont crits en ActionScript 3.0 pour certains et dans des versions antrieures dActionScript pour dautres. La communication entre ces fichiers sera toutefois possible grce la classe LocalConnection. Pour plus dinformations, voir Programmation croise , la page 822. Les rgles de scurit lmentaires prsentes ci-aprs sappliquent toujours par dfaut :

Des ressources issues du mme sandbox de scurit ont accs les unes aux autres. Les fichiers SWF situs dans un sandbox distant ne peuvent jamais accder aux donnes et fichiers locaux.

Flash Player considre les domaines suivants comme distincts et dfinit un sandbox de scurit pour chacun :

http://example.com http://www.example.com http://store.example.com https://www.example.com http://192.0.34.166

Mme si un domaine nomm, tel que http://example.com, est associ une adresse IP particulire, par exemple http://192.0.34.166, Flash Player dfinit un sandbox distinct pour chacun deux.

798

La scurit dans Flash Player

Le dveloppeur dispose de deux mthodes de base pour permettre un fichier SWF daccder des actifs issus de sandboxes diffrents du sien.

La mthode Security.allowDomain() (voir Contrles de cration (dveloppeur) , la page 810) Le fichier de rgulation inter-domaines (voir Contrles de site Web (fichiers de rgulation interdomaine) , la page 806)

Par dfaut, un fichier SWF ne peut bnficier de la programmation croise avec des fichiers ActionScript 3.0 issus dautres domaines, ni charger des donnes partir dautres domaines. Il peut y tre autoris en appelant la mthode Security.allowDomain() dans le fichier SWF charg. Pour plus dinformations, voir Programmation croise , la page 822. Le modle de scurit Flash Player tablit une distinction entre le chargement de contenu et laccs des donnes ou leur chargement :

Chargement de contenu : le contenu correspond des mdias, notamment les lments visuels que Flash Player peut afficher, les fichiers audio et vido et les fichiers SWF contenant des mdias affichs. Les donnes sont des lments uniquement accessibles au code ActionScript. Vous pouvez charger du contenu laide de classes telles que Loader, Sound et NetStream. Accs au contenu sous forme de donnes ou chargement de donnes : vous pouvez accder aux donnes de deux manires, par extraction partir dun mdia charg ou par chargement direct partir dun fichier externe (par exemple un fichier XML). Il est possible dextraire des donnes partir de mdias chargs grce aux objets Bitmap, la mthode BitmapData.draw(), la proprit BitmapData.draw() ou la mthode SoundMixer.computeSpectrum(). Vous pouvez charger des donnes laide de classes telles que URLStream, URLLoader, Socket et XMLSocket.

Le modle de scurit Flash Player dfinit diffrentes rgles concernant le chargement de contenu et laccs aux donnes. En gnral, les restrictions sont moindres sur le chargement de contenu que sur laccs aux donnes. Habituellement, le contenu (fichiers SWF, bitmap, mp3 et vido) peut tre charg de nimporte quelle source mais sil provient dun domaine diffrent du fichier SWF lorigine du chargement, ce contenu se trouvera dans un sandbox de scurit distinct.

Prsentation de la scurit dans Flash Player

799

Certains obstacles sappliquent au chargement de contenu :

Par dfaut, les fichiers SWF locaux (ceux chargs partir dune adresse ne se trouvant pas sur un rseau, par exemple le disque dur de lutilisateur) sont classs dans le sandbox local avec systme de fichiers. Ces fichiers ne peuvent pas charger de contenu provenant dun rseau. Pour plus dinformations, voir Sandboxes locaux , la page 812. Les serveurs RTMP (Real-Time Messaging Protocol) peuvent limiter laccs au contenu. Pour plus dinformations, voir Contenu diffus laide de serveur RTMP , la page 822.

Si le mdia charg est une image, un fichier audio ou une vido, ses donnes (par exemple donnes de pixels ou sons) sont inaccessibles pour un fichier SWF situ en dehors de son sandbox de scurit, sauf si le domaine de ce fichier SWF a t inclus dans un fichier de rgulation inter-domaines dans le domaine dorigine du mdia. Pour plus dinformations, voir Accs aux mdias chargs comme sil sagissait de donnes , la page 826. Les donnes charges peuvent galement provenir de fichiers texte ou XML chargs avec lobjet URLLoader. L encore, laccs des donnes situes dans un autre sandbox de scurit ncessite lattribution des autorisations suffisantes par le biais dun fichier de rgulation interdomaine plac dans le domaine dorigine. Pour plus dinformations, voir Utilisation de URLLoader et URLStream , la page 829.

800

La scurit dans Flash Player

Prsentation des contrles dautorisation


Le modle de scurit dexcution du client Flash Player a t conu autour des ressources, cest--dire des objets tels que des fichiers SWF, des donnes locales et des URL Internet. Les parties prenantes sont celles qui dtiennent ou utilisent ces ressources. Elles peuvent exercer un contrle (via des paramtres de scurit) sur leurs propres ressources, chaque ressource ayant quatre parties prenantes. Flash Player applique une stricte hirarchie dautorit sur ces contrles, comme le montre lillustration suivante :
Paramtres administrateur (Institution utilisateur)

Paramtres utilisateur

Paramtres de site Web

Paramtres de cration

Hirarchie des contrles de scurit Ainsi, par exemple, si un administrateur restreint laccs une ressource, aucune autre partie prenante ne peut revenir sur cette restriction. Les contrles administrateur, utilisateur et de site Web sont dcrits dans les sections suivantes. Les paramtres de cration (dveloppeur) sont prsents dans le reste du chapitre.

Contrles administrateur
Ladministrateur dun ordinateur (un utilisateur ayant ouvert une session avec des droits dadministration) peut dfinir des paramtres de scurit Flash Player qui sappliquent tous les utilisateurs de lordinateur. Dans un environnement autre que lentreprise, par exemple un ordinateur domestique, un utilisateur dispose aussi dun accs administrateur. Mme au sein dune entreprise, certains utilisateurs peuvent possder des droits dadministration sur lordinateur. Il existe deux types de contrles administrateur :

Le fichier mms.cfg Le rpertoire Flash Player Trust global

Prsentation des contrles dautorisation

801

Fichier mms.cfg
Sur les systmes Mac OS X, le fichier mms.cfg se trouve dans /Library/Application Support/ Macromedia/mms.cfg. Sur les systmes Microsoft Windows, ce fichier se situe dans le dossier Macromedia Flash Player du rpertoire systme (par exemple C:\windows\system32\macromed\flash\mms.cfg, dans le cas dune installation par dfaut sous Windows XP). Lors du lancement de Flash Player, lapplication lit les paramtres de scurit dans ce fichier, puis les utilise pour limiter la fonctionnalit. Le fichier mms.cfg inclut des paramtres que ladministrateur utilise pour effectuer les tches suivantes :

Chargement des donnes : restreindre la lecture des fichiers SWF locaux, dsactiver le tlchargement et chargement de fichier et dfinir les limites de stockage pour les objets partags persistants. Contrles de confidentialit : dsactiver laccs au microphone et la camra, empcher les fichiers SWF de lire du contenu sans fentre et empcher les fichiers SWF dun domaine ne correspondant pas lURL affiche dans la fentre du navigateur daccder aux objets partags persistants. Mises jour Flash Player : dfinir lintervalle de vrification des mises jour de Flash Player, spcifier lURL de vrification des informations de mise jour de Flash Player, spcifier lURL de tlchargement des versions mises jour de Flash Player et dsactiver compltement les mises jour automatiques de Flash Player. Prise en charge des fichiers hrits : spcifier si les fichiers SWF issus de versions antrieures doivent tre placs dans le sandbox local approuv. Scurit des fichiers locaux : spcifier si les fichiers locaux doivent tre placs dans le sandbox local approuv. Mode plein cran : dsactiver le mode plein cran.

Un fichier SWF peut obtenir des informations sur les fonctions dsactives en appelant les proprits Capabilities.avHardwareDisable et Capabilities.localFileReadDisable. Toutefois, la plupart des paramtres du fichier mms.cfg ne peuvent tre interrogs partir dActionScript. Pour mettre en place sur un ordinateur des stratgies de confidentialit et de scurit indpendantes des applications, le fichier mms.cfg doit tre uniquement modifi par un administrateur systme. Le fichier mms.cfg nest pas destin aux programmes dinstallation des applications. Bien quun programme dinstallation excut avec des privilges administrateur puisse modifier le contenu du fichier mms.cfg, Adobe considre cette pratique comme une violation de la confiance de lutilisateur et presse les crateurs de programmes dinstallation de ne jamais modifier le fichier mms.cfg.

802

La scurit dans Flash Player

Rpertoire Flash Player Trust global


Les administrateurs et programmes dinstallation peuvent approuver des fichiers SWF locaux spcifiques. Ces fichiers SWF sont associs au sandbox local approuv. Ils peuvent interagir avec tout autre fichier SWF puisquils peuvent charger des donnes stockes localement ou distance. Les fichiers sont dsigns comme approuvs dans le rpertoire Flash Player Trust global, qui se trouve dans le mme rpertoire que le fichier mms.cfg, aux emplacements suivants (en fonction de lutilisateur actif ):

Windows : system\Macromed\Flash\FlashPlayerTrust (par exemple, C:\windows\system32\Macromed\Flash\FlashPlayerTrust) Mac : app support/Macromedia/FlashPlayerTrust (par exemple, /Library/Application Support/Macromedia/FlashPlayerTrust)

Le rpertoire Flash Player Trust peut contenir un nombre illimit de fichiers texte, chacun rpertoriant des chemins daccs approuvs, raison dun chemin par ligne. Chaque chemin daccs peut mener un fichier SWF ou HTML, ou un rpertoire. Les lignes de commentaire commencent par le symbole #. Par exemple, un fichier de configuration Flash Player contenant le texte suivant approuve tous les fichiers placs dans le rpertoire spcifi et ses sous-rpertoires :
# Trust files in the following directories: C:\Documents and Settings\All Users\Documents\SampleApp

Les chemins rpertoris dans un fichier de configuration Trust doivent toujours faire rfrence au systme local ou un rseau SMB. Les chemins daccs HTTP placs dans un fichier de configuration Trust sont ignors ; seuls les fichiers locaux peuvent tre approuvs. Pour viter les conflits, attribuez au fichier de configuration Trust un nom correspondant lapplication installe, suivi de lextension de fichier .cfg. En tant que dveloppeur diffusant un fichier SWF excuter localement par le biais dun programme dinstallation, vous pouvez faire en sorte que ce programme dinstallation ajoute un fichier de configuration au rpertoire Flash Player Trust global afin daccorder des privilges complets au fichier que vous diffusez. Le programme dinstallation doit tre excut par un utilisateur dot de droits dadministration. Contrairement au fichier mms.cfg, le rpertoire Flash Player Trust global est prvu pour les programmes dinstallation devant accorder des autorisations. Il permet aux administrateurs et aux programmes dinstallation de dsigner des application locales approuves. Il existe galement des rpertoires Flash Player Trust destins aux utilisateurs individuels (voir la section suivante Contrles utilisateur )

Prsentation des contrles dautorisation

803

Contrles utilisateur
Flash Player fournit trois mcanismes de dfinition des autorisations pour les utilisateurs : linterface de paramtrage, le Gestionnaire des paramtres et le rpertoire Flash Player Trust utilisateur.

Interface de paramtrage et Gestionnaire des paramtres


Linterface de paramtrage est un mcanisme interactif qui permet de configurer rapidement les paramtres dun domaine donn. Le Gestionnaire des paramtres, avec son interface plus dtaille, permet deffectuer des modifications globales sur les autorisations de plusieurs domaines ou de tous. En outre, si un fichier SWF requiert une nouvelle autorisation qui oblige prendre des dcisions en cours dexcution concernant la scurit ou la confidentialit, des botes de dialogue saffichent dans lesquelles les utilisateurs peuvent rgler certains paramtres de Flash Player. Le Gestionnaire des paramtres et linterface de paramtrage proposent les options de scurit suivantes :

Paramtres microphone et camra : lutilisateur peut contrler laccs de Flash Player la camra et au microphone de lordinateur. Il peut autoriser ou refuser laccs pour tous les sites ou pour certains seulement. Si lutilisateur ne spcifie aucun paramtre (pour lensemble des sites ou un site particulier), une bote de dialogue saffiche lorsquun fichier SWF essaie daccder la camra ou au microphone, pour lui permettre dautoriser ou non laccs du fichier SWF au priphrique concern. Lutilisateur peut galement spcifier la camra ou le microphone utiliser, et rgler la sensibilit de ce dernier. Paramtres de stockage des objets partags : lutilisateur peut slectionner la quantit despace disque quun domaine peut utiliser pour stocker les objets partags persistants. Ce paramtre est disponible pour un nombre illimit de domaines. Lutilisateur peut en outre dfinir les paramtres par dfaut appliquer aux nouveaux domaines. Par dfaut, la limite est de 1000 Ko despace disque. Pour plus dinformations sur les objets partags persistants, voir la classe SharedObject dans la Rfrence du langage et des composants ActionScript 3.0.
Les rglages effectus dans le fichier mms.cfg (voir Contrles administrateur , la page 801) ne sont pas reflts dans le Gestionnaire des paramtres.

Pour plus dinformations sur le Gestionnaire des paramtres, voir www.adobe.com/go/settingsmanager_fr.

804

REMARQUE

La scurit dans Flash Player

Rpertoire Flash Player Trust utilisateur


Les utilisateurs et programmes dinstallation peuvent approuver des fichiers SWF locaux spcifiques. Ces fichiers SWF sont associs au sandbox local approuv. Ils peuvent interagir avec tout autre fichier SWF puisquils peuvent charger des donnes stockes localement ou distance. Pour approuver un fichier, lutilisateur le dsigne dans le rpertoire Flash Player Trust utilisateur, qui se trouve dans le mme rpertoire que la zone de stockage des objets partags Flash, aux emplacements suivants (ces emplacements sont spcifiques lutilisateur actif ) :

Windows : app data\Macromedia\Flash Player\#Security\FlashPlayerTrust (par exemple, C:\Documents and Settings\JohnD\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust)

Mac : app data/Macromedia/Flash Player/#Security/FlashPlayerTrust (par exemple, /Users/JohnD/Library/Preferences/Macromedia/Flash Player/#Security/ FlashPlayerTrust)

Ces paramtres sappliquent uniquement lutilisateur actif, et non aux autres utilisateurs qui ouvrent une session sur lordinateur. Si un utilisateur sans droits dadministration installe une application dans sa partie rserve du systme, le rpertoire Flash Player Trust utilisateur permet au programme dinstallation denregistrer cette application comme approuve pour lutilisateur en question. En tant que dveloppeur diffusant un fichier SWF excuter localement par le biais dun programme dinstallation, vous pouvez faire en sorte que ce programme dinstallation ajoute un fichier de configuration au rpertoire Flash Player Trust utilisateur afin daccorder des privilges complets au fichier que vous diffusez. Mme dans ce cas de figure, le fichier plac dans le rpertoire Flash Player Trust utilisateur constitue un contrle utilisateur puisque son initialisation rsulte dune action de lutilisateur (linstallation). Il existe galement un rpertoire Flash Player Trust global utilis par ladministrateur ou les programmes dinstallation pour enregistrer une application destine lensemble des utilisateurs dun ordinateur (voir Contrles administrateur , la page 801).

Prsentation des contrles dautorisation

805

Contrles de site Web (fichiers de rgulation interdomaine)


Si vous souhaitez rendre les donnes dun serveur Web accessibles aux fichiers SWF issus de domaines diffrents, vous pouvez crer un fichier de rgulation interdomaine sur votre serveur. Un fichier de rgulation interdomaine est un fichier XML qui permet au serveur dindiquer que ses donnes et ses documents sont disponibles pour les fichiers SWF servis partir de certains domaines ou de tous les domaines. Tout fichier SWF servi partir dun domaine spcifi par le fichier de rgulation du serveur peut accder aux donnes et aux ressources de ce serveur. Les fichiers de rgulation interdomaine ont une incidence sur laccs certains actifs, notamment les suivants :

Les donnes de fichiers bitmap, son et vido Le chargement des fichiers XML et texte Laccs aux connexions socket et socket XML Limportation de fichiers SWF partir dautres domaines de scurit dans le domaine du fichier SWF lorigine du chargement

Des informations dtailles sont fournies ce sujet dans le reste de ce chapitre.

Syntaxe du fichier de rgulation


Lexemple suivant prsente un fichier de rgulation qui autorise laccs des fichiers SWF issus des domaines *.example.com, www.friendOfExample.com et 192.0.34.166 :
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*.example.com" /> <allow-access-from domain="www.friendOfExample.com" /> <allow-access-from domain="192.0.34.166" /> </cross-domain-policy>

Lorsquun fichier SWG essaie daccder aux donnes depuis un autre domaine, Flash Player essaie automatiquement de charger un fichier de rgulation depuis ce domaine. Si le domaine du fichier SWF qui tente daccder aux donnes est inclus dans le fichier de rgulation, les donnes sont automatiquement accessibles.

806

La scurit dans Flash Player

Par dfaut, les fichiers de rgulation sont nomms crossdomain.xml et doivent rsider dans le rpertoire racine du serveur. Cependant, un fichier SWF peut effectuer une recherche sur un nom de fichier ou un emplacement diffrent en appelant la mthode Security.loadPolicyFile(). Un fichier de rgulation interdomaine sapplique uniquement au rpertoire dans lequel il est charg et ses sous-rpertoires. Ainsi, un fichier de rgulation plac dans le rpertoire racine sapplique lensemble du serveur. En revanche, un fichier de rgulation charg dun sous-rpertoire quelconque sapplique uniquement celui-ci et ses sous-rpertoires. Un fichier de rgulation contrle uniquement laccs au serveur sur lequel il rside. Par exemple, un fichier de rgulation situ dans https://www.adobe.com:8080/ crossdomain.xml ne sapplique quaux appels de chargement de donnes transmis www.adobe.com sur HTTPS au port 8080. Un fichier de rgulation interdomaine contient une seule balise <cross-domain-policy>, qui contient elle-mme aucune ou plusieurs balises <allow-access-from>. Chaque balise <allow-access-from> contient un attribut domain qui spcifie soit une adresse IP exacte, un domaine exact ou un domaine gnrique (tout domaine). Les domaines gnriques sont signals par un astrisque (*) seul, qui correspond tous les domaines et toutes les adresses IP, ou par un astrisque suivi dun suffixe, qui correspond uniquement aux domaines se terminant par le suffixe spcifi. Les suffixes doivent commencer par un point. Cependant, les domaines gnriques suivis de suffixes peuvent correspondre des domaines qui sont composs uniquement du suffixe sans le point de sparation. Par exemple, foo.com est considr comme un lment de *.foo.com. Les caractres gnriques ne sont pas autoriss dans les spcifications de domaine IP. Si vous spcifiez une adresse IP, seuls les fichiers SWF chargs depuis cette adresse IP laide de la syntaxe IP (par exemple, http://65.57.83.12/flashmovie.swf ) sont accessibles ; les fichiers chargs laide dune syntaxe domaine-nom sont inaccessibles. Flash Player neffectue pas de rsolution DNS. Vous pouvez autoriser laccs des documents provenant de tout autre domaine, comme indiqu dans lexemple suivant :
<?xml version="1.0"?> <!-- http://www.foo.com/crossdomain.xml --> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy>

Chaque balise <allow-access-from> peut prsenter lattribut facultatif secure, dont la valeur par dfaut est true. Vous pouvez dfinir cet attribut sur false si le fichier de rgulation figure sur un serveur HTTPS et si vous autorisez les fichiers situs sur un serveur non HTTPS charger des donnes partir dun serveur HTTPS.

Prsentation des contrles dautorisation

807

La dfinition de lattribut secure sur false risque de compromettre la scurit fournie par le protocole HTTPS. Plus particulirement, la dfinition de cet attribut sur false rend le contenu scuris vulnrable aux attaques despionnage. Adobe recommande vivement de ne pas dfinir lattribut secure sur false. Si les donnes charger se trouvent sur un serveur HTTPS mais que le fichier SWF lorigine du chargement se situe sur un serveur HTTP, Adobe recommande de placer le fichier SWF sur un serveur HTTPS de manire que toutes les donnes scurises soient sous la protection de HTTPS. Cependant si vous dcidez que vous devez conserver le fichier SWF lorigine du chargement sur un serveur HTTP, ajoutez lattribut secure="false" la balise <allowaccess-from>, comme le montre le code suivant :
<allow-access-from domain="www.example.com" secure="false" />

Un fichier de rgulation ne contenant aucune balise <allow-access-from> revient ne pas avoir de rgulation sur un serveur.

Fichiers de rgulation socket


Les objets ActionScript instancient deux diffrents types de connexions serveur : des connexions lies des documents et des connexions socket. Les objets ActionScript tels que Loader, Sound, URLLoader et URLStream instancient des connexions serveur lies des documents, chacun de ces objets permettant de charger un fichier partir dune URL. Les objets ActionScript Socket et XMLSocket tablissent des connexions socket, qui fonctionnent avec des flux de donnes et non des documents chargs. Flash Player prend en charge deux types de fichiers de rgulation : des fichiers de rgulation lis des documents et des fichiers de rgulation socket. Les connexions lies des documents ncessitent des fichiers de rgulation du premier type, alors que les connexions socket exigent des fichiers de rgulation socket. Pour le transfert du fichier de rgulation, Flash Player impose quil seffectue suivant le mme protocole que la connexion elle-mme. Par exemple, si vous placez un fichier de rgulation sur un serveur HTTP, les fichiers SWF issus dautres domaines sont autoriss charger les donnes quil contient en tant que serveur HTTP. Cependant, si vous ne fournissez aucun fichier de rgulation socket sur ce mme serveur, vous empchez les fichiers SWF issus dautres domaines daccder au serveur au niveau socket. La mthode de rcupration du fichier de rgulation socket doit correspondre la mthode de connexion.

808

La scurit dans Flash Player

La syntaxe des fichiers de rgulation transmis par un serveur socket est identique celle des autres fichiers de rgulation, lexception prs que ces fichiers doivent galement spcifier les ports auxquels ils permettent daccder. Un fichier de rgulation transmis via un port dont le numro est infrieur 1024 peut autoriser laccs tous les ports. Un fichier de rgulation transmis via le port 1024 ou suprieur ne peut dfinir laccs quau port 1024 et aux ports suprieurs. Les ports accessibles sont spcifis par lattribut to-ports dans la balise <allowaccess-from>. Il est possible dutiliser des numros de ports, des plages de ports et des caractres gnriques. Voici un exemple de fichier de rgulation XMLSocket :
<cross-domain-policy> <allow-access-from domain="*" to-ports="507" /> <allow-access-from domain="*.example.com" to-ports="507,516" /> <allow-access-from domain="*.example2.com" to-ports="516-523" /> <allow-access-from domain="www.example2.com" to-ports="507,516-523" /> <allow-access-from domain="www.example3.com" to-ports="*" /> </cross-domain-policy>

Lors de lintroduction des fichiers de rgulation dans Flash Player 6, les fichiers socket ntaient pas pris en charge. Les connexions aux serveurs socket taient autorises par un fichier de rgulation issu de lemplacement par dfaut du fichier de rgulation interdomaine sur un serveur HTTP condition dutiliser le port 80 du mme hte que le serveur socket. Pour quil soit possible de conserver les organisations de serveurs existantes, Flash Player 9 continue de prendre en charge cette fonction. Cependant, par dfaut, Flash Player rcupre dsormais le fichier de rgulation socket sur le mme port que la connexion socket. Si vous utilisez un fichier de rgulation sur HTTP pour autoriser une connexion socket, vous devez explicitement demander le fichier de rgulation HTTP laide dun code tel que celui-ci :
Security.loadPolicyFile("http://socketServerHost.com/crossdomain.xml")

En outre, pour autoriser les connexions socket, un fichier de rgulation HTTP doit provenir exclusivement de lemplacement par dfaut du fichier de rgulation inter-domaines et daucun autre emplacement HTTP. Un fichier de rgulation obtenu dun serveur HTTP autorise implicitement laccs socket aux ports 1024 et suprieurs ; les ventuels attributs to-ports dans ce type de fichier sont ignors. Pour plus dinformations sur les fichiers de rgulation socket, voir Connexion aux sockets , la page 830.

Prsentation des contrles dautorisation

809

Prchargement des fichiers de rgulation


Le chargement de donnes partir dun serveur ou la connexion un socket est une opration asynchrone ; Flash Player attend que le fichier de rgulation interdomaine soit entirement tlcharg avant de commencer lopration principale. Cependant, lextraction de donnes de pixels dans des images ou de donnes chantillon partir de fichiers son est une opration synchrone ; le fichier de rgulation interdomaine doit se charger avant de permettre lextraction des donnes. Lors du chargement du mdia, vous devez spcifier que le fichier de rgulation interdomaine doit tre vrifi :

Si vous utilisez la mthode Loader.load(), dfinissez la proprit checkPolicyFile du paramtre context, qui constitue un objet LoaderContext. Si vous incorporez une image dans un champ texte laide de la balise <img>, dfinissez lattribut checkPolicyFile de la balise <img> sur true, comme dans lexemple suivant : <img checkPolicyFile = "true" src = "example.jpg">. Si vous utilisez la mthode Sound.load(), dfinissez la proprit checkPolicyFile du paramtre context, qui constitue un objet SoundLoaderContext. Si vous utilisez la classe NetStream, dfinissez la proprit checkPolicyFile de lobjet NetStream.

Lorsque vous dfinissez lun des ces paramtres, Flash Player commence par vrifier si des fichiers de rgulation ont dj t tlchargs pour ce domaine. Il examine ensuite tous les appels en attente la mthode Security.loadPolicyFile() pour voir sils correspondent au domaine. Si tel est le cas, il attend leur excution. Dans un troisime temps, il recherche le fichier de rgulation interdomaine lemplacement par dfaut sur le serveur.

Contrles de cration (dveloppeur)


LAPI ActionScript principale utilise dans lattribution des privilges de scurit est la mthode Security.allowDomain(), qui accorde des droits aux fichiers SWF du domaine que vous spcifiez. Dans lexemple suivant, un fichier SWF autorise laccs des fichiers SWF servis partir du domaine www.example.com :
Security.allowDomain("www.example.com")

Cette mthode autorise les oprations suivantes :


Programmation croise entre fichiers SWF (voir Programmation croise , la page 822) Accs la liste daffichage (voir Parcours de la liste daffichage , la page 825) Dtection dvnements (voir Scurit dvnements , la page 826) Accs total aux proprits et mthodes de lobjet Stage (voir scurit de la scne , la page 824)

810

La scurit dans Flash Player

La mthode Security.allowDomain() sert avant tout permettre aux fichiers SWF situs dans un domaine externe deffectuer une programmation croise avec le fichier SWF qui appelle la mthode Security.allowDomain(). Pour plus dinformations, voir Programmation croise , la page 822. La spcification de ladresse IP en tant que paramtre de Security.allowDomain() nautorise pas laccs de toutes les parties provenant de ladresse IP spcifie. Au contraire, elle autorise laccs dune partie prsentant une URL identique ladresse IP spcifie, plutt quun nom de domaine renvoyant ladresse IP. Par exemple, si le nom de domaine www.example.com renvoie ladresse IP 192.0.34.166, un appel Security.allowDomain("192.0.34.166") ne donne pas accs www.example.com. Vous pouvez transmettre le caractre gnrique "*" la mthode Security.allowDomain() pour permettre laccs partir de tous les domaines. Soyez prudent lorsque vous utilisez le caractre gnrique "*" car celui-ci autorise les fichiers SWF issus de tous les domaines effectuer une programmation dans le fichier SWF appelant. ActionScript inclut une seconde API dautorisation appele Security.allowInsecureDomain(). Cette mthode joue le mme rle que la mthode Security.allowDomain() la diffrence suivante : lorsquelle est appele partir dun fichier SWF servi par une connexion HTTPS, elle autorise laccs ce fichier appelant pour dautres fichiers SWF servis partir dun protocole non scuris, tel HTTP. Cependant, il est dconseill de permettre la programmation croise entre des fichiers issus dun protocole scuris et ceux provenant dun protocole qui ne lest pas. Cette pratique est susceptible de rendre le contenu vulnrable aux attaques despionnage. Voici comment fonctionnent ces attaques : puisque la mthode Security.allowInsecureDomain() permet aux fichiers SWF servis sur des connexions HTTP daccder aux donnes HTTPS scurises, un attaquant qui sinterposerait entre le serveur HTTP et les utilisateurs pourraient remplacer votre fichier SWF HTTP par un fichier de son cru afin daccder vos donnes HTTPS. Autre mthode importante lie la scurit, Security.loadPolicyFile() permet Flash Player de rechercher le fichier de rgulation interdomaine un autre emplacement. Pour plus dinformations, voir Contrles de site Web (fichiers de rgulation interdomaine) , la page 806.

Prsentation des contrles dautorisation

811

Sandboxes de scurit
Les ordinateurs client peuvent obtenir des fichiers SWF individuels de diverses sources, par exemple dun site Web externe ou dun systme de fichiers local. Flash Player associe chaque fichier SWF et chaque ressource (objets partags, fichiers bitmap, son, vido et donnes) des sandboxes de scurit en fonction de leur origine au moment du chargement dans Flash Player. Les sections suivantes dcrivent les rgles mises en place par Flash Player pour contrler ce quoi un fichier SWF peut accder au sein dun sandbox donn. Pour plus dinformations sur les sandboxes de scurit, reportez-vous la prsentation technique Scurit dans Flash Player 9.

Sandboxes distants
Flash Player classe les actifs (y compris les fichiers SWF) en provenance dInternet dans des sandboxes diffrents correspondant leur domaine dorigine. Par dfaut, ces fichiers sont autoriss accder toutes les ressources issues de leur propre serveur. Il est possible dautoriser les fichiers SWF distants accder des donnes dautres domaines laide dautorisations explicites portant sur les sites Web et les auteurs, par exemple des fichiers de rgulation interdomaine et la mthode Security.allowDomain(). Pour plus dinformations, voir Contrles de site Web (fichiers de rgulation interdomaine) , la page 806 et Contrles de cration (dveloppeur) , la page 810. Les fichiers SWF distants ne peuvent pas charger de fichiers ou de ressources locales. Pour plus dinformations, voir la prsentation technique Scurit dans Flash Player 9 .

Sandboxes locaux
Lexpression fichier local renvoie tout fichier rfrenc laide du protocole file : ou dun chemin UNC (Universal Naming Convention, convention de dnomination universelle). Les fichiers SWF locaux sont placs dans lun des trois sandboxes locaux :

Sandbox local avec systme de fichiers : pour des raisons de scurit, Flash Player place par dfaut tous les fichiers SWF et actifs locaux dans ce sandbox. De l, les fichiers SWF peuvent lire les fichiers locaux ( laide de la classe URLLoader, par exemple), mais en aucun cas communiquer avec le rseau. Ceci garanti lutilisateur que les donnes locales ne peuvent pas filtrer hors du rseau ou autrement tre partages de manire inopportune.

812

La scurit dans Flash Player

Sandbox local avec rseau : lors de la compilation dun fichier SWF, vous pouvez spcifier sil dispose dun accs rseau lorsquil est excut comme fichier local (voir Dfinition du type de sandbox pour les fichiers SWF locaux , la page 814). De tels fichiers sont placs dans le sandbox local avec rseau. Les fichiers SWF placs dans le sandbox local avec rseau abandonnent leur accs aux fichiers locaux. En change, ils sont autoriss accder aux donnes sur le rseau. Toutefois, un fichier local avec rseau ne peut pas lire des donnes drives du rseau si aucune autorisation nest accorde pour cela par le biais dun fichier de rgulation interdomaine ou un appel la mthodeSecurity.allowDomain(). A cet effet, le fichier de rgulation inter-domaine doit accorder une autorisation tous les domaines en utilisant <allow-access-from domain="*"/> ou Security.allowDomain("*"). Pour plus dinformations, voir Contrles de site Web (fichiers de rgulation interdomaine) , la page 806 et Contrles de cration (dveloppeur) , la page 810. Sandbox local approuv : les fichiers SWF locaux enregistrs comme approuvs (par lutilisateur ou un programme dinstallation) sont placs dans ce sandbox. Les administrateurs systme et les utilisateurs peuvent aussi associer un fichier SWF local au sandbox local approuv ou len dissocier, selon les contraintes de scurit (voir Contrles administrateur , la page 801 et Contrles utilisateur , la page 804). Les fichiers SWF associs au Sandbox local approuv peuvent interagir avec tous les autres fichiers SWF et charger des donnes partir de nimporte quel emplacement ( distance ou localement).

La communication entre le sandbox local avec rseau et le sandbox local avec systme de fichiers est strictement interdite, tout comme la communication entre le sandbox local avec systme de fichiers et le sandbox distant. Elles ne peuvent pas tre autorises par une application Flash ni par un utilisateur ou un administrateur. La programmation croise entre les fichiers HTML et SWF locaux (par exemple laide de la classe ExternalInterface) exige que les deux fichiers impliqus se trouvent dans le sandbox local approuv. Cette contrainte vient du fait que les modles de scurit locaux des navigateurs diffrent de celui de Flash Player. Les fichiers SWF du sandbox local avec rseau ne peuvent pas charger des fichiers SWF du sandbox local avec systme de fichiers. Les fichiers SWF du sandbox local avec systme de fichier ne peuvent pas charger des fichiers SWF du sandbox local avec rseau.

Sandboxes de scurit

813

Dfinition du type de sandbox pour les fichiers SWF locaux


Vous pouvez configurer un fichier SWF pour le sandbox local avec systme de fichiers ou le sandbox local avec rseau en dfinissant les paramtres de publication du document dans loutil de programmation Adobe Flash CS3 Professional. Pour plus dinformations, voir Dfinition doptions de publication pour le format de fichier Flash SWF dans Utilisation de Flash. Un utilisateur ou ladministrateur dun ordinateur peut spcifier si un fichier SWF local est approuv, lui permettant ainsi de charger des donnes de tous les domaines, locaux ou rseau. Cette caractristique est dfinie dans les rpertoires Flash Player Trust global et utilisateur. Pour plus dinformations, voir Contrles administrateur , la page 801 et Contrles utilisateur , la page 804. Pour plus dinformations sur les sandboxes locaux, voir Sandboxes locaux , la page 812.

Proprit Security.sandboxType
La proprit statique en lecture seule Security.sandboxType permet lauteur dun fichier SWF de dterminer le type de sandbox auquel Flash Player a associ le fichier SWF. La classe Security inclut des constantes qui reprsentent les valeurs possibles de la proprit Security.sandboxType, comme suit :

Security.REMOTE : le fichier SWF file provient dune URL Internet et son fonctionnement est rgi par les rgles de sandbox de domaines. Security.LOCAL_WITH_FILE

: le fichier SWF est un fichier local mais na pas t approuv par lutilisateur ni publi avec une dsignation rseau. Le fichier SWF peut lire les sources de donnes locales mais ne peut pas communiquer avec Internet.

Security.LOCAL_WITH_NETWORK

: le fichier SWF est un fichier local non approuv par lutilisateur mais qui a t publi avec une dsignation rseau. Le fichier SWF peut communiquer avec Internet mais ne peut pas lire les sources de donnes locales.

Security.LOCAL_TRUSTED : le fichier SWF est un fichier local qui a t approuv par lutilisateur via le Gestionnaire des paramtres ou le fichier de configuration Flash Player Trust. Ce fichier SWF peut lire les sources de donnes locales et communiquer avec Internet.

814

La scurit dans Flash Player

Restriction des API de rseau


Vous pouvez contrler laccs dun fichier SWF aux fonctionnalits rseau en dfinissant le paramtre allowNetworking dans les balises <object> et <embed> de la page HTML qui accueille le contenu SWF.
allowNetworking

peut prendre les valeurs suivantes :

"all"

(par dfaut) : toutes les API de rseau sont autorises dans le fichier SWF.

"internal"

: le fichier SWF ne peut pas appeler les API de navigation et dinteraction avec le navigateur (prsentes plus loin dans cette section). Il peut cependant appeler toutes les autres API de rseau.

"none" : le fichier SWF file ne peut pas appeler les API de navigation et dinteraction avec le navigateur (prsentes plus loin dans cette section) ni utiliser les API de communication entre fichiers SWF (galement dcrites plus loin).

Lappel dune API interdite renvoie une exception SecurityError. La dfinition du paramtre allowNetworking seffectue dans les balises <object> et <embed> de la page HTML qui contient la rfrence au fichier SWF. Pour ce faire, ajoutez le paramtre allowNetworking aux balises et dfinissez sa valeur, comme illustr ci-aprs :
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/ swflash.cab#version=9,0,18,0" width="600" height="400" id="test" align="middle"> <param name="allowNetworking" value="none" /> <param name="movie" value="test.swf" /> <param name="bgcolor" value="#333333" /> <embed src="test.swf" allowNetworking="none" bgcolor="#333333" width="600" height="400" name="test" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /> </object>

Une page HTML peut galement gnrer des balises dincorporation SWF laide dun script. Vous devez modifier le script de manire quil insre les paramtres allowNetworking appropris. Les pages HTML gnres par Flash et Adobe Flex Builder utilisent la fonction AC_FL_RunContent() pour incorporer des rfrences aux fichiers SWF. Vous devez ajouter les paramtres allowNetworking au script, comme illustr ci-aprs :
AC_FL_RunContent( ... "allowNetworking", "none", ...)

Les API suivantes sont interdites lorsque allowNetworking est dfini sur "internal" :

navigateToURL() fscommand() ExternalInterface.call()

Restriction des API de rseau

815

Outre les API listes ci-dessus, les API ci-aprs sont galement interdites lorsque allowNetworking a la valeur "none" :

sendToURL() FileReference.download() FileReference.upload() Loader.load() LocalConnection.connect() LocalConnection.send() NetConnection.connect() NetStream.play() Security.loadPolicyFile() SharedObject.getLocal() SharedObject.getRemote() Socket.connect() Sound.load() URLLoader.load() URLStream.load() XMLSocket.connect()

Mme si le paramtre allowNetworking slectionn permet au fichier SWF dutiliser une API de rseau, dautres restrictions peuvent survenir en fonction des limites fixes par le sandbox de scurit, comme dcrit dans ce chapitre. Si allowNetworking est dfini sur "none", vous ne pouvez pas rfrencer un mdia externe dans une balise <img> de la proprit htmlText dun objet TextField (si vous le faites, une exception SecurityError est renvoye). Si allowNetworking est dfini sur "none", un symbole issu dune bibliothque partage importe dans loutil de programmation Flash (pas ActionScript) est bloqu lors de lexcution.

816

La scurit dans Flash Player

Scurit du mode plein cran


Flash Player version 9.0.27.0 et ultrieure prend en charge le mode plein cran, dans lequel le contenu Flash peut remplir tout lcran. Pour passer en mode plein cran, la proprit displayState de la scne est dfinie avec la constante StageDisplayState.FULL_SCREEN. Pour plus dinformations, voir Utilisation du mode plein cran , la page 415. Lexcution de fichiers SWF dans un navigateur impose la prise en considration de certains points de scurit. Lactivation du mode plein cran seffectue dans les balises <object> et <embed> de la page HTML qui contient la rfrence au fichier SWF. Pour ce faire, ajoutez le paramtre allowFullScreen et attribuez-lui la valeur "true" (la valeur par dfaut est "false"), comme le montre lexemple suivant :
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/ swflash.cab#version=9,0,18,0" width="600" height="400" id="test" align="middle"> <param name="allowFullScreen" value="true" /> <param name="movie" value="test.swf" /> <param name="bgcolor" value="#333333" /> <embed src="test.swf" allowFullScreen="true" bgcolor="#333333" width="600" height="400" name="test" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /> </object>

Une page HTML peut galement gnrer des balises dincorporation SWF laide dun script. Vous devez modifier le script de manire quil insre les paramtres allowFullScreen appropris. Les pages HTML gnres par Flash et Flex Builder utilisent la fonction AC_FL_RunContent() pour incorporer des rfrences aux fichiers SWF. Vous devez ajouter les paramtres allowFullScreen au script, comme illustr ci-aprs :
AC_FL_RunContent( ... "allowFullScreen", "true", ...)

Le code ActionScript qui lance le mode plein cran peut tre uniquement appel en rponse un vnement souris ou clavier. Sil est appel dans dautres situations, Flash Player renvoie une exception. En mode plein cran, les utilisateurs ne peuvent effectuer aucune saisie dans les champs texte. Lensemble des entres clavier et du code ActionScript li au clavier est dsactiv en mode plein cran, lexception des raccourcis clavier qui peuvent rtablir le mode normal (par exemple la touche Echap).

Scurit du mode plein cran

817

Lorsque le contenu passe en mode plein cran, un message saffiche pour indiquer lutilisateur comment quitter ce mode et revenir au mode normal. Le message saffiche pendant quelques secondes, puis sestompe. Lappel de la proprit displayState dun objet Stage renvoie une exception pour tout appelant qui nappartient pas au mme sandbox de scurit que le propritaire de lobjet Stage (le fichier SWF principal). Pour plus dinformations, voir scurit de la scne , la page 824. Pour dsactiver le mode plein cran pour les fichiers excuts dans des navigateurs, les administrateurs peuvent dfinir FullScreenDisable = 1 dans le fichier mms.cfg. Pour plus dinformations, voir Contrles administrateur , la page 801. Pour accder au mode plein cran dans un navigateur, un fichier SWF doit se trouver au sein dune page HTML. Le mode plein cran est toujours autoris dans le lecteur autonome ou dans un fichier de projection.

Chargement de contenu
Un fichier SWF peut charger les types de contenu suivants :

Fichiers SWF Images Son Vido

Chargement de fichiers SWF et dimages


La classe Loader permet de charger des fichiers SWF et des images (fichiers JPG, GIF ou PNG). Un fichier SWF, sil ne se trouve pas dans le sandbox local avec systme de fichiers, peut charger des fichiers SWF et des images depuis nimporte quel domaine rseau. Seuls les fichiers SWF associs aux sandboxes locaux peuvent charger des fichiers SWF et des images issus du systme de fichiers local. Cependant, les fichiers du sandbox local avec rseau peuvent uniquement charger des fichiers SWF locaux qui se trouvent dans le sandbox local approuv ou avec rseau. Les fichiers SWF associs au sandbox local avec rseau peuvent charger du contenu autre que des fichiers SWF (par exemple des images), mais ne peuvent pas accder aux donnes du contenu charg.

818

La scurit dans Flash Player

Lorsque vous chargez un fichier SWF dune source non approuve (telle quun domaine autre que celui du fichier SWF racine de lobjet Loader), il peut savrer utile de dfinir un masque pour ce dernier, afin dempcher le contenu charg, qui est un enfant de lobjet Loader, dapparatre dans des parties de la scne qui ne relvent pas de ce masque, comme illustr par le code suivant :
import flash.display.*; import flash.net.URLRequest; var rect:Shape = new Shape(); rect.graphics.beginFill(0xFFFFFF); rect.graphics.drawRect(0, 0, 100, 100); addChild(rect); var ldr:Loader = new Loader(); ldr.mask = rect; var url:String = "http://www.unknown.example.com/content.swf"; var urlReq:URLRequest = new URLRequest(url); ldr.load(urlReq); addChild(ldr);

Lorsque vous appelez la mthode load() de lobjet Loader, vous pouvez spcifier un paramtre context, qui constitue un objet LoaderContext. La classe LoaderContext inclut trois proprits qui vous permettent de dfinir comment le contenu charg sera utilis :

checkPolicyFile : cette proprit est rserve au chargement dun fichier image, pas dun SWF. Spcifiez-la pour un fichier image issu dun domaine autre que celui du fichier contenant lobjet Loader. Si vous dfinissez cette proprit sur true, Loader recherche sur le serveur dorigine un fichier de rgulation interdomaine (voir Contrles de site Web (fichiers de rgulation interdomaine) , la page 806). Si le serveur autorise laccs au domaine Loader, le code ActionScript des fichiers SWF du domaine Loader peuvent accder limage charge. En dautres termes, vous pouvez utiliser soit la proprit Loader.content pour obtenir une rfrence un objet Bitmap qui reprsente limage charge, soit la mthode BitmapData.draw() pour accder aux pixels de limage charge.

Chargement de contenu

819

securityDomain : utilisez cette proprit uniquement pour le chargement dun fichier SWF, pas pour une image. Spcifiez-la pour un fichier SWF issu dun domaine autre que celui du fichier contenant lobjet Loader. Seules deux valeurs sont correctement prises en charge pour la proprit securityDomain : null (valeur par dfaut) et SecurityDomain.currentDomain. Si vous spcifiez SecurityDomain.currentDomain, le fichier SWF charg est import sur demande dans le sandbox du fichier SWF lorigine du chargement. Par consquent le fichier fonctionne comme sil avait t charg partir du serveur du fichier appelant. Cette opration nest permise que si le fichier de rgulation interdomaine se trouve sur le serveur du fichier SWF charg, pour quil soit accessible au domaine du fichier SWF lorigine de chargement. Si le fichier ncessaire est dtect, les deux fichiers peuvent librement effectuer une programmation croise ds le dbut du chargement, puisquils se trouvent dans le mme sandbox. Notez que limportation dans le sandbox peut presque tre remplace par un chargement ordinaire suivi dun appel du fichier SWF charg la mthode Security.allowDomain(). Cette dernire peut savrer plus simple utiliser puisque le fichier SWF charg se trouve alors dans son sandbox naturel, pouvant ainsi accder aux ressources de son propre serveur. applicationDomain : utilisez cette proprit uniquement lors du chargement dun fichier SWF crit avec ActionScript 3.0 (et non une image ou un fichier SWF crit avec ActionScript 1.0 ou 2.0). Lors du chargement du fichier, vous pouvez spcifier sil doit tre plac dans un domain dapplication particulier, plutt que dans le domaine par dfaut, cest--dire un nouveau domaine cr comme enfant du domaine dapplication du fichier SWF lorigine du chargement. Notez que les domaines dapplication sont des sousensembles des domaines de scurit. Ainsi, vous pouvez uniquement spcifier un domain dapplication cible si le fichier SWF charg provient de votre propre de domaine de scurit, soit parce quil appartient votre propre serveur, soit parce que vous lavez import dans votre domaine de scurit laide de la proprit securityDomain. Si vous spcifiez un domaine dapplication mais que le fichier SWF charg fait partie dun domaine de scurit diffrent, le domaine que vous spcifiez dans applicationDomain est ignor. Pour plus dinformations, voir Utilisation de la classe ApplicationDomain , la page 736.

Pour plus dinformations, voir Spcification du contexte de chargement , la page 449. Lobjet Loader possde une importante proprit, contentLoaderInfo, qui constitue un objet LoaderInfo. Contrairement la plupart des objets, un objet LoaderInfo est partag entre le fichier SWF lorigine du chargement et le contenu charg. Il est en outre accessible par les deux parties. Si le contenu charg est un fichier SWF, il peut accder lobjet LoaderInfo au moyen de la proprit DisplayObject.loaderInfo. Les objets LoaderInfo incluent des informations telles que la progression du chargement, lURL du fichier de chargement et du fichier charg, la relation de confiance entre ces deux fichiers, et dautres renseignements. Pour plus dinformations, voir Suivi de la progression du chargement. , la page 447.

820

La scurit dans Flash Player

Chargement de sons et vidos


En dehors des fichiers du sandbox local avec systme de fichiers, tous les fichiers SWF sont autoriss charger des sons et des vidos en provenance dun rseau grce aux mthodes Sound.load(), NetConnection.connect() et NetStream.play(). Seuls les fichiers SWF locaux peuvent charger des mdias du systme de fichiers local. Seuls les fichiers du sandbox local avec systme de fichiers et du sandbox local approuv peuvent accder aux donnes de ces fichiers chargs. Dautres restrictions sappliquent laccs aux donnes partir dun mdia charg. Pour plus dinformations, voir Accs aux mdias chargs comme sil sagissait de donnes , la page 826.

Chargement de fichiers SWF et dimages laide de la balise <img> dun champ texte
La balise <img> permet de charger des fichiers SWF et bitmap dans un champ texte, comme le montre le code suivant :
<img src = 'filename.jpg' id = 'instanceName' >

Pour accder au contenu charg de cette manire, utilisez la mthode getImageReference() de linstance TextField, comme dans le code suivant :
var loadedObject:DisplayObject = myTextField.getImageReference('instanceName');

Notez cependant que les fichiers SWF et image chargs de cette manire sont placs dans le sandbox correspondant leur origine. Lorsque vous chargez un fichier image laide de la balise <img> dun champ texte, laccs aux donnes de limage peut tre autoris par le biais du fichier de rgulation interdomaine. Vous pouvez vrifier lexistence dun tel fichier en ajoutant lattribut checkPolicyFile la balise <img>, comme le montre le code suivant :
<img src = 'filename.jpg' checkPolicyFile = 'true' id = 'instanceName' >

Lorsque vous chargez un SWF laide de la balise <img> dun champ texte, vous pouvez autoriser laccs aux donnes de ce fichier SWF via un appel la mthode Security.allowDomain().

Chargement de contenu

821

Si vous utilisez la balise <img> dun champ texte pour charger un fichier externe (plutt que dincorporer une classe Bitmap dans votre fichier SWF), un objet Loader est automatiquement cr comme enfant de lobjet TextField et le fichier externe est charg dans le Loader comme si vous aviez utilis lobjet Loader dans ActionScript pour charger ce fichier. Dans ce cas, la mthode getImageReference() renvoie le Loader automatiquement cr. Aucune vrification de scurit nest ncessaire pour charger cet objet Loader car il se trouve dans le mme sandbox de scurit que le code appelant. Toutefois, si vous faites rfrence la proprit content de lobjet Loader pour accder au mdia charg, des rgles de scurit sappliquent. Si le contenu est une image, vous devez mettre en uvre un fichier de rgulation interdomaine ; sil sagit dun fichier SWF, vous devez modifier le code de ce fichier de manire quil appelle la mthode allowDomain().

Contenu diffus laide de serveur RTMP


Flash Media Server utilise le protocole RTMP (Real-Time Media Protocol) pour servir des donnes, des sons et des vidos. Un fichier SWF charge ce type de mdia laide de la mthode connect() de la classe NetConnection, en transmettant une URL RTMP comme paramtre. Flash Media Server peut restreindre les connexions et empcher le tlchargement du contenu, selon le domaine du fichier requis. Pour plus dinformations, reportez-vous la documentation Flash Media Server. Pour les mdias chargs partir de sources RTMP, vous ne pouvez pas utiliser les mthodes BitmapData.draw() et SoundMixer.computeSpectrum() pour extraire les donnes image et son au moment de lexcution.

Programmation croise
Si deux fichiers SWF crits en ActionScript 3.0 sont servis partir dun mme domaine (par exemple lURL de lun est http://www.example.com/swfA.swf et celle de lautre est http://www.example.com/swfB.swf ), alors lun des fichiers SWF peut examiner et modifier les variables, objets, proprits, mthodes, etc. de lautre fichier, et inversement. On parle de programmation croise. La programmation croise nest pas prise en charge entre les fichiers SWF AVM1 et AVM2. Un fichier SWF AVM1 est un fichier cr avec ActionScript 1.0 ou ActionScript 2.0. (AVM1 et AVM2 font rfrence la machine virtuelle ActionScript.) Vous pouvez nanmoins utiliser la classe LocalConnection pour changer des donnes entre AVM1 et AVM2.

822

La scurit dans Flash Player

Si deux fichiers SWF crits en ActionScript 3.0 sont servis partir de domaines diffrents (par exemple http://siteA.com/swfA.swf et http://siteB.com/swfB.swf ), par dfaut Flash Player ne permet pas la programmation entre swfA.swf et script swfB.swf, et inversement. Pour autoriser laccs des fichiers SWF issus dautres domaines, un fichier SWF doit appeler Security.allowDomain(). Ainsi, en appelant Security.allowDomain("siteA.com"), swfB.swf accepte la programmation en provenance des fichiers SWF de siteA.com. Dans toute situation interdomaine, il est important de dfinir clairement les deux parties impliques. Dans le cadre de cette tude, le fichier effectuant la programmation croise sera appel partie procdant laccs (habituellement le fichier SWF procdant laccs), et lautre ct sera appel partie cible (gnralement le fichier SWF cible). Lorsque siteA.swf programme siteB.swf, siteA.swf est la partie procdant laccs et site.B.swf la partie cible, comme le montre lillustration suivante :
siteA.com / swfA.swf
SWF

var url:String = "http://siteB.com/swfB.swf"; var req:URLRequest = new URLRequest(url); myLoader.load(req);

myLoader.content.eggCount = 3; myLoader.content.DisplayEggs(); Programmation croise 3 2 Autorisation

Chargement

Security.allowDomain("siteA.com");

var eggCount:Number; function DisplayEggs() { ... }; siteB.com / swfB.swf


SWF

Les autorisations interdomaine tablies avec Security.allowDomain() sont asymtriques. Dans lexemple ci-avant, siteA.swf peut programmer siteB.swf mais linverse nest pas possible car siteA.swf na pas appel la mthode Security.allowDomain() pour autoriser les fichiers SWF de siteB.com le programmer. Vous pouvez dfinir des autorisations symtriques si les deux fichiers SWF appellent la mthode Security.allowDomain().

Programmation croise

823

Outre la protection des fichiers SWF contre les scripts interdomaine provenant dautres fichiers SWF, Flash Player protge galement les fichiers SWF contre ce type de script provenant des fichiers HTML. La programmation HTML vers SWF est possible au moyen de rappel effectu avec la mthode ExternalInterface.addCallback(). Lorsque la programmation HTML vers SWF franchit les limites du domaine, le SWF cible doit galement appeler Security.allowDomain(), comme sil avait t appel par un fichier SWF, faute de quoi lopration choue. Pour plus dinformations, voir Contrles de cration (dveloppeur) , la page 810. Flash Player fournit en outre des contrles de scurit spcifiques la programmation SWF vers HTML. Pour plus dinformations, voir Contrle de laccs aux scripts dans une page Web hte , la page 834.

scurit de la scne
Certaines proprits et mthodes de lobjet Stage sont disponibles pour tout sprite ou clip de la liste daffichage. On dit cependant de lobjet Stage quil a un propritaire : le fichier SWF charg. Par dfaut, les proprits et mthodes suivantes de lobjet Stage sont uniquement disponibles pour les fichiers SWF du mme sandbox de scurit que le propritaire de lobjet Stage :
Proprits
align displayState frameRate height mouseChildren numChildren quality scaleMode showDefaultContextMenu stageFocusRect stageHeight stageWidth tabChildren textSnapshot width

Mthodes
addChild() addChildAt() addEventListener() dispatchEvent() hasEventListener() setChildIndex() willTrigger()

Pour quun fichier SWF dun sandbox diffrent de celui du propritaire de lobjet Stage puisse accder ces proprits et mthodes, le fichier SWF propritaire de lobjet Stage doit appeler la mthode Security.allowDomain(). Pour plus dinformations, voir Contrles de cration (dveloppeur) , la page 810.

824

La scurit dans Flash Player

La proprit frameRate est un cas part : tout fichier SWF peut lire la proprit frameRate. Toutefois, seuls les fichiers situs dans le sandbox de scurit du propritaire de lobjet Stage (ou ceux qui ont t autoriss laide de la mthode Security.allowDomain()) peuvent modifier cette proprit. Il existe galement des restrictions sur les mthodes removeChildAt() et swapChildrenAt(), mais ce sont des restrictions diffrentes des autres. Pour appeler ces mthodes, le code ne doit pas se trouver dans le mme domaine que le propritaire de lobjet Stage mais dans le mme domaine que le ou les objets enfant concerns ; ou le ou les objets enfant doivent appeler la mthode Security.allowDomain().

Parcours de la liste daffichage


La capacit dun fichier SWF daccder aux objets daffichage chargs partir dautres sandboxes fait lobjet de restrictions. Pour quun fichier SWF puisse accder un objet daffichage cr par un autre fichier SWF dans un sandbox diffrent, le fichier SWF cible doit appeler la mthode Security.allowDomain() pour autoriser laccs du domaine du fichier SWF procdant lappel. Pour plus dinformations, voir Contrles de cration (dveloppeur) , la page 810. Pour accder un objet Bitmap charg par un objet Loader, il faut quun fichier de rgulation inter-domaines existe sur le serveur dorigine du fichier image et que ce fichier accorde une autorisation au domaine du fichier SWF qui essaie daccder lobjet Bitmap (voir Contrles de site Web (fichiers de rgulation interdomaine) , la page 806). Lobjet LoaderInfo qui correspond au fichier charg (et lobjet Loader) inclut les trois proprits suivantes, qui dfinissent la relation entre lobjet charg et lobjet Loader : childAllowsParent, parentAllowsChild et sameDomain.

Programmation croise

825

Scurit dvnements
Les vnements lis la liste daffichage sont soumis des restrictions daccs de scurit en fonction du sandbox de lobjet daffichage qui distribue lvnement. Un vnement de la liste daffichage traverse des phases de capture et de propagation vers le haut (dcrites dans le Chapitre 10, Gestion dvnements , la page 335). Au cours de ces deux phases un vnement passe de lobjet daffichage source aux objets daffichage parent dans la liste daffichage. Si un objet parent appartient un sandbox de scurit diffrent de celui de lobjet daffichage source, la phase de capture ou de propagation vers le haut sarrte en dessous de cet objet parent, sauf si une relation de confiance est tablie entre le propritaire de lobjet parent et celui de lobjet source. Cette confiance mutuelle stablit des manires suivantes :
1.

Le fichier SWF propritaire de lobjet parent doit appeler la mthode Security.allowDomain() pour approuver le domaine du fichier SWF propritaire de lobjet source. Le fichier SWF propritaire de lobjet source doit appeler la mthode Security.allowDomain() pour approuver le domaine du fichier SWF propritaire de lobjet parent.

2.

Lobjet LoaderInfo qui correspond au fichier charg (et lobjet Loader) inclut les deux proprits suivantes, qui dfinissent la relation entre lobjet charg et lobjet Loader : childAllowsParent et parentAllowsChild. Pour les vnements distribus partir dobjets autres que les objets daffichage, il nexiste aucune vrification de scurit ni aucune implication lie la scurit.

Accs aux mdias chargs comme sil sagissait de donnes


Vous pouvez accder aux donnes grce aux mthodes telles que BitmapData.draw() et SoundMixer.computeSpectrum(). Par dfaut, un fichier SWF dun sandbox de scurit ne peut obtenir de donnes de pixels ou de donnes audio de la part dobjets graphiques ou audio rendus ou lus dans un mdia charg dun autre sandbox. Vous pouvez cependant utiliser les mthodes suivantes pour accorder cette autorisation :

Dans le fichier SWF charg, appelez la mthode Security.allowDomain() pour permettre laccs aux donnes des fichiers SWF dautres domaines. Pour un fichier image, son ou vido charg, ajoutez un fichier de rgulation interdomaine sur le serveur du fichier charg. Ce fichier de rgulation doit accorder laccs au domaine du fichier SWF qui tente dappeler la mthode BitmapData.draw() et SoundMixer.computeSpectrum() pour extraire des donnes de ce fichier.

Les sections qui suivent offrent des dtails sur laccs aux donnes bitmap, son et vido.

826

La scurit dans Flash Player

Accs aux donnes bitmap


La mthode draw() de lobjet BitmapData vous permet dextraire les pixels actuellement affichs de tout objet vers lobjet BitmapData. Il peut sagir des pixels dun objet MovieClip, dun objet Bitmap ou dun objet daffichage. Les conditions suivantes doivent tre remplies pour que la mthode draw() puisse extraire les pixels vers lobjet BitmapData :

Si lobjet source nest pas un fichier bitmap charg, lobjet source et (dans le cas dun objet Sprite ou MovieClip) tous ses objets enfant doivent provenir du mme domaine que lobjet appelant la mthode draw() ou se trouver dans un fichier SWF qui est devenu accessible lobjet appelant suite lappel de la mthode Security.allowDomain(). Si lobjet source est un fichier bitmap charg, cet objet doit provenir du mme domaine que lobjet appelant la mthode draw() ou son serveur source doit inclure un fichier de rgulation inter-domaines qui accorde lautorisation ncessaire au domaine appelant.

Si ces conditions ne sont pas runies, une exception SecurityError est renvoye. Lorsque vous appelez la mthode load() de la classe Loader, vous pouvez spcifier un paramtre context, qui constitue un objet LoaderContext. Si vous rglez la proprit checkPolicyFile de lobjet LoaderContext sur true, Flash Player recherche un fichier de rgulation interdomaine sur le serveur partir duquel limage est charge. Sil existe un fichier de rgulation interdomaine autorisant le domaine du fichier SWF lorigine du chargement, le fichier peut accder aux donnes de lobjet Bitmap ; dans le cas contraire, laccs est refus. Vous pouvez galement spcifier une proprit checkPolicyFile dans une image charge via la balise <img> dun champ texte. Pour plus dinformations, voir Chargement de fichiers SWF et dimages laide de la balise <img> dun champ texte , la page 821.

Accs aux donnes son


Les API ActionScript 3.0 suivantes, lies aux sons, font lobjet de restrictions de scurit :

La mthode SoundMixer.computeSpectrum() : toujours autorise pour les fichiers SWF qui se trouvent dans le mme sandbox de scurit que le fichier son. Des contrles de scurit sont ncessaires pour les fichiers se trouvant dans dautres sandboxes. La mthode SoundMixer.stopAll() : toujours autorise pour les fichiers SWF qui se trouvent dans le mme sandbox de scurit que le fichier son. Des contrles de scurit sont ncessaires pour les fichiers se trouvant dans dautres sandboxes. La proprit id3 de lobjet Sound : toujours autorise pour les fichiers SWF qui se trouvent dans le mme sandbox de scurit que le fichier audio. Des contrles de scurit sont ncessaires pour les fichiers se trouvant dans dautres sandboxes.

Accs aux mdias chargs comme sil sagissait de donnes

827

Chaque son est associ deux types de sandbox, un sandbox de contexte et un sandbox de propritaire :

Le domaine dorigine du son dtermine le sandbox de contexte. Celui-ci tablit si les donnes peuvent tre extraites du son via la proprit id3 du son et la mthode SoundMixer.computeSpectrum(). Lobjet qui dclenche la lecture du son dtermine le sandbox de propritaire, qui tablit son tour si le son peut tre arrt laide de la mthode SoundMixer.stopAll().

Lorsque vous chargez le son laide de la mthode load() de la classe Sound, vous pouvez spcifier un paramtre context, qui constitue un objet SoundLoaderContext. Si vous rglez la proprit checkPolicyFile de lobjet SoundLoaderContext sur true, Flash Player recherche un fichier de rgulation interdomaine sur le serveur partir duquel le son est charg. Sil existe un fichier de rgulation interdomaine autorisant le domaine du fichier SWF lorigine du chargement, le fichier peut accder la proprit id de lobjet Sound ; dans le cas contraire, laccs est refus. En outre, la proprit checkPolicyFile peut permettre dactiver la mthode SoundMixer.computeSpectrum() pour les sons chargs. La mthode SoundMixer.areSoundsInaccessible() vous permet de savoir si lappel la mthode SoundMixer.stopAll() nentranerait pas larrt de tous les sons parce que le sandbox de lune ou de plusieurs des proprits dobjet son sont inaccessibles lappelant. La mthode SoundMixer.stopAll() permet darrter tous les sons dont le sandbox propritaire est le mme que celui de lappelant de stopAll(). Elle arrte galement les sons dont la lecture a t dclenche par des fichiers SWF ayant appel la mthode Security.allowDomain() pour autoriser le domaine du fichier SWF appelant la mthode stopAll(). Tous les autres sons ne sont pas arrts ; vous pouvez vrifier leur prsence en appelant la mthode SoundMixer.areSoundsInaccessible(). Lappel de la mthode computeSpectrum() requiert que chaque son en cours de lecture soit issu du mme sandbox que lobjet appelant la mthode ou de la mme source qui a autoris laccs au sandbox de lappelant. Autrement, une exception SecurityError est renvoye. Pour les sons chargs partir de sons incorpors dans la bibliothque dun fichier SWF, lautorisation est accorde en appelant la mthode Security.allowDomain() dans le fichier SWF charg. Pour les sons chargs partir de sources autres que des fichiers SWF (des fichiers mp3 ou des vidos Flash), un fichier de rgulation interdomaine sur le serveur source doit autoriser laccs aux donnes dans le mdia charg. Vous ne pouvez pas utiliser la mthode computeSpectrum() si le chargement du son seffectue partir de flux RTMP. Pour plus dinformations, voir Contrles de cration (dveloppeur) , la page 810 et Contrles de site Web (fichiers de rgulation interdomaine) , la page 806.

828

La scurit dans Flash Player

Accs aux donnes vido


La mthode BitmapData.draw() vous permet de capturer des donnes de pixels partir de limage active dune vido. Il existe deux types de vido :

La vido RTMP La vido progressive, charge partir dun fichier FLX sans utiliser de serveur RTMP

La mthode BitmapData.draw() ne permet pas dutiliser la vido RTMP. Lorsque vous appelez la mthode BitmapData.draw() avec la vido progressive comme paramtre source, lappelant de BitmapData.draw() doit provenir du mme sandbox que le fichier FLV ou le serveur du fichier FLV doit contenir un fichier de rgulation qui autorise le domaine du fichier SWF appelant. Pour demander le tlchargement du fichier de rgulation, dfinissez la proprit checkPolicyFile de lobjet NetStream sur true.

Chargement des donnes


Les fichiers SWF permettent dchanger des donnes entre un serveur et ActionScript. Le chargement de donnes est une opration diffrente du chargement de mdia car les informations charges apparaissent directement dans ActionScript et non affiches sous forme de mdia. En rgle gnrale, les fichiers SWF peuvent charger des donnes partir de leur propre domaine. En revanche, des fichiers de rgulation interdomaine sont normalement ncessaires pour charger des donnes issues dautres domaines.

Utilisation de URLLoader et URLStream


Vous pouvez charger des donnes telles que des fichiers XML ou texte. Les mthodes load() des classes URLLoader et URLStream sont rgies par les autorisations dun fichier de rgulation inter-domaines. Si vous utilisez la mthode load() pour charger le contenu dun autre domaine que celui du fichier SWF qui appelle la mthode, Flash Player recherche le fichier de rgulation interdomaine sur le serveur des actifs chargs. Sil en existe un qui autorise laccs au domaine du fichier SWF lorigine du chargement, vous pouvez charger les donnes.

Chargement des donnes

829

Connexion aux sockets


Laccs interdomaine aux connexions socket et XML socket sont dsactives par dfaut. Laccs aux connexions socket dans le mme domaine que le fichier SWF sur les numros de port infrieur 1024 est galement dsactiv par dfaut. Vous pouvez autoriser laccs ces ports en servant un fichier de rgulation inter-domaines partir de lun des emplacements suivants :

Le mme port que la connexion socket principale Un port diffrent Un serveur HTTP sur le port 80 dans le mme domaine que le serveur socket

Si vous servez le fichier de rgulation interdomaine partir du mme port que la connexion socket principale, ou dun port diffrent, numrez les ports autoriss laide de lattribut to-ports du fichier de rgulation interdomaine, comme le montre lexemple suivant :
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> <!-- Policy file for xmlsocket://socks.mysite.com --> <cross-domain-policy> <allow-access-from domain="*" to-ports="507" /> <allow-access-from domain="*.example.com" to-ports="507,516" /> <allow-access-from domain="*.example.org" to-ports="516-523" /> <allow-access-from domain="adobe.com" to-ports="507,516-523" /> <allow-access-from domain="192.0.34.166" to-ports="*" /> </cross-domain-policy>

Pour rcuprer un fichier de rgulation socket partir du mme port que la connexion socket principale, il suffit dappeler la mthode Socket.connect() ou XMLSocket.connect(). De plus, si le domaine spcifi est diffrent du domaine du fichier SWF appelant, Flash Player tente automatiquement de rcuprer un fichier de rgulation partir du mme port que celui de la connexion principale. Pour rcuprer un fichier de rgulation socket partir dun port diffrent sur le mme serveur que la connexion principale, appelez la mthode Security.loadPolicyFile() avec la syntaxe spciale "xmlsocket", comme suit :
Security.loadPolicyFile("xmlsocket://server.com:2525");

Appelez la mthode Security.loadPolicyFile() avant la mthode Socket.connect() ou XMLSocket.connect(). Flash Player peut alors attendre le retour de votre requte de fichier de rgulation avant de dcider ou non dautoriser la connexion principale.

830

La scurit dans Flash Player

Si vous mettez en uvre un serveur socket et que vous devez fournir un fichier de rgulation socket, vous devez choisir de fournir le fichier de rgulation sur le mme port que celui qui accepte les connexions principales ou dutiliser un autre port. Dans les deux cas, votre serveur doit attendre la premire transmission du client avant de dcider sil envoie le fichier de rgulation ou sil dfinit une connexion principale. Lorsque Flash Player requiert un fichier de rgulation, il transmet toujours la chane suivante ds que la connexion est tablie :
<policy-file-request/>

Une fois que le serveur a reu cette chane, il peut transmettre le fichier de rgulation. Nenvisagez pas dutiliser la mme connexion pour la requte de fichier de rgulation et pour la connexion principale. Vous devez fermer la connexion une fois le fichier de rgulation transmis. A dfaut, Flash Player ferme la connexion du fichier de rgulation, puis tablit une autre connexion pour la connexion principale. Pour plus dinformations, voir Fichiers de rgulation socket , la page 808.

Envoi de donnes
Lenvoi de donnes seffectue lorsque le code ActionScript issu dun fichier SWF envoie des donnes un serveur ou une ressource. Lenvoi de donnes est toujours autoris pour les fichiers SWF de domaines rseau. Un fichier SWF local peut envoyer des donnes des adresses rseau uniquement si elles se trouvent dans le sandbox local approuv ou local avec rseau. Pour plus dinformations, voir Sandboxes locaux , la page 812. Vous pouvez utiliser la fonction flash.net.sendToURL() pour envoyer des donnes une URL. Dautres mthodes permettent denvoyer des requtes aux URL. Il sagit notamment des mthodes de chargement, telles que Loader.load() et Sound.load(), et des mthodes de chargement de donnes, telles que URLLoader.load() and URLStream.load().

chargement et tlchargement de fichiers


La mthode FileReference.upload() lance le chargement dun fichier slectionn par lutilisateur vers un serveur distant. Vous devez appeler la mthode FileReference.browse() ou FileReferenceList.browse() avant la mthode FileReference.upload().

Chargement des donnes

831

Lappel de la mthode FileReference.download() ouvre une bote de dialogue dans laquelle lutilisateur peut tlcharger un fichier partir dun serveur distant.
REMARQUE 832

Si votre serveur requiert une authentification utilisateur, seuls les fichiers SWF sexcutant dans un navigateur (cest--dire utilisant le module externe du navigateur ou le contrle ActiveX) peuvent fournir une bote de dialogue pour demander lutilisateur un nom et un mot de passe dauthentification, et uniquement pour les tlchargements. Flash Player ne permet pas de charger des fichiers sur un serveur qui requiert une authentification utilisateur.

Les chargements et tlchargements ne sont autoriss que si le fichier SWF appelant appartient au sandbox local avec systme de fichiers. Par dfaut, un fichier SWF ne peut pas lancer un chargement ou un tlchargement avec un serveur autre que le sien. Il peut le faire si le serveur en question fournit un fichier de rgulation inter-domaines accordant un accs au domaine du fichier SWF appelant.

Chargement de contenu incorpor partir de fichiers SWF imports dans un domaine de scurit
Lorsque vous chargez un fichier SWF, vous pouvez dfinir le paramtre context de la mthode load() de lobjet Loader utilis pour le chargement. Ce paramtre prend un objet LoaderContext. Si vous rglez la proprit securityDomain de cet objet LoaderContext sur Security.currentDomain, Flash Player recherche un fichier de rgulation interdomaine sur le serveur partir duquel le fichier SWF est charg. Sil en existe un qui autorise laccs au domaine du fichier SWF lorigine du chargement, vous pouvez charger le fichier SWF sous forme de mdia import. De cette manire, le fichier lorigine du chargement obtient laccs aux objets de la bibliothque du fichier SWF. Une autre mthode permet dautoriser laccs dun fichier SWF aux classes des fichiers SWF chargs partir dun sandbox de scurit diffrent : le fichier SWF charg doit simplement appeler la mthode Security.allowDomain() pour autoriser laccs du domaine du fichier SWF appelant. Cet appel la mthode Security.allowDomain() peut sajouter la mthode constructeur de la classe principale du fichier SWF charg. Ensuite, le fichier SWF lorigine du chargement doit ajouter un couteur dvnements pour rpondre lvnement init distribu par la proprit contentLoaderInfo de lobjet Loader. Cet vnement est distribu lorsque le fichier SWF charg a distribu la mthode Security.allowDomain() dans la mthode constructeur et que des classes du fichier SWF charg sont disponibles au fichier SWF lorigine du chargement. Ce dernier peut alors extraire les classes du fichier SWF charg en appelant Loader.contentLoaderInfo.applicationDomain.getDefinition().

La scurit dans Flash Player

Utilisation de contenus existants


Dans Flash Player 6, le domaine utilis par certains paramtres Flash Player dpend de la fin du domaine du fichier SWF. Il sagit notamment des paramtres dautorisations relatifs la camra et au microphone, aux quotas de stockage et au stockage dobjets partags persistants. Si le domaine du fichier SWF comprend plus de deux segments, par exemple www.example.com, le premier segment du domaine (www) est supprim et la fin du domaine est exploite. Ainsi, dans Flash Player 6, www.example.com et store.example.com sont utiliss sous la forme example.com par les paramtres cits plus haut. De mme, pour www.example.co.uk et store.example.co.uk, le domaine utilis par ces paramtres est example.co.uk. Cette caractristique pose problme pour les fichiers SWF issus de domaines distincts, tels que example1.co.uk et example2.co.uk, qui ont alors accs aux mmes objets partags. Dans Flash Player 7 et les versions ultrieures, les paramtres du lecteur sont par dfaut choisis en fonction du domain exact du fichier SWF. Par exemple, pour un fichier SWF issu de www.example.com les paramtres utilisent www.example.com. Pour un fichier SWF provenant de store.example.com, ils utilisent store.example.com. Dans le cas dun fichier SWF crit en ActionScript 3.0, si Security.exactSettings conserve la valeur par dfaut true, Flash Player utilise les domaines exacts pour les paramtres de lecteur. Si sa valeur est false, Flash Player utilise les paramtres de domaine de Flash Player 6. Si vous modifiez la valeur de exactSettings, vous devez le faire avant que ne survienne tout vnement obligeant Flash Player choisir des paramtres de lecteur (par exemple lutilisation dune camra ou dun microphone, ou lextraction dun objet partag persistant). Si vous avez publi un fichier SWF avec la version 6 et cr des objets partags persistants partir de ce fichier, vous devez, pour rcuprer ces objets persistants partir dun fichier SWF en ActionScript 3.0, attribuer la valeur false Security.exactSettings avant dappeler SharedObject.getLocal().

Dfinition des autorisations LocalConnection


La classe LocalConnection permet de dvelopper des fichiers SWF capables de schanger des instructions. Les objets LocalConnection peuvent communiquer uniquement avec les fichiers SWF sexcutant sur le mme ordinateur client, mais peuvent sexcuter dans diverses applications, par exemple un fichier SWF sexcutant dans un navigateur et un fichier SWF sexcutant dans une projection.

Dfinition des autorisations LocalConnection

833

Chaque communication LocalConnection implique un fichier SWF metteur et un fichier SWF rcepteur. Par dfaut, Flash Player permet les communications LocalConnection entre les fichiers SWF dun mme domaine. Pour les fichiers SWF de sandboxes diffrents, le rcepteur doit accorder une autorisation lmetteur laide de la mthode LocalConnection.allowDomain(). La chane transmettre comme argument la mthode LocalConnection.allowDomain() peut contenir lun des lments suivants : noms de domaine exacts, adresses IP et caractre gnrique *.
REMARQUE

Le format de la mthode allowDomain() nest plus le mme que dans ActionScript 1.0 et 2.0. Dans ces versions, allowDomain() tait une mthode de rappel que vous mettiez en uvre. Dans ActionScript 3.0, allowDomain() est une mthode intgre de LocalConnection que vous appelez. Le fonctionnement de la nouvelle version de allowDomain() est semblable celui de Security.allowDomain().

Un fichier SWF peut utiliser la proprit domain de la classe LocalConnection pour dterminer le domaine.

Contrle de laccs aux scripts dans une page Web hte


ActionScript 3.0 permet lexploitation de scripts externes grce aux API suivantes : La fonction flash.system.fscommand() La fonction flash.net.navigateToURL() (en cas de spcification dune instruction de script, telle que navigateToURL("javascript: alert(Hello from Flash Player.)") La fonction flash.net.navigateToURL() (lorsque le paramtre window est dfini sur "_top", "_self" ou "_parent") La mthode ExternalInterface.call()

Pour les fichiers SWF excuts localement, les appels ces mthodes aboutissent uniquement si le fichier SWF et la page Web qui le contient (le cas chant) se trouvent dans le mme sandbox de scurit. Ils chouent si le contenu provient du sandbox local avec rseau ou local avec systme de fichiers. Le paramtre AllowScriptAccess du code HTML qui charge le fichier SWF permet de contrler la fonctionnalit de script externe partir dun fichier SWF.

834

La scurit dans Flash Player

Dfinissez ce paramtre dans le code HTML de la page Web qui accueille le fichier SWF, dans la balise PARAM ou EMBED. Le paramtre AllowScriptAccess peut prendre lune des trois valeurs : "always", "sameDomain" ou "never".

Si la valeur de AllowScriptAccess est "sameDomain", lutilisation de script externe est uniquement autorise si le fichier SWF et la page Web se trouvent dans le mme domaine. Il sagit de la valeur par dfaut pour le contenu AVM2. Lorsque AllowScriptAccess a pour valeur "never", les scripts externes chouent systmatiquement. Si AllowScriptAccess a pour valeur "always", les scripts externes russissent systmatiquement.

Si le paramtre AllowScriptAccess nest pas dfini pour un fichier SWF dans la page HTML, sa valeur par dfaut est "sameDomain" pour le contenu AVM2. Ci-aprs est illustre la dfinition de la balise AllowScriptAccess dans une page HTML :
<object id='MyMovie.swf' classid='clsid:D27CDB6E-AE6D-11cf-96B8444553540000' codebase='http://download.adobe.com/pub/shockwave/cabs/ flash/swflash.cab#version=9,0,0,0' height='100%' width='100%'> <param name='AllowScriptAccess' value='never'/> <param name='src' value=''MyMovie.swf'/> <embed name='MyMovie.swf' pluginspage='http://www.adobe.com/go/ getflashplayer' src='MyMovie.swf' height='100%' width='100%' AllowScriptAccess='never'/> </object>

Le paramtre AllowScriptAccess peut empcher un fichier SWF hberg dans un domaine daccder au script dune page HTML provenant dun autre domaine. La scurit des scripts situs dans une page HTML peut tre garantie en utilisant AllowScriptAccess="never" pour tous les fichiers SWF hbergs par dautres domaines. Pour plus dinformations, voir les entres suivantes dans la Rfrence du langage et des composants ActionScript 3.0 :

La fonction flash.system.fscommand() La fonction flash.net.navigateToURL() La mthode call() de la classe ExternalInterface

Contrle de laccs aux scripts dans une page Web hte

835

Objets partags
Flash Player offre la possibilit dutiliser des objets partags, cest--dire des objets ActionScript qui persistent en dehors dun fichier SWF, soit localement dans le systme de fichiers de lutilisateur, soit distance sur un serveur RTMP. Les objets partags, comme dautres mdias dans Flash Player, sont rpartis dans des sandboxes de scurit. Le modle de sandbox des objets partags savre toutefois diffrent parce que les objets partags ne sont pas des ressources accessibles depuis dautres domaines. Les objets partags sont au contraire extraits dun magasin dobjets partags propre au domaine de chaque fichier SWF qui appelle les mthodes de la classe SharedObject. Normalement, lappartenance du magasin dobjets partags va au-del du domaine du fichier SWF : par dfaut, chaque fichier SWF utilise un magasin dobjets partags propre son URL dorigine complte. Le fichier SWF peut utiliser le paramtre localPath des mthodes SharedObject.getLocal() et SharedObject.getRemote() afin dexploiter un magasin dobjets partags associ une partie de son URL seulement. Ainsi, le fichier SWF peut autoriser le partage avec dautres fichiers SWF issus dautres URL. Mme si la valeur transmise au paramtre localPath est /, celle-ci spcifie tout de mme un magasin dobjets partags propres son domaine. Les utilisateurs peuvent limiter laccs aux objets partags via la bote de dialogue Paramtres de Flash Player ou le Gestionnaire des paramtres. Par dfaut, le volume dobjets partags crs ne peut dpasser 100 Ko de donnes par domaine. Les administrateurs et les utilisateurs peuvent galement limiter la capacit crire dans le systme de fichiers. Pour plus dinformations, voir Contrles administrateur , la page 801 et Contrles utilisateur , la page 804. Vous pouvez dfinir la scurisation dun objet partag en attribuant la valeur true au paramtre
secure de la mthode SharedObject.getLocal() ou SharedObject.getRemote(). Veuillez

noter les points suivants concernant le paramtre secure :

Si ce paramtre est dfini sur true, Flash Player cre un objet partag scuris ou obtient une rfrence un objet partag scuris existant. Cet objet partag scuris peut uniquement tre lu ou crit par des fichiers SWF reus via des connexions HTTPS et appelant SharedObject.getLocal() avec le paramtre secure rgl sur true. Si ce paramtre est dfini sur false, Flash Player cre un objet partag ou obtient une rfrence un objet partag existant, qui peut tre lu ou crit par des fichiers SWF reus via des connexions autres que HTTPS.

836

La scurit dans Flash Player

Si le fichier SWF appelant ne provient pas dune URL HTTPS, lattribution de la valeur true au paramtre secure de la mthode SharedObject.getLocal() ou SharedObject.getRemote() renvoie un exception SecurityError. Le choix du magasin dobjets partag dpend de lURL dorigine du fichier SWF. Cela reste vrai mme dans les deux cas de figure o un fichier SWF ne provient pas dune URL simple : limportation et le chargement dynamique. Limportation sapplique lorsque vous chargez un fichier SWF dont la proprit LoaderContext.securityDomain a la valeur SecurityDomain.currentDomain. Dans ce cas, le fichier SWF charg portera une pseudoURL qui commence par le domaine du fichier SWF lorigine du chargement, puis spcifie sa vritable URL dorigine. Le chargement dynamique renvoie au chargement dun fichier SWF laide de la mthode Loader.loadBytes(). Dans cette situation, le fichier SWF charg porte une pseudo-URL qui commence par lURL complte du fichier SWF lorigine du chargement, suivie dun entier didentification. Dans les deux cas de figure (importation et chargement dynamique), la pseudo-URL du fichier SWF peut tre analyse laide de la proprit LoaderInfo.url. Cette pseudo-URL est traite comme une URL relle pour dfinir le magasin dobjets partags. Elle peut tre utilise en partie ou dans son intgralit comme paramtre localPath dun objet partag. Les utilisateurs et les administrateurs peuvent choisir de dsactiver lutilisation dobjets partags tiers. Il sagit des objets partags utiliss par tout fichier SWF excut dans un navigateur Web lorsque lURL dorigine de ce fichier SWF est dun domaine diffrent de lURL affiche dans la barre dadresse du navigateur. Les administrateurs et utilisateurs peuvent choisir de dsactiver lutilisation des objets partags pour des raisons de confidentialit, sils souhaitent viter la surveillance interdomaine. Pour viter cette restriction, il est judicieux de veiller ce que tous les fichiers SWF utilisant des objets partags soient chargs uniquement dans une structure de pages HTML qui garantit que le fichier provient du mme domaine que celui affich dans la barre dadresse du navigateur. Si vous essayez dutiliser des objets partags partir dun fichier SWF tiers et que lutilisation des objets partags tiers est dsactive, les mthode SharedObject.getLocal() et SharedObject.getRemote() renvoient la valeur null. Pour plus dinformations, voir www.adobe.com/products/flashplayer/articles/thirdpartylso.

Objets partags

837

Accs la camra, au microphone, au presse-papiers, la souris et au clavier


Lorsquun fichier SWF essaie daccder la camra ou au microphone de lutilisateur laide de la mthode Camera.get() ou Microphone.get(), Flash Player affiche une bote de dialogue de confidentialit, dans laquelle lutilisateur peut autoriser ou refuser laccs sa camra ou son microphone. Lutilisateur et ladministrateur peuvent galement dsactiver laccs la camra de manire globale ou pour chaque site, grce aux commandes du fichier mms.cfg, de linterface de paramtrage et du Gestionnaire des paramtres (voir Contrles administrateur , la page 801 et Contrles utilisateur , la page 804). Si des restrictions utilisateur sappliquent, les mthodes Camera.get() et Microphone.get() renvoient chacune la valeur null. La proprit Capabilities.avHardwareDisable vous permet de dterminer si ladministrateur a interdit (valeur true) ou autoris (valeur false) la camra et le microphone. La mthode System.setClipboard() autorise un fichier SWF remplacer le contenu du presse-papiers par une chane de caractres en texte brut, ce qui ne pose aucun risque de scurit. Aucune mthode getClipboard (en lecture) ne permet dempcher les mots de passe et autres donnes sensibles dtre coups ou copis dans le presse-papiers. Une application Flash peut uniquement contrler les vnements de clavier et de souris qui se produisent dans son focus. Elle ne peut pas dtecter les vnements de souris et de clavier qui se produisent dans une autre application.

838

La scurit dans Flash Player

Index

Symboles
!= (ingalit) 223 !== (ingalit stricte) 223 & (esperluette) 685 (), oprateur (parenthses) 114 * (caractre gnrique), oprateur, XML 383 + (addition), oprateur 224 += (affectation daddition), oprateur 224 +=, oprateur (daffectation de laddition) 381 , oprateur (virgule) 90 . (point), oprateur 112, 134 . (point), oprateur, XML 373, 382 . caractre de remplacement (point) .. (accesseur descendant), oprateur, XML 382 ... paramtre (rest) 142 / (barre oblique) 310, 312 : oprateur (deux points) 95 < oprateur 119 > oprateur 119 >oprateur = 223 ?: (conditionnel), oprateur 125 @) (identificateur dattribut), oprateur, XML 373, 383 [ (crochet gauche) 312 \ (caractre dchappement) dans une chane 221 dans une expression rgulire 312 \? (point dinterrogation) ] (crochet droit) 312 ^ (caret) 312 __proto__ 73 __resolve 73 | (barre) 318

A
access control 176 accesseur descendant (..), oprateur, XML 382 ActionScript propos de 72 avantage 22 compatibilit avec les versions prcdentes 27 cration dune application avec 50 description de 21 documentation 17 criture avec un diteur de texte 54 historique de la prise en charge de la POO 184 mthode permettant dintgrer dans une application 51 nouvelle fonction 23 outil pour lcriture 53 processus de dveloppement 55 stockage dans des fichiers ActionScript 51 ActionScript 1.0 184 ActionScript 2.0, chanage du prototype 187 ActionScript Virtual Machine (AVM1) 184 ActionScript Virtual Machine 2 (AVM2) 184, 189 addCallback(), mthode 824 addEventListener(), mthode 166, 342, 357 addListener(), mthode 342 adresse URL dun objet charg 448 affichage du signal provenant de la camra 610 affichage, architecture 395, 476 affichage, objets ajout la liste daffichage 407 assemblage dobjets compliqus 405 cration 406 gestion de la profondeur 404 groupement 407 hritage des classes de base 401

839

hors liste 405 sous-classement 405 tches courantes 398 terminologie 399 types 401 affichage, objets d animation 444 choix dune sous-classe 418 dfinition des couleurs 438 vnements 417 fondu 440 masquage 441 mise en mmoire cache 432 positionnement 420, 421 redimensionnement 428, 429 rglage de la couleur 437 rotation 440 size 428 allowDomain(), mthode propos de la programmation croise 823 balise img et 821 constructeur et 832 contexte de chargement 449 LocalConnection, classe 695 son et 828 allowFullScreen, attribut 817 allowInsecureDomain(), mthode 695 allowNetworking, balise 815 AllowScriptAccess, paramtre 835 amlioration des performances pour les objets daffichage 432 animation 444 annotation de type 89, 95 annotation de type (*) astrisque 93, 96, 104 annotation de type * (astrisque) 93, 96, 104 anti-aliasing, texte 557 API externe propos de 768 avantage 772 concept et terme 769 exemple 779 tche courante 768 XML, format 777 application deffets de fondu des objets daffichage 440 application de balado cration 655 extension 663

application, dcision de dveloppement 50 application/x-www-form-urlencoded 683 ApplicationDomain, classe 449, 736, 820 apply(), mthode 260 argument, transfert par rfrence ou valeur 138 arguments, objet 137, 140, 142 arguments.callee, proprit 140 arguments.caller, proprit 141 arguments.length, proprit 140 Array, classe algorithme de constructeur 261 concat(), mthode 250 extension 259 join(), mthode 250 length, proprit 246, 252 pop(), mthode 245 push(), mthode 244, 262 reverse(), mthode 246 shift(), mthode 245 slice(), mthode 250 sort(), mthode 246 sortOn(), mthode 246, 249 splice(), mthode 244, 245 toString(), mthode 250 unshift(), mthode 244 arrt de clips 525 arrire-plan opaque 435 as, oprateur 99, 170 association 105, 106, 109 astrisque (caractre gnrique), oprateur, XML 383 autorisation LocalConnection, classe 833 avance rapide, clips 525 avHardwareDisable, proprit 802 AVM1Movie, classe 402 AVM2 (ActionScript Virtual Machine 2) 184, 189

B
barre (|), caractre 318 barre oblique 310, 312 barre oblique (/) 310, 312 barre oblique inverse (\) 221, 312 beginGradientFill (), mthode 484 bitmap caching caching movie clips 435 Bitmap, classe 401, 575

840

Index

bitmaps dfinition dans la classe Bitmap 401 fichier, format 572 lissage 576 opaques ou transparents 573 prsentation 572 scurit 827 Boolean, classe association 109 coercition implicite en mode strict 106 boucle do..while 131 boucle while 130 bubbles, proprit 347 ByteArray, classe 258

C
call(), mthode (classe ExternalInterface) 815, 834 callback methods ignoring 599 callee, proprit 140 caller, proprit 141 camra scurit 833, 838 Camera, classe 609 camras affichage du signal 610 capture de la saisie 609 lecture, conditions 616 permissions 612 vrification de linstallation 611 cancelable, proprit 345 Capabilities, classe 735 Capabilities.avHardwareDisable, proprit 802 Capabilities.localFileReadDisable, proprit 802 capture dun signal vido provenant de la camra de lutilisateur 609 capture de texte slectionn par lutilisateur 548 caractre dans une expression rgulire 311 caractre ASCII 217 caractre barre (|) 318 caractre dchappement (\) dans une chane 221 dans une expression rgulire 312 caractre de changement de page 221 caractre de nouvelle ligne 221 caractre de remplacement $ 312 caractre de remplacement ( ) (parenthse) 312

caractre de remplacement * (astrisque) 312 caractre de remplacement + (plus) 312 caractre de remplacement astrisque (*) 312 caractre de remplacement point (.) caractre de remplacement point dinterrogation (\?) caractre de remplacement signe dollar ($) 312 caractre de remplacement, dans une expression rgulire 311, 313 caractre de tabulation 221 caractre dlimiteur, utilisation pour diviser des chanes en un tableau 227 caractre gnrique (*), oprateur, XML 383 caractre Unicode 217 caractres dans une chane 222, 226 caret (^) 312 chanage de prototype 186 chane combinaison de tableaux en une chane spare par des caractres 269 conversion dun objet XML en 388 conversion dun type de donnes pour un attribut XML 389 recherche dune correspondance dans une expression rgulire 327 sous-chane correspondante 320 chane de domaine 145 chane de porte 182 chane de prototype 73 chane spare par des caractres, combinaison de tableaux en 269 chanes comparaison 223 concatnation 224 conversion de la casse 230 dclaration 220 exemple 230, 231 length 221 modle, recherche 225 motif, recherche 227 position dun caractre 226 positions dindex 222 recherche de sous-chanes 225 remplacement de texte 227 sous-chanes 225, 227 tches courantes 218 terminologie 219 champ texte balise img et scurit 821 dsactivation de lIME pour 743

Index

841

champs texte dfilant, texte 546 dynamiques 541 HTML dans 552 images intgres 545 modification 544 saisie 541 statiques 541 champs texte dynamique 541 champs texte statique 541 charAt(), mthode 222 charCodeAt(), mthode 222 chargement dun fichier 709, 716 chargement de fichiers 831 chargement de graphismes 446 chargement dynamique de contenu 446 checkPolicyFile, proprit 810 chemin de classe 78 chemin de cration 78 chemin source 78 childAllowsParent, proprit 825, 826 cible dvnement 336, 343 class, mot-cl 151 classe propos de lcriture du code pour 57 caractristique 33 classe prive 75 cration personnalise 56 dynamic 99 dynamique 134 intgr 73 organisation 59 public, classe 79 scell 99 classe BitmapData 575 classe derreur personnalise 286 classe de caractre (dans une expression rgulire) 314 classe de caractre nie (dans une expression rgulire) 316 classe dynamique 99, 134 classe Error de base ECMAScript 292, 295 Classe ExternalInterface 815 classe faade 657 classe intgre 73 classe personnalise 56 classe prive 75 classe scelle 99 Classe TextSnapshot 559 classe XML 76 Classe XMLSocket 698

classes abstraites non prises en charge 152 attributs 151 base 173 contrle daccs par dfaut 156 corps 152 dclaration des proprits static et instance 153 dfinition 151 dfinition en interne dun espace de nom 152 dynamic, attribut 152 dynamiques 155 hritage des proprits des instances 175 instructions de niveau suprieur 153 internal, attribut 156 prsentation 150 private, attribut 154 proprit, attributs 154 proprits statiques 180 protected, attribut 156 public, attribut 154 sous-classes 173 classes abstraites 152 classes dlments incorpors 169 classes de base 173 classes dynamiques 155 clavier, scurit 838 cl dobjet dans un tableau 253 cl de chane 252 cl, chane 252 clearInterval(), fonction 212 clearTimeout(), fonction 212 clic droit de la souris, menu (menu contextuel) 673 client LocalConnection personnalis 692 clips avance rapide 525 cadence dimages 413 concepts et terminologie 522 lecture et arrt 525 prsentation 521 rembobinage 525 tches courantes 522 clone(), mthode (classe Event) 349 code de caractre 669 code de remplacement 229 code de touche 669 code externe, appel partir dActionScript 774 code, mthode permettant dintgrer dans une application 51 codes de remplacement $ 229 ColdFusion 689

842

Index

collision, dtection au niveau des pixels 579 ColorTransform, classe 470 colorTransform, proprit 470 commentaire propos de 45, 115 dans XML 374, 375 communication entre des fichiers SWF 693 entre des fichiers SWF de domaines diffrents 695 entre des instances de Flash Player 690 compatibilit, Flash Player et les fichiers FLV 617 comportement par dfaut annulation 346 dfinition 341 computeSpectrum(), mthode (classe SoundMixer) 822, 826, 827 concat(), mthode Array, classe 250 String, classe 224 concatnation dun objet XML 381 de chanes 224 concept de base commentaire 45 contrle du flux 45 cration dune instance dobjet 42 vnement 35 exemple 46 mthode 34 objet 33 oprateur 44 proprit 34 variable 30 conflit de nom, prvention 76, 79 connect(), mthode LocalConnection, classe 816 NetConnection, classe 816, 821 Socket, classe 816 XMLSocket, classe 698 XMLSocket, XML 816 connexion socket 697 constante 116, 346 constantes 157 constructeurs en ActionScript 1.0 185 prsentation 160 constructeurs de type private non pris en charge 160 conteneur dobjets daffichage 397, 407 conteneur externe, obtention dinformation sur 774 content, proprit (classe Loader) 822

contentLoaderInfo, proprit 448, 832 contentType, proprit 683 contexte de chargement 449 contrle du flux, concept de base 45 conversion de type 105, 106, 388 conversion de type explicite 105 conversion de type implicite 105 cookie 702 cookie Flash 702 couleur darrire-plan, opaque 435 couleurs arrire-plan 435 combinaison de diffrentes images 436 modification dans un objet daffichage 437 modification spcifique 438 pour les objets daffichage 438 createBox(), mthode 469 createGradientBox(), mthode 484 crochet ([ et ]) 312 crochet douverture ([) 312 crochet de fermeture 312 crochet droit (]) 312 crochet gauche 312 CSS chargement 553 dfinition styles 552 currentDomain, proprit 832 currentTarget, proprit 348 curseur de souris, personnalisation 672 curseur, personnalisation 672

D
dataFormat, proprit 689 date et heure propos de 205 exemple 206 Date(), constructeur 207 Date, classe propos de 205 constructeur 207 date, proprit 208 day, proprit 208 fullYear, proprit 208 getMonth (), mthode 162, 208 getMonthUTC(), mthode 208 getTime (), mthode 208 getTimezoneOffset (), mthode 209

Index

843

hours, proprit 208 milliseconds, proprit 208 minutes, proprit 208 month, proprit 208 monthUTC, proprit 208 parse (), mthode 161 seconds, proprit 208 setTime (), mthode 208 date, proprit 208 day, proprit 208 dbogage 280 decode(), mthode 685 dcrmentation dune valeur 121 dfilant, texte 546, 547 dfinitions de classe, plusieurs 736 dgrad 484 dlai dexpiration 758 dlai dexpiration de script 758 Delegate, classe 354 delete, oprateur 135, 246 dveloppement planification 50 processus 55 Dictionary, classe propos de 253 useWeakReference, paramtre 255 diffusion vido en continu 596 directive despace de nom xml par dfaut 387 directive use namespace 84 dispatchEvent(), mthode 358 DisplayObject, classe prsentation 397, 406 proprit stage 343 sous-classes 401 DisplayObjectContainer, classe 397, 402, 407 displayState, proprit 415, 817 distance(), mthode 463 distribution dvnements 336 division par zro 103 document externe, chargement de donnes 685 Document Object Model (DOM) niveau 3, spcification dvnement 335, 341 documentation ActionScript 17 contenu de Programmation avec ActionScript 3.0 16 Flash 17 Ple de dveloppement et Ple de cration Adobe 19 documentation Flash 17 DOM, spcification dvnement 335, 341

domain, proprit (LocalConnection, classe) 834 domaine fonction et 136, 144 global 144 niveau bloc 91 variable 90 domaine de niveau bloc 91 domaine global 144 domaines, communication entre des 695 donnes chargement de donnes externes 683 envoi un serveur 689 scurit de 826, 831 donnes bitmap, copie 581 donnes externes, chargement 683 donnes RSS chargement, exemple 390 lecture pour une chane de balado 657 dotall, proprit dexpression rgulire 322 download(), mthode 816, 831 draw(), mthode 449, 819, 822, 826, 827, 829 dynamic, attribut 152

E
E4X Voir XML ECMAScript pour XML Voir XML couteur dvnements propos de changement dans ActionScript 3.0 342 cration en dehors dune classe 352 gestion 356 comme mthode de classe 353 suppression 358 technique viter 354 couteurs. Voircouteurs dvnements. diteur de texte 54 en boucle do..while 131 for (XML) 374, 386 for each..in 254, 386 for..in 129, 254, 386 while 130 encodage dune esperluette (&) 685 encodage URL 685 Endian.BIG_ENDIAN 697 Endian.LITTLE_ENDIAN 697 enterFrame, vnement 345

844

Index

numrations 166 enveloppe 94 environnement du systme client propos de 731 tche courante 732 environnement lexical 145 erreur propos de la gestion 272 affichage 284 asynchrone 276 classe personnalise 286 ErrorEvent, classe 288, 359 vnement bas sur le statut 288 outil de dbogage 280 print 755 renvoi 285 throw, instruction 283 type de 272, 275 erreur asynchrone 276 erreur synchrone 275 Error, classe propos de 292 ActionScript 295 ECMAScript. 292 ErrorEvent, classe 289, 359 espace blanc 375 espace de coordonne dfinition 460 translation 463 espace de nom propos de 80 application 82 AS3 260 dfinition 81 directive use namespace 84 espace de nom par dfaut 81 flash_proxy 84 importation 87 mot-cl namespace 81 ouverture 84 rfrence 83 spcificateur de contrle daccs 82 use namespace, directive 86 XML 387 espace de nom AS3 260 espace de nom dActionScript 3 192 espaces de nom AS3 192 attributs dfinis par lutilisateur 157 dfinition 152

use namespace, directive 192 esperluette (&) 685 toile (*). Voir astrisque vnement changement de statut 290 concept de base 35 erreur 288, 359 flux dvnements 336, 347 vnements Voir galement couteurs dvnements vnement derreur 288, 359 vnement derreur bas sur le statut 288 vnement de changement de statut 290 vnements pour les objets daffichage 417 comportement par dfaut 341 distribution 336, 358 enterFrame, vnement 345 flux dvnements 343 init, vnement 345 nud cible 343 nud parent 344 objet vnement 345 scurit 826 this, mot-cl 354 Event, classe propos de 345 bubbles, proprit 347 cancelable, proprit 345 catgorie de mthode 349 clone(), mthode 349 constantes 346 currentTarget, proprit 348 eventPhase, proprit 347 isDefaultPrevented(), mthode 350 preventDefault(), mthode 341, 350 sous-classes 350 stopImmediatePropogation(), mthode 349 stopPropogation(), mthode 349 target, proprit 348 toString(), mthode 349 type, proprit 345 Event.COMPLETE 683 EventDispatcher, classe addEventListener(), mthode 166, 342 dispatchEvent(), mthode 358 IeventDispatcher, interface 170 rfrence 112 willTrigger(), mthode 358 eventPhase, proprit 347

Index

845

exactSettings, proprit (classe Security) 833 exception 275 exec(), mthode 327 excution, dtermination du systme de lutilisateur 734 exemple analyseur Wiki 328 application de son 655 chargement de donnes RSS 390 cration dun client Telnet 717 dtection des capacits du systme 746 expression rgulire 328 gestion des erreurs 360 impression sur plusieurs pages 761 Matrix, classe 470 SimpleClock 213 tableau 265 utilisation de lAPI externe dans un conteneur de page Web 779 WordSearch 675 exemple avec la classe SpriteArranger 452 exemple dhorloge 213 exemple dun client Telnet 717 exemple de lanalyseur Wiki 328 exemple SimpleClock 213 exemple WordSearch 675 exemples animation dobjets Sprite laide dune image bitmap hors cran 585 chanes 230 filtrage des images 520 formatage du texte 560 GeometricShapes 193 jukebox vido 619 modification de lordre de superposition des objets daffichage 457 RuntimeAssetsExplorer 533 SpriteArranger, classe 452 exportation de symboles de la bibliothque 528 expression de fonction 133 expression rgulire propos de 306 caractre dans 311 caractre de remplacement 311, 312 classe de caractre 314 correspondance de sous-chane capture 320 cration 310 dlimiteur de barre oblique 310 exemple 328 groupe 319

groupe nomm 322 indicateur 322 mtasquence 311, 313 mthode pour utiliser 327 paramtre dans une mthode String 328 permutateur et groupe de caractres 320 permutation laide du caractre de remplacement barre (|) 318 proprit 322 quantificateur 316 recherche 326 extended, proprit dexpression rgulire 322 extends, mot-cl 173 ExternalInterface, classe 772, 834 ExternalInterface.addCallback(), mthode 824

F
feuilles de style en cascade. Voir CSS feuilles de style Voir CSS fichier chargement 716, 831 tlchargement 831 fichier de rgulation inter-domaines 830 balise img et 821 checkPolicyFile, proprit et 449 extraction de donnes 826 proprit checkPolicyFile et 827 proprit securityDomain et 820 URLLoader et URLStream, classes 829 fichier SWF communication entre des domaines 695 communication entre des instances 693 dtermination de lenvironnement dexcution 735 fichier SWF import 832 fichiers SWF chargement 446 chargement danciennes versions 533 chargement de donnes externes 532 importation 832 fichiers SWF externes, chargement 532 FileReference, classe 707, 816, 831 FileReferenceList, classe 716, 831 filtrage de donnes XML 384 filtres disponibles pour les objets daffichage et bitmap 502 application des objets BitmapData 499 application des objets daffichage 498

846

Index

cration 497 et mise en cache bitmap 500 fonctionnement 500 pour les images, exemple 520 modification des filtres lexcution 500 suppression des objets daffichage 499 tches courantes 496 filtres et mise en cache bitmap 500 fin dune instruction 114 final, attribut 97, 163, 167, 178 Flash Media Server 822 Flash Player communication entre des instances 690 compatibilit avec les fichiers FLV cods 617 IME et version 6 184 version de dbogage 359 flash, package 76 flash.display, package saisie utilisateur et 665 son et 627 flash.display, paquet bitmaps et 571 clips et 521 et API de dessin 475 filtrage 495 programmation de laffichage texte et 539 flash.geom, package 459 flash_proxy, espace de nom 84 Flex, utilisation pour ActionScript 54 flux dvnements 336, 343, 347 flux du programme 126 FLV configuration pour lhbergement sur serveur fichier, format de 591 Flash Player et 617 sur Macintosh 619 focus, gestion dans une interaction 673 fonction propos de 131 accesseur ajout dune proprit 144 anonyme 133, 141 appel 132 arguments, objet 137 domaine 136, 144 imbriqu 137 imbrique 144, 145 objet 143

paramtre 137 parenthse 132 rcursive 141 renvoi de valeurs 136 temporelle 212 fonction accesseur de dfinition. Voir mthodes de lecture et de dfinition fonction anonyme 133, 141 fonction closure 131, 137, 145 fonction imbrique 137, 144, 145 fonction rcursive 141 fonction temporelle 212 fonctions accesseur, get et set 163 for each..in, instruction 129, 254, 386 for, boucle 128 for, boucle, XML 374, 386 for..in, instruction 129, 254, 386 format dheure 206 formatage du texte 551, 555 frameRate, proprit 413 fromCharCode(), mthode 222 fscommand(), fonction 690, 815, 834 fullScreen, vnement 416 fullYear, proprit 208 function, mot-cl 132, 159 Function.apply(), mthode 260 fuseau horaire 207, 209

G
GeometricShapes, exemple 193 gomtrie propos de 459 concept et terme 461 concepts et terminologie 477 tche courante laide de 460 gestion de la mmoire 255 gestion de la profondeur, amlioration 404 gestion des erreurs comportement par dfaut 341 exemple 360 outil 278 stratgie 279 tche courante 273 terme 273 gestionnaire dvnements 340 gestionnaires dvnement 598 getDefinition(), mthode 832 getImageReference(), mthode 822

Index

847

getLocal(), mthode 703, 816, 833, 836 getMonth (), mthode 162, 208 getMonthUTC(), mthode 208 getRect (), mthode 467 getRemote(), mthode 703, 816, 836 getTime (), mthode 208 getTimer(), fonction 212 getTimezoneOffset (), mthode 209 GIF, graphismes 446 glisser-dposer capture dinteraction 671 cration dinteraction 422 graphismes, chargement 446 groupage des objets daffichage 407 groupe nomm (dans une expression rgulire) 322 groupe non captur, dans une expression rgulire 321 groupe, dans une expression rgulire 319 guillemets droits 220, 221 guillemets droits doubles dans les chanes 220, 221 guillemets droits simples dans les chanes 220, 221

H
hachage 251, 253 haut-parleur et microphone 652 hritage dfinition 173 proprit statique 180 proprits des instances 175 proprits fixes 190 hritage de classe 190 hritage des proprits fixes 190 hissage 92 horloge 210 hours, proprit 208 htmlText, proprit 545

I
id3, proprit 827 identifiant 80 identificateur dattribut (@), oprateur, XML 373, 383 IEventDispatcher, interface 356 IeventDispatcher, interface 169 ignoreCase, proprit dexpression rgulire 322 image scurit 827

images dans un champ texte 545 chargement 446 dfinition dans la classe Bitmap 401 exemple de filtrage 520 images, accs direct 526 IME vnement de composition 744 manipulation dans Flash Player vrification de la disponibilit 741 img, balise dun champ texte, scurit 821 import, instruction 78 impression propos de 752 concept et terme 753 dfinition de zone 759 exception et renvoi 755 expiration du dlai 758 hauteur et largeur de page 760 orientation 760 page 753 plusieurs pages, exemple 761 points 759 proprits de page 757 Rectangle, objet 759 redimensionnement 760 tche courante 752 vectorielle ou bitmap 757 impression bitmap 757 impression paysage 760 impression portrait 760 impression vectorielle 757 inclinaison dun objet daffichage 469 inclinaison dune matrice 469, 470 incompatibilit de types 95 incrmentation dune valeur 121 index, position dans une chane 222 indexOf(), mthode 226 indicateur dans une expression rgulire 322 indicateur dotall dans une expression rgulire 325 indicateur extended dans une expression rgulire 325 indicateur g (dans une expression rgulire) 322 indicateur global dans une expression rgulire 323 indicateur i (dans une expression rgulire) 322 indicateur ignore dans une expression rgulire 324 indicateur m (dans une expression rgulire) 322 indicateur multiline dans une expression rgulire 324 indicateur s (dans une expression rgulire) 322 indicateur x (dans une expression rgulire) 322 infini 103

848

Index

infini ngatif 103 infini positif 103 inheritance across packages 177 init, vnement 345 instance, cration 42 instanceof, oprateur 99 instruction conditionnelle 126 instruction de fonction 132 instruction if 126 instruction if..else 126 int, classe, association 106 interaction utilisateur, gestion du focus 673 InteractiveObject, classe 402 interception de blocs 281 interfaces dfinition 171 extension 171 implmentation dune classe 172 prsentation 169 interfaces IDataInput et IDataOutput 697 internal attribute 176 internal, attribut 79, 81, 156 intersection (), mthode 467 intersects(), mthode 467 intervalle temporel 210 is, oprateur 98, 170 isDefaultPrevented(), mthode 350 isNaN(), fonction globale 93

J
join(), mthode 250 JPG, graphismes 446

L
lastIndexOf (), mthode 226 lecture des clips 524 contrle de la frquence daffichage 413 et camra 616 interruption et reprise de la lecture 662 surveillance audio 661 vido 594 lecture audio, surveillance 661 lecture en boucle for 128 for each..in 129

lecture et dfinition prsentation redfinition 180 length, proprit arguments, objet 140 Array, classe 246 chanes 221 level, proprit 359 lineGradientStyle (), mthode 484 lissage des bitmaps 576 liste daffichage scurit 825 liste daffichage avantages 403 flux dvnements 343 prsentation 395 traverse 411 littral compos 113 littral dobjet 252 load(), mthode (classe Loader) 449, 810, 816 load(), mthode (classe Sound) 810, 816, 821, 831 load(), mthode (classe URLLoader) 684, 816 load(), mthode (classe URLStream) 816, 831 loadBytes(), mthode 449, 810 Loader, classe 446, 816, 827, 832 LoaderContext, classe 449, 819, 827 LoaderContext, objet 810 LoaderInfo, classe accs lobjet daffichage 825 suivi de la progression du chargement. 447 loaderInfo, proprit 448 loadPolicyFile(), mthode 816 LocalConnection, classe propos de 690 autorisation 833 connectionName, paramtre 696 restreint 816 LocalConnection.allowDomain(), mthode 695, 834 LocalConnection.allowInsecureDomain(), mthode 695 LocalConnection.client, proprit 691, 692 LocalConnection.connect(), mthode 816 localFileReadDisable, proprit 802 localToGlobal (), mthode 463

Index

849

M
Macintosh, fichiers FLV 619 mantisse 102 mappage 251, 253 masquage de canal alpha 442 masquage des objets daffichage 440 masquage du canal alpha 442 match(), mthode 228 matrice de transformation. Voir classe Matrix Matrix, classe dfinition 469 dfinition dun dgrad avec 484 exemple 470 inclinaison 470 objet, dfinition 469 redimensionnement 469 rotation 469 translation 469 MAX_VALUE (classe Number) 102 mdias chargs, accs comme des donnes 826 menu contextuel, personnalisation 673 mtadonnes vido 605, 607 mthode concept de base 34 li 146 mthode browse() 831 mthode clone() (classe BitmapData) 581 mthode lie 146 mthodes constructeurs 160 dfinition 159 instance 162 lecture et dfinition 163, 180 lies 165 redfinition 178 statiques 161 mthodes dinstance 162 mthodes de rappel gestion 600 mthodes lies 165 mthodes statiques 161 mthodes substr() et substring() 225 mtrique des lignes de texte 541, 568 microphone accs 651 acheminement vers des haut-parleurs locaux 652 dtection de lactivit 653 scurit 833, 838 Microphone, classe 348

milliseconds, proprit 208 MIN_VALUE (classe Number) 102 minutes, proprit 208 mise en cache sous forme de bitmap avantages et inconvnients 433 contexte viter 434 et filtres 500 utilisation 433 mise en rseau propos de 679 concept et terme 681 restriction 815 mode de conversion IME dfinition 742 dtermination 741 mode plein cran 415, 416 mode standard 96, 134 mode strict propos de 94 association 106 conversion explicite 106 erreurs dexcution 96 renvoi de valeurs 136 syntaxe point et 134 moniteur, mode plein cran 415 month, proprit 208 monthUTC, proprit 208 MorphShape, class 403 mot rserv 115, 116 mot-cl syntaxique 116 mots-cls 115 MouseEvent, classe 341, 350 movie clips caching 435 MovieClip, classe 402 cadence daffichage 413 multiline, proprit dexpression rgulire 322 mx.util.Delegate, classe 354

N
navigateToURL(), fonction 815, 834 NetConnection, classe 816 NetConnection.connect(), mthode 816, 821 NetStream, classe 810, 816, 821 nettoyage 135, 255 new, oprateur 74 nud cible ou phase 343 noeud dans XML, accs 382

850

Index

nombres octaux 107 Number, classe association 106 isNaN(), fonction globale 93 plage dentiers 102 prcision 102 valeur par dfaut 93

O
Object, classe prototype, proprit 186, 190 tableau associatif 252 type de donnes et 104 valueOf(), mthode 191 objet concept de base 33 instanciation 42 objet dactivation 145 objet daffichage clips 521 prsentation 397 saisie utilisateur et 665 scurit 825 objet daffichage inclinaison 469 redimensionnement 469 rotation 469 transformation de matrice 470 translation 469 objet Date exemple de cration 207 obtention dune valeur temporelle de 208 objet de classe 72, 188 objet de liste daffichage 341 objet vnement 336 objet gnrique 113, 252 objet global 145 objet MovieClip, cration 528 objet partag propos de 702 affichage du contenu de 705 scurit et 705 objet prototype 135 objets BitmapData, application de filtres 499 objets daffichage bitmaps 571 et API de dessin exemple 451, 491

exemple de glisser-dplacer 456 exemple de rorganisation 457 filtrage 495, 498, 502 suppression de filtres 499 objets de liste daffichage hors liste 405 objets function 150 objets partags paramtre Flash Player et 833 scurit et 836 objets visuels. Voir objets daffichage octets chargs 448 ombre 183 on(), gestionnaire dvnements 340 onClipEvent(), fonction 340 onCuePoint, gestionnaire dvnement 598 oprateur propos de 118 affectation 125 concept de base 44 conditionnel 125 dajout 123 de multiplication 122 dcalage au niveau du bit 123 galit 124, 223 logique 124 logique au niveau du bit 124 prfixe 122 principal 121 priorit 119 relationnel 123 suffixe 121 unaire 118, 122 oprateur ( ) (filtrage XML) 384 oprateur + (concatnation), XMLList 381 oprateur == 223 oprateur === 223 oprateur > 223 oprateur accolade ({ et }) dans XML 380 oprateur associatif droit 119 oprateur associatif gauche 119 oprateur binaire 118 oprateur conditionnel (?:) 125 oprateur crochet ([ et ]) 134 oprateur daccs la proprit 253 oprateur daffectation 125 oprateur daffectation de laddition (+=) 224 oprateur dajout 123 oprateur dgalit 124, 223 oprateur dingalit 223 oprateur dingalit stricte 223

Index

851

oprateur de concatnation (+), XMLList 381 oprateur de dcalage au niveau du bit 123 oprateur de multiplication 122 oprateur de prfixe 122 oprateur de suffixe 121 oprateur deux points (:) 95 oprateur Infrieur 119, 223 oprateur Infrieur ou gal 223 oprateur logique 124 oprateur logique au niveau du bit 124 oprateur point (.) 112, 134 oprateur principal 121 oprateur relationnel 123 oprateur suprieur ou gal 223 oprateur surcharg 118 oprateur ternaire 118 oprateur unaire 118, 122 oprateur virgule 90 opration arithmtique sur la date 209 opration asynchrone 359 option -as3 du compilateur 260 option du compilateur 193, 260 option -es du compilateur 260 ordre doctets 697 ordre doctets du rseau 697 ordre doctets gros-boutiste 697 ordre doctets petit-boutiste 697 ordre de superposition, rorganisation 457 override, mot-cl 163, 164

P
package propos de 74 cration 77 importation 78 niveau suprieur 75, 77 oprateur point 75, 112 package imbriqu 76 syntaxe point 112 package imbriqu 76 package, instruction 151 packages inheriting across 177 paramtre facultatif ou obligatoire 139 transfert par valeur ou par rfrence 138 paramtre de fonction 137 paramtre facultatif 139

paramtre obligatoire 139 paramtre rest 142 parcours en boucle dun tableau 254 parentAllowsChild, proprit 825, 826 parenthse caractre de remplacement 312 oprateur 114 oprateur de filtrage XML 384 vide 132 parenthse douverture 312 parenthse de fermeture 312 parenthse droite 312 parenthse gauche 312 parse (), mthode 161 permissions camra 612 permutation dans une expression rgulire 318 phase de capture 343 phase de propagation vers le haut 343 pixels, accrochage aux 576 pixels, manipulation individuelle 577 plage de caractres, spcification 316 play(), mthode (classe NetStream) 816 player. Voir Flash Player plein cran, mode 817 plusieurs dfinitions de classe 736 PNG, graphismes 446 point (.), oprateur, XML 373, 382 point (.). Voir point Point, objet propos de 462 distance entre des points 463 translation despaces de coordonnes 463 utilisation supplmentaire pour 464 point-virgule 114 pointeur (curseur), personnalisation 672 points de repre dclenchement dactions 598 en vido 597 points et pixels 759 polar(), mthode 464 polices intgres 541, 556 priphrique 541 polices de priphrique 541 polices intgres dfinition 541 utilisation 556 polymorphisme 174 pop(), mthode 245

852

Index

ports, scurit 830 positions des caractres dans une chane 226 des objets daffichage 420 premier Sprite charg 396, 447 presse-papiers enregistrement de texte 735 scurit 838 preventDefault(), mthode 341, 350 printArea, paramtre 757 PrintJob(), constructeur 753 PrintJob, instructions, temporisation 758 priority (paramtre), addEventListener() (mthode) 357 private attribute 176 private, attribut 154 programmation croise 822 programmation de laffichage 395 programmation Flash, utilisation pour ActionScript 53 programmation oriente objet concepts 149 tches courantes 148 programme, dfinition de base 29 ProgressEvent.PROGRESS 683 progression de la lecture audio 661 progression du chargement 448 propritaire de lobjet Stage 824 proprit ActionScript par rapport dautres langages 72 ajout une fonction 144 concept de base 34 dune expression rgulire 322 dfinie pour ActionScript 3.0 154 statique et instance 153, 180 XML 375 proprit de donnes (classe URLRequest) 684 proprit de mthode (classe URLRequest) 684 proprit de page 757 proprit globale dune expression rgulire 322 proprit statique XML 375 proprits des instances dclaration 153 hritage 175 proprits statiques dans la chane de porte 182 dclaration 153 hritage 180 protected attribute 176 protected, attribut 156

__proto__ 73 prototype, objet 186, 189 prototype, proprit 186, 190 Proxy, classe 84 public, attribut 154 public, classe 79 push(), mthode 244, 262

Q
quantificateur (dans une expression rgulire) 316

R
raccourci (menu contextuel) 673 recherche dans une chane 228 recherche, dans une expression rgulire 326 Rectangle, objet dfinition 465 impression 759 intersection 467 redimensionnement 465 repositionnement 465 union 467 utilisation supplmentaire pour 468 redfinition des mthodes de lecture et de dfinition 180 redimensionnement contrle de la distorsion 429 impression 760 matrice 469 objet daffichage 469 scne 413 rfrence faible 255 rfrence, transfert par 138 RegExp, classe propos de 305 mthode 327 proprit 322 rgle dassociativit 119 rembobinage, clips 525 remplacement de la casse dans une chane 230 remplacement de texte dans une chane 227 replace(), mthode 212, 229 reprsentations de chane dautres objets 223 __resolve 73 respect de la casse 111 return, instruction 136, 161 reverse(), mthode 246

Index

853

rotate(), mthode 469 rotation dun objet daffichage 440, 469 rotation dune matrice 469 RTMP (Real-Tiime Messaging Protocol), scurit du contenu 822

S
saisie au clavier, capture 667 saisie utilisateur propos de 665 concept et terme 666 tche courante 666 saisie, champs texte 541 sameDomain, proprit 825 scale(), mthode 469 scnario Flash, ajout dActionScript 51 scnario, Flash 51 scne conteneur dobjets daffichage 397 dfinition de proprits 413 prsentation 395 redimensionnement 413 scurit 824 scnes, utilisation pour sparer les scnarios 527 script ct serveur 689 search(), mthode 228 seconds, proprit 208 scurit accs aux mdias chargs comme sil sagissait de donnes 826 allowNetworking, balise 815 bitmaps 827 camra 833, 838 chargement et tlchargement de fichiers 831 clavier 838 envoi de donnes 831 fichiers SWF imports 832 images 827 img, balise 821 lie aux vnements 826 liste daffichage 825 LocalConnection, classe 833 microphone 833, 838 objets partags 833, 836 plein cran, mode 817 ports 830 presse-papiers 838 RTMP 822

scne 824 sockets 830 son 827 sons 821 souris 838 URLLoader 829 URLStream 829 vido 821, 829 Voir aussi fichiers de rgulation inter-domaines scurit audio 827 scurit de contenu RTMP 822 scurit de la souris 838 Security, classe 816 Security.allowDomain(), mthode propos de la programmation croise 823 balise img et 821 constructeur et 832 contexte de chargement 449 son et 828 Security.currentDomain, proprit 832 Security.exactSettings, proprit 833 SecurityDomain, classe 449, 820 send(), mthode (classe LocalConnection) 691, 816 sendToURL(), fonction 816, 831 squence dchappement dans une classe de caractre 314 Server, Flash Media 822 serveur socket 700 serveur socket Java 700 setClipboard(), mthode 838 setInterval(), fonction 212 setTime (), mthode 208 setTimeout(), mthode 212 Shape, classe 402 SharedObject, classe 702, 816 SharedObject.getLocal(), mthode 833, 836 SharedObject.getRemote(), mthode 836 shift(), mthode 245 signe dollar ($), codes de remplacement 229 signe plus (+) 312 significande 102 SimpleButton, classe 402 slice(), mthode Array, classe 250 String, classe 225 Socket, classe 697, 816, 830 son envoi vers et depuis un serveur 655 exemple dapplication 655 scurit de 821, 827

854

Index

Sound, classe 810, 816, 821 SoundFacade, classe 657 SoundLoaderContext, classe 810 SoundMixer.computeSpectrum(), mthode 822, 826, 827 SoundMixer.stopAll() , mthode 827 sous-chane correspondance dans une expression rgulire 320 sous-chanes cration partir dun dlimiteur 227 prsentation 225 recherche et remplacement 225, 227 sous-classes 173 splice(), mthode 244, 245 split(), mthode 227 Sprite, classe 402 Stage propos de 343 Stage, classe 343 StageDisplayState, classe 817 static, attribut 157 StaticText, classe 403 statique, texte accs 559 cration 403 stockage de donnes 702 stockage local 702 stopAll(), mthode (classe SoundMixer) 827 stopImmediatePropogation(), mthode 349 stopPropogation(), mthode 349 String, classe charAt(), mthode 222 charCodeAt(), mthode 222 concat(), mthode 224 fromCharCode(), mthode 222 indexOf(), mthode 226 lastIndexOf (), mthode 226 match(), mthode 228 replace(), mthode 229 search(), mthode 228 slice(), mthode 225 split(), mthode 227 substr() et substring(), mthodes 225 toLowerCase() et toUpperCase(), mthodes 230 strings about 218 structure de donnes 239 StyleSheet, classe 552 super, instruction 160, 162, 179 super-classes 173

superconstructeur pour un tableau 260 suprieur , oprateur 119, 223 switch, instruction 127 symbole dans une expression rgulire 311 symboles de la bibliothque, exportation 528 syntaxe 111 syntaxe barre oblique 112 syntaxe point 112 System.setClipboard(), mthode 838 systme de lutilisateur, dtermination 734 systme de lutilisateur, dtermination lors de lexcution 734

T
tableau propos de 239 associatif 251 cl dobjet 253 clonage 258 constructeur 243 copie en profondeur de 258 copie simple 258 cration 243 delete, oprateur 246 exemple 265 index 242 insertion dun lment 244 interrogation 250 littral de tableau 113, 244 longueur de 246 multidimensionnel 256 paire de cl et de valeur 252 parcours en boucle 254 superconstructeur 260 suppression dun lment 245 tableau imbriqu et mthode join() 251 tableau typ non pris en charge 243 tche courante 241 taille maximale 242 terme 241 tri 246 utilisation dun tableau associatif et dun tableau index 257 tableau index 242 tableau non tri 251 tableau typ 243 tableaux cration 227

Index

855

taille de fichier rduite pour les formes 403 target, proprit 348 tlchargement dun fichier 714 tlchargement de fichiers 831 temps universel (UTC) 206 test(), mthode 327 texte affectation de formats 551 affichage 543 anti-aliasing 557 capture de la saisie 549 concepts et terminologie 541 dfilement 546, 547 enregistrement dans le Presse-papiers 735 paisseur 557 formatage 551, 560 formatage de plages 555 manipulation 547 nettet 557 prsentation 540 remplacement 227 restriction de la saisie 550 slection 548 static 403 statiques 559 tches courantes 541 types disponibles 543 texte HTML affichage 545 et CSS 552 TextEvent, classe 341 TextField, classe 341, 402 TextFormat, classe 551 TextLineMetrics, classe 568 this, mot-cl 162, 163, 165, 354 throw, instruction 283 Timer, classe propos de 210 surveillance de la lecture 661 timer, vnement 210 toLowerCase(), mthode 230 toString(), mthode Array, classe 250 Event, classe 349 prsentation 223 toUppercase(), mthode 230 traits, objet 189 Transform, classe 469 transform, proprit 469, 470 translate(), mthode 469

translation dune matrice 469 tri dun tableau 246, 248 try..catch..finally, instructions 281 tunneling HTTP 698 twips 759 type de donnes propos de Boolean 101 dfinition 93 int 101 Number 102 personnaliser 166 simple et complexe String 103 uint 103 valeur par dfaut (non typ) 73 void 104 type de donnes Boolean 101 type de donnes int 101 type de donnes Number 102 type de donnes par dfaut 73 type de donnes String 103 type de donnes uint 103 type primitif, conversion implicite 105 type, proprit (classe Event) 345 type. Voir type de donnes types de donnes personnaliss, numrations 166

U
UIEventDispatcher, classe 340 uint, classe, association 106 undefined 74, 104, 243 union(), mthode 467 unshift(), mthode 244 upcast 97 upload(), mthode 816, 831 URI 81 URI (Uniform Resource Identifier) 81 URLLoader, classe propos de 683 chargement de donnes XML 379, 390 lorsque restreint 816 scurit et 829 URLLoader, constructeur 684 URLLoader.dataFormat, proprit 689 URLLoader.load(), mthode 684 URLLoaderDataFormat.VARIABLES 689 URLRequest, instance 684

856

Index

URLRequest.contentType, proprit 683 URLRequest.data, proprit 684 URLRequest.method, proprit 684 URLRequestMethod.GET 685 URLRequestMethod.POST 685 URLStream, classe 816, 829 URLVariables, classe 683 URLVariables.decode(), mthode 685 use namespace, directive 86, 192 useCapture (paramtre), addEventListener() (mthode) 357 useWeakReference, paramtre 255 UTC, temps universel 206

V
valeur affectation une variable 89 transfert dun argument par 138 valeur complexe 94 valeur dunit temporelle 208 valeur de paramtre par dfaut 139 valeur littrale propos de 113 littral de tableau 113, 244 objet 252 valeur NaN 103 valeur null 93, 101, 104, 255 valeur primitive 73, 93 valueOf(), mthode (classe Object) 191 var, mot-cl 89, 157 variable annotation de type 95 annotations de type 89 concept de base 30 domaine de 90 initialisation 92, 378 non initialise 92 non type 74, 93 valeur par dfaut 92 var, instruction 89 variable globale 90 variable locale 90 variable non type 74, 93 variables dclaration 157 instance 159 overriding not permitted 178 redfinition impossible 159

statiques 158 types 157 variables dinstance 159 variables statiques 158 vrification des types lors de la compilation 94 vrification des types de donnes lors de lexcution 96 vrification des types lors de la compilation 95 Version 4 dECMAScript 72 version de dbogage, Flash Player 359 vido chargement 593 diffusion en flux continu 596 envoi un serveur 617 fin du flux 595 lecture 594 sur Macintosh 619 mtadonnes 605, 607 prsentation 588 qualit 614 scurit 821, 829 tches courantes 589 Vido Flash. Voir FLV video jukebox, exemple 619 Video, classe 592 vitesse, amlioration pour laffichage 433 void 104

W
willTrigger(), mthode 358

X
XML accs un attribut 383 ActionScript pour 370 chargement des donnes 379, 390 commentaire 374, 375 concept de base 368 concept et terme 371 conversion de type 388 document 369 E4X (ECMAScript pour XML) 76, 367, 372 espace blanc 375 espace de nom 387 filtrage 384 for each..in, boucle 129

Index

857

for, boucle 374, 386 format pour lAPI externe 777 initialisation dune variable 378 instruction de traitement 374 mthode 375 noeud enfant 382 nud parent 382 oprateur accolade ({ et }) 380 parcours dune structure 381 proprit 375 serveur socket 700 tche courante 371 transformation 380 XMLDocument, classe 76, 372 XMLList, objet propos de 377 concatnation 381 XMLNode, classe 372 XMLParser, classe 372 XMLSocket, classe 379, 390, 816 XMLSocket, XML 830 XMLSocket.connect(), mthode 698, 816 XMLTag, classe 372

858

Index

Das könnte Ihnen auch gefallen