Beruflich Dokumente
Kultur Dokumente
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.
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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
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.
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
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
19
20
A propos de ce manuel
CHAPITRE 1
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.
22
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.
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.
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
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.
25
26
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.
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.
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
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 *
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
CHAPITRE 2
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
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
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
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
Pris ensemble, ces lments servent grer les donnes que le programme utilise, et dterminer les actions excuter ainsi que lordre dexcution.
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
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.
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.
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
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.
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
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).
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
c.
Lorsque la fonction eventResponse() est appele, le code quelle contient est excut et vos actions spcifies sont effectues.
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);
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);
42
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.
43
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
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.
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.
46
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.
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.
47
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
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.
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).
50
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.
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
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.
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).
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.
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
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).
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.
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.
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
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.
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.
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 :
58
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.
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
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
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.
La classe Greeter inclut une seule mthode sayHello() ; celle-ci renvoie une chane qui dit Hello au nom dutilisateur indiqu.
2.
Vous pouvez maintenant utiliser la classe Greeter dans une application Flash ou Flex.
61
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.
62
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.
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
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.
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); } }
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.
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
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.
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);
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);
68
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());
69
70
CHAPITRE 3
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
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
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
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.
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
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.
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
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
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()"); } }
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();
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; }
82
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.
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();
84
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); } } }
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
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; } } }
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;
public class NamespaceUseCase extends MovieClip { public function NamespaceUseCase() { use namespace myInternal; Utility.someTask(); Utility.someTask(); trace(Utility.taskCounter); // 2 Helper.someTask(); trace(Helper.lastCalled); } } }
88
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.
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
0
NaN null null
0
undefined null
92
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
94
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");
96
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
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
Types de donnes
101
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
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.
Types de donnes
103
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
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.
106
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
Object String
undefined
108
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
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
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
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
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
112
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
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. */
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
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 ... } }
= = = =
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
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
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
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
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
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
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
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
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
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
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
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();
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
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
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"); }
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
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
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.
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
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) 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
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
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
CHAPITRE 4
Sommaire
Principes de la programmation oriente objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Hritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 Rubriques avances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Exemple : GeometricShapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
147
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
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.
149
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.
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
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
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
154
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 :
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
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.
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
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
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 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
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.
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.
162
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.
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; } }
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
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.
166
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
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
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
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
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
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);
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 {} ... }
176
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
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
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
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.
180
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
182
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.
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
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
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
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
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
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
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
<< 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
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
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
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
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
Exemple : GeometricShapes
203
204
CHAPITRE 5
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
205
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
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.
206
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.
207
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 :
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).
208
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.
209
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
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.
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!
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).
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
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.
213
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
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(); }
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
CHAPITRE 6
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
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.
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
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.
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 == ""
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
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
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)); }
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
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
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
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.
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().
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
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
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.
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.
227
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);
Pour plus dinformations sur les expressions rgulires, voir Chapitre 9, Utilisation dexpressions rgulires , la page 305.
228
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
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.
Une fois que ces mthodes sont excutes, la chane source reste inchange. Pour transformer la chane source, utilisez le code suivant :
str = str.toUpperCase();
230
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 :
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.
232
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.
233
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
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.
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.
236
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.
237
238
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
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
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
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.
241
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"];
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
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
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 :
repres.
Array.NUMERIC :
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 */
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
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
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
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
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.
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
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
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
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
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.
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.
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.
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
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
272
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.
Ecriture de code pour grer des erreurs Test, capture et renvoi derreurs Dfinition de votre classe derreur Rponse des vnements derreurs et de statut
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.
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.
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
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
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.
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.
277
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
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.
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.
279
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
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); }
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
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. }
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.
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.
285
catch (error:Error) { trace("<< Error >> " + error); } } catch (error:ApplicationError) { trace("<< catch >> " + error); }
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.
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
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.
287
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
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); }
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 } } }
public class VideoExample extends Sprite { private var videoUrl:String = "Video.flv"; private var connection:NetConnection; private var stream:NetStream;
290
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); } } }
291
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
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.
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
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
295
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
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.
297
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.
298
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); } }
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
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.
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.
302
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; }
303
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; }
304
CHAPITRE 9
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
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
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
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.
307
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
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.
309
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
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.
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.
311
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)
312
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)
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
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/
314
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
] -
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
\xnn
Dautres caractres de remplacement et mtasquences dexpression rgulire sont considrs comme des caractres normaux dans une classe de caractre.
315
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]/
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
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>";
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>/
317
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>
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]/
318
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.
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.
319
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
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
321
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
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
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
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
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
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
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
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
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
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
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.
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) :
330
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).
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).
331
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
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).
333
334
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
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).
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
337
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.
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
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()
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.
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.
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 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.
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
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);
346
Gestion dvnements
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
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
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
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.
Ecouteurs dvnements
351
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
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.
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); }
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
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
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().
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().
358
Gestion dvnements
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
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.
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
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).
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/>
369
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).
Didacticiel W3Schools XML : http://w3schools.com/xml/ XML.com : http://www.xml.com/ Didacticiels XMLpitstop, listes de discussion, etc. : http://xmlpitstop.com/
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
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
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.
371
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.
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
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";
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 :
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 :
Les mthodes suivantes vous permettent deffectuer des conversions en chanes et de formater des objets XML :
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 :
Les mthodes suivantes vous permettent dutiliser des attributs dobjet XMLList :
attribute() attributes()
hasOwnProperty() propertyIsEnumerable()
Les mthodes suivantes vous permettent dutiliser et de dterminer certains types de contenu XML :
Les mthodes suivantes vous permettent deffectuer des conversions en chanes et de formater les objets XMLList :
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.
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.
379
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";
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>
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
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
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
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.
x.employee.(lastName == "McGee")Il
x.employee.(lastName == "McGee").firstNameIl
384
Utilisation de XML
x.employee.(lastName == "McGee").@idIl
x.employee.(@id == 347)Le
x.employee.(@id == 347).lastNameIl
nud employee.
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'));
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'));
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
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 />;
387
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
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
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
389
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.
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.
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.
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.
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();
393
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
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
Objet daffichage
Objet daffichage
Objet 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.
397
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
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.
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).
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
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.
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.
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.
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.
404
Programmation de laffichage
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); } }
406
Programmation de laffichage
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;
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) :
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
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.
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.
Objet daffichage
Objet daffichage
Objet 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 + "") } } }
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.
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
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;
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);
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).
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.
417
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.
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.
419
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
Inversement, vous pouvez utiliser la mthode localToGlobal() de la classe DisplayObject pour convertir des coordonnes locales en coordonnes de la scne.
421
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); }
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);
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.
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.
427
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.
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;
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;
431
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
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.
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
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.
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).
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.
: 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")
dombre.
: 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")
436
Programmation de laffichage
BlendMode.SCREEN ("screen")
des halos.
BlendMode.SUBTRACT ("subtract")
: couramment utilis pour crer un effet de transition par fondu au noir anim entre deux images.
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;
437
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).
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);
439
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.
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.
440
Programmation de laffichage
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);
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.
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);
443
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.
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.
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).
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); }
Objet LoaderInfo
Proprit LoaderInfo
Objet Loader
Proprit ContentLoaderInfo
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
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.
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.
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.
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.
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.
454
Programmation de laffichage
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.
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 :
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.
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
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.
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
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.
Crez un document Flash vide. Slectionnez une image-cl dans le scnario. Ouvrez le panneau Actions et copiez le code dans le panneau Script.
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.
462
Utilisation de la gomtrie
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);
463
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
Matrix
Rectangle
464
Utilisation de la gomtrie
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)
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
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.
467
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.
468
Utilisation de la gomtrie
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;
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.
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.
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.
La mthode transform()
La mthode transform() comprend des paramtres pour chaque lment suivant :
sourceMatrixLa xScale dx
et yScaleLe facteur de redimensionnement x et y montant de rotation, en degrs sens dinclinaison ("right" ou "left")
rotationLe skewLe
skewTypeLe
La valeur renvoye est la matrice rsultante. La mthode transform() appelle les mthodes statiques suivantes de la classe :
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);
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;
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;
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
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
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
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
477
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.
478
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
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.
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.
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);
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);
482
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.
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.
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.
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
Deux couleurs, vert et bleu, avec le tableau ratios dfini sur [0, 255]
SpreadMethod.PAD InterpolationMethod.LINEAR_RGB
484
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;
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;
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
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.
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
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); }
489
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 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.
491
492
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.
493
494
CHAPITRE 15
15
Sommaire
Bases du filtrage des objets daffichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495 Cration et application de filtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .497 Filtres daffichage disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 Exemple : Filter Workbench. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
495
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
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
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.
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.
497
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
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.
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.
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);
499
500
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);
501
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
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];
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];
504
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);
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];
506
// 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;
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);
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
// 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];
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();
510
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
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
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 :
Accentuation (diviseur 1) :
0, -1, 0 -1, 5, -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).
513
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
// 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);
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.
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
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;
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
// 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.
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.
520
CHAPITRE 16
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
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.
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
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
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
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.
523
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.
524
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);
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.
526
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 }
527
Slectionnez le symbole dans le panneau Bibliothque et ouvrez sa bote de dialogue Proprits. Si ncessaire, activez les paramtres avancs.
2.
528
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() { } } }
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
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).
531
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 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
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.
534
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
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().
536
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.
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
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
540
Utilisation de texte
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
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.
541
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
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
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.
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.
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++; } } }
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.
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.
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
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
549
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.
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
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 :
552
Utilisation de texte
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.
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
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 du texte
555
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
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.
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); }
558
Utilisation de texte
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
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.
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
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.
563
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.
564
Utilisation de texte
faible,
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
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; } }
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.
569
570
Utilisation de texte
CHAPITRE 18
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
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.
572
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.
573
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
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
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.
575
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.
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
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);
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
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;
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.
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);
580
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);
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.
(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
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
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);
584
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
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
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
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
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.
589
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.
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.
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.
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
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.
593
: 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
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.
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.
596
Utilisation de la vido
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.
597
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
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.
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 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"); } } }
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"); } } }
602
Utilisation de la vido
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"); }
603
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"); }
604
Utilisation de la vido
function onCuePoint(infoObject:Object):void { var key:String; for (key in infoObject) { trace(key + ": " + infoObject[key]); } }
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.
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
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.
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
event ).
name: chane reprsentant le nom du point de repre. time : nombre correspondant au code horaire du point de repre
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.
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
Nom du codec
non compress ADPCM mp3 Nellymoser 8kHz mono Nellymoser
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.
609
La classe Camera ne possde pas de mthode constructeur. Pour crer une nouvelle instance de Camera, utilisez la mthode statique Camera.getCamera().
610
Utilisation de la vido
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.
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. }
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); }
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; } }
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.
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); }
615
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
Rubriques avances :
Les rubriques suivantes abordent certains problmes dutilisation de la vido.
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
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
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.
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.
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.
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; } }
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.
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
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.
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 } }
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; } }
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
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.
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
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.
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.
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
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
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
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.
633
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.
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.
635
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.
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.
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.
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.
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).
645
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
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.
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); }
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
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);
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 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.
Utilisation du son
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.
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.
655
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.
URLService.as playerconfig.xml
656
Utilisation du son
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.
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); }
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.
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.
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
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.
663
664
Utilisation du son
CHAPITRE 21
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
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
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
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.
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
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).
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.
670
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.
671
Pour plus dinformations, voir Cration dinteractions aux actions de glisser-dposer , la page 422.
672
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(); }
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.
Exemple : WordSearch
675
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
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
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
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
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.
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
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.
681
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
Si aucune valeur nest dfinie pour URLRequest.contentType, les valeurs sont envoyes sous la forme application/x-www-form-urlencoded.
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.
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
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 :
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
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
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
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
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>
689
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.
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");
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.
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
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).
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");
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
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.
705
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();
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 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
707
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--
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);
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
710
Rseau et communication
HTTPStatusEvent.HTTP_STATUS
IOErrorEvent.IO_ERROR
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
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).
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.
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
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>
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
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.
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.
717
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
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");
719
try { msg("Trying to connect to " + serverURL + ":" + portNumber + "\n"); socket.connect(serverURL, portNumber); } catch (error:Error) { msg(error.message + "\n"); socket.close(); } }
Cette mthode est appele par la mthode sendCommand() du fichier dapplication principal.
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
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.
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.
721
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
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.
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().
724
Rseau et communication
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; }
725
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
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.
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.
727
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.
729
730
Rseau et communication
CHAPITRE 23
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
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.
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
732
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.
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.
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.
734
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.
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);
736
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
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 } } }
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
Module
Domaine dapplication 3
Utilisation B
module3.swf Module
Utilisation C
Domaine dapplication 2
Utilisation A
738
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.
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);
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 :
740
REMARQUE
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.
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.
742
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.
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.
744
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.
745
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
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.
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.
748
<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>
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
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
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
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.
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.
new PrintJob()
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()
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()
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
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 :
755
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
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.
757
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.
758
Impression
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);
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
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.
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.
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;
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);
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(); } } } } }
763
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
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; } } }
765
766
Impression
CHAPITRE 25
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
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
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).
769
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.
12. Utilisez
770
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.
771
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
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.
A V E R T IS S E M E N T
773
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.
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.
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
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
777
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>
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#.
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.
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.
780
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."); } }
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
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.
783
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.
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
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().
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
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.
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/ 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
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.
789
790
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.
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
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).
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.
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
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()
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()
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.
795
796
CHAPITRE 26
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
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 :
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
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.
799
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
Paramtres utilisateur
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 :
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
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 )
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.
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.
804
REMARQUE
Windows : app data\Macromedia\Flash Player\#Security\FlashPlayerTrust (par exemple, C:\Documents and Settings\JohnD\Application Data\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).
805
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
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
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.
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.
808
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.
809
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.
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 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.
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
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
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
"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" :
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
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).
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 :
818
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
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().
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
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
Chargement
Security.allowDomain("siteA.com");
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 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().
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.
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
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.
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.
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 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.
829
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
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().
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().
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.
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
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 :
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
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
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
838
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