Apprendre l`Action-Script

Transcription

Apprendre l`Action-Script
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Introduction à l'ActionScript
Bonjour futurs flasheurs
Depuis plusieurs années, vous pouvez
voir fleurir sur les sites de la galaxie
Web des petites animations colorées et
interactives. Que ce soit des petits
jeux, des radios, ou encore
simplement de la publicité : Flash est
maintenant omniprésent !
Auteur : SuprazZz
Créé le : 30/11/2005 à 19h39
Modifié le : 08/10/2006 à
20h54
Avancement : 75%
Imprimer tout le tutorial
Dans Flash, on trouve deux parties distinctes : le graphisme et le scripting. Ce que ce tuto vous propose de faire c'est
d'apprendre l'ActionScript, c'est à dire toute la partie dynamique d'une animation Flash !
Je vous souhaite bonne chance, et j'espère que vous prendrez autant de plaisir dans la lecture de ce tutorial que moi
pour l'écrire
Petite recommandation avant de partir. Au début de chaque grand chapitre, j'indique le niveau prérequis
pour une bonne compréhension du contenu des tutoriaux. A chaque nouveau chapitre, nous ferons appel à des
connaissances extérieures, comme l'HTML, le PHP ... Et cela toujours à des niveaux plus élevés. N'hésitez donc
pas à commencer l'apprentissage de ces autres langages de façon simultanée !
Ce cours est composé des parties suivantes :
I.
II.
III.
IV.
V.
VI.
Présentation de Flash
Les bases de l'actionscript
Actionscript avancé
Communication client-serveur
Techniques complexes
Annexes
Partie 1 : Présentation de Flash
Flash est un outil très puissant sur le web, car il autorise une interaction avec l'utilisateur que d'autres
technologies comme le Javascript auraient du mal à fournir.
Mais il est indispensable de savoir utiliser Flash avec parcimonie.
Nous allons donc faire un petit tour d'horizon : ce qu'est Flash, ce qu'on peut en faire, et pour finir un schéma
fonctionnel du Fil Rouge de fin de chapitre que nous réaliserons !
Prérequis : aucun.
1 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
But : Première approche de l'interface
1) Flash bien / pas bien
Flash sous toutes ses coutures
Flash c'est pas bien
Flash c'est bien
2) Deux architectures classiques
L'Architecture Flashocentriste
L'architecture Flashoponctuelle
3) L'IDE de macromedia
Se familiariser avec l'interface
Le Scénario
Formes et Symboles
4) Où je le mets ce fichu code ?
Notion de "clip"
Créer un clip
Les zones de texte
La solution pratique
Q.C.M.
5) Ma première animation !
Un nouveau document
Dessine moi une balle
Interpolation de mouvement
Un soupçon d'ActionScript
6) Fil rouge
Cahier des charges
Architecture globale
Dans ce chapitre, nous avons donc délimité les champs d'application de Flash, et nous avons vu d'un point de vue
très théorique ce qu'allait être notre travail tout au long de notre Fil Rouge
Partie 2 : Les bases de l'actionscript
Actionscript est le langage de script de Flash. C'est grâce à lui qu'une bête animation Flash gagne toute son
interactivité.
Macromedia s'est inspiré du standard ECMAscript (nom standard du javascript) pour créer son langage, vous
retrouverez donc de fortes similitudes avec ce langage pour les chanceux qui le connaissent déjà.
Nous allons nous intéresser à la structure du code et au positionnement de ce dernier, Flash possédant un
système de "clip" sur et dans chacun desquelles du code peut être placé. Ce qui créé une complexité artificielle
dans la conception d'application.
Prérequis : Vous devez avoir bien compris le maniement de l'IDE de Flash. Vous devez surtout
savoir comment créer un clip.
2 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
But :
- Assimiler la structure de l'ActionScript
- Comprendre le système d'événements
=> Logo animé de Zozor !
1) Variables et fonction trace()
Structure et commentaires
Types de variables : Number, String et Array
Fonction trace()
Récapitulatif des opérateurs
Q.C.M.
2) Les Clips (ou MovieClip)
_root , this et _parent
Positionnement
Taille absolue
Agrandissement
Rotation
Transparence
Visibilité
Q.C.M.
3) Les Conditions
Un nouveau type : Boolean
Opérateurs de test
Opérations sur les booléens
La structure conditionnelle
Récapitulatif
Q.C.M.
4) Les Boucles
Qu'est-ce qu'une boucle
Boucle while
Boucle for
Petits exercices de style
Q.C.M.
5) Les Fonctions
Déclarer une fonction
Des arguments
Retour de valeur
Méthodes et fonctions
6) Les Evénements
Vous avez dit "événement" ?
Evénements souris localisés
Evénements souris globaux
Evénements à tout faire !
Récapitulatif
Q.C.M.
7) Fil rouge - le logo animé
Point de départ
Bonnet de noël
Rotation des yeux
3 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Contenu de la bulle
Récapitulatif
Ce chapitre vous a autorisé une première approche du langage ActionScript, et vous a permis de réaliser un petit
logo animé sympa.
Vous avez appris l'essentiel et sûrement la plus grosse partie de ce qu'il y a à savoir, les prochains chapitres
relèveront plus de l'application de ces connaissances
Partie 3 : Actionscript avancé
Nous avons vu les bases de l'Actionscript. Et c'était déjà un gros morceau.
Vous allez voir que Flash en garde encore sous le pied et que la programmation avancée c'est rigolo.
Et comme dans toute animation Flash vous avez intérêt à avoir un crayon et du papier à petit carreau sous la
main
, car cela aide à comprendre le positionnement des objets, et permet de faire des petits calculs
mathématiques chiants à faire de tête (règles de 3, ...)
Prérequis :
- Maîtriser l'IDE de Flash (créer des clips, savoir où placer le code)
- Maîtriser les bases de l'ActionScript
- Connaître les bases de l'HTML (langage de balises)
But :
- Maîtriser la notion de Clips
- Connaître l'API de dessin
- Savoir utiliser les écouteurs claviers
- Détecter les collisions
=> Jeu de voiture !
1) Publication et variables
Paramètres de publication Html
Le code Html expliqué
Envoie des variables
Réception des variables
Les caractères spéciaux
Q.C.M.
2) Créer et enlever des Clips
Clips dynamiques, statiques et profondeur
Créer un clip vide
Dupliquer un clip de la scène
Attacher un clip à la scène
Supprimer un clip
Une astuce en profondeur
La variable dans la variable
Q.C.M.
3) Dessiner avec Actionscript
Couleurs d'un clip
Dessinons sur des clips
Gribouillons un peu
Un peu de coloriage !
Gommez moi tout çà !
Q.C.M.
4 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
4) Utiliser le clavier
Les écouteurs
La touche enfoncée
Les raccourcis des touches
Une condition bien pratique !
Trichons avec les écouteurs
5) Les collisions
Approche des collisions
Collision rectangulaire
Collision circulaire
Collision ponctuelle
Collision bourrine
6) Fil rouge - On The Road Again
Point de départ
Faire mumuse avec la voiture
Les goals
Collisions inside
Fignolages
Des améliorations
A la fin de ce chapitre vous avez toutes les connaissances requises pour faire ce que vous voulez avec Flash.
Cependant Flash seul ne suffit plus, il va falloir le coupler avec une technologie côté serveur
Partie 4 : Communication client-serveur
Voilà un chapitre qui fera appel à toutes vos connaissances !
Si vous ne connaissez pas le PHP, allez lire ce tuto sur le sujet et revenez plus tard
Si vous êtes débutant en PHP, ne vous inquiétez pas on ira doucement ... pour l'instant !
-
Prérequis :
Maîtriser l'IDE de Flash (créer des clips, savoir où placer le code)
Maîtriser les bases et les fonctions avancées de l'ActionScript
Connaître le fonctionnement d'un site Web (Requêtes HTTP, HTML ...)
Connaître les bases du PHP
But :
- Comprendre le système de sécurité du lecteur Flash
- Charger des variables
- Charger du contenu multimédia (photos, vidéos, animations Flash)
=> Radio-Blog !
1) Sécurité et Flash
crossdomain.xml
Structure de crossdomain.xml
Nouveautés de FlashPlayer 8
Contourner la protection
5 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
2) Images et Animations
Dans un clip ou un niveau
Un chargeur
Redimensionner l'image
Particularité du chargement des animations
3) Transfert de variables
La vieille technique
Chargement avec LoadVars
Envoyer des variables
Exercice : Zozor dynamique
Q.C.M.
4) Musique !
Préparation du terrain
Lecture
Curseur de lecture
Chargement dynamique
Q.C.M.
5) Vidéos
Riva FLV Encoder
Un nouvel objet
Trois classes pour le prix d'une
Contrôle du flux
6) Fil Rouge - Radio-Blog
Du côté de PHP
Chargement de la Playlist
Gestion de la musique
Le volume - startDrag() notre ami
L'ascenceur
Maintenant vous savez tout ! Les chapitres suivants seront plus pointus et dévoileront des fonctions propres aux
dernières versions de Flash
Partie 5 : Techniques complexes
Si vous avez tenu jusque là, vous connaissez à peu près tout ce qui est possible de faire avec les anciennes
versions de Flash. Mais Flash a toujours été avant-gardiste, et intègre donc des technologies en pleine expansion
comme le XML ou l'upload de fichiers contrôlé.
Bref tout ce qui est nécessaire pour créer un projet Flash complexe !
Prérequis :
- Maîtriser très bien le logiciel (interface et Actionscript vu jusque là)
- Connaître suffisamment le PHP
But :
- Utilisation du XML avec Flash
- Envoie de fichiers
=> Galerie Photo !
6 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
1) Gestion du XML
Rappel sur le XML
Chargement
Une grande famille !
Types et attributs
XML tabulaire
Partie 6 : Annexes
Cette annexe comportera quelques astuces ou morceaux de code choisis.
Je ferais en sorte d'accumuler ici les astuces en suivant l'ordre du cours
1) Rotation d'un clip vers la souris
Création du clip
Explication géométrique
Le code
Partie 1 : Présentation de Flash
Flash est un outil très puissant sur le web, car il autorise une interaction avec l'utilisateur que d'autres technologies
comme le Javascript auraient du mal à fournir.
Mais il est indispensable de savoir utiliser Flash avec parcimonie.
Nous allons donc faire un petit tour d'horizon : ce qu'est Flash, ce qu'on peut en faire, et pour finir un schéma
fonctionnel du Fil Rouge de fin de chapitre que nous réaliserons !
Prérequis : aucun.
But : Première approche de l'interface
Flash bien / pas bien
Nous allons dans ce chapitre apprendre à déjouer les pièges de Flash. Ces pièges qui entraînent de nombreux
webmestres avides de rendre leur site flashy à leur perte !
Oui, car l'utilisation de Flash dans un site est souvent chaotique et mal organisée. C'est pour cela que de nombreuses
personnes considèrent Flash comme l'arme du Malin
Alors qu'en fait, si Flash commence à avoir une si mauvaise réputation c'est seulement parce qu'il est mal utilisé
On va donc déjà voir les arguments des uns et des autres. Puis nous essayerons de tirer la première conclusion de ce
tutorial : pourquoi certains sites en Flash sombrent dans les abîmes du Web alors que d'autres atteignent des sommets ?
Flash sous toutes ses coutures
Tout d'abord il me parait impératif de resituer Flash pour pouvoir bien comprendre comment fonctionne ActionScript.
7 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Le Flash est un format de fichier d'extension swf (=schockwave Flash) pouvant contenir de la vidéo, des images
vectorielles ou bitmaps, du son, et encore du code pour l'interaction avec l'utilisateur. Depuis sa version 4, les
spécifications SWF ont été rendues publiques, ce qui a conduit à la création de programmes comme Swish, ou des
modules pour Eclipse permettant de créer une animation flash simple ou gratuite (impossible d'avoir les deux à la fois
). Mais l'outil le plus puissant (et le plus cher ! ) pour créer du Flash reste Macromedia Flash, et surtout sa dernière
version 8 que nous utiliserons au cours de ce tutorial !
Flash offre en consultation libre un document PDF des spécifications complètes de Flash. Je ne peux que
vous conseiller d'aller au moins voir à quoi ressemble un document de spécifications.
SWF est un format de fichier binaire. On défini un fichier binaire comme ce qui n'est pas un fichier texte
. L'intérêt
du binaire par rapport au texte, c'est qu'il prend beaucoup moins de place, et c'est justement le grand avantage des
animations Flash : leur compacité. Le problème, c'est qu'un fichier SWF une fois compilé ne peut plus être modifié (du
moins pas directement) !
C'est pourquoi vous enregistrez votre projet Flash au format FLA, binaire lui aussi et dépendant de votre version de
Macromedia Flash, qui contient la source de votre animation que vous pouvez modifier.
Le langage de script de Flash est l'ActionScript, un dérivé de l'ECMAscript (= nom standardisé du javascript). Les
connaisseurs retrouveront donc certains éléments, mais je vous garantie que la non-connaissance du Javascript n'est en
aucun cas un frein à l'apprentissage de l'ActionScript ! Par contre vous devriez être capable de faire du Javascript une
fois que vous connaîtrez l'AS
Flash c'est pas bien
Les démons de Flash sont en gros :
Le plugin est lourd et consomme des ressources systèmes (processeur, mémoire vive ...)
Tout le monde ne possède pas la dernière version du plugin (des fois non disponibles pour les linuxiens)
Flash a tendance à être trop utilisé dans la publicité
Flash n'autorise pas le référencement du contenu qu'il produit ou affiche
Manque d'accessibilité (un aveugle aura du mal à lire en braille une animation Flash)
Un internaute présente sur sa page Web 25 arguments contre l'utilisation de Flash : 25 raisons de dire
non. Le point de vue est très intéressant, mais présente pas mal de lacunes. Le plugin a en effet subit de
nombreuses mises à jour depuis le moment où cet article a été rédigé. Prenez donc les informations fournies
avec des pincettes
Pour toutes ces raisons, importantes dès qu'on rentre dans le cadre d'une application web (= ensemble des pages web,
scripts, bases de données, contenus ...) professionnelle ou semi-professionnelle, il faut savoir utiliser la technologie
Flash avec parcimonie !
Flash c'est bien
Mais Flash permet tout de même :
Les mini-jeux
L'affichage de contenu sous forme graphique (si impossibilité de générer une image avec PHP ou autre
technologie côté serveur)
La recherche dynamique (possibilité d'éviter l'utilisation de Flash si on maîtrise certains outils Javascript le
permettant comme le xmlhttprequest utilisé entre autre sur ce site)
8 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Et puis surtout Flash, comme son nom l'indique, attire l'oeil !
Si votre site comporte un petit jeu en accord avec le thème général ou des petits éléments rigolos, ça ne pourra être
que du bon
Comme vous pouvez le constater, Flash est en fin de compte une technologie à double tranchant. Pour
résumer on peut énoncer 2 lois :
Flash ne doit pas être utilisé à outrance dans un site de type communautaire et sujet à de nombreuses évolutions
Désolé, je n'ai pas de site sur ma liste qui utilise Flash à outrance, du fait que ces sites possèdent en
général la durée de vie d'une pâquerette sur la banquise
Flash est très adapté aux sites vitrines ou comme contenu semi-dynamique (affichage de graphiques, musiques,
vidéos ...)
Un site vitrine d'Air france très bien réalisé qui fait partie de la galerie des meilleurs sites réalisés en
Flash de Macromedia : Air France - La Saga
Voilà, j'espère que je ne vous aie pas trop démoralisé pour un premier chapitre, mais il me paraissait indispensable de
vous donner tous les éléments avant de commencer la programmation
Deux architectures classiques
Nous avons pu voir les 2 lois à ne pas enfreindre pour réaliser un site Web potable utilisant Flash. Nous allons maintenant
voir, que chaque loi conduit à un type possible d'architecture.
Ce sont les deux principales architectures utilisées impliquant Flash.
L'Architecture Flashocentriste
Vous vous demandez sûrement ce qui se cache sous ce nom pompeux que je viens d'inventer pour le besoin
. Et bien
en fait, il s'agit de l'architecture dans laquelle Flash est au centre du site web.
Voici donc l'architecture à ne surtout pas reproduire si on souhaite créer un site communautaire selon la première loi :
Flash ne doit pas être utilisé à outrance dans un site de type communautaire et sujet à de nombreuses évolutions
Et selon la seconde loi :
Flash est très adapté aux sites vitrines ou comme contenu semi-dynamique
Cette architecture est très intéressante dans le cas d'un site galerie/vitrine/portfolio
9 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Flash est au centre de l'application Web.
L'utilisateur ne navigue pas à travers
différentes pages web mais dans un seul objet
Flash, qui affichera le contenu en fonction des
requêtes de l'utilisateur. Pour aller chercher
des données, flash à travers son langage de
script, l'ActionScript que nous verrons plus loin
dans ce tuto, peut charger des pages et en
récolter le contenu. Flash est donc capable
d'aller formuler une requête à un script côté
serveur, de type PHP, et d'afficher les données
formatées
(que
nous
appellerons
des
informations,
terminologiquement
les
informations ce sont les données une fois
triées et formatées).
Les sites web "vitrines" qui sont là pour promouvoir pendant un temps limité un produit ou alors les site
de Designers professionnels sont souvent "flashocentriques".
L'architecture Flashoponctuelle
Une toute autre approche dans l'utilisation de Flash n'est plus son utilisation comme fournisseur de contenu, mais
comme contenu lui même. Bien entendu, l'utilisation en sera complètement différente.
En fait, si on suit les deux lois, cette architecture est à privilégier dans le cas d'un site fournisseur de contenu riche, ou
communautaire.
Cette fois les animations Flash sont
considérées non pas comme l'unique moyen
d'afficher les informations, mais plutôt comme
des images. On peut voir sur le schéma qu'il
existe alors 2 principaux moyens pour
transmettre une donnée à l'animation qui
devra l'afficher. Soit comme précédemment
l'animation va chercher toute seule les
données et les met en forme, soit dans le code
xhtml de la page on complète le lien vers
l'animation par la transmission de une ou
plusieurs variables au format GET (
mavar1=salut&mavar2=comment+ca+va )
Mais rien n'empêche de combiner les deux,
pour indiquer à l'animation son rôle dans la
page et la laisser ensuite chercher elle même
ce qu'il manque !
10 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Les publicités en Flash qui parsèment le web sont un bon exemple de cette architecture
Voilà j'espère que vous avez pu choisir quelle architecture était la plus adaptée pour votre site Web.
En résumé pour les faignants, voici la conclusion du second tutorial :
Flash en tant que site web complet dans le cadre d'un site vitrine/galerie
Flash en tant que "images" inclues dans le site web
L'IDE de macromedia
IDE (= Integrated Development Environment) est une abréviation caractérisant les logiciels qui facilitent le
développement d'applications sur ordinateur.
Dans ce chapitre, nous nous intéresserons au plus connu des IDEs pour le Flash : il s'agit d'Adobe Flash 8. (plus connu
sous le nom de Macromedia Flash 8, mais Macromedia s'est fait racheter il y a quelques temps maintenant par Adobe).
Vous pouvez acheter Flash (sortez le porte-monnaie, c'est environ 699€) ou encore simplement l'essayer
dans la limite d'une période de 30 jours à cette adresse : http://www.adobe.com/fr
Se familiariser avec l'interface
Pour que vous puissiez convenablement suivre ce tutorial, on va essayer de se mettre d'accord sur la disposition des
différentes fenêtres de Flash.
Utilisez le menu Fenêtre dans la barre des menus du haut, pour disposer les fenêtres de la façon suivante :
11 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
En plein milieu, le gros carré blanc, représente la Scène. C'est ce que verra l'utilisateur de votre animation, et c'est là
que nous dessinerons et jouerons avec des formes.
On remarquera le panneau Actions tout en haut, dans lequel nous écrirons le code ActionScript.
Juste en dessous se trouve le Scénario (souvent appelé timeline en anglais). Il permet de naviguer dans le temps et dans
les calques, nous reviendrons dessus plus loin.
Tout en bas, deux panneaux très importants :
- L'aide de Flash, qui est extrêmement claire et détaillée. Quand je vous présente une nouvelle fonction ou une
nouvelle classe, n'hésitez pas à aller voir ce qu'en dit l'aide qui apportera un complément d'informations ainsi que des
exemples pratiques.
- Les propriétés, qui permettent de modifier justement les "propriétés" des objets que l'on peut manipuler dans Flash.
A gauche vous trouvez comme d'habitude la classique barre d'outils, très similaire à celle de logiciels comme photoshop,
par exemple.
Et enfin à droite encore d'autres fenêtres. Celle qui nous intéresse étant la Bibliothèque.
Ainsi se termine le petit tour d'horizon des différentes fenêtres de Flash
Je suppose que vous l'avez déjà trouvé, mais pour créer une nouvelle animation Flash, faites
Fichier->Nouveau puis sélectionnez Document Flash avant de cliquer sur OK
12 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Le Scénario
Maintenant, mettez votre casquette, Spielberg n'a qu'à bien se tenir !
Nous allons attaquer le scénario ! Le gros bloc plein de carrés noirs et blancs en haut.
Nous avons vu que la scène permettait de dessiner en deux dimensions : largeur et hauteur.
Le scénario rajoute deux dimensions :
La profondeur
Le temps
La profondeur
La profondeur se gère à l'aide des Calques, à gauche dans le scénario. Vous pouvez en créer autant que vous le
souhaitez, mais vous devrez toujours en garder un au minimum.
En fait, leur utilisation est toute simple : vous pouvez dessiner sur chacun, mais les formes(=les dessins) de chaque
calque sont indépendantes entre elles. Elles ne peuvent donc pas "s'écraser" mutuellement. Essayez donc de dessiner un
carré plein dans un calque et un disque dans un autre et superposez les deux formes. Elles se chevauchent sans
problème et ne s'effacent pas comme elles l'auraient fait si elles avaient été sur un seul calque.
Vous remarquerez aussi, que la forme qui est dans le calque du dessus, est aussi au dessus dans la scène. L'ordre dans
lequel vous rangez vos calques permet donc de gérer la profondeur de vos formes les unes par rapport aux autres.
Si vous mettez un calque au dessus de tous les autres, alors les dessins placés sur ce calque seront au dessus de tous les
autres dans la scène.
Le temps
Chaque petite case que vous voyez est une image, que nous appellerons quelques fois frame ("trame" en anglais) pour
éviter les confusions. Le curseur rouge contrôlable à la souris permet de se déplacer dans le scénario : c'est à dire dans
le temps.
Il existe plusieurs types de frames.
Dans l'image ci-dessus, vous pouvez voir en position 1, ce qu'on appelle une image-clé pleine. Je sais qu'elle est clée
parce qu'elle a un petit point noir, et qu'elle est pleine parce qu'elle est grisée.
Je suppose que vous avez compris que pleine signifie que dans cette frame on a dessiné quelque chose. Cette image-clé
continue jusqu'en position 16, le carré blanc en indiquant la fin. Toutes les images entre le point noir et le carré blanc
sont donc les mêmes.
Quelle type d'image avons nous en position 32 ?
Une image-clé vide ! Qui se termine en position 40.
Il faut bien comprendre, que chaque image correspond à la scène à un instant donné.
On va prendre l'exemple d'un petit dessin-animé avec un bonhomme en fil de fer :
13 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Mettez vous à la position 1 (avec une image-clé vide) et dessinez un personnage à tête jaune.
Créez une nouvelle image-clé en position 6 et changez la couleur de la tête du personnage pour du rouge. Ajoutez une
image simple à la position 10 pour que le personnage rouge reste quelques instants et ne s'en aille pas tout de suite à
cause de la lecture en boucle de l'animation.
Si vous exécutez l'animation (Contrôle->Tester l'animation), vous verrez que chaque personnage reste affiché le temps
de 5 frames.
Si vous avez un peu de mal au début, vous pouvez vous aider du mode Aperçu du scénario. Il faut cliquer sur le petit
bouton en haut à droite du scénario comme ci-dessous et sélectionner Aperçu. Vous devriez obtenir un scénario
semblable à celui ci :
Ce mode est pratique pour débuter, mais pas vraiment pour travailler
J'en profite pour vous parler des ips (images par secondes) ou encore en anglais : fps (frames per seconds)
Sur la photo ci dessus, on peut lire en bas : 12.0 ips
Cela signifie, que durant 1 seconde, Flash lira 12 images. En clair une frame durera 1/12 = 0.083 seconde !
On estime la durée de la persistance rétinienne à 50ms, ce qui donne 40 images par secondes pour avoie une fluidité
quasi-optimale.
Personnellement j'utilise souvent 24 ips dans mes animations, c'est d'ailleurs la fréquence utilisée à la télévision.
Pour modifier cette valeur dans votre animation, il vous suffit de double-cliquer dessus.
Formes et Symboles
Tous les objets présents dans la scène sont :
soit des formes
soit des symboles
Les formes
Je passerai rapidement dessus, car je pense que vous savez déjà dessiner
c'est qu'elles sont vectorielles.
La particularité des formes dans Flash,
Les images Bitmaps
Prenons un exemple : ouvrez paint, dessinez une droite, puis zoomez à fond dessus !
14 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Vous remarquez que la droite est "crénelée", ou "pixelisée" : on peut distinguer chaque
pixel aisément.
C'est ce qu'on appelle une image bitmap, qu'on peut traduire par "carte de bit" en
français.
C'est vrai que ce n'est pas beaucoup plus parlant
. En fait, il faut se représenter
l'image comme une grille, où chaque case possède des coordonnées. Ensuite dans votre
image Bitmap, à chaque case, c'est à dire à chaque pixel, on associe une couleur.
Donc en clair, plus on zoom, plus c'est moche
Les images vectorielles
On peut bien sûr importer des images Bitmaps dans Flash, mais
non seulement c'est moche quand on zoom dessus, mais en plus
ça prend beaucoup de place, car il faut stocker la couleur de
chaque pixel de l'image !
A la base, les animations Flash sont censées être très légères,
car elles sont faites pour le Web, et tout le monde ne possède
pas du 100Mbit/s comme connexion internet
En Flash on dessine donc avec des vecteurs. Vous pouvez
dessiner une droite dans Flash, et vous verrez que même en
zoomant à fond, elle reste lisse !
Dans une image vectorielle on ne stocke donc pas la couleur de
chaque pixel, mais seulement les coordonnées d'un vecteur et
de son origine. Si vous regardez le schéma à côté, le vecteur
est représenté par la flèche orange. Son origine correspond au
point A.
On a juste besoin d'enregistrer la position du point A et les
coordonnées (la longueur et l'orientation si vous préférez) du
vecteur. Ensuite, le lecteur Flash, interprétera les données et dessinera une droite partant de A et suivant le vecteur.
Le principe reste le même si vous dessinez des courbes ou des formes complexes, les vecteurs permettant alors
d'indiquer en plus la "courbure" d'une droite.
A vous de jouer
Maintenant que vous savez ce qu'est une image vectorielle, je vais vous laisser jouer avec les pinceaux et stylos de la
barre d'outils. Ils se manipulent presque comme ceux de Paint ou de Photoshop, mais vous devez garder à l'esprit qu'ils
fonctionnent avec des vecteurs, vous ne pourrez donc pas faire de Pixel-Art dans Flash
Les symboles
Tout ce qui n'est pas une forme est nécessairement un symbole. Première particularité des symboles : ils sont tous listés
dans la bibliothèque.
Prenons un exemple. Dessinez un carré rouge sur la scène avec l'outil rectangle, sélectionnez votre joli carré et cliquez
dans les menus sur Modification -> Convertir en Symbole.
Vous pouvez donner un nom à votre symbole. Ce nom permettra de le retrouver dans la bibliothèque, on l'appellera donc
nom de bibliothèque.
La fenêtre vous demande aussi l'alignement de la forme sélectionnée dans le symbole. Soit vous centrez le symbole avec
la forme, soit vous mettez la forme dans un des coins du symbole. A vous de choisir, pour l'instant.
15 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Comme vous pouvez le voir, il existe 3 types de symboles. Nous allons les
détailler plus bas.
Pour l'instant votre nouveau symbole apparaît dans la bibliothèque.
Ce qu'il y a sur votre scène n'est donc plus une forme, mais un symbole, vous
ne pouvez donc plus le modifier directement avec les outils.
En fait la forme est maintenant contenue dans le symbole. Pour la modifier,
il faut rentrer dans le symbole. Vous pouvez pour cela double-cliquer soit sur
l'occurrence du symbole dans la scène soit sur son nom dans la bibliothèque.
Maintenant, glissez-déplacez plusieurs fois le symbole de la bibliothèque vers
la scène. Vous remarquez qu'on peut en mettre autant qu'on veut ! En fait, le
symbole dans la bibliothèque est le "modèle" et tous ceux sur la scène sont
des occurrences de ce modèle.
D'ailleurs si vous modifiez un seul de ces symboles, la modification se
répercute sur tous les autres !
Il est possible de placer un symbole dans un autre, puis dans un autre, puis
dans un autre etc..., à l'infini ! Par contre, n'essayez pas de placer un
symbole dans lui même : ça ne fonctionnera pas !
Voyons maintenant les différences entre les différents symboles :
Le graphique
Le graphique est le symbole le plus simple ! Il permet de convertir une forme en symbole et de le réutiliser le nombre de
fois voulu sur la scène. Un graphique n'apporte aucune interactivité et doit donc être utilisé décorativement seulement.
Les graphiques peuvent aussi être animés, il faudra alors préciser s'ils doivent l'être en boucle ou pas dans les propriétés
de l'occurrence. (Vous sélectionnez l'occurrence sur la scène et vous pouvez modifier ses propriétés dans le panneau
justement nommé Propriétés)
Le bouton
Les boutons permettent de rajouter un peu d'interactivité dans votre animation, en permettant à l'utilisateur de cliquer
dessus. On peut ensuite lier le bouton à un Script.
Vous pouvez remarquer que le scénario d'un bouton est différent de celui de la scène ou d'un graphique. On ne peut y
mettre que 4 images, qui correspondent aux 3 états du bouton plus sa zone de réactivité.
Le premier état Haut correspond à l'aspect du bouton quand on n'y touche pas. Dessus correspond à la forme du bouton
quand on passe la souris dessus, et Abaissé c'est tout bêtement quand on clique dessus. Vous pouvez ainsi créer 3
images-clés pour chaque état et constater par vous même.
La dernière image : cliqué, ne sera jamais visible par l'utilisateur, elle permet de spécifier la zone cliquable. Ainsi, si
vous n'avez que du texte dans votre bouton, pour cliquer dessus, il faudra viser une lettre précisément, pas à côté !
Alors que si vous rajoutez un rectangle qui encadre le texte dans l'image-clé Cliqué, alors il suffira de passer la souris
sur ce rectangle (invisible dans l'animation) pour que le bouton s'active !
Les boutons ne peuvent pas être directement "animés" (Avec une seule image, ça va être dur). Mais rien ne vous
empêche de créer un graphique animé, et de le placer dans un des états du bouton
Les Clips
16 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Aussi appelés quelquefois MovieClip, il est la crème des symboles ! (c'est pour ça que je le garde pour la fin)
Il est en tout point commun avec la scène (d'ailleurs, la scène est un clip par convention...) et c'est celui qu'on utilise le
plus. Si on le souhaite, il peut se comporter comme un bouton, on peut aussi lui adjoindre du code, et en plus il peut
être animé !
Bref, le symbole à tout faire. Pour l'instant je n'en dit pas plus, vous le découvrirez vous même plus tard. Vous
connaissez maintenant les bases du maniement de Flash. Maintenant, essayez de vous débrouiller tout seul et surtout :
expérimentez ! Touchez à tous les boutons, et si vous ne comprenez pas l'utilité de l'un d'eux, allez voir dans l'aide de
Flash !
Pareil pour le dessin, je ne vais pas vous montrer comment manier ces outils. C'est à vous de les essayer et de
comprendre leur maniement.
Où je le mets ce fichu code ?
La principale difficulté du flasheur débutant est la position de son code dans l'application.
On va donc déjà aborder la notion de clip chère à Flash pour ensuite s'attarder sur la meilleure posture à adopter
Je rappelle ici des bases que j'ai déjà présentées dans le chapitre sur la présentation de l'IDE Flash. Mais
comme ce sont des notions très importantes : mieux vaut deux fois qu'une
Notion de "clip"
On appelle la scène principale de votre application, le carré blanc au centre de l'écran quand vous créez un nouveau
document.
Retenez que son nom est _root
Il faut considérer les clips, comme les "briques" d'une animation Flash. Le clips sont des petites animations à part
entière, dans la mesure où ils ont leur propre scénario indépendant du scénario de la scène principale.
Il est possible de créer des clips sur la scène (Insertion->Nouveau symbole ou Modification->Convertir en symbole). Les
clips présents sur scène sont des symboles auxquels on peut donner un nom d'occurrence.
Chaque clip peut lui même comprendre d'autres clips, qui peuvent eux aussi avoir des clips, qui peuvent ... Enfin bref,
On peut imbriquer des clips les uns dans les autres !
vous m'avez compris
Voyons maintenant comment se place le code par rapport aux clips, il est possible de placer de l'ActionScript :
Sur le clip (on sélectionne le clip, et on va dans l'onglet "action")
Dans un clip (on rentre dans le clip en double-cliquant dessus, on sélectionne une image du scénario, et on code
dans l'onglet "action")
Par convention, _root (la scène principale) est un clip, on peut donc lui assigner du code en sélectionnant une image clé
dans le scénario et en codant dans l'onglet action. (et c'est ce qu'on fera
)
Et le cauchemar ne s'arrête pas là !
Car si on peut mettre du code sur une image clé d'un clip, ça veut dire qu'on peut mettre du code différent sur chaque
image clé dans un même clip ...
Bref que de réjouissances en perspective
Créer un clip
17 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Nous allons brièvement voir comment créer un clip.
Dans la barre des menus, cliquez sur "Nouveau Symbole" ou alors utilisez le raccourci ctrl+F8
Une boite de dialogue apparaît pour vous demander le nom que vous souhaitez donner au nouveau clip. Le nom qu'on
donne là n'a pas d'influence en ActionScript, ce nom n'est là que pour "décorer", c'est à dire vous faciliter la vie pour
retrouver ce clip qui va s'ajouter dans la bibliothèque. Au cours de ce big-tuto, on appellera ce nom nom de
bibliothèque. La plupart du temps, ça sera à vous de choisir ce nom, dans la mesure où il n'a pas d'utilité en
ActionScript.
Image utilisateur
Maintenant toujours dans cette même boite de dialogue, si vous cliquez sur avancé, vous obtiendrez de nouvelles
options, dont une qui nous intéressera plus particulièrement par la suite : le nom de liaison. Pour pouvoir donner un
identifiant à notre clip, il va falloir cocher la case "Exporter pour ActionScript". Le nom que vous donnez là est très
important, car il permettra de créer le clip sur la scène en utilisant ActionScript. Au long de ce tuto nous appellerons
cet identifiant : nom de liaison.
Ne vous inquiétez pas de voir autant d'options pour l'instant ! Retenez seulement ce qui est utile pour
nous. Nous verrons le reste plus tard en abordant de nouvelles notions.
18 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Une fois le clip créé, il apparaît dans la bibliothèque où tous les clips sont classés par ordre alphabétique suivant leur
nom de bibliothèque.
Vous pouvez ensuite glisser un clip sur la scène ce qui va créer une occurrence de ce clip.
Une occurrence d'un clip est en fait une "copie" sur la scène d'un symbole de la bibliothèque.
Il est possible de créer plusieurs occurences d'un même clip : on peut le faire avant de compiler l'animation
comme nous l'avons fait à l'instant en glissant simplement le clip de la bibliothèque sur la scène, mais aussi de
façon dynamique avec ActionScript, nous verrons cela plus loin dans le cours !
Il peut y avoir un nombre virtuellement infini d'occurrences d'un même clip. Et chaque occurrence possède un nom
d'occurrence que vous devez assigner dans les propriétés de l'occurrence. Pour cela vous devez sélectionner
l'occurrence du clip et aller changer la zone Nom de l'occurrence dans l'onglet Propriétés.
Chaque occurrence de clip peut contenir d'autres occurrences d'autres clips (mais pas de lui même). On retrouve une
structure arborescente. Le premier de tous les clips, c'est à dire celui qui contient tous les autres, est appelé dans ce
tuto scène principale ou encore par son petit nom : _root
Pour rentrer dans un clip : vous double-cliquez dessus.
Pour sortir d'un clip : vous double-cliquez dans une zone vide.
Vous savez en permanence où vous êtes en regardant le scénario, par exemple dans l'image ci-dessous, je suis dans une
occurrence de a_monclip qui est lui même dans une occurrence de c_monclip qui est lui même dans la scène principale
!
19 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Les zones de texte
Deux notions à comprendre pour la suite du cours. Nous avons vu que quand je vous demanderais de nommer un clip, je
parlerai toujours de son nom d'occurrence. Une occurrence d'un clip possède un nom d'occurrence qui permet d'y
accéder par ActionScript, il possède aussi comme nous l'avons vu un nom dans la bibliothèque qui n'a aucune utilité en
ActionScript, ainsi qu'un nom de liaison que nous étudierons plus tard.
Il existe trois types de zone de texte :
statique : dans ce cas, on ne peut la modifier une fois l'animation lancée, elle n'a donc aucun identifiant (pas de
nom d'occurrence, pas de variable associée ...)
dynamique : elle peut être modifiée par ActionScript en connaissant l'identifiant de la zone de texte
de saisie : l'utilisateur peut écrire dedans et le contenu récupéré par l'intermédiaire d'ActionScript
Nom d'occurrence d'une zone de texte
Les zones de texte, à l'instar des clips, possèdent un nom d'occurrence, qu'on peut modifier exactement de la même
façon (sauf pour les zones de texte statiques qui n'ont pas besoin d'identifiant).
Je le rappelle, vous pouvez le modifier là :
Les zones de texte
Les champs de texte possèdent aussi une variable associée. Cette variable permet d'accéder au contenu textuel de la
zone de texte.
On peut modifier cette variable comme cela :
La solution pratique
Comme vous l'avez vu : c'est un peu le bordel
Donc nous on va simplifier tout ça grâce à quelques conseils simples :
Jamais de code sur un clip tu ne mettras
En effet, ça complexifie énormément la gestion du code, et la façon de coder sur un clip diffère de celle dans un clip.
Toujours dans la scène principale _root tu coderas
Alors là, c'est quand même fort ! On peut mettre du code où on veut, et toi tu nous dis de ne le mettre
que dans la scène principale !
Mais non, vous allez voir, ça va vous simplifier la vie ! Parce que comme cela, vous aurez tout votre code au même
20 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
endroit !
Sur la scène principale, un calque "action" tu créeras, où tout ton code tu mettras
Et oui, non seulement on va mettre tout le code sur la scène principale, mais en plus on le mettra dans un calque à part.
ActionScript se fiche royalement des calques, on pourrait donc mettre le code n'importe où : ça ne changerait rien. C'est
juste une question de propreté de mettre toujours son code dans un endroit facilement accessible.
Ces 3 conseils de base, sont très très importants, et j'essayerai (je dis bien "essayerai") de m'y tenir dans mes tutoriaux
Si vous êtes grand débutant avec Flash, voilà la procédure à suivre pour écrire du code :
Dans la scène principale, créez un nouveau calque Actions, sélectionnez l'image clé de ce calque et là ouvrez
l'onglet "action". C'est là qu'il faudra placer tout le code que je donnerai par la suite.
Alors, il était facile ce QCM, non ?
Ma première animation !
Nous allons créer votre toute première animation avec un soupçon d'ActionScript. Je vous guiderais surtout pas à pas
avec un maximum d'image pour que vous ne vous perdez pas.
Ce premier tuto vous permettra donc de vous familiariser de façon concrète avec Macromedia Flash 8
Un nouveau document
Commencez par ouvrir Flash.
Nouveau document
Si vous n'avez pas devant vous une nouvelle scène vierge, nous allons nous même créer une nouvelle animation.
Allez donc dans Fichier->Nouveau...
Cette boite de dialogue devrait s'ouvrir :
21 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Sélectionnez Document Flash dans la liste si ce n'est pas déjà fait, puis cliquez sur OK.
Propriétés du document
Normalement, en cliquant sur un espace vide de votre scène, vous devriez avoir un panneau Propriétés ressemblant à
celui ci-dessous :
Il contient plusieurs informations importantes sur votre animation. Déjà vous trouvez sa taille. Ça tombe bien, j'aimerais
bien la réduire un peu. Cliquez donc sur le bouton indiquant la taille de l'animation pour ouvrir la boite de dialogue
suivante :
22 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Vous pouvez mettre un titre si vous le souhaitez, je me suis contenté de mettre 300pixels en largeur et 100pixels en
hauteur pour mon animation.
Si vous le désirez vous pouvez aussi changer la couleur d'arrière-plan pour des tonalités plus exotiques
Dessine moi une balle
Dessine moi une balle
Sélectionnez dans la barre d'outils à gauche l'outil ovale :
Ensuite avant de dessiner votre balle, choisissez les couleurs qui vous plaisent.
La couleur du haut, avec le petit crayon à côté, représente la couleur de la bordure de vote futur cercle.
Dans notre exemple nous prendrons un bleu foncé.
La couleur du bas, avec le seau de peinture à côté, représente la couleur de remplissage, c'est à dire de
l'intérieur de votre cercle. Prenez un bleu clair/turquoise
Maintenant, vous pouvez dessiner votre ovale sur la scène, si vous enfoncez la touche Majuscule pendant
23 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
que vous tracez l'ovale, celui là deviendra un cercle
Voilà à quoi ressemble notre balle :
Lui mettre un numéro
On va dessinez un petit numéro sur notre balle. Il faut donc utiliser l'outil texte juste au dessus à droite
de l'outil ovale qu'on vient d'utiliser. Il est représenté par un A majuscule.
Vous pouvez alors écrire un 1 sur la balle, comme ci-dessous :
Sélectionnez votre champ de texte, vous pouvez modifier ses propriétés en bas. Comme dans n'importe quel éditeur de
texte, vous pouvez choisir une police, une taille, une couleur ... je pense que vous êtes en terrain connu !
Transformation !
Par la suite, je voudrais que la balle puisse bouger sur la scène pendant l'exécution de l'animation. Une forme ne peut
pas bouger, on va donc devoir transformer notre balle en symbole !
Sélectionnez donc la forme plus la zone de texte, et cliquez sur Modification->Convertir en symbole (ou faites F8 tout
simplement).
Ici, un simple graphique suffira pour ce que nous voulons faire ! Cliquez sur OK
Interpolation de mouvement
24 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Imaginez que vous ayez un clip dans une position à un moment puis dans une autre plus tard, et que vous vouliez créer
une transition entre les deux états ? Oui, vous avez deviné, c'est l'interpolation de mouvement qui va s'occuper de ça !
Il existe aussi une interpolation de forme, qui comme son nom l'indique permet de modifier une forme. A
l'inverse une interpolation de mouvement ne peut s'appliquer que sur un symbole !
Placez votre graphique "balle" tout à gauche de votre animation.
Votre scénario devrait ressembler à ça pour l'instant :
Il n'y a qu'une seule image clé, nous allons en créer une seconde en position 10.
Pour cela, cliquez sur la case 10 avec le bouton droit de la souris et cliquez sur Insérer une image-clé.
Voila à quoi ressemblera votre scénario :
Pour l'image-clé 1 laissez votre balle à gauche de la scène. Pour l'image-clé 10 mettez la balle complètement à droite.
Maintenant, cliquez avec le bouton droite sur l'espace grisé entre les deux images-clés, et dans le menu sélectionnez
Créer une interpolation de mouvement. L'espace devrait devenir bleu avec une flèche continue, comme ci-dessous :
Si vous appuyez sur Entrée, vous pourrez voir le déplacement de la balle de gauche à droite !
Tester l'animation
Flash possède un outil complet pour tester votre animation. Pour compiler puis prévisualiser l'animation, vous pouvez
soit cliquer sur Contrôle->Tester l'animation soit utiliser la combinaison de touches Ctrl+Entrée.
25 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Comme vous le constater la lecture de l'animation se fait en boucle
Un soupçon d'ActionScript
Il serait dommage de ne pas parler d'ActionScript dans ce chapitre d'introduction. Je vais donc montrer les deux, trois
trucs à absolument connaître.
Arrêter la lecture
On va voir comment arrêter la lecture en boucle de l'animation. Placez vous sur la dernière image-clé (en position 10).
Ouvrez le panneau Action en haut de votre IDE si vous l'avez placé comme moi.
C'est là que l'on va taper notre code :
Attention ! Le code que vous tapez là appartient à l'image-clé 10. Si vous revenez à la position 1, le
panneau Action sera vide. Le code que nous allons donc taper en position 10, s'exécutera quand cette image
sera lue !
Tapez ce code tout simple
Code : ActionScript
:
stop();
Et lancez votre animation (Ctrl+Entrée).
Vous devriez voir que la balle arrête sa course une fois à droite.
C'est normal, stop() est une fonction d'ActionScript qui arrête la lecture de l'animation. Vous remarquez aussi, que la
26 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
ligne se termine par un
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
;
Pour l'instant, ne vous attardez pas sur les détails, ça sera le contenu des prochains chapitres. Essayez seulement de
retenir comment on écrit du code et de comprendre son domaine d'action.
Un bouton pour la suite
Créez un second calque "Action" dans votre scénario et créez une seconde image-clé aussi en position 10.
Vous remarquez au passage la présence du petit a sur l'image-clé où nous avons écris le code.
Supprimez le stop(); de là où il est, et mettez le sur l'image-clé 10 du calque "Action", car c'est là que nous mettrons
tout le code.
Bien entendu, cette manipulation n'a strictement rien changée dans l'animation. Elle permet juste de centraliser le code
pour une meilleure organisation.
Sélectionnez l'image-clé 10 du claque "Action" et dessinez sur la scène un petit carré.
Transformez ce carré en bouton :
Puis retournez sur la scène principale en double-cliquant sur un espace vide de la scène.
Et donnez à ce bouton un nom d'occurrence, en le sélectionnant puis en allant regarder dans ses propriétés. Appelez le :
monbouton
Image utilisateur
27 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Maintenant, allez dans l'onglet Action où vous aviez déjà écris stop();.
En dessous rajoutez ce code :
Code : ActionScript
monbouton.onRelease = function() {
play();
};
Vous ne pouvez pas encore comprendre tout le code. Sachez que monbouton.onRelease va exécuter le code entre les
crochets { } quand on cliquera sur monbouton.
Entre les crochets on a la fonction play() que vous devez connaître, qui va reprendre la lecture de l'animation.
En gros, ce qu'il se passe si vous exécutez l'animation :
- lecture de l'animation
- arrêt à l'image 10 car rencontre du stop();
- apparition du bouton rouge car positionné sur une image-clé en position 10
- si on clique sur le bouton, exécution de play(), qui reprend la lecture
Voilà, c'est tout pour ce court, mais très
imagé, mini-tuto.
Ce que vous devez avoir absolument retenu, c'est comment écrire du code dans Flash !
Vous devriez aussi savoir de façon très rapide et sans explication créer un nouveau symbole : graphique, bouton ou clip.
Je ne l'expliquerai plus
Fil rouge
Et voilà le début de notre Fil Rouge, à savoir l'élaboration de petites animations incluant les fonctionnalités les plus
usuelles utilisant la technologie Flash
Si vous avez bien suivi les deux précédents tutoriaux, nous avons en gros deux possibilités :
- soit un site uniquement en Flash
- soit un site constitué de pages Web Xhtml classiques avec intégration d'objets Flash
Et bien certains seront peut-être déçus, mais pour des raisons bassement pédagogiques, on va prendre la deuxième
solution
Mais ne me huez pas !
Car si un site tout en Flash empêche l'intégration d'éléments Xhtml (ou du moins presque, nous verrons cela par la
suite), un site en Xhtml classique n'empêche pas l'intégration d'applications Flash complètes. Il vous suffira alors
d'extrapoler un peu le cours pour faire votre site Flashocentriste
Cahier des charges
Et oui, comme dans tout projet qui se respecte, la première chose à faire est la laborieuse et lassante, mais néanmoins
inévitable, rédaction du célèbre cahier des charges
Définition du cahier des charges (pour nos Zéros analphabètes comme leurs pieds
):
Document qui décrit en terme de fonctions, d'aptitudes de qualité ce que l'on attend d'un produit
C'est plus clair pour tout le monde ? Ça reste tout de même très théorique.
On va donc dans un premier temps rédiger tout ce que nous allons demander à nos petites animations :
Un logo (rigolo) - Va nous permettre d'apprendre les bases
Un jeu de voiture basique - Application aisée des bases
Un lecteur mp3 - aussi appelé radio-flash ou radio-blog, c'est à la mode et c'est très instructif
Une galerie d'images - toujours sympathique pour afficher ses photos de vacances
Un mini-jeu - la consécration !
28 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
L'ordre dans lequel on va le faire est l'ordre dans lequel je l'ai écrit, et vous allez voir que vous allez vite progresser
Architecture globale
On a le cahier des charges, alors maintenant il va falloir se demander comment on va agencer tout ça d'un point de vue
liaisons entre interface (=côté utilisateur) et serveur
Le Logo
Le logo ne nécessite aucune donnée externe, ce sera donc une bête animation flash sans liaison.
Il faudra penser à l'intégrer en haut de chaque page grâce à la fonction include() de PHP
Un jeu de voiture basique
Ça sera un tout petit jeu vraiment basique. mais il permettra une première synthèse de vos connaissances en les
utilisant toutes dans un projet comportant quelques lignes de codes
Un lecteur Mp3
Dans le cas d'une playlist de dizaines de Mp3, Flash va devoir se débrouiller lui même pour aller chercher d'abord la liste
des musique, puis ensuite les charger bien entendu pour pouvoir les écouter
Il faudra donc prévoir une page PHP qui sera appelée par l'application Flash et qui retournera une Playlist.
Une galerie d'image
Bon, a priori pas de grandes différences entre un lecteur mp3 et une galerie d'image ... Sauf que les musiques du lecteur
sont présentées sous la forme d'un liste textuelle, alors que dans une galerie il faudra afficher des miniatures.
Et pour la déconnade, on fera vite fait un script d'upload des images conjuguant PHP côté serveur et la toute nouvelle
fonction d'upload de Flash côté client (aïe va falloir que je me documente, je connais pas encore
)
Le Mini-jeu
Vous l'attendiez : vous l'avez !
Le mini jeu permettra une synthèse de vos connaissances. Il nous faudra donc une bonne idée de jeu sympathique et un
système de high-score (Pour toute idée de jeu sympa et pas trop dur à réaliser, envoyez moi un MP ou laissez un
commentaire )
Voilà, on a donc une idée des liaisons que chaque application Flash nécessitera
Schéma fonctionnel des liaisons :
Dans ce chapitre, nous avons donc délimité les champs d'application de Flash, et nous avons vu d'un point de vue très
théorique ce qu'allait être notre travail tout au long de notre Fil Rouge
29 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Partie 2 : Les bases de l'actionscript
Actionscript est le langage de script de Flash. C'est grâce à lui qu'une bête animation Flash gagne toute son interactivité.
Macromedia s'est inspiré du standard ECMAscript (nom standard du javascript) pour créer son langage, vous retrouverez
donc de fortes similitudes avec ce langage pour les chanceux qui le connaissent déjà.
Nous allons nous intéresser à la structure du code et au positionnement de ce dernier, Flash possédant un système de
"clip" sur et dans chacun desquelles du code peut être placé. Ce qui créé une complexité artificielle dans la conception
d'application.
Prérequis : Vous devez avoir bien compris le maniement de l'IDE de Flash. Vous devez surtout savoir
comment créer un clip.
But :
- Assimiler la structure de l'ActionScript
- Comprendre le système d'événements
=> Logo animé de Zozor !
Variables et fonction trace()
Nous allons étudier la structure en objets de l'Actionscript (dont l'abréviation est tout simplement AS).
Je vous parlerai principalement de l'AS 2.0, successeur plus complet, mais plus complexe pour les débutants, de l'AS 1.0
(Qui dit AS 2.0, dit nécessité d'utiliser Flash mx, Flash Mx 2004 et même si possible Flash 8 que j'utilise pour écrire ce
tutorial)
Structure et commentaires
Tout langage informatique repose sur la gestion des variables, AS ne déroge pas à la règle.
Les variables sont là pour qu'on leur affecte des valeurs, numériques, textuelles, graphiques, ...
Il faut aussi savoir que chaque instruction en AS se termine par un
ligne est finie, et qu'une nouvelle instruction commence.
; ce qui permet de préciser au compilateur AS que la
En AS 2.0, il est fortement conseillé de déclarer les variables, ce qui était très optionnel à l'époque de l'AS 1.0. Il est
aussi nécessaire de faire attention aux majuscules et minuscules, car l'AS est sensible à la casse. Ainsi si vous écrivez
mavar et Mavar, Flash comprendra deux instructions différentes.
Voilà comment attribuer la valeur 5 à la variable mavar
Code : ActionScript
mavar = 5;
Vous noterez, que c'est l'opérateur = qui permet d'attribuer une valeur à une variable. On l'appelle opérateur
d'assignement : il assigne la valeur de droite à la variable de gauche
Vous constatez aussi, qu'il est tout à fait autorisé en AS d'ajouter des espaces entre les différentes expressions, ainsi
tous ces codes reviennent au même :
Code : ActionScript
mavar = 5;
mavar=5;
mavar= 5 ;
30 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Autre point important, il est possible de commenter votre code, et c'est même recommandé.
Deux techniques possibles, utiliser /* mon commentaire */ sur plusieurs lignes ou // mon commentaire sur une seule
ligne
Code : ActionScript
mavar = 5; // On assigne 5 à mavar
/* Je blablate sur
plusieurs lignes */
Types de variables : Number, String et Array
On va maintenant aborder les trois types, ou classes, de variables les plus importantes !
1. Number
2. String
3. Array
1. Type Number
Ce que Flash appelle Number (Majuscule au N, attention !), ce sont tout simplement les variables contenant des
nombres. Voyons comment déclarer une variable Number :
Code : ActionScript
var monnombre:Number = new Number(123); //Méthode complète
var monnombre:Number = 123; //Méthode plus simple, mais correcte
monnombre = 123; //Méthode courte, et peu recommandée, car on ne donne pas le type de
variable
Vous remarquerez que seules les deux premières techniques nécessite l'instruction var. Ce petit mot permet non
seulement de définir précisément le type de la variable, mais supprimera aussi automatiquement la variable une fois
que les instructions du bloc auquel appartient la variable seront terminées. Là les variables n'appartiennent à aucun
bloc, elle ne seront donc pas supprimées avant la fin de l'animation (les blocs de codes sont délimités par des accolades
{ } ).
Une fois déclarée dans un type, n'essayer pas d'affecter un autre type de valeur à une variable ! Ça
conduira à une erreur du compilateur
Voyons ce qu'on peut faire avec ces variables ...
Commençons avec les opérations simples :
Code : ActionScript
var monnombre:Number = 10; //On déclare monnombre et on lui assigne 10 comme valeur
monnombre = monnombre + 5; // on rajoute 5 à la variable, ce qui donne ... 15 !
monnombre = 10; // Remettons à 10 la variable
monnombre = monnombre - 5; // En toute logique ca donne 5
monnombre = 10; // Une fois déclarée, pas besoin de repréciser que c'est du type Number
monnombre = monnombre * 5 ;// on multiplie par 5 la variable => 50
monnombre = monnombre / 10 ;
/* On avait 50 à la ligne d'avant, on n'a pas remis la variable à 10, on a donc 50 divisé
par 10, ce qui fait 5 ! */
31 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
Mais il existe des opérateur qui nous simplifient la vie
Prenons un exemple :
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
, il permettent d'éviter de répéter monnombre à gauche.
Code : ActionScript
var monnombre:Number = 10;
monombre += 5; // Ca revient au même que monombre = monnombre + 5;
monnombre *= 5; // Même chose que monnombre = monnombre * 5;
Ça va quand même plus vite, non ?
Bien entendu vous trouverez aussi les opérateur -= et /=, opérateur d'affectation de soustraction et d'affectation de
division.
2. Type String
Le type String permet le "stockage" de chaînes de caractères, c'est à dire de texte.
Les Number s'écrivent directement, mais les String doivent être entourés de guillemets
" ou
d'apostrophes ' pour que l'ordinateur sache qu'il s'agit de chaînes de caractères
Déclarons un String, comme toujours dans l'ordre du plus académique au plus faignant
:
Code : ActionScript
var machaine:String = new String("Salut la compagnie");
var machaine:String = "Salut la compagnie";
machaine = "Salut la compagnie";
En fait, pour les puristes, il faudrait distinguer la première ligne qui construit un objet String et les deux
autres qui créent des chaînes littérales. De toute façon Flash convertira votre variable automatiquement si
besoin est, donc vous aurez rarement l'occasion de vous en soucier
Pour les Number, nous avions des opérateurs mathématiques permettant d'effectuer des calculs. Ici pas d'opérateur
mathématique, mais un opérateur de concaténation (beau mot n'est-ce pas ?). La concaténation permet de "coller" deux
chaînes de caractères, en Flash on utilise le
+
C'est là que les problèmes commencent pour les maîtres du PHP, car en PHP on utilise le point
concaténation. Alors faites attention !
. pour la
Exemple :
Code : ActionScript
var machaine:String = new String();
machaine = "Salut" + " la compagnie"; // Ce qui donne "Salut la compagnie"
On aurait aussi pu donner la valeur "Salut" à machaine puis rajouter le reste après :
Code : ActionScript
var machaine:String = "Salut";
machaine = machaine + " la compagnie"; // Ce qui donne aussi "Salut la compagnie"
32 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Mais cette dernière solution revient au même :
Code : ActionScript
var machaine:String = "Salut";
machaine += " la compagnie"; // Ce qui donne encore "Salut la compagnie"
Supposons maintenant que vous vouliez mettre dans votre texte le caractère ". Ça risque d'être embêtant puisqu'on
l'utilise déjà comme caractère délimitant la chaîne...
Encore une fois, on a plusieurs solutions.
On peut utiliser le caractère d'échappement \, en le plaçant devant le guillemet à échapper. On aurait donc :
Code : ActionScript
var machaine:String = "Il m'a dit \"Bonjour !\" ";
Ou alors on peut utiliser l'apostrophe pour délimiter le texte, dans ce cas là il faudra échapper les apostrophes
Code : ActionScript
:
var machaine:String = 'Il m\'a dit "Bonjour !" ';
Voilà déjà un bon morceau de dégrossi
3. Type Array
Il s'agit tout simplement des tableaux, qui permettent de stocker plusieurs valeurs dans des "cases". Je ne ferais pas de
théorie là dessus, pour cela aller jeter un coup d'oeil au cours sur le PHP ou le C++ : les tableaux sont les mêmes
partout.
Passons à la pratique :
Code : ActionScript
var montableau:Array = new Array("a", "b", "c"); //Exemple honteusement pompé sur l'aide de
Flash :p
Comment accéder à la deuxième valeur du tableau, c'est à dire "b" ?
Code : ActionScript
var montableau:Array = new Array("a", "b", "c");
var machaine:String = montableau[1]; //on place dans "machaine" la deuxième valeur du
tableau
Attends, attends ! Tu nous dit qu'on prend la deuxième valeur, or tu écris montableau[1] ... Pourquoi
pas montableau[2] ?
Bonne question, la réponse est simple, la première valeur d'un tableau est le 0. Donc la deuxième c'est 1, et la troisième
c'est 2...
Comment connaître le nombre d'entrées dans un tableau ?
Il vous faut utiliser la propriété length
Code : ActionScript
var montableau:Array = new Array("a", "b", "c");
var unnombre:Number = montableau.length; // "unnombre" correspond à 3
33 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Vous avez donc pu avoir un aperçu rapide des 3 types de variables les plus utilisées dans Flash. Pour en savoir plus sur
elles, allez dans l'aide de Flash, et cherchez les classes "Number", "String" ou encore "Array". Flash vous proposera un
nombre très intéressant de fonctions permettant de jouer avec ces variables.
Fonction trace()
La fonction trace() est la fonction la plus utile et la plus "puissante" de flash
.
Grâce à elle vous pourrez aisément construire, vérifier et débuger vos scripts. Depuis tout à l'heure nous faisons de la
théorie pure sur les variables, car vous n'avez aucun moyen de connaître la valeur d'une variable à la fin d'un calcul ou
d'une concaténation. trace() va répondre à vos attentes !
Pour commencer créez une nouvelle scène vide et tapez dans l'onglet action :
Code : ActionScript
trace("Hello World !");
Vous constatez que comme dans tous les langages de types fonctionnels (C, php, presque tous quoi ...), on passe les
)
variables à la fonction grâce aux parenthèses et ont fini chaque ligne de code par un ; (ça c'est pas nouveau
Chaque fonction peut requérir un certain nombre "d'arguments", c'est à dire de variables qu'on passe par les parenthèses
et qui sont séparées par des virgules. trace() n'accepte par exemple qu'un seul argument.
Rappel : les chaînes de caractères doivent être délimitées par des guillemets ou des apostrophes, tout
comme en PHP ou en JavaScript.
Si vous exécutez cette animation, vous constaterez que Flash ouvre une fenêtre nommée Sortie. C'est dans cette
fenêtre que s'affichera le contenu de toutes les variables que vous passerez à la fonction trace.
Nous allons maintenant passer aux opérations numériques.
Tapez dans l'onglet action :
Code : ActionScript
var resultat:Number = 5 + 5;
trace("Le résultat est : "+resultat); //Affiche 10 bien sûr
Le code ci-dessus n'est pas très "beau" du point de vue sémantique, car on concatène une chaîne littérale
avec un nombre ... Flash, intelligent comme il est, fait la conversion tout seul. Mais il aurait été préférable de
convertir resultat en texte en utilisant cette méthode : resultat.toString(). On aurait alors eu : trace("Le
résultat est : "+resultat.toString());
Maintenant, voyons comment la fenêtre de sortie peut s'afficher toute seule en cas d'erreur sans faire appel à la
fonction trace()
Essayons :
Code : ActionScript
var resultat:Number = 5+5;
resultat = "salut"; //Horreur, une chaîne de caractères sur une variable Number !
34 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
La fenêtre de sortie va alors afficher une erreur de type incompatibilité de type de variable. En effet nous affectons une
chaîne de caractères (type « String ») à une variable que nous avions définie de type « Number »
Pour coder de façon propre il est conseillé de définir chaque variable avant de l'utiliser, mais vous verrez
que cela n'est pas toujours nécessaire et j'espère que vous voudrez bien m'excuser de ne pas tout le temps le
faire.
C'est tout ce qu'il y a à savoir sur la fonction trace(), la première fonction à maîtriser, et celle qui vous permettra de
comprendre pourquoi ce fout** de put*** de bon de D** de code ne fonctionne pas
Récapitulatif des opérateurs
Type
Opérateur
Nom
Signification
Exemple
tous
=
Assignement
Affecte une valeur à la variable
mavar=5;
Number
+
Addition
Effectue l'addition entre deux nombres
monnombre=10+5;
monnombre+=5;
Number
+=
Addition et
assignement
Effectue l'addition entre la variable et un nombre et
affecte la nouvelle valeur à la variable (revient à
utiliser monnombre=monnombre+5;)
Number
++
incrémentation
incrémente la variable, c'est à dire augmente sa valeur
monnombre++;
de 1
Number
-
Soustraction
Effectue la soustraction entre deux nombres
Number
-=
Soustraction et
assignement
Effectue la soustraction entre la variable et un nombre
monnombre-=5;
et affecte la nouvelle valeur à la variable (revient à
utiliser monnombre=monnombre-5;)
Number
--
Décrémentation
Décrémente la variable, c'est à dire réduit sa valeur de
monnombre--;
1
Number
*
Multiplication
Effectue la multiplication entre deux nombres
monnombre=10*5;
Number
*=
Multiplication et
assignement
Effectue l'addition entre la variable et un nombre et
affecte la nouvelle valeur à la variable (revient à
utiliser monnombre=monnombre*5;)
monnombre*=5;
Number
/
Division
Effectue la division entre deux nombres (Attention, il
ne s'agit pas d'une division euclidienne, mais bien d'une monnombre=10/5;
division décimale)
Number
/=
Division et
assignement
Effectue l'addition entre la variable et un nombre et
affecte la nouvelle valeur à la variable (revient à
utiliser monnombre=monnombre/5;)
Number
%
Modulo
Renvoie le reste de la division entière de deux nombres monnombre=10%5;
Number
%=
Modulo et
assignement
Effectue le modulo entre la variable et un nombre et
affecte la nouvelle valeur à la variable (revient à
utiliser monnombre=monnombre%5;)
+
Concaténation
Concatène deux chaînes de caractères. C'est à dire que
monstring="salut"+"
l'opérateur va "coller" les deux chainées pour n'en faire
tout le monde";
qu'une
+=
Concaténation et
assignement
Concatène la variable avec la chaîne de caractères
après l'opérateur et assigne la nouvelle chaîne à la
variable (revient à utiliser monstring = monstring+"
tout le monde";
String
String
monnombre=10-5;
monnombre/=5;
monnombre%=5;
monstring+=" tout le
monde";
Comme vous avez pu le constater dans cette partie, l'ActionScript ne diffère des autres langages que par une plus grande
simplicité encore. Malgré tout, Flash vous offre beaucoup de possibilités. Je ne peux donc que vous conseiller de
souvent visiter l'aide, qui vous permettra de vous en sortir souvent sans aller demander du secours sur les forums
35 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Les Clips (ou MovieClip)
Les Clips (ou MovieClip ou MC) sont les structures de base de Flash ! C'est donc une classe que l'on utilisera beaucoup.
Les clips sont un peu comme une animation flash à part entière. Comme on l'a vu, il est possible d'y mettre du code.
Mais on évitera
_root , this et _parent
Je rappelle que tout le code que je donne sans indication se place de la façon suivante : vous devez être
sur la scène principale, sélectionner une image clé dans le scénario et ouvrir le panneau action. C'est là que
vous pourrez mettre le code ! Si vous ne vous rappelez plus de ce qu'est un clip ou comment les créer,
retourner lire ce chapitre : Où je le mets ce fichu code ?
_root
Nous avons déjà vu dans le premier chapitre, que le clip parent à tous les autres clips, qu'on appelle la scène principale
se nommait _root
Maintenant que nous avons quelques notions d'ActionScript, intéressons nous à la signification de ce _root.
Code : ActionScript
var monnombre:Number = 10;
trace(monnombre);
trace(_root.monnombre);
La fenêtre de sortie va vous afficher deux fois 10
Cela signifie que sur la scène principale, _root.monnombre = monnombre
C'est logique, puisque, vu qu'on est dans _root, on a pas besoin de le repréciser !
Le . entre _root et monnombre, permet de dire au compilateur que l'un est inclus dans l'autre. En effet la variable
appartient à l'objet _root (en Mathématique on parlerait d'ensemble).
Maintenant, on va faire une chose ignoble, mais nécessaire à l'apprentissage : on va mettre du code dans un clip !
Créez une nouveau clip, mettez le sur la scène principale et nommez le monclip (oui, je sais, l'originalité n'est pas mon
fort
. Et au passage, je précise que je parle de son nom d'occurrence)
Allez dans une image clé de ce clip (double-cliquez sur le clip), et tapez dans l'onglet action :
Code : ActionScript
trace(" monnombre => "+monnombre);
trace(" _root.monnombre => "+_root.monnombre);
Et laissez seulement ça sur la scène principale :
Code : ActionScript
var monnombre:Number = 10;
Voyons ce que nous affiche la fenêtre de sortie :
Code : Autre
monnombre => undefined
_root.monnombre => 10
36 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Et là on constate en effet, qu'essayer d'afficher la variable qui est déclarée dans _root, mais pas dans le clip, ne
fonctionne pas si on ne précise pas que cette variable se trouve sur _root. Le undefined signifie que la variable n'est pas
définie, car elle n'existe pas dans le clip monclip.
En clair, la variable monnombre existe dans _root.
Mais elle n'existe pas dans _root.monclip.
Pour y accéder à partir de _root.monclip, il faut préciser où elle se trouve : _root.monnombre.
this
Voilà une propriété que nous allons TOUT LE TEMPS utiliser.
this permet de préciser au compilateur qu'on travaille sur l'objet qui contient le script.
Bah, ça sert à rien, il suffit de rien mettre !
Souvent, en effet, this est optionnel. Mais vous verrez par la suite, quand on abordera les événements, que cette
propriété se révèle fort utile, pour préciser au compilateur que malgré que le code soit dans _root, il s'applique à un
autre clip.
Il est en effet possible d'écrire du code dans l'onglet action de _root qui se rapporte pourtant à un autre clip. Dans ce
cas, si on ne met pas this, la variable appartiendra à _root, et si on précise this, la variable appartiendra au clip dont on
parle. (Pour l'instant c'est normal que ça vous paraisse abstrait, nous prendrons des exemples par la suite).
_parent
_parent, renvoie au clip parent.
Et si on reprend l'exemple précédent, en remplaçant le _root.monnombre par
this._parent.monnombre, que se passera-t-il ?
Et bien ça fonctionnera !
En effet le clip parent de _root.monclip c'est la scène principale (_root).
Vous vous demandez peut-être si _root._parent.monnombre fonctionnerait ? La réponse est : non. En
effet, il n'existe pas de niveau "en dessous" de root. _root._parent renvoie donc à un objet qui n'existe pas !
_parent devient donc intéressant en cas d'imbrication d'un clip, dans un clip, dans un clip ...
Et c'est pour éviter d'utiliser cette propriété en spaghetti qu'on met tout le code au même endroit
En effet, si vous
commencez à mettre du code un peu partout dans des clips, vous devrez utiliser _parent plus souvent, et votre code
deviendra rapidement incompréhensible, aussi mal "ordonné" qu'un plat de spaghetti
Positionnement
Maintenant que nous savons comment accéder aux clips, nous allons apprendre à manipuler leurs propriétés,
commençons par les propriétés _x et _y des clips, qui permettent de positionner un clip au pixel près sur la scène.
Positionnement d'un clip sur _root
Dans un nouveau document créez un nouveau clip que vous nommerez dans l'onglet propriétés monclip (Ce qui nous
intéresse ici c'est le nom d'occurrence du clip, pas son nom dans la bibliothèque qui lui ne sert à rien en ActionScript.
Mais ça vous le savez déjà
Aller voir ici pour un rapide rappel)
Tapez dans l'onglet action (si je ne donne pas d'indication c'est que le code doit être placé dans la scène principale) :
37 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
monclip._x=0;
monclip._y=0;
En exécutant l'animation vous verrez que le clip se placera en haut à gauche de l'écran.
En fait c'est le point d'ancrage du clip qui se placera aux coordonnées indiquées. Le point d'ancrage d'un
clip correspond à la petite croix noire par défaut au centre d'un clip fraîchement créé, mais qu'il est plus
judicieux de placer en haut à gauche du clip dans certains cas.
Pour ceux qui n'auraient pas compris, la syntaxe à point, permet de séparer le nom du clip de sa propriété, ici on utilise
deux propriétés du clip. Sa position sur l'axe horizontale (axe des abscisse) est la propriété _x et _y est sa position sur
l'axe verticale (axe des ordonnées).
Voilà un petit schéma simple expliquant comment Flash et la
plupart des langages que je connaisse conçoivent le placement
d'un clip dans un plan, c'est à dire sur l'écran.
Vous pouvez ainsi donner n'importe quelle position au clip que
vous souhaitez en utilisant ce système.
Positionnement d'un clip dans un autre
complexifions un petit peu la chose, entrez dans le clip monclip et créez à l'intérieur un second clip que vous nommerez
clipdansleclip
Maintenant retournons dans le code, et voyons comment faire pour bouger ce clip à l'intérieur de l'autre.
Code : ActionScript
monclip._y = 50;
monclip._x = 50;
monclip.clipdansleclip._y = 25;
monclip.clipdansleclip._x = 50;
38 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
A votre avis, où va être placé le clip clipdansleclip ?
Et bien, il sera à 50 pixels à droite du point d'ancrage de
monclip.
Et monclip lui même sera à 50 pixels à droite du point
d'ancrage de la scène principale.
Donc par rapport au point d'ancrage de la scène principale,
le clip clipdansleclip sera à 50+50=100 pixels à droite et à 75
pixels vers le bas.
Cliquez ici pour voir une petite animation récapitulative
Taille absolue
Les clips possèdent aussi les propriétés _width et _height (respectivement largeur et hauteur en français).
Ces propriétés permettent d'indiquer la taille des clips en pixels. Le clip sera alors redimensionné par le lecteur Flash.
N'oubliez pas que _width, représente la largeur sur l'axe des horizontal. Et donc que la hauteur _height correspond à
l'axe horizontal.
Cliquez ici pour un exemple animé
Reprenez l'exemple précédent, et rajoutez :
Code : ActionScript
monclip._width = 300; // Largeur : 300px
monclip._height = 100; // Hauteur : 100px
Comme vous le constatez, la figure devient très allongée.
Si on voulait rendre le clip carré, il suffirait de prendre la même largeur et hauteur :
Code : ActionScript
monclip._width = 100; // Largeur : 100px
monclip._height = 100; // Hauteur : 100px
Voilà, le clip est carré.
Imaginons maintenant que nous voulions agrandir le clip de façon à garder ses proportions, c'est à dire conserver le
rapport largeur/hauteur d'origine.
Il faudrait alors suivre cette bête règle de trois :
Code : ActionScript
_width/*de départ*/ / _height/*de départ*/ = _width/*d'arrivée*/ / _height/*d'arrivée*/
39 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Il s'agit là d'une équation qui n'a rien de mathématique, arrangeons là pour que Flash la comprenne. Prenons l'exemple
d'une boite de largeur 100px et de hauteur 50px. Nous voulons que cette boite deviennent large de 200px, en conservant
les proportions. On cherche donc la hauteur ( x sur le schéma) qu'on va devoir lui donner pour conserver ce rapport.
Bon là, c'est facile, on voit qu'il suffit de multiplier par deux, mais dans des cas plus complexes, voilà le code qui
permettrait d'assigner la bonne hauteur à monclip
Code : ActionScript
monclip._height = 200*monclip._height/monclip._width;
Vous avez donc brièvement vu comment assigner une taille absolue à un clip, et même comment conserver ses
proportions lors d'un agrandissement.
Agrandissement
Pourquoi s'embêter avec des calculs pour conserver la proportion d'une image ou d'un clip. Utilisons les propriétés
_xscale et _yscale.
Ces deux propriétés permettent d'agrandir en pourcentage un clip sur l'axe horizontal _xscale ou vertical _yscale.
La valeur d'origine pour un clip est _xscale = _yscale = 100 puisque l'agrandissement se fait en pourcentage.
Reprenez l'exemple précédent, supprimer tout le code et tapez :
Code : ActionScript
trace("Agrandissement horizontal avant changement : "+monclip._xscale); // Affiche 100
monclip._xscale = 200; // on agrandit 2 fois en longueur le clip (100*2=200)
trace("Agrandissement horizontal après changement : "+monclip._xscale); // Affiche 200
Intéressant, n'est-ce pas ?
Maintenant, réduisons ce clip en conservant ses proportions, c'est à dire que son agrandissement horizontal et vertical
doivent être les mêmes.
Code : ActionScript
monclip._xscale = 50; // on réduit la taille de moitié (100 / 2 = 50)
monclip._yscale = monclip._xscale; // on conserve les proportions
On peut encore plus compresser ce code comme ça :
Code : ActionScript
monclip._xscale = monclip._yscale = 50;
Cliquez ici pour une petite démonstration de l'agrandissement proportionnel
40 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Rotation
Avant dernière propriété que nous allons étudier : _rotation
_rotation s'exprime en degré, et ses valeurs vont de -180 à 180 degrés. Si vous donnez une valeur supérieur, Flash fera
la transformation qu'il faut pour que ça tombe juste.
En effet n'oubliez pas qu'une rotation de 360° équivaut à une rotation de 0 degré, puisque 360° c'est un tour complet.
La rotation s'effectue avec le point d'ancrage du clip comme centre ! Ne l'oubliez jamais, c'est ce point
d'ancrage qui est le centre pour toutes les propriétés que nous avons vu !
Reprenons encore et toujours l'exemple précédent, mais je vous conseille de mettre une photo dans le clip, pour mieux
voir l'effet de _rotation en faisant Ficher->Importer->Importer dans la scène quand vous êtes en train d'éditer le clip.
Supprimez tout le code précédent, et essayez les différents codes suivants ligne après ligne (ne mettez pas tout d'un
coup, sinon, seule la dernière ligne aura un effet
):
Code : ActionScript
monclip._rotation
monclip._rotation
monclip._rotation
monclip._rotation
=
=
=
=
180 ; // On le retourne complétement
90 ; // La tête en bas
-90 ; // La tête en haut
45 ; // En biais
C'est bien beau tout ça, mais on va passer à plus complexe et surtout à plus utile ! On va demander à notre clip
d'effectuer une rotation dans la direction d'un autre clip
Pour ce faire, créez une nouvelle scène, un clip monclip et un clip cible, mettez ce que vous voulez dedans.
Tapez ce code :
Code : ActionScript
_root.monclip._rotation = Math.atan2(_root.cible._y-_root.monclip._y,
_root.cible._x-_root.monclip._x)/(Math.PI/180);
Et si vous executez l'animation, vous devriez obtenir cela :
Image utilisateur
Bon expliquons cette petite formule
_root.cible._y-_root.monclip._y => renvoie la distance verticale entre les deux clips
_root.cible._x-_root.monclip._x => renvoie la distance horizontale entre les deux clips
la fonction Math.atan2 inclue dans Flash, va renvoyer l'angle que le clip doit adopter en Radians. Or on cherche cet
angle en degré.
41 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Conversion d'un angle de radian en degré :
degré = radian / (pi/180)
ou encore
degré = radian*180 / pi
La classe Math de Flash contient non seulement cette magnifique fonction atan2, mais aussi la valeur approchée de pi :
Math.PI
Surtout gardez cette formule dans un coin, elle nous servira par la suite
Si vous ne l'avez pas compris, ce n'est pas bien grave. Mais suivez bien vos cours de Maths qui parlent de trigonométrie et
vous devriez en saisir le fonctionnement !
Cliquez ici pour voir une rotation à l'oeuvre
Transparence
Dernière des propriétés importantes que nous allons voir dans ce chapitre: _alpha
Flash est souvent utilisé pour ses effets visuels dynamiques. Or en voici un bien pratique : la transparence !
_alpha détermine la transparence d'un clip :
si _alpha = 0 alors clip invisible
si _alpha = 50 alors clip à moitié visible (ou à moitié transparent, ça dépend de votre état d'esprit
si _alpha = 100 alors clip visible
Allez faites donc quelques tests vous même
)
Je suis sûr que vous avez compris le truc
Mais attention ! Un clip a beau être totalement transparent, il existe toujours ! Ne l'oubliez pas, on
pourrait par exemple toujours cliquer sur un bouton complètement transparent !
Et comme d'habitude, une petite animation pour finir
Visibilité
Une propriété très intéressante : _visible
Vous pouvez lui assigner la valeur true (le clip est visible) ou false (le clip est invisible)
Par exemple :
Code : ActionScript
monclip._visible = false; //Le clip va devenir invisible
Quelle est alors la différence entre _visible=false et _alpha=0 ?
En fait non seulement _visible peut rendre un clip invisible comme le ferait _alpha, mais en plus il désactive le clip.
42 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Imaginez un bouton sur la scène principale, si vous utilisiez _alpha=0, alors le clip serait invisible mais vous pourriez
encore cliquer dessus. Mais si vous utilisez _visible=false alors le clip deviendra invisible et en plus il deviendra
impossible de cliquer dessus. C'était les propriétés de base des clips.
Vous avez pu constater que chacune de ces propriétés commençait par un
_, c'est un bon moyen de les reconnaître !
Les Conditions
Les conditions sont à la base de tout langage de programmation. En effet, la seule chose qu'on peut demander à une
machine c'est de faire ça si telle ou telle condition et remplie.
On va donc voir dans ce chapitre comment "tester" une variable, et exécuter une action selon le résultat du test !
Un nouveau type : Boolean
Vous m'excuserez de ne pas suivre un ordre "intuitif", mais avant de commencer à utiliser les conditions, je veux que
vous les compreniez. Et pour cela nous allons faire appel à un nouveau type de variable : les variables booléennes, ou
Boolean en anglais.
Vous avez dit booléen ?
C'est le type de variable le plus simple. Il n'a que deux valeurs possibles : true ou false (vrai ou faux en français)
Déclarons une variable booléenne, comme d'habitude, 3 techniques possibles :
Code : ActionScript
var mabool:Boolean = new Boolean(true); //Méthode complète
var mabool:Boolean = false; //Méthode plus simple, mais correcte
mabool = true; //Méthode courte, moins stricte, car on ne donne pas le type de variable
Maintenant, imaginons que nous ayons deux variables numériques, et que nous voulions savoir si elles ont la même
valeur ou non.
Code : ActionScript
var mabool:Boolean = new Boolean(); // On définie une variable booléenne. En l'absence de
valeur, elle prend d'elle même la valeur false
var nombre_a:Number = 100;
var nombre_b:Number = 50;
mabool = (nombre_a==nombre_b); // On assigne à mabool la valeur résultante du test
trace(mabool);
Et vous allez voir apparaître dans la fenêtre de sortie : false. Ce qui est tout à fait logique puisque 100 est différent de
50
Vous avez pu constater qu'entre nombre_a et nombre_b on a intercalé l'opérateur ==. Cet opérateur permet de tester
l'égalité entre deux variables.
Maintenant, refaisons le test de façon un peu plus rapide, sans passer par les variables :
Code : ActionScript
var mabool:Boolean = new Boolean(); // On définie une variable booléenne. En l'absence de
valeur, elle prend d'elle même la valeur false
mabool = (100==100); // On assigne à mabool la valeur résultante du test
trace(mabool);
Et là, miracle, la fenêtre sortie nous gratifie d'un beau true
43 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Conversion vers Number ou String
Chose utile à savoir, mais qui ne devrait pas nous gêner puisqu'on code proprement en indiquant le type de chaque
variable, pour Flash true et 1 et false et 0 sont la même chose.
Ainsi, testez donc cette ligne :
Code : ActionScript
var mabool:Boolean = true;
trace(mabool+mabool); // Horreur, on additionne deux booléens
Mais Flash ne se laisse pas démonter, et nous affiche 2
En effet Flash va adapter la variable selon les besoins. Là il s'agit d'un calcul numérique, il va donc modifier le true en 1.
Ce qui explique le 2.
Et pour transformer le true en "true" et le false en "false"
Il faut utiliser la méthode toString() qui va transformer votre variable en chaîne de caractères.
Voilà ce qui ne marchera pas :
Code : ActionScript
var mabool:Boolean = true;
var monstring:String = "valeur : ";
monstring+=mabool; // on concatène un String avec un Boolean -> aïe caramba
trace(monstring);
Un beau message d'erreur d'incompatibilité des types s'affichera à vous.
Voilà ce qui fonctionnera :
Code : ActionScript
var mabool:Boolean = true;
var monstring:String = "valeur : ";
monstring+=mabool.toString(); // on concatène deux String -> no problemo
trace(monstring);
Opérateurs de test
Nous avons donc vu le célébrissime == qui permet de tester l'égalité. Passons à du plus lourd :
1.
2.
3.
4.
N'est pas égal à
"Plus petit que" - "Plus grand que"
"Plus petit ou égal à" - "Plus grand ou égal à"
"Égalité stricte" (et inégalité stricte)
1. "N'est pas égal à"
Voilà l'exact opposé à ==, je parle bien sûr de !=.
Cet opérateur permet de vérifier que les valeurs de deux variables sont bien différentes.
Code : ActionScript
44 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
var mabool_a:Boolean = true;
var mabool_b:Boolean = false;
trace( mabool_a!=mabool_b);
Ce qui renvoie true, car true est différent de false
On aurait pu aussi essayer cet opérateur avec des valeurs numériques ou des chaînes de caractère.
2. "Plus petit que" - "Plus grand que"
Il serait intéressant de pouvoir tester si un nombre est plus grand qu'un autre. Pas besoin de chercher dans le manuel de
Flash l'opérateur, c'est le même que dans votre cours de Maths
L'opérateur < correspond en français à "plus petit que" et à l'inverse, l'opérateur > correspond à "plus grand que".
Cela va nous permettre de comparer deux valeurs numériques. Testez chez vous ces différents lignes :
Code : ActionScript
trace
trace
trace
trace
(100<50); // Renvoie false, car 50 n'est pas plus grand que 100 !
(50<100); // Renvoie true, car 50 est plus petit que 100
(100<100); // Renvoie false, car 100 n'est pas plus petit que 100, mais égal
(500>10); // Renvoie true
Intéressant, non ?
Mais je suis sur qu'un détail vous a plus intéressé que le reste : le test sur 100<100
3. "Plus petit ou égal à" - "Plus grand ou égal à"
Il s'agit cette fois de l'opérateur >= ou à l'inverse <=
Testons :
Code : ActionScript
trace (100>=50); // Renvoie true, car 100 plus grand que 50
trace (100>=100); // Renvoie true, car 100 égal à 100
Et si on utilise > ou < avec des chaînes de caractère ?
Alors Flash comparera en fonction de la place de la lettre dans l'alphabet (en fait selon la place de la lettre dans la table
des caractères ASCII (TABLE ASCII).
Quelques exemples enrichissant :
Code : ActionScript
trace("A"<"B"); //true car A avant B dans l'alphabet
trace("a"<"B"); //false car pour Flash, les majuscules sont avant les minuscules.
trace("ab"<"ac"); //true car b avant le c dans l'alphabet
4. "Égalité stricte"
Voilà un opérateur qu'on utilise assez rarement, mais qui peut se révéler utile.
Pour comprendre son intérêt, testons cela :
Code : ActionScript
var mabool:Boolean = true;
var monnombre:Number = 1;
trace(mabool==monnombre);
45 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Ce qui nous renvoie true, car comme on l'a vu précédemment, pour Flash le booléen true équivaut au numérique 1.
Mais maintenant tapons :
Code : ActionScript
var mabool:Boolean = true;
var monnombre:Number = 1;
trace(mabool===monnombre);
Ce qui nous renvoie false ! L'opérateur === (oui, ça en fait beaucoup
) va non seulement comparer l'égalité des
valeurs contenues dans les variables mais aussi l'égalité des types des variables. Or ici, le type Boolean est différent de
Number, d'où le false.
Existe-il une inégalité stricte ?
Et oui, il est assez rarement utilisé : !==
Cet opérateur renverra true si les valeurs ou les types sont différents.
C'était le petit tour des opérateurs de conditions les plus usités
Opérations sur les booléens
Et oui, tout comme les nombres, les booléens ont leurs opérations.
Pour les nombres on a 4 opérations, qu'on peut réduire à 2 (la somme et le produit).
Et bien chez les booléens c'est pareil, on a deux opérations : ET et OU
La logique binaire (c'est à dire les opérations sur les booléens) pourrait faire l'objet de plusieurs chapitres, je vais donc
faire simple et n'expliquerai pas toutes les possibilités de la logique binaire.
Nous nous en tiendrons aux bases, c'est à dire :
1. Opposé
2. ET
3. OU
1. "Opposé"
Celui là, il est bien pratique, il s'agit du petit !
Ce dernier inverse tout simplement la valeur d'une variable booléenne.
Par exemple :
Code : ActionScript
var mabool:Boolean = false;
trace(!mabool); // Renvoie true
ou encore
Code : ActionScript
var mabool:Boolean = true;
trace(!mabool); // Renvoie false
2. "ET"
Vous voulez vérifier qu'une variable est égale à telle valeur ET une autre est égale à telle autre valeur ?
Utilisez l'opérateur &&
Imaginez, vous êtes directeur d'une boite branchée. A chaque client vous demandez la variable age et argent. Vous ne
voulez laisser rentrer (true) que les majeurs et ceux qui ont plus de 50 €.
46 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
En semi-français on aurait :
(age PLUS GRAND OU EGAL 18) ET (argent PLUS GRAND 50)
ce qui nous donne en Actionscript :
(age>=18) && (argent>50)
Un petit exemple :
Code : ActionScript
var age:Number = 10;
var argent:Number = 100;
trace((age>=18) && (argent>50));
Le jeune garçon a bien l'argent, mais n'est pas majeur, donc éjection
Flash renvoie false
3. "OU"
Opérateur : || (Ctrl+alt+6 pour les plus zéros d'entre nous)
Maintenant, imaginez vous chef de casting
pour la Zéros Académie
Vous cherchez un Zéro qui soit possède un Q.I. inférieur au Q.I. d'une limace, ou alors un zéro qui possède une
ancienneté supérieur à 3 ans sur le SDZ (un geek en somme
)
En semi-français :
(qi du zéro PLUS PETIT QUE qi de la limace) OU (ancienneté PLUS GRANDE QUE 3)
En Flash :
(zero_qi < limace_qi) || (zero_ancien > 3)
Et le petit exemple qui va bien
Code : ActionScript
:
var zero_qi:Number = 90;
var limace_qi:Number = 2;
var zero_ancien:Number = 3.5;
trace((zero_qi < limace_qi) || (zero_ancien > 3));
Cela nous renvoie true, car le Zéro a beau posséder un QI approchant de la moyenne mondiale, son ancienneté le sauve
Voilà c'était tout sur les opérations de logique booléenne. Sachez que si vous aimez vous triturer les méninges, vous
pouvez combiner toutes ces opérations et même démontrer que le ET possède les mêmes propriétés que la
multiplication (distributivité ...) et le OU les mêmes que la somme.
La structure conditionnelle
On arrive enfin au lourd
Regardons maintenant comment utiliser tout ce que nous avons appris sur ses booléens !
1.
2.
3.
4.
if
if else
if else if
les ternaires
1. if
Intéressons nous à la structure conditionnelle la plus classique : if
(if veut dire si en français pour les plus anglophobes d'entre nous
)
L'instruction if va vérifier si une variable booléenne est vraie, si c'est le cas, elle va effectuer une action.
47 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Vous pouvez voir la structure dans l'exemple ci dessous. Entre parenthèses, on met la variable booléeene qui va être
testée : ici c'est mabool. Dans le bloc d'instruction délimité par les accolades, on va écrire l'action qui se produira, si la
variable booléenne est vraie.
Code : ActionScript
if (mabool) {
//l'action à effectuer si mabool vaut true
}
Petit exemple facile :
Code : ActionScript
if (50<100) {
trace("en effet, 50 plus petit que 100");
}
2. if else
else signifie en français sinon
Il va nous permettre d'ajouter une action dans le cas où la condition renvoie false
Code : ActionScript
if (50>100) {
trace("si la condition était vraie");
} else {
trace("mais en fait elle est fausse");
}
Ce code exécutera l'action contenue dans le else car la condition renvoie false
3. if else if
Et si on a plusieurs cas à éplucher ?
Code : ActionScript
var monnombre:Number = 2;
if (monnombre==0) {
trace("monnombre vaut 0");
} else if (monnombre==1) {
trace("monnombre vaut 1");
} else if (monnombre==2) {
trace("monnombre vaut 2");
} else if (monnombre==3) {
trace("monnombre vaut 3");
} else {
trace("je sais pas ce que vaut monnombre");
}
Ce code affichera "monnombre vaut 2"
Mais amusez vous à changer la valeur de monnombre pour comprendre le système.
La dernière action else sera exécutée si aucune condition précédente s'est révélée vraie.
N'oubliez pas que les tests s'effectuent dans l'ordre. Et Flash s'arrêtera à la première condition vraie, il n'ira pas voir plus
loin.
4. les ternaires
Voilà une structure conditionelle qui va nous faire gagner du temps
Prenons cet exemple :
Code : ActionScript
48 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
if (monnombre==0) {
trace("monnombre vaut 0");
} else {
trace("monnombre ne vaut pas 0");
}
Ca nous fait : 5 lignes !
En ternaire :
Code : ActionScript
(monnombre==0) ? trace("monnombre vaut 0") : trace("monnombre ne vaut pas 0");
Ca fait : 1 ligne
Voici comment se présente un ternaire structurellement :
Citation : Strucuture ternaire
CONDITION ? ACTION SI CONDITION VRAIE : ACTION SI CONDITION FAUSSE ;
Maintenant un petit exercice difficile
Vous vous souvenez de l'opérateur ! qui permet d'inverser la valeur d'un booléen ?
Et bien je veux qu'on écrive une ligne de code qui fasse exactement la même chose
Réponse :
Secret (cliquez pour afficher)
Code : ActionScript
var mabool:Boolean = false;
mabool = (mabool==true) ? false : true;
trace(mabool); // affiche true
Comment ça marche ?
Pour comprendre, il suffit de remonter d'un cran dans la simplification de l'expression, on va "développer" :
Code : ActionScript
mabool = (mabool==true) ? false : true;
// Peut aussi s'écrire
(mabool==true) ? mabool=false : mabool=true;
Ce code a le même effet.
Ainsi que celui ci :
Code : ActionScript
if (mabool==false) {
mabool = true;
} else {
mabool = false;
}
Voilà vous savez tout sur les conditions. J'ai omis de parler de l'instruction switch, car elle est rarement utilisée, et peut
souvent s'éviter en utilisant un outil plus pratique : les boucles ! Que nous verrons au prochain chapitre. Cela dit, si vous
tenez à comprendre le switch, aller lire les tutos sur les conditions avec les langages C++ ou Php : le système est le
même. L'aide de Flash vous sera aussi très utile
49 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Récapitulatif
Valeur Booléenne et correspondance numérique
Valeurs Correspondance numérique
false
0
true
1
L'inverse n'est pas complètement vrai. Le 0 correspond bien à false, mais tous les autres chiffres correspondront à un
true dans une condition.
Opérateurs de test
Opérateur
Signification
Vrai si ...
Faux si ...
==
égal à
les valeurs sont égales
les valeurs sont différentes
!=
non égal à
les valeurs sont différentes
les valeurs sont égales
===
strictement égal à
les valeurs ET les types sont égales
les valeurs sont différentes
les types sont différents
!==
strictement non égal les valeurs sont différentes
à
les types sont différents
les valeurs ET les types sont égales
A<B
plus petit que
si la valeur de A est plus petite que la
valeur de B
si la valeur de A est plus grande que la
valeur de B
si la valeur de A est égale à la valeur de B
A>B
plus grand que
si la valeur de A est plus grande que la
valeur de B
si la valeur de A est plus petite que la
valeur de B
si la valeur de A est égale à la valeur de B
A <= B
plus petit ou égal à
si la valeur de A est plus petite que la
si la valeur de A est plus grande que la
valeur de B
valeur de B
si la valeur de A est égale à la valeur de B
A >= B
si la valeur de A est plus grande que la
si la valeur de A est plus petite que la
plus grand ou égal à valeur de B
valeur de B
si la valeur de A est égale à la valeur de B
Opérateurs booléens
Opérateur Signification
!A
Ce qui se passe ...
opposé
A prend la valeur opposée. false devient true et true devient false
A && B
ET
Condition sur A ET sur B. Les deux doivent valoir true pour que le ET renvoie true
A || B
OU
Condition sur A OU sur B. Un des deux doit valoir true pour que le OU renvoie true
Structures
Code : ActionScript
if (condition) {
//Si condition est vraie
} else {
// Si condition est fausse
}
Code : ActionScript
50 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
if (condition) {
//Si condition est vraie
} else if (condition2) {
//Si condition2 est vraie
} else {
// Si condition et condition2 sont fausses
}
Code : ActionScript
(condition) ? /*si vraie*/ : /* si faux */ ;
Les Boucles
Nous avons vu les conditions et leur importance, nous nous intéressons maintenant à l'autre point commun à tous les
langages de programmation, j'ai nommé : les boucles !
Qu'est-ce qu'une boucle
Comme vous le savez, Flash lit le code dans l'ordre : de haut en bas.
Une fois arrivé tout en bas : il s'arrête
Et bien avec une boucle, vous allez pouvoir demander à ce
qu'une partie du code, un bloc d'instructions, soit répété un
certain nombre de fois.
Et pour illustrer mes propos, je vais me permettre de ressortir
sans autorisation, alors ne le répétez pas, une image d'un autre
tuto du site que vous reconnaîtrez
Le système de boucle de Flash est exactement le même que
celui du C ou du Php, ceux qui savent déjà comment utiliser les
boucles peuvent donc sauter ce chapitre.
Cela dit, les nouveaux en Flash font souvent une erreur importante. Ils pensent que en faisant une boucle qui déplace un
clip sur la scène, l'utilisateur verra ce clip se déplacer. C'est faux ! Tant que Flash n'a pas fini d'exécuter tout le code
qu'il voit, il n'affichera rien !
La boucle ne s'exécute pas DANS le temps mais INSTANTANEMENT. Mais attention, si on demande à Flash
de répéter une boucle plusieurs centaines de fois, ça peut durer longtemps, mais cela ne fera que figer
l'animation, l'utilisateur ne verra rien.
Boucle while
Nous allons déjà regarder la boucle simple existante : la boucle while.
Tout comme if qu'on a vu précédemment, while va exécuter du code si une condition booléenne est remplie (retournez
vite dans le chapitre précédent si vous avez pas compris les derniers mots
)
En français, voilà ce que donnerait une boucle while
Code : Autre
51 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
TANT QUE {CONDITION est VRAIE}
ALORS ...
Et en Flash :
Code : ActionScript
while (condition) {
// actions à effectuer
}
Ainsi, tant que la condition est remplie, Flash réexécutera le code à l'intérieur de la boucle.
Et si la condition ne change pas et reste toujours égale à true ?
Là c'est le bordel
C'est ce qu'on nomme une boucle infinie. L'animation Flash restera figée un bon moment, mais au
bout de quelques dizaines de (longues) secondes, Flash vous demandera si vous souhaitez continuer l'exécution du code,
où si vous préférez arrêter tout. C'est un mécanisme de protection pour les utilisateurs.
Amusons nous un peu
Code : ActionScript
var monnombre:Number = 10;
while(monnombre > 0) { // Tant que monnombre est strictement plus grand que 0
trace(monnombre); // On affiche la valeur de la variable
monnombre--; // On décremente la variable (on soustrait 1 )
}
Vous pouvez observer dans la fenêtre de sortie, que l'effet est immédiat. Vous pouvez voir tous les chiffres de 10 à 1
Maintenant, pour le plaisir, un exemple de ce qu'il ne faut pas faire :
Code : ActionScript
while(true) {
trace("boucle infinie");
}
Pour tester, vous pouvez exécuter ce code, vous pourrez ainsi voir la fenêtre de Flash demandant s'il est raisonnable de
continuer d'exécuter le script
C'est tout ce qu'il y a à savoir sur les boucles while
Boucle for
Voilà une boucle plus évoluée que while, il s'agit de for.
En fait, for est une boucle while condensée, tout comme les ternaires étaient des if condensés
En français :
Code : Autre
Déclaration de ma variable
Condition sur la variable pour que la boucle se fasse
Modification de ma variable pour que la boucle ne se fasse pas à l'infinie
52 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Tout à l'heure on a écrit :
Code : ActionScript
var monnombre:Number = 10;
while(monnombre > 0) { // Tant que monnombre est strictement plus grand que 0
trace(monnombre); // On affiche la valeur de la variable
monnombre--; // On décremente la variable (on soustrait 1 )
}
Et maintenant la même chose avec for :
Code : ActionScript
for (var monnombre:Number = 10; monnombre>0; monnombre--) {
trace(monnombre);
}
Vous retrouvez tous les éléments, mais dans le désordre
On initialise la variable, on écrit la condition nécessaire à l'exécution de la boucle, et dans cet exemple on décrémente
la variable. On sépare tout ça par des points virgules ;
Pour les matheux, vous verrez une analogie avec ce qu'on appelle les démonstrations par récurrence.
Maintenant, voyons comment faire si on voulait que la fenêtre de sortie ne nous affiche pas 10 jusqu'à 1 mais 1 jusqu'à
10
Secret (cliquez pour afficher)
Code : ActionScript
for (var monnombre:Number = 1; monnombre<=10; monnombre++) {
trace(monnombre);
}
Comme vous avez remarqué, dans ce cas on déclare la variable égale à 1, pas zéro. Sinon, la première valeur affichée
serait 0, car l'incrémentation ne s'effectuera qu'après la première lecture du bloc contenue dans la boucle.
Il ne faut
pas oublier de préciser la condition inverse, c'est à dire tant que monnombre strictement plus petit que 10 et changer
la décrémentation en incrémentation.
Petits exercices de style
Je trouvais ça triste d'écrire un chapitre sur les boucles sans s'amuser un peu avec. Et pour cela je vous ai préparé un
petit exercice sympathique et qui se révélera utile :
Vous souhaitez que la fenêtre de sortie vous affiche une fois "No problemo", une fois "Aïe caramba" et cela de façon
alternée une vingtaine de fois :
Code : Autre
No Problemo
Aïe Caramba
No Problemo
Aïe Caramba
...
Comment faire ?
Avant de regardez les solutions, cherchez un peu
53 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Il existe des dizaines de façon de répondre à cet exercice.
Moi j'ai décidé d'utiliser une boucle for dans les deux solutions que je vous propose
La première solution
C'est la plus logique et la plus facile à comprendre.
Code : ActionScript
var machaine:String = "No Problemo";
for (var monnombre:Number = 20; monnombre>0; monnombre--) {
machaine = (machaine=="No Problemo") ? "Aïe Caramba" : "No Problemo";
trace(machaine);
}
On déclare la variable machaine et on lui affecte la valeur "No Problemo"
Ensuite dans une boucle for qui va s'exécuter 20 fois, je place une condition avec structure ternaire histoire de gagner
de la place
(et de vous faire réviser la précédente leçon
)
Code : Autre
Si machaine vaut "No Problemo", alors on lui affecte la valeur "Aïe Caramba"
Si machaine ne vaut pas "No Problemo", alors on lui affecte la valeur "No Problemo"
Et puisqu'il n'y a que deux possibilité de valeur, ça fonctionne très bien
La seconde solution
Plus "mathématique", mais aussi plus courte, voici la seconde solution :
Code : ActionScript
var machaine:String;
for (var monnombre:Number = 20; monnombre>0; monnombre--) {
machaine = (monnombre%2 == 1) ? "No Problemo" : "Aïe Caramba";
trace(machaine);
}
On utilise ici les modulos.
On déclare une chaîne de caractère vide : machaine
Et dans une boucle répétée 20 fois, on va utiliser les modulos.
Rappel : le modulo est un opérateur qui retourne le reste de la division euclidienne de deux nombres. Il
est représenté par le signe %
Par exemple : 10%4 = 2 car quand vous divisez 10 par 4 il restera 2 !
Il faut savoir que la division euclidienne de n'importe quel nombre entier (sans virgule si vous préférez) par 2 ne donnera
que deux restes possibles : 0 ou 1
Code : Autre
SI reste de la division de monnombre par 2 VAUT 1 ALORS machaine DEVIENT "No Problemo"
SI reste de la division de monnombre par 2 NE VAUT PAS 1 ALORS machaine DEVIENT "Aïe
Caramba"
J'ai décidé pour que le code soit plus clair de passer encore une fois par la variable machaine
Cela dit, elle n'est pas obligatoire avec la solution des modulos. On aurait pu mettre directement la condition dans la
fonction trace et on aurait gagné 3 lignes
Code : ActionScript
54 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
for (var monnombre:Number = 20; monnombre>0; monnombre--) {
trace((monnombre%2 == 1) ? "No Problemo" : "Aïe Caramba");
}
J'espère que vous avez trouvé ce petit exercice sympathique. Sachez que pouvoir de façon simple échanger deux valeurs
dans une variable se révèle souvent très utile, par exemple pour colorier de couleurs différentes un ligne sur deux d'un
tableau
Ce chapitre fut court mais très enrichissant. Ne l'oubliez donc pas, les boucles reviendront souvent dans
notre code
Les Fonctions
Pour l'instant vous connaissez trois fonctions : stop(), play() et trace()
Maintenant, vous avez le droit à la définition honteusement pompé chez wikipedia :
Citation : Wikipedia
En informatique, une fonction est un ensemble d'instructions réalisant une certaine tâche.
Je ne pense pas pouvoir faire mieux
Ce chapitre sera très court, car la notion de fonction est très simple
Déclarer une fonction
On a plusieurs moyen pour déclarer une fonction en AS. Imaginons que nous voulions créer une fonction mafonction qui
afficherait dans la fenêtre de Sortie "Hello world".
On aurait soit cette solution :
Code : ActionScript
function mafonction() {
trace('hello world');
}
soit cette autre méthode :
Code : ActionScript
mafonction = function() {
trace('hello world');
}
Cette fonction ne fera rien par elle même, si on veut que son code soit exécutée il va falloir l'appeler. Comme ça :
Code : ActionScript
mafonction();
Oui, c'est honteusement facile !
Vous pouvez même vous amuser à afficher 500 fois 'Hello World' dans la fenêtre de Sortie en utilisant une boucle par
exemple.
On peut mettre la boucle à l'intérieur de la fonction :
Code : ActionScript
55 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
function mafonction() {
for (i=0; i<500; i++) {
trace('hello world');
}
}
mafonction();
ou à l'extérieur :
Code : ActionScript
function mafonction() {
trace('hello world');
}
for (i=0; i<500; i++) {
mafonction();
}
Comme vous le voyez, tout ce que nous avons déjà appris est parfaitement compatible avec les fonctions.
Des arguments
Un argument
L'intérêt d'une fonction c'est de pouvoir exécuter une certaine tâche à chaque fois qu'on l'appelle. Mais il est encore plus
intéressant de pouvoir lui passer des arguments, c'est à dire des variables qui vont influencer sur son fonctionnement.
Imaginons que je veuille faire une fonction bonjour() qui affiche dans la fenêtre de sortie 'Bonjour ' suivi du nom de la
personne qu'on aura transmis comme argument.
On aurait un code de ce genre :
Code : ActionScript
function bonjour(qui) {
trace('Bonjour '+qui);
}
bonjour('toi');
On transmet la chaîne 'toi' comme argument. Dans la fonction, cet argument est stocké dans la variable qui.
On aurait pu utiliser un typage strict, pour obliger l'envoie d'une chaîne de caractère comme argument :
Code : ActionScript
function bonjour(qui:String) {
trace('Bonjour '+qui);
}
bonjour('toi');
Si vous aviez tapé ensuite bonjour(5);, votre animation aurait planté...
Des arguments
Bien entendu, on peu transmettre plus d'un argument à une fonction, il faut alors les séparer par des virgules.
Code : ActionScript
function bonjour(prenom:String,nom:String) {
trace('Bonjour '+prenom+' '+nom);
}
bonjour('Gérard','Bouchard');
56 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Mais si on veut transmettre un nombre avec des virgules ? Par exemple 2,68 ?
Les nombres à virgule n'existent pas chez nos amis anglo-saxons ! Pour séparer la partie entière de la partie
"sub-unitaire", les anglophones utilisent le point ..
Les français écrivent 2,68 et les anglais écriront 2.68
Or AS utilise le point anglophone, donc il n'y aura pas de problème
Retour de valeur
Je suis sûr qu'en Mathématique vous avez déjà vu des fonctions. Par exemple la fonction carrée multiplie le nombre
qu'on lui transmet par lui même et retourne la nouvelle valeur.
Comment créer cette fonction ? Je vous donne la solution et nous allons la décortiquer :
Code : ActionScript
function au_carre(nombre) {
return nombre*nombre;
}
trace(au_carre(5));
Ce morceau de code va nous afficher 25, le carré de 5.
En fait, la seule nouveauté pour vous, c'est l'instruction return. Elle retournera la valeur de la variable située à sa
droite, c'est à dire ici 5*5
Imaginons maintenant que je veuille une fonction qui calcule le pourcentage de lecteur de ce tuto quand on lui
transmet le nombre de lecteurs en cours sur le nombre de lecteurs total.
A vous de jouer
Voilà la solution la plus complète :
Code : ActionScript
function pourcentage(encemoment:Number,total:Number) : String {
var pourcent = (encemoment/total)*100;
return pourcent.toString()+' %';
}
trace(pourcentage(2500,50000));
Vous remarquerez encore une nouveauté, c'est le : String que j'ai rajouté à la fin du nom de la fonction. Il permet de
préciser que cette fonction renverra un chaîne de caractères
Méthodes et fonctions
Je parlerais souvent plus tard dans ce cours de "méthodes".
En fait une méthode n'est rien d'autre qu'une fonction, mais qui est rattachée à un objet.
Par exemple trace() n'est pas une méthode, car elle n'appartient à aucune classe.
play() et stop() sont des méthodes, car elle appartiennent à une classe. On pourra par exemple écrire : monclip.play();
Vous vous souvenez peut-être de la fonction toString() que je vous avais très brièvement montré ? Elle permet de
transformer un nombre (et pleins d'autres types de variables) en chaîne de caractères !
Cette fonction est-elle une méthode ?
Oui bien sûr, car elle appartient à des classes. Par exemple si vous voulez convertir une variable numérique en texte :
57 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
var nombre:Number = 5;
var texte:String = nombre.toString(); // On voit bien que toString() est portée par un
objet
Retenez donc bien la spécificité des méthodes, pour mieux comprendre celles que nous verrons plus loin
déjà fini pour ce très court, et pourtant très important, chapitre
Voilà c'est
Les Evénements
Dans tout ce qu'on a vu jusque maintenant, vous ne trouverez aucun moyen d'ajouter de l'interactivité à votre
animation.
C'est normal, c'est grâce aux événements que nous allons donner la possibilité à l'utilisateur d'interagir avec
l'application.
Vous avez dit "événement" ?
Les événements sont des actions, tel un clic de souris de l'utilisateur ou la pression d'une touche du clavier, qui se
produisent dans votre animation.
Quand l'utilisateur fera telle ou telle action, l'événement correspondant sera appelé et le code associé sera exécuté.
Dans ce chapitre je vais uniquement traiter des événements spécifiques au movieclips.
Pourquoi seulement ceux-là ? Parce que ces événements sont commun à de nombreuses classes d'objets dans Flash.
Pour des raisons de commodité, ce chapitre ne traitera que des événements courants qu'on utilisera lors du fil rouge de
fin de chapitre.
Nous verrons dans les prochains chapitres des événements plus "poussés" utilisés par exemple dans la gestion des
requêtes pour le transfert de variables entre Flash et un serveur.
De même nous ne verrons pas les événements en rapport avec la gestion des touches du clavier, ces derniers ne nous
servirons en effet à rien pour l'instant. Nous les retrouverons plus tard dans ce chapitre pour l'élaboration d'un mini-jeu
Voici la structure commune à tous les événements pour les Clips.
Version longue :
Code : ActionScript
mafonction = function () {
trace ("événement appelé");
}
monclip.monevenement = mafonction;
Version semi-longue
:
Code : ActionScript
function mafonction() {
trace ("événement appelé");
}
monclip.monevenement = mafonction;
Version courte :
Code : ActionScript
monclip.monevenement = function () {
trace ("événement appelé");
}
58 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
A l'intérieur de l'événement, c'est comme si on écrivait le code dans le clip concerné.
C'est assez déroutant au début, mais il faut comprendre que l'événement appartient au clip.
Donc dans le bloc d'instructions à l'intérieur d'un événement appartenant à monclip, si on veut accéder à une propriété
de monclip, il faudra écrire : this._propriete et non pas monclip.propriete. Car dans ce dernier cas, Flash chercherait
le clip : monclip.monclip qui n'existe pas.
Vous remarquerez au long de ce chapitre que tous les noms d'événements commencent par "on" (qui pourrait se traduire
approximativement par "lorsque" )
C'est un bon moyen de les repérer dans l'aide de Flash.
Pour faciliter la compréhension, j'ai décidé de séparer en deux groupes les événements liés à la souris. Cela dit, ce
regroupement est fait de façon arbitraire et personnelle. Ne parlez jamais à un Flasheur d'événements souris localisés et
d'événements souris globaux. Il comprendra peut-être, mais ce n'est pas le vocabulaire "officiel".
Evénements souris localisés
Commençons par les événements qui découlent de l'utilisation localisée de la souris.
C'est à dire les événements qui concernent les relations entre un clip (ou bouton) particulier et la souris.
Le clip associé à ces événements agira comme un bouton, et lorsque l'utilisateur passera la souris dessus, le curseur se
transformera en petite main
.
Nous ne verrons que les plus utiles :
1.
2.
3.
4.
5.
onPress
onRelease
onReleaseOutside
onRollOver
onRollOut
1. onPress
Cet événement se déclenche lors du clic de la souris sur le clip.
L'action se déclenche dès que le bouton gauche de la souris est baissé
Voilà la structure du code:
Code : ActionScript
monclip.onPress = function () {
trace ("Vous avez cliqué sur 'monclip' ");
}
2. onRelease
Plus courant que onPress, voici onRelease
onRelease se déclenche lorsque que l'on relâche le bouton de la souris sur un clip. On peut le considérer comme
l'inverse de onPress.
Il est préférable de l'utiliser, en effet lorsque qu'un utilisateur clique sur un bouton, il faut lui laisser la possibilité
d'annuler son choix, tout simplement en gardant le bouton appuyé et en relâchant ailleurs. D'ailleurs, vous remarquerez
peut-être que l'immense majorité des boutons que vous utilisez ne s'activent pas lorsque vous cliquez dessus, mais quand
vous relâchez le clic.
Code : ActionScript
59 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
monclip.onRelease = function () {
trace ("Vous avez relâché le bouton de la souris sur le clip");
}
3. onReleaseOutside
Même chose que onRelease, mais n'est appelé que si le bouton de la souris est enfoncé sur le clip et relâché en dehors
du clip.
C'est un événement peu utilisé.
4. onRollOver
Très utile celui là, il est appelé lors du passage de la souris sur le clip.
Il permet de changer l'aspect du clip quand on passe la souris dessus, par exemple ici :
Code : ActionScript
monclip.onRollOver = function () {
this._alpha=50; // Lors du passage de la souris, le clip se retrouve à moitié
transparent
}
Vous remarquerez en testant cet exemple, qu'en sortant la souris du clip, ce dernier reste à moitié transparent .. D'où
l'utilité de l'événement suivant.
5. onRollOut
C'est l'inverse, cet événement de déclenche quand la souris sort du clip. Donc, pour compléter le code précédent, il
faudrait écrire :
Code : ActionScript
monclip.onRollOver = function () {
this._alpha=50; // Lors du passage de la souris, le clip se retrouve à moitié
transparent
}
monclip.onRollOut = function () {
this._alpha=100; // Lors de la sortie de la souris, on remet le clip opaque
}
Voilà qui permet déjà un effet sympathique pour votre bouton.
Premier exemple avec les événements de souris localisés
Utilisons maintenant tout ce qu'on a vu jusque maintenant à propos des propriétés des Clips et des événements.
Reprenons le code précédent pour la transparence qui change au passage de la souris et, rajoutons-y un petit effet sans
prétention quand on clique dessus avec la souris :
Code : ActionScript
monclip.onRollOver = function () {
this._alpha=50;
}
monclip.onRollOut = function () {
this._alpha=100;
}
monclip.onPress = function () {
this._xscale=125;
this._yscale=125;
this._rotation = 10;
}
60 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Mais il y a un problème : une fois cliqué, le clip reste dans la position fixée...
Il suffit d'utiliser l'événement onrelease :
Code : ActionScript
monclip.onRelease = function () {
this._xscale=100;
this._yscale=100;
this._rotation = 0;
}
Mais là encore, il y a un problème
Si vous cliquez sur le clip, et que vous sortez du clip avant de relâcher, celui-là
reste bloqué dans sa position "acrobatique".
Pour y remédier, il suffit de reprendre le code du onRelease et de l'adapter au onreleaseoutside. Comme ça, les deux
cas seront couverts !
Hop, rajoutez ça à votre code :
Code : ActionScript
monclip.onReleaseOutside = function () {
this._xscale=100;
this._yscale=100;
this._rotation = 0;
}
Et pour illustrer le tout : animation flash d'exemple
Evénements souris globaux
L'autre face de la lune
Au nombre de 3, ces événements ne sont pas restreints au clip qui les porte, mais à toute la scène. Il n'y aura donc pas
de petite main qui apparaîtra.
Nous allons voir :
1. onmousedown
2. onmouseup
3. onmousemove
1. onMouseDown
Il s'agit de l'équivalent global de onpress. Où que vous cliquiez dans la scène, cet événement sera appelé.
Code : ActionScript
monclip.onMouseDown = function () {
trace ("Bouton de la souris enfoncé");
}
Mais alors, quel est l'intérêt de le faire porter par un clip précis ? Et pas tout simplement le mettre pour
_root ?
Aucun
61 sur 166
Sauf peut-être pour la clarté du code quelques fois.
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Tapez cela revient exactement au même :
Code : ActionScript
_root.onMouseDown = function () {
trace ("Bouton de la souris enfoncé");
}
Et si je fais porter cet événement à deux clips à la fois ?
Il suffit de tester :
Code : ActionScript
monclip.onMouseDown = function () {
trace ("onMouseDown appartenant à monclip");
}
_root.onMouseDown = function () {
trace ("onMouseDown appartenant à _root");
}
Et vous pourrez constater que la fenêtre de sortie affichera les deux. Les deux sont donc appelés. Évitez tout de même
ce genre de code ...
2. onMouseUp
onMouseUp est l'équivalent de onRelease. Il est exécuté lorsque le bouton de la souris est relâché.
Il n'existe pas d'équivalent à onReleaseOutside pour les événements globaux, dans la mesure où que vous pouvez
relâcher le bouton de la souris où vous voulez sur scène, ça sera toujours sur scène. Donc onRelease sera appelé.
3. onMouseMove
En voilà un très intéressant
Il se déclenche dès que la souris est déplacée ! Même si la souris se déplace seulement de 1 pixel, l'événement sera
exécuté ! Donc, de façon presque continue quand on bouge la souris.
Et là, on va pouvoir enfin utiliser un code que je vous avais montré dans les propriétés des clips et, qui n'avait qu'une
utilité limitée : le code permettant de faire tourner un clip sur lui même de façon à ce qu'il suive un clip.
Changez le clip en souris et vous avez un code qui fait tourner un clip en fonction de la souris.
A savoir : les coordonnées de la souris sur la scène sont données par _xmouse pour l'axe des abscisses et
_ymouse pour l'axe des ordonnées
Le code était :
Code : ActionScript
_root.monclip._rotation = Math.atan2(_root.cible._y-_root.monclip._y,
_root.cible._x-_root.monclip._x)/(Math.PI/180);
Maintenant, remplaçons les coordonnées du clip cible par les coordonnées de la souris, ce qui nous donne (en
supprimant les _root qui ne servent à rien puisqu'on sait qu'on est sur la scène principale) :
Code : ActionScript
monclip._rotation = Math.atan2(_ymouse-monclip._y, _xmouse-monclip._x)/(Math.PI/180);
Et maintenant mettons ce code dans un événement onMouseMove qui va être porté par _root
62 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
_root.onMouseMove = function() {
monclip._rotation = Math.atan2(_ymouse-monclip._y, _xmouse-monclip._x)/(Math.PI/180);
}
Et là, miracle, ça marche
Maintenant, petit exercice de style (vous savez que je les aime bien
).
Je veux faire la même chose, mais que l'événement onMouseMove soit porté par le clip monclip.
Voyez vous les changements que cela va induire ?
Si vous n'avez pas trouvé, regardez la réponse :
Secret (cliquez pour afficher)
Code : ActionScript
monclip.onMouseMove = function() {
this._rotation = Math.atan2(_root._ymouse-this._y,
_root._xmouse-this._x)/(Math.PI/180);
}
Et oui, puisque qu'on se place dans le clip monclip, on change de référentiel.
On remplace donc monclip par this, quant aux coordonnées de la souris, il est conseillé de préciser qu'il s'agit des
coordonnées par rapport à la scène _root, même si cela reste facultatif. En effet, si on ne précise pas à qui appartient
un objet, Flash va supposer qu'il appartient non pas au clip qui porte le code, mais au clip dans lequel on a écrit le code.
Et encore une fois pour votre plaisir : EXEMPLE FLASH
Evénements à tout faire !
Dans cette dernière partie je traiterai des deux événements à tout faire
:
1. onload
2. onenterframe
1. onLoad
onLoad s'exécute dès que le clip est chargé. C'est à dire, de façon plus ou moins instantanée au démarrage.
Cela dit, j'utiliserai cet événement très rarement, car ces deux blocs de code reviennent au même :
Code : ActionScript
monclip.variable = "variable quelquonque";
Code : ActionScript
monclip.onLoad = function() {
this.variable = "variable quelquonque";
}
En effet, la variable sera initialisée au démarrage, que le code soit dans un onLoad ou pas ...
En fait, onLoad sert principalement dans le cas où on place le code sur un script. Chose abominable que nous ne ferons
jamais tout au fil de ce tuto, mais pour votre culture et compréhension de sources Flash de codeurs moins propres, je
me devais de vous le montrer.
63 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
2. onEnterFrame
Voilà un événement que nous utiliserons par contre très souvent. Surtout dans l'élaboration de jeux par exemple
Cet événement se déclenche de façon constante et continue
Sa fréquence d'exécution correspond au nombre
d'image par seconde de votre animation.
Plus vous avez un nombre d'image par seconde élevé, plus souvent sera appelé cet événement.
Exercice 1
Et pour illustrer mes propos, reprenons l'exemple précédent avec le clip qui tourne en suivant la souris.
Changeons le onMouseMove en onEnterFrame
Code : ActionScript
_root.onEnterFrame = function() {
monclip._rotation = Math.atan2(_ymouse-monclip._y, _xmouse-monclip._x)/(Math.PI/180);
}
Ce qui conduira exactement au même effet !
En effet, que vous bougiez la souris ou pas, le code sera effectué.
Exercice 2
Maintenant, petit exercice facile. Comment faire pour que le clip suive la souris, non pas en se tournant sur lui même,
mais en bougeant ? En clair comment faire pour que le clip ait les mêmes coordonnées que la souris, et cela de façon
continue ?
Trouvé ? Voilà la réponse :
Secret (cliquez pour afficher)
Code : ActionScript
monclip.onEnterFrame = function() {
this._x = _root._xmouse;
this._y = _root._ymouse;
}
Vous remarquerez, qu'en utilisant l'événement onMouseMove on aurait eu exactement le même résultat !
Exercice 3
Maintenant, un peu de code qui ne nécessite pas la souris.
Faites-moi tourner un clip sur lui même de 1 degré à chaque image !
Hop, résultat ci-dessous :
Code : ActionScript
monclip.onEnterFrame = function() {
this._rotation ++;
}
Complexifions la chose. Je veux que la vitesse de rotation accélère à chaque fois que je clique sur le clip
Aide : Il va falloir utiliser une variable vitesse
Correction :
Secret (cliquez pour afficher)
64 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
var vitesse:Number = 1; // Déclaration de la variable vitesse
monclip.onEnterFrame = function() { // A chaque image
this._rotation += _root.vitesse; // On tourne de plus une fois la vitesse
}
monclip.onRelease = function() { // Quand on clique sur le clip
_root.vitesse ++; // On augmente la vitesse de 1
}
Vous aviez trouvé ? ... Pourtant c'était facile
Et bien entendu, l'exemple pour illustrer le tout
Récapitulatif
Événement
Appelé si
onPress
l'utilisateur appuie sur le bouton gauche de la souris sur le clip portant l'événement
onRelease
l'utilisateur relâche le bouton gauche de la souris dans le clip en ayant précédemment cliqué sur le
clip portant l'événement (toujours appelé après l'événement onPress)
onReleaseOutside
l'utilisateur relâche le bouton gauche de la souris en dehors du clip en ayant précédemment cliqué
sur le clip portant l'événement (toujours appelé après l'événement onPress)
onrollover
l'utilisateur passe la souris sur le clip portant l'événement
onRollOut
l'utilisateur sort la souris du clip portant l'événement (toujours appelé après l'événement
onRollOver)
onMouseDown
l'utilisateur appuie sur le bouton gauche de la souris n'importe où sur la scène
onMouseUp
l'utilisateur relâche le bouton gauche de la souris n'importe où sur la scène (toujours appelé après
l'événement onMouseDown)
onMouseMove
l'utilisateur bouge la souris sur la scène
onLoad
le clip est chargé (appelé une seule fois)
onEnterFrame
appelé à chaque image (c'est à dire 12 par seconde pour une animation Flash normale)
Voilà un chapitre fort important que je vous conseille de relire souvent.
Si vous maîtrisez les propriétés des clips, les événements et la structure du langage comme les conditions et boucles,
alors vous êtes déjà un champion
Et parce que vous êtes champion, le prochain chapitre sera le dernier de cette partie et vous permettra de réaliser un
beau logo pour le SDZ
Fil rouge - le logo animé
Enfin la consécration de cette première partie ! Vous allez pouvoir appliquer tout ce que vous avez vu pour concevoir un
logo animé pour le SDZ
Et pour vous donner envie, voilà le résultat final
LOGO FLASH DU SDZ
65 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Point de départ
Pour que vous ne perdiez pas de temps, voilà l'animation de base, avec tout sauf le code que nous allons ajouter. Il vous
faut au minimum Flash Mx 2004 !
POINT DE DEPART (Flash MX 2004)
J'ai déjà donné aux clips et aux zones de texte un nom d'occurrence :
Notre but va être de rajouter de l'interactivité à chacun de ces objets.
Bonnet de noël
Vous avez vu le petit bonnet ? Il est pas mignon
Notre premier travail va être de faire en sorte que ce bonnet n'apparaisse que pendant le mois de décembre. Et pour
cela, nous allons faire un très rapide détour du côté de la classe Date, qui permet de jouer avec les dates (comme son
nom l'indique), les heures, ...
Avant tout nous allons déclarer un nouvel objet Date
Code : ActionScript
var date_noel:Date = new Date();
Maintenant, étudions la méthode getmonth() de la classe Date.
Cette fonction renvoie le numéro du mois courant, en commençant la numérotation à 0.
C'est à dire que janvier correspond à 0 et décembre à 11 (oui, les programmeurs n'ont jamais eu l'esprit très pratique ...
)
Nous allons donc jouer avec une petite condition qui va rendre le bonnet visible ou non selon le numéro du mois
renvoyé.
Comme ça :
Code : ActionScript
if (date_noel.getMonth() == 11) { //En ActionScript, décembre est le mois n°11, car janvier
est le mois n°0
// Si on est en décembre
} else {
// Si on n'est pas en décembre
}
Et maintenant rajoutons l'action permettant de rendre invisible le bonnet. Dans la mesure où le bonnet n'est pas un
66 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
bouton, utiliser _alpha=0 ou _visible=false (_visible) revient exactement au même.
J'ai choisi pour vous : on va utiliser _visible.
Ce qui nous donne en totalité :
Code : ActionScript
var date_noel:Date = new Date();
if (date_noel.getMonth() == 11) { //En ActionScript, décembre est le mois n°11, car janvier
est le mois n°0
bonnet._visible = true;
} else {
bonnet._visible = false;
}
Et puisque vous êtes des pros avec les conditions, nous allons "compresser" tout ça en utilisant les ternaires :
Code : ActionScript
var date_noel:Date = new Date();
bonnet._visible = (date_noel.getMonth() == 11) ? true : false;
Ca prend déjà moins de place, non ?
Rotation des yeux
Allez déjà faire un tour à l'intérieur des clips pupille1 et pupille2.
Zoomez un peu, et vous pourrez constater que le point d'ancrage n'est pas au centre de la pupille mais légèrement à
gauche.
Comme ça, si on fait tourner le clip, le point d'ancrage restant fixe, la pupille tournera autour.
Nous allons réutiliser le code que nous avions vu précédemment pour faire tourner un clip selon la position de la souris :
Code : ActionScript
pupille1.onEnterFrame = function () {
this._rotation = Math.atan2(_ymouse-this._y, _xmouse-this._x)/(Math.PI/180);
};
Voilà qui va permettre de faire tourner pupille1 dans la direction de la souris.
Mais au lieu de copier-coller ce code pour pupille2, on va faire plus malin
Code : ActionScript
67 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
orbites = function () {
this._rotation = Math.atan2(_ymouse-this._y, _xmouse-this._x)/(Math.PI/180);
};
pupille1.onEnterFrame = orbites;
pupille2.onEnterFrame = orbites;
Et voilà, à ce stade là, vous avez zozor qui vous suit des yeux et qui sort son petit bonnet en décembre
Contenu de la bulle
Nous allons enregistrer dans un tableau tout ce que Zozor peut dire, je vous donne directement tout le contenu, il y a
:
quelques lignes
Code : ActionScript
var contenu:Array = new Array();
contenu[0] = "Salut les <b>Zéros</b> !";
contenu[1] = "Ce <i>didacticiel</i> vous plait-il ?";
contenu[2] = "Je me nomme <font color='#FF0000'>Zozor</font> et je sens des <font
color='#FF0000'>pieds</font> !";
contenu[3] = "<b>Toufou</b> ? C'est un ami ! En tout cas il en était un avant ce terrible
jour, où on était dans sa cave, et ...";
contenu[4] = "<b>Hiii Haaan !</b>";
contenu[5] = "J'aime les <b>carottes</b> ! D'ailleurs je suis très copain avec l'avatar de
SuprazZz";
contenu[6] = "Il parait que je dis toujours la même chose .. C'est vrai ?";
contenu[7] = "Une bande de gars, nommés <b>Zéros</b>, m'ont élu comme mascotte ... C'est
toujours mieux qu'être Canard WC";
contenu[8] = "Si j'attrapais <b>l'en*oiré</b> qui m'a fait une <b>tête de vache</b> !";
contenu[9] = "Toi, vu ta tête, je parie que tu es un <b>Zéro</b> !";
contenu[10] = "Tu connais la blague du fou qui repeint son plafond ? Non ? Dommage ...";
contenu[11] = "Tu connais la blague du con qui dit non ?";
contenu[12] = "Le SDZ saturé ? Et ca t'étonne encore ? :D";
contenu[13] = "Enfin un peu de compagnie !";
contenu[14] = "Je veux pas dire, mais c'est un peu lassant de toujours parler et qu'on ne
nous réponde pas";
contenu[15] = "Surtout n'écoutez pas les rumeurs comme quoi je sortirais avec Toufou !";
contenu[16] = "Sais-tu dancer la Carioca ?";
contenu[17] = "Aïe Caramba !";
contenu[18] = "Après m'avoir vu, Barney a arrêté de boire";
contenu[19] = "Derrière toi ! <b>Tahiti Bob !</b>";
contenu[20] = "Eh Manu ! Tu descends ?";
Comme vous le voyez, Zozor a 20 répliques possibles, mais vous pouvez en rajouter si vous le souhaitez, mais n'oubliez
pas de changer le nombre juste avant.
J'ai aussi mis des balises HTML dans les répliques, et dans les propriétés du clip, j'ai activé le format HTML.
Pour afficher du code HTML dans une zone de texte il faut utiliser la propriété htmltext de la zone de
texte pour lui transmettre le contenu avec les balises
Code : ActionScript
_root.bulle.htmlText = contenu[0];// Affiche la première réplique
Et nous souhaitons afficher de façon aléatoire une réplique, pas que la première
random(unnombre) renvoie un nombre au hasard entre 0 et le nombre unnombre
68 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Nous cherchons à afficher une entrée entre 0 et le nombre total d'entrées. Il va donc falloir transmettre à cette fonction
le nombre total d'entrées du tableau (Voir propriété length donnant la longueur d'un tableau)
Ce code affichera donc un nombre entre 0 et 20 compris (car nous avons 21 entrées) :
Code : ActionScript
trace( random(contenu.length) );
Il ne nous reste plus qu'à faire un mélange entre tout ce qu'on vient de faire, ce qui nous donne :
Code : ActionScript
_root.bulle.htmlText = contenu[random(contenu.length)];
Mais nous allons appeler ce code plusieurs fois dans l'animation puisque nous souhaitons pouvoir changer la réplique en
cliquant sur l'animation. On va donc mettre ce code dans une fonction, et appeler cette fonction au démarrage de
l'animation :
Code : ActionScript
//-- Déclaration de la fonction parlotte
parlotte = function () {
_root.bulle.htmlText = contenu[random(contenu.length)];
};
//-- Au démarage de l'animation, on appelle une première fois la fonction parlotte
parlotte();
Rajoutons ce qu'il faut pour que la fonction parlotte soit appelée quand on clique dans l'animation :
Code : ActionScript
_root.onMouseDown = function() {
parlotte();
};
C'était pas bien compliqué en fin de compte !
Et voilà
Et il est possible de rajouter autant de répliques qu'on le souhaite !
Récapitulatif
Pour les fainéants, voici le code final et commenté :
Code : ActionScript
69 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
////- POUR NOËL
//var date_noel:Date = new Date();
bonnet._visible = (date_noel.getMonth() == 11) ? true : false;
////- ROTATION DES YEUX
////-- Déclaration de la fonction "orbite" permettant d'exercer une rotation sur un clip vers
une direction
orbites = function () {
this._rotation = Math.atan2(_ymouse-this._y, _xmouse-this._x)/(Math.PI/180);
};
//-- Association de la fonction aux événements onEnterFrame des deux clips
pupille1.onEnterFrame = orbites;
pupille2.onEnterFrame = orbites;
////- CONTENU DE LA BULLE
////-- Tableau des contenus possibles
var contenu:Array = new Array();
contenu[0] = "Salut les <b>Zéros</b> !";
contenu[1] = "Ce <i>didacticiel</i> vous plait-il ?";
contenu[2] = "Je me nomme <font color='#FF0000'>Zozor</font> et je sens des <font
color='#FF0000'>pieds</font> !";
contenu[3] = "<b>Toufou</b> ? C'est un ami ! En tout cas il en était un avant ce terrible
jour, où on était dans sa cave, et ...";
contenu[4] = "<b>Hiii Haaan !</b>";
contenu[5] = "J'aime les <b>carottes</b> ! D'ailleurs je suis très copain avec l'avatar de
SuprazZz";
contenu[6] = "Il parait que je dis toujours la même chose .. C'est vrai ?";
contenu[7] = "Une bande de gars, nommés <b>Zéros</b>, m'ont élus comme mascotte ... C'est
toujours mieux qu'être Canard WC";
contenu[8] = "Si j'attrapais <b>l'en*oiré</b> qui m'a fait une <b>tête de vache</b> !";
contenu[9] = "Toi, vu ta tête, je paris que tu es un <b>Zéro</b> !";
contenu[10] = "Tu connais la blague du fou qui repeind son plafond ? Non ? Dommage ...";
contenu[11] = "Tu connais la blague du con qui dit non ?";
contenu[12] = "Le SDZ saturé ? Et ca t'étonne encore ? :D";
contenu[13] = "Enfin un peu de compagnie !";
contenu[14] = "Je veux pas dire, mais c'est un peu lasant de toujours parler et qu'on ne
nous réponde pas";
contenu[15] = "Surtout n'écoutez pas les rumeurs comme quoi je sortirais avec Toufou !";
contenu[16] = "Sais-tu dancer la Carioca ?";
contenu[17] = "Aïe Caramba !";
contenu[18] = "Après m'avoir vu, Barney a arrêté de boire";
contenu[19] = "Derrière toi ! <b>Tahiti Bob !</b>";
contenu[20] = "Et Manu, tu descends ?";
//-- Déclaration de la fonction parlotte
parlotte = function () {
_root.bulle.htmlText = contenu[random(contenu.length)];
};
//-- Au démarage de l'animation, on appelle une première fois la fonction parlotte
parlotte();
//-- En cas de clic (n'importe où sur la scène)
_root.onMouseDown = function() {
parlotte();
};
Et pour les plus faignants encore, voilà la source du logo finalisé :
SOURCE DU LOGO
N'hésitez pas à poser des questions complémentaires dans les commentaires ou sur le forum !
En espérant que vous trouverez des idées de logos pour votre site
Ce chapitre vous a autorisé une première approche
du langage ActionScript, et vous a permis de réaliser un petit logo animé sympa.
Vous avez appris l'essentiel et sûrement la plus grosse partie de ce qu'il y a à savoir, les prochains chapitres relèveront
plus de l'application de ces connaissances
70 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Partie 3 : Actionscript avancé
Nous avons vu les bases de l'Actionscript. Et c'était déjà un gros morceau.
Vous allez voir que Flash en garde encore sous le pied et que la programmation avancée c'est rigolo.
Et comme dans toute animation Flash vous avez intérêt à avoir un crayon et du papier à petit carreau sous la main
,
car cela aide à comprendre le positionnement des objets, et permet de faire des petits calculs mathématiques chiants à
faire de tête (règles de 3, ...)
Prérequis :
- Maîtriser l'IDE de Flash (créer des clips, savoir où placer le code)
- Maîtriser les bases de l'ActionScript
- Connaître les bases de l'HTML (langage de balises)
But :
- Maîtriser la notion de Clips
- Connaître l'API de dessin
- Savoir utiliser les écouteurs claviers
- Détecter les collisions
=> Jeu de voiture !
Publication et variables
Dans cette partie, nous nous intéresserons seulement à ce que j'avais précédemment nommé : l'architecture
Flashoponctuelle.
C'est à dire que nous allons étudier comment transmettre des variables directement à l'animation contenue dans une
page Web, sans que l'animation aie besoin de faire de requête.
Paramètres de publication Html
71 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Pour commencer, créez une nouvelle
animation vide et aller voir les options
de publication Fichier->Paramètres
de publication.
Vérifiez que les cases Flash et Html
sont cochées puis aller voir l'onglet
Html.
Pour plus d'informations sur le Modèle,
sélectionnez celui concerné et cliquez
sur infos
Vous pouvez changer les dimensions
de l'animation dans la page Web,
essayer de conserver toujours les
mêmes proportions, sinon l'utilisateur
verra les "côtés" de l'animation, ce qui
n'est pas très beau.
Les cases à cocher de Lecture nous
concernent peu, car nous contrôlons la
lecture et les autres propriétés
directement en Actionscript.
Idem pour la Qualité
Grâce au Mode fenêtre, vous pouvez
rendre l'arrière plan de votre
animation transparent (C'est à dire
qu'on verra la page Web au travers) !
Mais si l'animation et la page Web qui
la porte sont trop complexes, ca va
horriblement ralentir l'ordinateur...
Option à double tranchant !
Vous comprendrez aisément les
options suivantes, sachez toutefois que "Alignement Flash" correspond à l'alignement de l'animation dans l'espace qui lui
est réservée et non pas par rapport à la page.
Or la plupart du temps l'espace réservé est le même que l'espace pris par l'animation, changer l'alignement ne fera donc
rien.
Le code Html expliqué
Cliquez ensuite sur le bouton Publier (maj+F12).
Avant de publier une animation, il faut l'avoir enregistrée quelque part, sinon elle sera publiée dans le
"vide" (en fait dans le fichier temporaire windows)
Aller jeter un coup d'oeil à la page Html produite par Flash, vous trouverez aisément les lignes qui nous intéressent :
Code : HTML
72 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"
width="550" height="400" id="Sans nom-1" align="middle">
<param
<param
<param
<param
name="allowScriptAccess" value="sameDomain" />
name="movie" value="Sans nom-1.swf" />
name="quality" value="high" />
name="bgcolor" value="#ffffff" />
<embed src="Sans nom-1.swf" quality="high" bgcolor="#ffffff" width="550" height="400"
name="Sans nom-1" align="middle" allowScriptAccess="sameDomain"
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
J'ai mis un peu en forme le code pour qu'on s'y retrouve.
La balise object permet de signifier au navigateur qu'il doit charger un plug-in possédant les attributs fournis.
Suivent ensuite quelques balises de type param qui permettent de déclarer quelques propriétés qui seront passées au
plugin.
Et enfin vient la balise embed qui n'est pas standard (elle empêchera la validation Xhtml stricte de votre code) qui
résume tout ce qui a été dit avant pour les autres navigateur que IE (Firefox par exemple).
Maintenant que nous avons vu ce que Flash fait et donc ce qu'il ne faut pas faire, voyons ce qu'on peut faire pour
proposer un code valide.
Voici la solution proposée par cette très bonne page Web (anglais) :
Code : HTML
<object type="application/x-shockwave-flash" data="monanimation.swf" width="550"
height="400">
<param name="movie" value="monanimation.swf" />
<p>Si l'utilisateur ne possède pas le plug-in</p>
</object>
L'auteur de ce code précise cependant, que cela conduit à un petit bug avec Internet Explorer : avant d'être lue
l'animation sera chargée complètement, ce qui n'est pas grave pour nous. Mais c'est embêtant pour les grosses
animations qui sont lues en streaming, c'est à dire pendant le chargement.
Dans tous les cas, il est impératif de garder l'attribut data qui indique aux navigateurs alternatifs (et valides), comme
Mozilla Firefox, le chemin vers l'animation.
Mais il faut aussi conserver le param : movie qui lui sera utilisé par Internet Explorer. Vous pouvez d'ailleurs essayer l'un
ou l'autre au choix, et ce sera soit IE soit Firefox qui n'affichera pas l'animation !
C'est une gêne, mais il faudra bien penser à chaque fois à modifier le chemin vers l'animation aux deux
endroits.
Envoie des variables
On arrive enfin à ce qui nous intéresse vraiment !
Le moyen le plus simple pour transmettre des variables à une animation Flash est de lui envoyer codé sous la forme GET.
Dit comme ça, ça à l'air drôlement compliqué, mais si vous avez quelques connaissances en PHP par exemple, vous
comprendrez vite.
Rien de mieux qu'un exemple : dans le code ci-dessous je transmets à l'animation monanimation.swf la variable siteweb
qui vaut www.siteduzero.com
Code : HTML
73 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
<object type="application/x-shockwave-flash"
data="monanimation.swf?siteweb=www.siteduzero.com" width="550" height="400">
<param name="movie" value="monanimation.swf?siteweb=www.siteduzero.com" />
</object>
Vous avez vu, c'est tout simple, il suffit de rajouter ?nomdemavariable=valeurdemavariable juste après le lien vers
l'animation.
Si j'ai plusieurs variables ?
Il faut utiliser le séparateur &
Exemple :
monanimation.swf?premierevariable=premierevaleur&secondevariable=secondevaleur
Et vous pouvez en mettre une infinité comme ça !
Réception des variables
On sait comment on peut envoyer les variables, mais concrètement, comment les recevoir et les afficher
dans l'animation ?
Il suffit de savoir que les variables sont transmises à la scène principale sur _root
Pour tester, créez une zone de texte dynamique et donnez lui comme nom de variable (pas nom d'occurrence, mais
bien nom de variable) : siteweb
Publiez l'animation, et modifier votre code Html en conséquence pour avoir, comme tout à l'heure :
votreanimation.swf?siteweb=www.siteduzero.com
Ouvrez votre page Web, et là, miracle, www.siteduzero.com est écrit dans la zone de texte !
Encore un autre petit exemple pour la route.
Dessinez ce que vous souhaitez dans votre animation et transformez le en clip que vous appellerez en toute originalité :
monclip
Tapez le code suivant sur la scène principale :
Code : ActionScript
this.monclip._rotation = this.degre;
this.monclip._alpha = this.transparence;
Courez dans votre code Html et changez le chemin de l'animation pour :
votreanimation.swf?degre=90&transparence=50
Ouvrez la page Web, et là sans étonnement, vous verrez que votre clip est penché de 90° vers la droite et est à moitié
transparent !
Les caractères spéciaux
Je vous invite à essayer de transmettre cette variable : Zéros et de l'afficher dans votre animation !
Si vous êtes sous Internet Explorer : pas de problème, le plug-in Flash (sous forme de contrôle activex) a fait ce qu'il
fallait pour que ca passe.
74 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Essayez avec Mozilla Firefox : là c'est beaucoup moins beau, Flash vous affiche Z¡s
Voilà l'origine du problème :
Tout caractère textuel est codé selon une table des caractères, qu'on appelle aussi charset.
Si vous regardez en haut du code Html des pages Web, vous verrez toujours une ligne avec un attribut de ce type :
charset=iso-8859-1
Ce charset là est celui le plus répandu pour les sites européens. Il gère la quasi-intégralité des caractères des alphabets
européens. Cela dit, ne lui demandez pas de vous afficher du Japonais ou du Chinois.
Flash ayant des prétentions mondiales a choisi un charset "mondial", standard et très à la mode en ce moment, le
charset UTF-8.
Je vous conseil donc coder en UTF-8 vos pages web !
Pour les lettres de l'alphabet, pas de problèmes, elles occupent la même position en iso-8859-1 et en UTF-8, ce qui
explique pourquoi cela fonctionnait. Mais pour tous les autres caractères accentués, spéciaux, étrangers, il va falloir
utiliser UTF-8.
Le charset de la mort
Il va vous falloir utiliser un programme qui permette de choisir le charset de votre page Web. dreamweaver, Notepad+,
unired le font. Il vous faut non-seulement changer le charset "apparent" en haut de votre page web charset=UTF-8 mais
en plus changer le charset "réel" du fichier, soit lors de la sauvegarde avec un logiciel d'édition du texte adapté, soit
dans les propriété de codage de la page avec Dreamweaver.
Et vos peines ne sont pas finies ! Selon que la page Web soit sur votre ordinateur ou sur votre serveur Web, l'animation
affichera peut-être le ¡ qui deviendra vite votre pire ennemi ! Cela vient du fait, que le charset est non seulement
précisé à l'intérieur du la page web grâce à la ligne charset=UTF-8, mais le serveur Web peut aussi envoyer au
navigateur un en-tête HTTP indiquant le charset à utiliser.
Donc la plupart du temps c'est en tâtonnant qu'on trouve la bonne solution, le mieux est d'utiliser le même charset
partout.
Dès le départ indiquer le charset=UTF-8 en haut de vos pages, indiquez à l'éditeur HTML que vous voulez écrire en UTF-8
et vérifier dans les configurations de votre hébergeur que l'en-tête envoyé précise bien au navigateur qu'il doit utiliser
l'UTF-8 (vous pouvez faire un programme PHP qui s'en chargera si votre hébergeur est nul).
L'encodage URL de rêve
Une solution pratique consiste à utiliser les fonctions escape() et unescape() de Flash.
Ces fonctions permettent d'encoder ou de décoder une chaîne de caractère au format URL.
Chaque caractère spécial possède un équivalent en codage URL. Par exemple le é devient %C3%A9 et l'espace devient
%20.
Même pas besoin de s'embêter avec les différents encodages (quoique ... ca serait trop beau
)!
Essayer de passer cette valeur à Flash : Z%C3%A9ros
Et là ca marche à tous les coups !
Même pas besoin d'utiliser la fonction unescape(), Flash s'en occupe tout seul
Vous l'aurez compris, l'encodage devient un casse-tête dès le moment où on n'y fait plus attention !
Il est donc conseillé d'encoder les variables en utilisant l'encodage URL, comme ça pas de problème.
Mais il ne faut pas oublier que derrière se cache toujours le gros méchant charset ! Ce tuto vous a permis de
comprendre le système de transmission de variable, mais vous a aussi prévenu des dangers de l'encodage des variables !
Le meilleur moyen de ne pas se tromper reste encore d'effectuer les tests non pas en local sur votre ordinateur mais sur
un serveur web distant.
Créer et enlever des Clips
Cette partie est d'une importance capitale pour la compréhension de la suite du cours. Nous allons jouer avec des clips !
Nous allons en créer des vides ou à partir de la bibliothèque, en supprimer, et tout cela dynamiquement !
75 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Suivez bien le guide !
Clips dynamiques, statiques et profondeur
Avant de passer au côté pratique, nous allons nous plonger un peu dans la théorie.
Il faut savoir qu'il existe deux types de Clip :
Les clips statiques, créés dans Flash avant la compilation
Les clips dynamiques, créés pendant l'exécution par Actionscript
Un clip statique ne peut pas être supprimé par Actionscript
Chaque clip a deux caractéristiques propres et uniques : son nom et sa profondeur !
Le nom, vous connaissez déjà, mais la profondeur (depth en anglais), je suis sûr que vous n'en avez jamais entendu
parler !
Les profondeurs sont comprises entre -16383 et 1048575, et vous pouvez placer UN seul et unique clip par profondeur :
ca laisse une certaine marge de manoeuvre
Il faut savoir que Flash attribue aux clips statiques des profondeurs négatives en partant de la plus basse valeur : -16383
Mais il est tout à fait possible de leur indiquer une autre profondeur ou de créer un clip dynamique avec une profondeur
négative.
Pour jouer avec les profondeurs je vais vous indiquer deux méthodes appartenant à la classe MovieClip :
monclip.getDepth() renvoie la profondeur de monclip
monclip.swapDepths(profondeur) assigne la profondeur profondeur à monclip
Essayez de créer un clip statique, et d'afficher sa profondeur dans la fenêtre de sortie, vous constaterez vous-même que
sa profondeur sera -16383 si c'est le premier clip statique créé.
Amusez vous ensuite à changer sa profondeur.
Maintenant, abordons une autre utilisation possible de swapDepths().
Comme le "swap" l'indique, cette méthode permet aussi d'intervertir la profondeur de deux clips monclip1 et monclip2,
comme cela :
Code : ActionScript
trace("profondeur de monclip1 :"+monclip1.getDepth());
trace("profondeur de monclip2 :"+monclip2.getDepth());
monclip1.swapDepths(monclip2);
trace("ECHANGE DE PROFONDEUR");
trace("profondeur de monclip1 :"+monclip1.getDepth());
trace("profondeur de monclip2 :"+monclip2.getDepth());
Et voilà ce que vous affichera le fenêtre de sortie :
Citation : Sortie
profondeur de monclip1 :-16383
profondeur de monclip2 :-16381
ECHANGE DE PROFONDEUR
profondeur de monclip1 :-16381
profondeur de monclip2 :-16383
76 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
La profondeur fait aussi partie de ce que vous verrez. En effet si deux clips se chevauchent, c'est celui qui aura la plus
haute profondeur qui sera au dessus des autres !
Intéressant à savoir !
Créer un clip vide
La méthode la plus simple et en même temps la plus abstraite : createEmptyMovieClip()
Comme son nom l'indique, elle permet de créer un nouveau clip vide.
Décortiquons ce que nous dit l'aide de Flash à son sujet.
public createEmptyMovieClip(name:String, depth:Number) : MovieClip
Le public signifie tout simplement qu'on peut appeler la méthode où qu'on soit par rapport au code. (Je résume
)
Ensuite on constate que la fonction admet 2 paramètres : name et depth :
Pour name, vous l'aurez compris, il s'agit seulement de donner un nom à notre clip. Il faut donner ce nom sous la forme
d'une chaîne de caractère.
Pour depth, on l'a vu, il suffit de donner une profondeur qui n'est pas déjà utilisée. Sinon le clip qui se trouvait
précédemment sur cette profondeur sera détruit. (Ce qui peut se révéler parfois utile)
Enfin, le : MovieClip à la fin de la ligne signifie que la méthode ne renvoie non pas le MovieClip lui même mais une
référence vers le Clip créé.
Petit exemple :
Code : ActionScript
reference = _root.createEmptyMovieClip("monclip",1);
Ce code va créer un clip vide sur la profondeur 1 de la scène principale. C'est à dire que si vous créez un autre clip sur la
scène principale, il pourra prendre toutes les profondeurs possibles, sauf 1, sous peine d'écraser le clip précédent.
Quelle est la différence entre reference et monclip ?
Et bien, en effet les deux variables indiquent le même clip. Donc que vous fassiez trace(reference) ou trace(monclip)
vous aurez le même résultat !
Dupliquer un clip de la scène
Voilà une méthode très facile à comprendre, mais qu'on utilise en fin de compte assez peu :
public duplicateMovieClip(name:String, depth:Number, [initObject:Object]) : MovieClip
Cette méthode permet de dupliquer un clip de la scène principale. Le clip qui va être créé sera dans le même clip
parent que le clip que vous copiez, il sera placé au même endroit et aura la même taille : une copie parfaite !
name correspond au nom que l'on donne au nouveau clip et depth à sa profondeur.
Encore une fois, un seul clip par profondeur !
Tout comme createEmptyMovieClip(), cette méthode renvoie une référence vers le clip. Mais au contraire de
createEmptyMovieClip(), le clip qui "porte" la méthode (c'est à dire monclip dans cet exemple : monclip.mamethode()
) ne sera pas le clip sur lequel sera créé le duplicata mais le clip à dupliquer.
77 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
Ca parait peut-être pas très clair
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
mais avec un exemple vous allez vite comprendre :
Pour tester, dessiner ce qui vous passe par la tête et transformez votre oeuvre
clipacopier le tout sur la scène principale.
en un clip que vous nommerez
Tapez ensuite comme code :
Code : ActionScript
reference = clipacopier.duplicateMovieClip('monclip',2);
Comme pour createEmptyMovieClip(), que l'on utilise la variable retournée reference ou le nom du clip monclip pour y
accéder : ca revient au même !
Mais il ne fait rien ton code !
Mais si ! C'est juste que la copie du clip est parfaite, même position et même taille ! Les deux clips sont donc superposés
!
Arrangeons tout ça :
Code : ActionScript
reference = clipacopier.duplicateMovieClip('monclip',2);
reference._x = 0;
reference._y = 0;
Maintenant, votre nouveau clip va se placer en haut à gauche de la scène.
Exercice 1
Faites en sorte que le clip nouvellement créé suive la souris.
Correction possible (plein de possibilités) :
Secret (cliquez pour afficher)
Code : ActionScript
reference = clipacopier.duplicateMovieClip('monclip',2);
reference.onEnterFrame = function() {
this._x = _root._xmouse;
this._y = _root._ymouse;
}
Exercice 2
Créez 5 copies de votre clip et disposez les sur une diagonale, tout ça en utilisant une boucle bien-entendu.
Correction possible (plein de possibilités encore une fois) :
Secret (cliquez pour afficher)
Code : ActionScript
for (i=0;i<5;i++) {
reference = clipacopier.duplicateMovieClip('monclip'+i,i);
reference._x = i*reference._width;
reference._y = i*reference._height;
}
Vous avez bien remarqué que la profondeur qu'on demande pour le clip est la variable de la boucle. Ce qui permet
d'avoir une profondeur différente à chaque fois. Car si vous aviez laissez une constante comme profondeur, alors les
nouvelles copies auraient au fur et à mesure remplacer les précédentes !
78 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Vous pouvez essayer avec une constante, et vous verrez que seule la dernière copie est encore là !
A chaque tour de boucle, on donne aussi un nom différent à notre nouvelle copie. Sinon on se retrouverait avec un seul
nom pour 5 clips, et ca poserait des petits problèmes, puisque seul le premier clip conserverait ce nom, et tous les
autres n'en porteraient pas.
Pour le positionnement en diagonale, on multiplie simplement la taille de l'objet par le numéro du tour de boucle en
cours.
Maintenant explicitons pourquoi cette méthode est finalement peu utilisée !
Et bien jetez un coup d'oeil à votre diagonale, elle est pas belle, parce que le clip original est toujours là et c'est pas
très esthétique (et peu pratique aussi). Or c'est un clip statique, car créé dans Flash et pas par Actionscript, et un clip
statique ne peut pas être supprimé.
Donc on préférera utiliser une autre méthode pour pouvoir créer des clips de façon dynamique.
Animation test pour la duplication des clips
Attacher un clip à la scène
Et cette méthode magique et parfaite là voilà, il s'agit de :
public attachMovie(id:String, name:String, depth:Number, [initObject:Object]) : MovieClip
Cette fonction va aller non pas dupliquer un clip de la scène, mais un clip de la bibliothèque !
Voilà comment assigner un identifiant à un clip de la bibliothèque. Pour afficher cet onglet il faut cliquer sur
"propriétés" du clip puis afficher les options "avancées". Vous pouvez aussi accéder tout simplement aux options de
"liaison"
Pour nos tests on va donner l'identifiant monclip à votre clip comme d'habitude.
79 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
On fournit donc à la méthode l'identifiant id, le nom qu'on veut donner au nouveau clip name et une profondeur depth.
Le nouveau clip sera créé dans le clip qui porte la fonction.
Et enfin, comme depuis le début, la fonction renvoie une référence vers le clip créé.
Testons :
Code : ActionScript
reference = _root.attachMovie('monclip','nouveauclip',1);
Et là miracle, le clip qui était stocké dans votre bibliothèque apparaît sur votre scène _root.
Exercice 1
Comme tout à l'heure, faite moi une belle diagonale de 5 fois votre clip.
Correction possible (vous savez déjà qu'il y en a beaucoup
Secret (cliquez pour afficher)
):
Code : ActionScript
for (i=0;i<5;i++) {
reference = _root.attachMovie('monclip','nouveauclip'+i,i);
reference._x = i*reference._width;
reference._y = i*reference._height;
}
En fait il n'y a rien à changer, si ce n'est la ligne où on créé le nouveau clip.
Exercice 2
Faites moi de la belle neige !
Supposez que vous avec un clip représentant un flocon de neige dans votre bibliothèque et qu'il porte l'identifiant neige.
Supposez aussi que la neige n'apparaît pas en une seule fois (dites au revoir à la boucle for) mais au fur et à mesure du
temps qui passe.
Supposez que la neige apparaît tout en haut de l'écran et à un endroit aléatoire (dites bonjour à la fonction random()
)
Supposez enfin que la neige descend en ligne droite de 5 pixels par images.
N'oubliez pas de mettre un fond noir, sinon vous verrez rien !
Solution possible :
Secret (cliquez pour afficher)
Code : ActionScript
var i:Number=0;
_root.onEnterFrame = function() {
i++;
reference = _root.attachMovie('neige','neige'+i,i);
reference._x = random(500);
reference._y = 0;
reference.onEnterFrame = function() {
this._y+=5;
}
}
La principale difficulté était de conserver une variable qui s'incrémentait à chaque nouveau clip pour pouvoir donner au
clip une nouvelle profondeur à chaque tour.
Mais le problème, c'est que la neige, une fois disparue de l'écran existe toujours ?
80 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
En effet, c'est un problème ! Nous allons corriger cela
Supprimer un clip
On va enfin pouvoir se défouler sur ces clips
La méthode magique :
public removeMovieClip() : void
Le clip qui porte cette méthode disparaît pour toujours
Je le répète une dernière fois, ca ne marche que si le clip est dynamique. On ne peut pas supprimer un
clip statique
Pour tester on va tout simplement reprendre notre code précédent et ajouter une condition qui va tester si le clip n'est
pas trop bas dans l'écran.
On suppose que votre scène fait 400px de hauteur et qu'on doit faire disparaître le clip dès que sa position verticale
dépasse ce point.
Secret (cliquez pour afficher)
Code : ActionScript
var i:Number=0;
_root.onEnterFrame = function() {
i++;
reference = _root.attachMovie('monclip','nouveauclip'+i,i);
reference._x = random(500);
reference._y = 0;
reference.onEnterFrame = function() {
this._y+=5;
if (this._y >=400) {
this.removeMovieClip();
}
}
}
Il a suffit de rajouter ce petit morceau de code :
Code : ActionScript
if (this._y >=400) {
this.removeMovieClip();
}
Comme vous le voyez c'est une méthode très simple à utiliser !
Une astuce en profondeur
Sous ce jeu de mot qui vaut pas un clou rouillé, se cache une fonction de Flash bien pratique :
public getNextHighestDepth() : Number
Cette méthode renvoie un nombre qui correspond à la prochaine profondeur non-utilisée !
Donc à priori plus besoin de s'embêter à utiliser des variables qui s'incrémentent au fur et à mesure, il suffirait d'écrire :
Code : ActionScript
81 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
reference = _root.attachMovie('monclip','nouveauclip'+i,_root.getNextHighestDepth());
Mais voilà le petit problème : le nom du clip créé. Il a toujours besoin de i sinon on donnerait toujours le même nom !
Aller, cherchez 5 secondes pour trouver une solution
Secret (cliquez pour afficher)
Code : ActionScript
reference =
_root.attachMovie('monclip','nouveauclip'+_root.getNextHighestDepth(),_root.getNextHighestDepth
Voilà, c'était tout bête !
Autre astuce intéressante : public getInstanceAtDepth(depth:Number) : MovieClip
Imaginez que vous ayez créé un nouveau clip et que, manque de chance, vous perdiez son nom ET sa référence ou que
vous les effaciez comme ici :
Code : ActionScript
reference = _root.attachMovie('monclip','nouveauclip',1);
reference = null;
monclip = null;
null correspond au vide. Si vous assignez cette "non-valeur" à une variable, Flash la considérera comme
ne possédant aucune valeur
Et maintenant essayez de supprimer le clip. Vous pouvez essayer avec nouveauclip.removeMovieClip(); ou avec
reference.removeMovieClip(); : ca ne marchera pas ! Les variables ne renvoient plus au clip !
Comment on fait alors pour accéder au clip, pour l'effacer par exemple ?
Et bien on utilise la fonction magique :
Secret (cliquez pour afficher)
Code : ActionScript
_root.getInstanceAtDepth(1).removeMovieClip();
La fonction va renvoyer le clip situé sur _root et possédant la profondeur 1. Et comme çà on peut supprimer un clip dont
on a oublié le nom ! (mais pas la profondeur, on a rien sans rien
)
La variable dans la variable
Reprenons un exemple précédent facile :
Code : ActionScript
82 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
for (i=0;i<5;i++) {
reference = _root.attachMovie('monclip','nouveauclip'+i,i);
reference._x = i*reference._width;
reference._y = i*reference._height;
}
Vous êtes d'accord que les clips porteront les noms 'nouveauclip'+i avec i qui varie de 0 à 4.
Imaginions que nous ne voulions pas utiliser la variable reference que nous retourne la fonction, mais directement le
nom du nouveau clip pour accéder à ses coordonnées.
Comment faire ?
Voilà la syntaxe qui permet d'accéder au clip
_root['nouveauclip'+i]
Appliquons-là ensemble à l'exemple pour bien comprendre :
Code : ActionScript
for (i=0;i<5;i++) {
_root.attachMovie('monclip','nouveauclip'+i,i); // Plus besoin de reference
_root['nouveauclip'+i]._x = i*_root['nouveauclip'+i]._width;
_root['nouveauclip'+i]._y = i*_root['nouveauclip'+i]._height;
}
Ca alourdit drôlement le code ! Alors soyez intelligent et trouvez un moyen pour n'écrire qu'une seule fois
_root['nouveauclip'+i]
Secret (cliquez pour afficher)
Code : ActionScript
for (i=0;i<5;i++) {
_root.attachMovie('monclip','nouveauclip'+i,i);
reference = _root['nouveauclip'+i];
reference._x = i*reference._width;
reference._y = i*reference._height;
}
Et bien on fait appelle à une variable "tampon" qui sera elle aussi une référence au clip, mais qui est plus courte à écrire
Vous allez me dire que dans cet exemple : ca sert à rien. Et vous avez raison. Mais je vous assure que les cas où on a
besoin d'accéder à des variables dans des variables sont légions et qu'il faut bien connaître la syntaxe :
clipparent['nomduclip'] Il s'agit là du chapitre le plus important ! N'oubliez donc pas son contenu.
Si vous vous demandez toujours le rapport entre l'icône du chapitre et les Clips, pensez aux variables qui font référence
aux clips et au problème qu'on peut avoir si on les perd
Dessiner avec Actionscript
Flash est un superbe outil pour la conception et l'animation d'illustrations pour le Web.
Mais savez vous qu'Actionscript permet aussi de dessiner de façon dynamique ?
Couleurs d'un clip
On ne peut pas vraiment dire que la classe que nous allons étudier maintenant permet de dessiner, mais dans la mesure
où elle permet d'attribuer une couleur à un clip, on va la ranger ici
83 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Avant Flash 8, pour colorer un clip on utilisait ce code :
Code : ActionScript
var macouleur:Color = new Color(monclip); // On associe macouleur à un clip
macouleur.setRGB(0xFF0000); // On donne une couleur héxadécimal à macouleur
Et ca suffisait pour changer la couleur du clip et le colorer en rouge comme dans l'exemple.
Mais si vous allez faire un tour dans l'aide, vous apprendrez que la classe color est obsolète !
Et j'avoue qu'au départ j'étais un peu déstabilisé. Mais puisque je base ce cours sur Flash 8, je vais vous apprendre à
colorer correctement un clip avec ActionScript 2 (et bientôt 3).
Pour colorer un clip, il faut utiliser les classes colortransform et transform. L'une permet de créer la transformation de
la couleur, et l'autre de l'appliquer au clip.
Il faut donc penser à rajouter ces deux lignes tout en haut de votre code, pour importer ces deux classes :
Code : ActionScript
import flash.geom.ColorTransform;
import flash.geom.Transform;
Créer un objet ColorTransform
Pour créer un nouvel objet ColorTransform, on va utiliser cette syntaxe, commune à toute les classes :
var macouleur:ColorTransform = new ColorTransform();
Avant de continuer, voici une petite information. Vous savez déjà que les couleurs en informatique sont
codées en hexadécimal. Pour avoir du rouge dans un page Xhtml vous utiliserez par exemple #FF0000. Le #
signifie qu'on utilise le système hexadécimal. Les deux premiers "chiffres" correspondent à la quantité de
rouge, les deux seconds à la quantité de vert et les deux derniers à la quantité de bleu. Le minimum est 00 et
le maximum est FF (255 en décimal). Ainsi le blanc s'écrit #FFFFFF (toutes les couleurs à fond les gamelles) et
le noir #000000 (aucune couleur)
Et bien dans Flash, on peut aussi employer l'écriture hexadécimale des couleurs (mais elle n'est pas obligatoire). Par
contre pour préciser à Flash que le nombre qui suit est en hexadécimal, il ne faut pas utiliser le # mais 0x.
Le bleu s'écrit donc 0x0000FF
Mini-récapitulatif pour ceux qui découvriraient la notion :
Couleur Xhtml & CSS ActionScript
Rouge
#FF0000
0xFF0000
Vert
#00FF00
0x00FF00
Bleu
#0000FF
0x0000FF
Jaune
#FFFF00
0xFFFF00
Bref, la pipette de Flash dans la barre d'outil vous donne accès à toutes les couleurs possibles et imaginables et vous
donne le code hexadécimal correspondant. Il faudra juste penser à remplacer le # par 0x, car la pipette de Flash
l'affiche avec un #
.
Tout ce qu'il faut savoir c'est que Flash veut des couleurs notées avec # et que ActionScript veut des couleurs avec 0x
Image utilisateur
Maintenant qu'on a notre couleur, on va utiliser la variable rgb (rgb = red-Green-blue = rouge - vert - bleu) de la classe
ColorTransform pour l'enregistrer, ce qui nous donne :
84 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
import flash.geom.ColorTransform;
import flash.geom.Transform;
var macouleur:ColorTransform = new ColorTransform();
macouleur.rgb = 0xFF0000; //Couleur rouge
Application de la transformation couleur
Notre transformation est prête
On a un clip monclip sur la scène, et on souhaite lui appliquer !
Il faut déjà associer une transformation au clip :
Code : ActionScript
var transformation:Transform = new Transform(monclip);
On a créé avec ce code une transformation appelée, en toute originalité
On a aussi précisé que cette transformation s'appliquait à monclip
: transformation.
Eh bien, il ne reste plus qu'à faire le lien entre la couleur et la transformation, grâce à :
transformation.colorTransform = macouleur;
Ce qui nous donne en récapitulant :
Code : ActionScript
import flash.geom.ColorTransform;
import flash.geom.Transform;
var macouleur:ColorTransform = new ColorTransform();
macouleur.rgb = 0xFF0000;
var transformation:Transform = new Transform(monclip);
transformation.colorTransform = macouleur;
C'est drôlement plus long que l'ancienne méthode ! Pourquoi ce changement ?
En fait, il y a une logique là derrière
La classe Transform centralise les transformations qu'on peut effectuer sur un objet. Et la classe colorTransform
possède beaucoup plus de possibilités que l'ancienne classe color, vous pouvez ainsi appliquer des coefficients sur les
différentes composantes de la couleur et même sur sa transparence
Allez voir l'aide de Flash pour plus
d'informations là dessus.
Dessinons sur des clips
Première chose à comprendre : on dessine toujours sur un clip !
En effet, toutes les méthodes de dessin que nous allons voir appartiennent à la classe MovieClip
Et puisqu'on est des codeurs propres, on dessinera le moins possible directement sur la scène principale
Nous allons donc préparer notre zone de dessins comme suit :
Code : ActionScript
85 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
_root.createEmptyMovieClip('dessin',1);
Et tout ce qu'on dessinera, on le dessinera sur ce clip pour pouvoir :
effacer facilement le dessin en supprimant le clip
bouger le dessin en bougeant le clip
agir sur la transparence du dessin en agissant sur la transparence du clip
...
Bref, énormément d'avantages !
Gribouillons un peu
Sous ce titre explicite, se découvre les bases du dessin avec Flash : les traits !
public lineStyle(thickness:Number, rgb:Number, alpha:Number) : Void
La première chose à faire quand on dessine un trait c'est de dire à Flash quel type de trait on veut !
thickness correspond à la largeur en pixel du trait, rgb sa couleur (en hexadécimal la plupart du temps), alpha sa
transparence.
Flash 8 implémente d'autres arguments pour cette fonction, mais qui ne nous servent à pas grand chose pour l'instant,
allez faire un petit tour dans l'aide pour en apprendre plus.
Posons la première ligne de notre code :
Code : ActionScript
_root.dessin.lineStyle(4, 0x000000, 100);
Là on dit à Flash d'utiliser un trait noir de largeur 4px et complètement opaque.
public moveTo(x:Number, y:Number) : Void
Cette méthode va vous permettre de placer le point de départ du dessin. Ca n'affiche rien en sois-même.
Si vous commencer directement à dessiner, alors Flash supposera que cette fonction a été appelée avec les arguments
(0,0) c'est à dire en haut à gauche de votre animation.
Pour l'instant écrivons :
Code : ActionScript
_root.dessin.lineStyle(4, 0x000000, 100);
_root.dessin.moveTo(10, 10);
Avec ce code on place le départ du dessin aux coordonnées (10,10) dans le clip dessin (puisque c'est là qu'on va
dessiner).
public lineTo(x:Number, y:Number) : Void
Et voilà la reine des fonctions de dessin, celle qui trace effectivement le trait. Elle ne demande que les coordonnées
cible du trait.
Elle va donc tracer un trait entre les dernières coordonnées où on a dessiné (c'est à dire pour l'instant les coordonnées
qu'on a passé à moveTo() ) et celle qu'on lui fournit.
Ce qui nous donne en achevant le code :
Code : ActionScript
86 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
_root.createEmptyMovieClip('dessin',1);
dessin.lineStyle(4, 0x000000, 100);
dessin.moveTo(10,10);
dessin.lineTo(300, 300);
Et voilà un beau trait
Exercice 1
Dessinez un carré.
Secret (cliquez pour afficher)
Code : ActionScript
_root.createEmptyMovieClip('dessin',1);
dessin.lineStyle(4, 0x000000, 100);
dessin.moveTo(10,10); // On se place au coin en haut à gauche
dessin.lineTo(300, 10); // Coin en haut à droite
dessin.lineTo(300, 300); // Coin en bas à droite
dessin.lineTo(10, 300); // Coin en bas à gauche
dessin.lineTo(10, 10);// Et on retourne en haut à gauche
Exercice 2
Permettez à l'utilisateur de dessiner avec la souris
Secret (cliquez pour afficher)
Code : ActionScript
_root.createEmptyMovieClip('dessin',1);
dessin.lineStyle(4, 0x000000, 100);
dessin.moveTo(0,0);
_root.onEnterFrame = function() {
dessin.lineTo(_xmouse, _ymouse);
}
Petit rajout : ne dessinez que si l'utilisateur à le bouton de la souris enfoncé
Secret (cliquez pour afficher)
Code : ActionScript
_root.createEmptyMovieClip('dessin', 1);
dessin.lineStyle(4, 0x000000, 100);
_root.onMouseDown = function() { // Quand on appuye sur le bouton de la souris
dessin.moveTo(_xmouse, _ymouse); // On place le début du dessin aux
coordonnées de la souris
_root.onEnterFrame = function() {
dessin.lineTo(_xmouse, _ymouse); //Et on dessine à chaque image un
trait
};
};
_root.onMouseUp = function() { //Quand on relache le bouton
_root.onEnterFrame = null; //On arrête le onEnterFrame
};
Voilà, vous êtes déjà un pro en dessin
Un peu de coloriage !
Continuons nos gribouillis avec un peu de coloriage !
87 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
public beginFill(rgb:Number, [alpha:Number]) : Void
La méthode qui permet de colorier c'est celle-ci. Il en existe 2 autres plus complexes qui sont :
beginBitmapFill() - Colorie avec une image
beginGradientFill() - Colorie avec un dégradé
Si vous voulez en savoir plus allez les voir dans l'aide.
Pour l'instant reprenons notre cube et colorions le en rouge, tout en sachant que pour achever le coloriage il faut utiliser
la méthode MovieClip.endFill() à la fin du dessin :
Code : ActionScript
_root.createEmptyMovieClip('dessin',1);
dessin.lineStyle(4, 0x000000, 100);
dessin.beginFill(0xff0000,100); // On remplie de rouge
dessin.moveTo(10,10); // On se place au coin en haut à gauche
dessin.lineTo(300, 10); // Coin en haut à droite
dessin.lineTo(300, 300); // Coin en bas à droite
dessin.lineTo(10, 300); // Coin en bas à gauche
dessin.lineTo(10, 10);// Et on retourne en haut à gauche
dessin.endFill(); //On arrête le coloriage
Sympathique, non ?
Et si je ne mets pas dessin.endFill(); ?
Ben ca change rien
grave.
En effet, on ne commence pas de nouvelle figure avec de nouvelles couleurs, donc c'est pas bien
Exercice 1
Reprenez le code de votre mini-paint
Code : ActionScript
_root.createEmptyMovieClip('dessin', 1);
dessin.lineStyle(4, 0x000000, 100);
_root.onMouseDown = function() { // Quand on appuye sur le bouton de la souris
dessin.moveTo(_xmouse, _ymouse); // On place le début du dessin aux coordonnées de
la souris
_root.onEnterFrame = function() {
dessin.lineTo(_xmouse, _ymouse); //Et on dessine à chaque image un trait
};
};
_root.onMouseUp = function() { //Quand on relache le bouton
_root.onEnterFrame = null; //On arrête le onEnterFrame
};
Et maintenant faites en sorte que tout ce qu'on colorie soit rempli de rouge !
Secret (cliquez pour afficher)
88 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
_root.createEmptyMovieClip('dessin', 1);
dessin.lineStyle(4, 0x000000, 100);
_root.onMouseDown = function() {
dessin.moveTo(_xmouse, _ymouse);
dessin.beginFill(0xff0000,100);
_root.onEnterFrame = function() {
dessin.lineTo(_xmouse, _ymouse);
};
};
_root.onMouseUp = function() {
dessin.endFill();
_root.onEnterFrame = null;
};
Rien de bien sorcier, suffisait de rajouter le beginFill().
C'est pas très avancé comme Paint mais c'est déjà suffisant pour dessiner un coeur percé d'une flèche
Gommez moi tout çà !
Il y a deux moyens pour effacer tous ses gribouillis !
Vu que c'est sur un clip dynamique je pense que vous avez déjà deviné la première :
Effaçons le clip
Créez un clip carré sur la scène que vous appellerez effaceur.
Rajoutez ensuite dans votre paint à la fin du code :
Code : ActionScript
effaceur.onRelease = function() { // Quand on clique sur "effaceur"
_root.dessin.removeMovieClip(); // On supprime le clip "dessin"
}
Ca marche, ca efface tout, mais impossible de redessiner ensuite, vu que le clip dessin n'existe plus !
Aller, cogitez un peu et trouvez moi une solution élégante pour recréer le clip dessin à chaque effacement.
Secret (cliquez pour afficher)
89 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
//-- Pour dessiner
_root.onMouseDown = function() {
dessin.moveTo(_xmouse, _ymouse);
dessin.beginFill(0xff0000,100);
_root.onEnterFrame = function() {
dessin.lineTo(_xmouse, _ymouse);
};
};
_root.onMouseUp = function() {
dessin.endFill();
_root.onEnterFrame = null;
};
//-- Pour effacer
effaceur.onRelease = function() {
_root.dessin.removeMovieClip();
_root.creer_espace_de_dessin();
}
//-- Pour commencer
creer_espace_de_dessin = function() {
_root.createEmptyMovieClip('dessin', 1);
_root.dessin.lineStyle(4, 0x000000, 100);
}
_root.creer_espace_de_dessin(); //On appelle la fonction qui créé le clip dessin
une première fois au lancement de l'animation. Sinon il faudrait cliquer sur le
bouton avant de pouvoir dessiner
Pas bête, hein ?
public clear() : Void
Voici la deuxième solution beaucoup plus rapide dans notre cas ! Elle efface tout ce qui a été dessiné dans le clip !
Donc reprenez le code précédent et au lieu d'utiliser removeMovieClip utilisez moi clear()
Secret (cliquez pour afficher)
Code : ActionScript
//-- Pour dessiner
_root.onMouseDown = function() {
dessin.lineStyle(4, 0x000000, 100);
dessin.moveTo(_xmouse, _ymouse);
dessin.beginFill(0xff0000,100);
_root.onEnterFrame = function() {
dessin.lineTo(_xmouse, _ymouse);
};
};
_root.onMouseUp = function() {
dessin.endFill();
_root.onEnterFrame = null;
};
//-- Pour effacer
effaceur.onRelease = function() {
_root.dessin.clear();
}
//-- Pour commencer
_root.createEmptyMovieClip('dessin', 1);
Ca va drôlement plus vite déjà !
Vous remarquerez que dessin.lineStyle(4, 0x000000, 100); a été remonté tout en haut pour être exécuté à chaque clic
de souris. Parce que si on le laissait à sa place originel, il était supprimé en même temps que le dessin.
En effet clear() efface le dessin et tout ce qu'on a passé comme paramètre de remplissage ou de couleur de trait ! Il faut
A priori les méthodes de dessin en Flash n'ont pas l'air très utiles ...
donc que ce soit recréé à chaque fois.
Détrompez vous ! Vous constaterez vous-même à quel point il est indispensable de bien les connaître dans notre fil
90 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
rouge
Utiliser le clavier
Voilà une partie très intéressante, puisque après l'avoir lue nous pourrons non-seulement passer à la réalisation d'un
petit jeu basique, mais vous pourrez commencer à programmer des vrais mini-jeux bien funs
Nous allons étudier l'objet key et apprendre certaines notions comme le concept d'écouteurs. Ouvrez bien vos oreilles
(sans mauvais jeux de mots
)
Les écouteurs
Pour commencer on va s'intéresser à la notion d'écouteurs.
On essaye ... et on se plante
Vous vous souvenez probablement des événements ? Les événements permettent d'exécuter du code selon une action,
comme le clic de la souris par exemple :
Code : ActionScript
_root.onMouseDown = function() {
trace('bouton gauche de la souris abbaissée');
}
Et bien dans cet exemple, onMouseDown est un événement.
Curieux comme tous les zéros, vous allez vous jeter sur l'aide de Flash et voir s'il existe un événement onkeydown pour
la classe MovieClip.
Et là miracle ! Il existe bien un événement onKeyDown
Tout con(tent), vous vous empressez de rentrer ce genre de code dans votre animation :
Code : ActionScript
_root.onKeyDown = function() {
trace('Une touche du clavier a été titillée');
}
Et là enfer et damnation, ca ne fonctionne pas
Donc retour à l'aide de Flash, et là on voit que ca se complique, pour que ce code fonctionne, il faut que le clip ait le
focus et pleins d'autres propriétés (chiantes).
Bref, la dernière ligne de l'aide résume bien la situation :
Citation : Aide de Flash
Par conséquent, vous devez utiliser Key.onKeyDown dans la plupart des cas.
Voilà la solution, la classe Key
Les écouteurs de Key
L'objet Key ne possède pas d'événements comme les MovieClip mais des écouteurs. La différence primordiale, c'est que
là où un clip ne peut avoir qu'un seul et unique événement, alors que l'objet Key peut avoir un nombre infini
d'écouteurs, qui seront tous appelés lors d'une action sur le clavier.
Passons à la réalisation du classique "Hello World" :
91 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
var ecouteur_clavier:Object = new Object(); // On créé un écouteur, qui est en fait un
objet quelquonque pour l'instant
ecouteur_clavier.onKeyDown = function() { // On écrit une fonction onKeyDown pour cet objet
quelquonque
trace("Hello World");
};
Key.addListener(ecouteur_clavier); // On indique que cet objet n'est pas quelquonque, mais
un écouteur clavier !
Et maintenant que vous avez compris comment ca marchait, vérifions que ce que j'ai dit précédemment sur les
écouteurs est vrai (parce que même le prof il peut se planter) :
Code : ActionScript
var ecouteur_clavier:Object = new Object();
var ecouteur_clavier_bis:Object = new Object();
ecouteur_clavier.onKeyDown = function() {
trace("Hello World");
};
ecouteur_clavier_bis.onKeyDown = function() {
trace("Hello World (bis)");
};
Key.addListener(ecouteur_clavier);
Key.addListener(ecouteur_clavier_bis);
Et là miracle ! La fenêtre de sortie nous affiche :
Citation : Sortie
Hello World
Hello World (bis)
Les deux écouteurs ont donc été appelés !
Key.onKeyUp
Nous avons déjà vu l'écouteur d'événement Key.onKeyDown, pas besoin donc de le représenter.
Mais il possède aussi son opposé : Key.onKeyUp, qui se déclenche lorsqu'une touche est relâchée.
On l'utilisera comme ceci :
Code : ActionScript
var ecouteur_clavier:Object = new Object();
ecouteur_clavier.onKeyUp = function() {
trace('Touche relevée');
};
Key.addListener(ecouteur_clavier);
Rien de bien compliqué !
Pour finir sur les écouteurs, il faut que je vous parle de la fonction Key.removeListener(mon_ecouteur);
Comme son nom l'indique, elle permet de retirer un écouteur. Pas besoin de vous donner d'exemple, de toute façon on
l'utilise presque jamais
La touche enfoncée
C'est bien beau tout çà, on peut savoir quand une touche est enfoncée ou relâchée, mais pas encore moyen de savoir
quelle touche l'a été !
92 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Les codes de touche
Flash nous offre non pas une méthode pour cela, mais deux !
Il existe getAscii() qui renvoie le code ASCII de la touche et getCode() qui renvoie le code de la touche selon un tableau
des valeurs propre à Flash.
La principale différence entre ces deux méthodes, c'est que getAscii() est sensible à la casse (c'est à dire qu'elle fait la
distinction entre majuscules et minuscules) et surtout que getAscii() ne possède des valeurs que pour les caractères.
Pour lui les touches comme "Ctrl", "Alt", "Maj" ... n'ont aucune valeur. Faites donc bien attention !
Voilà un petit code qui permet d'observer les différences dans les valeurs des deux tableaux des caractères.
Code : ActionScript
var ecouteur_clavier:Object = new Object();
ecouteur_clavier.onKeyDown = function() {
trace("______________________");
trace("\t Code : "+Key.getCode());
trace("\t ASCII: "+Key.getAscii());
trace("______________________");
};
Key.addListener(ecouteur_clavier);
Et voilà la petite animation qui va bien pour illustrer cette première partie : ICI
La baballe qui saute
Maintenant qu'on sait tout çà, on va s'amuser à faire notre premier jeu (attendez de le voir avant de pousser des cris de
)
joie
Créez un clip balle sur la scène principale, et faites moi un beau code qui va permettre de la faire "sauter" de 100 pixels
vers le haut quand on appuie sur la barre d'espace (à vous de vous débrouiller pour connaître la valeur de la barre
d'espace). Ensuite je veux que la balle redescende à sa position d'origine lentement
Hop au boulot
Solution :
Secret (cliquez pour afficher)
Code : ActionScript
// Initialisation
var y_de_depart = _root.balle._y; //On récupère la position de départ
var ecouteur_clavier:Object = new Object(); // On créé l'écouteur
// Saut de la balle
ecouteur_clavier.onKeyDown = function() {
if (Key.getAscii() == 32) { // 32 est le code de la barre d'espace
_root.balle._y -= 100; // 100 pixels vers le haut
}
};
Key.addListener(ecouteur_clavier);
// Retombée de la balle
_root.balle.onEnterFrame = function() {
if (this._y<_root.y_de_depart) {
this._y += 2;
}
}
Je suppose que vous avez déjà remarqué, qu'un objet qui tombe accélère sa chute au cours du temps. Et bien simulez
93 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
moi çà
Voilà la solution, en utilisant une variable vitesse :
Secret (cliquez pour afficher)
Code : ActionScript
// Initialisation
var y_de_depart = _root.balle._y; //On récupère la position de départ
var ecouteur_clavier:Object = new Object(); // On créé l'écouteur
// Saut de la balle
ecouteur_clavier.onKeyDown = function() {
if (Key.getAscii() == 32) { // 32 est le code de la barre d'espace
_root.vitesse = 2;
_root.balle._y -= 100; // 100 pixels vers le haut
}
};
Key.addListener(ecouteur_clavier);
// Retombée de la balle
_root.balle.onEnterFrame = function() {
if (this._y<_root.y_de_depart) {
this._y += _root.vitesse;
_root.vitesse += 1;
}
}
Le problème de certaines touches
Flash impose quelques limitations à connaître. Par exemple, il ne peut capturer des entrées clavier que si l'utilisateur à
cliqué dans l'animation si cette dernière est dans une page web.
Maintenant, faisons une petite expérience.
Reprenez votre code qui permet d'afficher le code de la touche enfoncée.
Faites "Ctrl+Entrée" pour lancer votre animation.
Appuyez sur "echap" sur votre clavier : pas de réaction
Idem pour "Entrée", et pourtant, ce sont des touches indispensables !
Voilà la solution toute bête à ce problème à priori insoluble des touches qui ne fonctionnent pas. En fait, une fois dans
une page web tout fonctionnera parfaitement, mais dans "la zone de test" de l'animation de Flash, les touches "Entrée"
et "Echap" sont des touches de raccourci, voici l'astuce pour les désactiver :
94 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Les raccourcis des touches
On a vu que chaque touche possédait une correspondance dans le tableau ASCII ou dans le tableau Code. Mais c'est assez
chi*** d'aller chercher à chaque fois à quel code correspond telle ou telle touche. Flash a donc intégré des "raccourcis"
pour les touches les plus importantes. Par exemple, dans le code précédent, on avait déterminé que la barre d'espace
avait pour valeur en Code : 32
Et bien si vous ne le savez pas utilisez Key.SPACE. C'est un raccourci qui possède la valeur de la barre d'espace dans le
tableau Code des caractères. Pour Flash, Key.SPACE = 32.
Voici la liste des correspondances. De nombreuses touches n'ont pas de correspondance avec la table ASCII, tout
simplement parce que ce ne sont pas des caractères, mais de touches de contrôle, qui n'ont souvent pas de valeur dans
la table ASCII
Touche
95 sur 166
Raccourci
Code ASCII
Retour arrière
Key.BACKSPACE 8
8
Majuscule
Key.SHIFT
16
0
Verrouillage Majuscule Key.CAPSLOCK 20
0
Suppr
Key.DELETEKEY 46
127
Echap
Key.ESCAPE
27
27
Insert
Key.INSERT
45
0
Origine
Key.HOME
36
0
Fin
Key.END
35
0
Page précédente
Key.PGUP
33
0
Page suivante
Key.PGDN
34
0
tabulation
Key.TAB
9
9
Espace
Key.SPACE
32
32
Ctrl
Key.CONTROL
17
0
Entrée
Key.ENTER
13
13
Flèche haut
Key.UP
38
0
Flèche bas
Key.DOWN
40
0
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
Touche
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Raccourci
Code ASCII
Flèche gauche
Key.LEFT
37
0
Flèche droite
Key.RIGHT
39
0
Une condition bien pratique !
Maintenant qu'on connaît les raccourcis, voilà un code qui permettrait de détecter la pression sur la barre d'espace :
Code : ActionScript
var ecouteur_clavier:Object = new Object();
ecouteur_clavier.onKeyDown = function() {
if (Key.getAscii() == Key.SPACE) {
trace("Barre d'espace appuyée");
}
};
Key.addListener(ecouteur_clavier);
Je vous présente maintenant la méthode Key.isDown(votre_touche) qui renvoie true si la touche est pressée ou false
dans le cas contraire.
Voilà l'équivalent du code précédent en utilisant cette fonction :
Code : ActionScript
var ecouteur_clavier:Object = new Object();
ecouteur_clavier.onKeyDown = function() {
if (Key.isDown(Key.SPACE)) {
trace("Barre d'espace appuyée");
}
};
Key.addListener(ecouteur_clavier);
On peut pas vraiment dire que le gain de place soit très perceptible, mais je vous conseille lourdement de vous souvenir
de cette méthode
Trichons avec les écouteurs
Si vous avez bien compris la notion d'écouteurs, alors vous devez avoir intégré que leur seul rôle est d'appeler une
fonction s'ils détectent quelque chose, comme la pression d'une touche. Les méthodes Key.getAscii et Key.getCode
renvoient le code de la dernière touche pressée. Ce qui veut dire, que l'appel à ces fonctions n'a pas besoin d'être
parfaitement synchronisé, car même si on appelle la méthode 10 minutes après avoir appuyé sur "Entrée", elle renverra
toujours 13.
D'où l'idée qui germe dans vos esprits de Zéros, pourquoi ne pas se passer d'écouteur, et effectuer la condition à chaque
image (c'est à dire presque en continu).
Ce qui nous donnerait par exemple :
Code : ActionScript
_root.onEnterFrame = function() {
if (Key.getCode() == Key.SPACE) {
trace("Barre d'espace appuyée");
}
};
On lance l'animation, et lors de l'appuie sur "Espace" l'animation réagit ! Victoire ! On s'est passé des écouteurs !
Mais, argh, horreur ! La fenêtre de sortie affiche en boucle "Barre d'espace appuyée" sans s'arrêter !
96 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Pourquoi ce comportement ?
Et bien, lors de l'appuie sur la barre d'espace, Key.getCode() reçoit la valeur Key.SPACE. Or on effectue la condition en
boucle, l'affichage de la phrase sera donc en boucle
Pour éviter ce comportement plus qu'ennuyant, il faut utiliser la fonction qui était apparemment si inutile, j'ai nommé :
Key.isDown()
En effet, la fonction ne renvoie true si et seulement si la touche est actuellement enfoncée !
Ce qui nous donne :
Code : ActionScript
_root.onEnterFrame = function() {
if (Key.isDown(Key.SPACE)) {
trace("Barre d'espace appuyée");
}
};
Après avoir appris à récupérer les entrées claviers, vous devriez être capable de diriger une voiture. Mais comment lui
mettre quelques obstacles ?
C'est le prochain mini-tuto
Les collisions
Ce mini-tuto ne traitera que d'une seule méthode de la classe ActionScript, mais quelle méthode !
Il s'agit d'une
fonction qui permet de tester la collision entre des clips ou entre des coordonnées et un clip.
Elle possède peu d'options, mais puisque rien ne vaut la pratique pour la comprendre, vous allez avoir des exercices
jusqu'à plus soif
Approche des collisions
Désolé, mais on ne va pas rentrer directement dans le tas ! On va déjà faire travailler un peu les méninges.
On va travailler tout au long de ce chapitre avec une base toute simple : un clip carré de taille 20*20 px que vous
appellerez boite. Ce clip boite se déplace dans toutes les directions de 2 pixels à l'aide des flèches du clavier. Cadencez
l'animation à 24 images par secondes (on sentira moins les "saccades" dans le déplacement de boite). dimensionnez
ensuite l'animation à 400*400px.
Prenez l'habitude de toujours centrer les formes de vos clips. C'est à dire qu'à l'intérieur du boite, la
forme qui fait 20*20 px doit être placée aux coordonnées (-10;-10), comme çà, le centre du clip est au centre
de la forme. Vous verrez que cela à son importance ! (imaginez par exemple une rotation, qui différera
complètement selon là où est le centre du clip).
Pour le feignants, et ceux qui voudraient voir s'ils ne se sont pas trompés dans le code, voilà la source au
format Flash MX 2004
La première chose que nous allons faire, c'est délimiter la zone où peut se déplacer librement boite. On va dire tout
simplement que la boite n'a pas le droit de sortir de l'animation.
Qu'est-ce que cela signifie ? C'est la question que vous devez vous poser quand vous êtes face à ce genre de problème.
Cela signifie que à tout instant :
97 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
boite._y > 0 // Plus bas que le haut de l'animation
boite._y < 400 // Plus haut que le bas de l'animation
boite._x > 0 // Plus à droite que la gauche de l'animation
boite._x < 400 // Plus à gauche que la droite de l'animation
Alors, maintenant branchez les neurones, et pondez moi le code que je dois rajouter dans le bloc boite.onEnterFrame !
Bon, je présente une solution parmi d'autres, hésitez pas à me proposer les vôtres pour évaluation dans les
commentaires du tuto :
Secret (cliquez pour afficher)
Code : ActionScript
if (this._y<0) {
this._y = 0
}
if (this._y>400) {
this._y = 400;
}
if (this._x<0) {
this._x = 0;
}
if (this._x>400) {
this._x = 400;
}
Vous l'avez compris, si le clip dépasse une limite de quelque côté que ce soit, il est repoussé à la position limite !
Voilà pour la première partie de ce tutorial
Collision rectangulaire
Maintenant on a notre animation de base, avec boite qui ne peut plus sortir de l'écran !
On va placer un obstacle, rectangulaire, sur sa route.
Ce qu'on souhaite, c'est que boite ne puisse pas passer par dessus cet obstacle, qu'on va appeler
obstacle_rectangulaire.
Pour les gros faignants, voilà encore une fois la source de l'animation au stade actuel : format flash mx
2004
Alors, on pourrait faire de nouveau plusieurs conditions qui vérifieraient que boite ne dépasse pas les limites de
obstacle_rectangulaire. Pais vu que le programmeur est toujours un gros paresseux, on va plutôt utiliser la méthode qui
va le faire pour nous
Rajoutez ce code juste avant la fin du bloc boite.onEnterFrame :
Code : ActionScript
if (this.hitTest(_root.obstacle_rectangulaire)) {
trace('Collision !!!');
}
Ais-je besoin de vous expliquer ? Bon, en clair, la méthode hitTest() va vérifier si le clip this (c'est à dire boite vu qu'on
est dans son bloc de code) et _root.obstacle_rectangulaire se chevauchent. Le cas échéant, il va afficher une alerte
"Collision !!!" dans la fenêtre de Sortie.
98 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Vous pouvez essayer !
Mais comment faire pour empêcher le clip d'aller sur l'obstacle ?
Et bien il existe de multiples possibilités pour répondre à cette question, et encore une fois j'attends vos solutions
Voici la mienne, elle déplace le clip, teste la collision, et si il y a effectivement collision, elle revient en arrière.
Voilà le code complet :
Code : ActionScript
var vitesse:Number = 2;
boite.onEnterFrame = function() {
/* On enregistre les positions avant de bouger le clip, pour pouvoir le remettre à
sa place s'il y a collision */
posx = this._x;
posy = this._y;
/* Pour déplacer le clip */
if (Key.isDown(Key.UP)) {
this._y -= vitesse;
}
if (Key.isDown(Key.DOWN)) {
this._y += vitesse;
}
if (Key.isDown(Key.LEFT)) {
this._x -= vitesse;
}
if (Key.isDown(Key.RIGHT)) {
this._x += vitesse;
}
/* Vérifions que le clip ne sorte pas de l'animation ! */
if (this._y<0) {
this._y = 0
}
if (this._y>400) {
this._y = 400;
}
if (this._x<0) {
this._x = 0;
}
if (this._x>400) {
this._x = 400;
}
/* On teste s'il y a collision, si c'est bien le cas, on redonne au clip la
position enregistrée au début. C'est instantannée, l'utilisateur ne voit pas le déplacement
qui a eu lieu, avant l'affichage de l'image */
if (this.hitTest(_root.obstacle_rectangulaire)) {
this._x = posx;
this._y = posy;
}
}
Ingénieux, non ?
Collision circulaire
Maintenant créez un clip obstacle_circulaire, qui comme son nom l'indique sera un obstacle constitué d'un cercle de
diamètre 75 px. N'oubliez pas de bien mettre le centre du clip en phase avec le centre de la forme, sinon le script que
nous allons étudier ne fonctionnera pas !
Dans mon infini bonté, voilà la source !
99 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Pour l'instant on va utiliser le même script pour l'obstacle circulaire que pour l'obstacle rectangulaire, rajoutez donc
dans le bloc boite.onEnterFrame :
Code : ActionScript
if (this.hitTest(_root.obstacle_circulaire)) {
this._x = posx;
this._y = posy;
}
Et testez votre animation !
Ca marche, mais pas parfaitement, comment ça se fait que boite se bloque des fois sans avoir touché le
cercle ?
Et bien, vous venez de rencontrer l'énorme limitation de la méthode hitTest !
Cette méthode ne peut pas prendre en compte à la fois la forme circulaire du clip obstacle_circulaire et la forme de
boite !
Elle considère qu'il y a collision à partir du moment ou la plus petite zone rectangulaire de chaque clip se chevauche. En
fait, il faut vous imaginer, qu'autour du cercle il y a un rectangle invisible qui est responsable de ce comportement
embêtant de la méthode hittest. Ce rectangle s'appelle le cadre de délimitation.
Il va donc falloir feinter
Qu'est-ce qu'on sait sur un cercle ? On sait que tous les points du cercle sont équidistants du centre. La distance entre le
centre du disque et son bord vaudra toujours la valeur de son rayon, c'est à dire 75/2 = 37.5 px
On va donc calculer la distance entre le centre de notre clip boite qui est tellement petit qu'il peut être assimilé à un
cercle de rayon 10px et le centre de l'autre cercle.
Ressortez vos souvenirs de Maths, qu'est-ce qu'il a dit le bon sieur pythagore ?
Il a dit çà :
Nous ce qu'on cherche c'est D (la Distance), et ce qu'on a, c'est les coordonnés des centres de chaque cercle.
Donc la longueur X correspond à la différence entre les deux abscisses des centres et la longueur Y à la différence entre
les deux ordonnées des centres.
On a donc
X = this._x - _root.obstacle_circulaire._x;
Y = this._y - _root.obstacle_circulaire._y;
On met au carré et on additionne, ce qui nous donne en ActionScript :
Math.pow(this._x - _root.obstacle_circulaire._x,2) + Math.pow(this._y - _root.obstacle_circulaire._y,2)
Et on doit trouver la racine carrée de tout çà pour avoir D :
100 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
distance = Math.sqrt(Math.pow(this._x - _root.obstacle_circulaire._x,2) + Math.pow(this._y
- _root.obstacle_circulaire._y,2));
Il reste donc à vérifier que la distance est plus grande que le rayon des deux clips additionnés.
Le rayon de obstacle_circulaire est 37.5px
On ne peut pas vraiment dire que boite a un rayon puisque c'est un carré, mais puisqu'il est relativement petit, ca ne se
verra pas trop. On suppose donc son rayon = 10px
Ce qui nous fait une distance limite de 37.5+10 = 47.5 px !
On peut donc rajouter à la place du script, qui fonctionnait mal, cela :
Code : ActionScript
distance =
Math.sqrt(Math.pow(this._x-_root.obstacle_circulaire._x,2)+Math.pow(this._y-_root.obstacle_circulaire
if (distance<47.5) {
this._x = posx;
this._y = posy;
}
C'est pas parfait, mais c'est déjà pas mal
Et puis ce qui compte, c'est que vous ayez compris que souvent, les problèmes de collision peuvent se régler sans même
utiliser hitTest
Collision ponctuelle
Je vous ai dit que hitTest ne pouvait pas calculer de collision entre deux clips avec des formes complexes (c'est à dire
autres que rectangulaires). Mais je n'ai pas dit qu'il n'était pas possible de vérifier la collision entre un point et une
forme complexe
Supprimez le script qu'on a rajouté dans la partie précédente pour la collision avec l'obstacle circulaire.
Et copiez-collez le code suivant, qui présente une autre façon d'utiliser hitTest :
Code : ActionScript
if (_root.obstacle_circulaire.hitTest(this._x,this._y,true)) {
this._x = posx;
this._y = posy;
}
Ce code vérifie la collision entre les coordonnées de boite (ce qui explique les this._x et this._y) et la forme du clip
obstacle_circulaire. L'argument true permet de préciser qu'on souhaite bien que la collision se calcule à partir de la
forme complexe du clip, et non pas son cadre de délimitation rectangulaire.
Comme vous pouvez le vérifier le code fonctionne assez bien, mais les clips se chevauchent un peu, puisque dans la
collision on considère boite comme un point. Ce code n'est donc à utiliser que pour un clip "ponctuel" c'est à dire
suffisamment petit pour pouvoir être assimilé à un point, pour que l'utilisateur ne se rende pas compte qu'il chevauche
un peu la forme complexe.
Collision bourrine
Sous ce titre à priori fort peut explicite, se cache une astuce qui permet de réaliser des collisions entre un clip dont on
connaît la forme complexe à l'avance et un autre clip à la forme complexe. Oui, oui, vous avez bien entendu, on va
101 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
réaliser le calcul de collision entre deux formes complexes
En fait, l'astuce est toute simple, on va prendre des points importants de notre clip boite (ca sera les quatres coins en
toute logique), et on va effectuer un test de collision entre obstacle_circulaire et chacun des points !
Si je dis que
c'est bourrin, c'est parce que, pour 4 points ce n'est pas bien lourd, mais avec des formes vraiment complexes, vous
arriverez à des tests de plusieurs dizaines de points, ce qui risque de faire nettement flancher la fluidité de l'animation
Vous allez donc créer un clip point représenté par un petit cercle rouge de 2 ou 3 pixels. Vous ne placerez pas ce clip
sur la scène principale, mais dans le clip boite. Vous copierez-collerez ce clip 3 fois, pour en placer un à chaque coin.
Vous nommerez ces clips : point_1 point_2 point_3 et point_4.
Et pour la dernière fois, voilà la source de base, pour pouvoir travailler dans de bonnes conditions
On va donc changer le code précédent qui gérait la collision entre le centre de boite et la forme de obstacle_circulaire
On va seulement changer ce qu'il faut pour que la collision s'effectue entre point_1 et la forme de obstacle_circulaire.
Ce qui nous donne :
Code : ActionScript
if (_root.obstacle_circulaire.hitTest(this.point_1._x,this.point_1._y,true)) {
this._x = posx;
this._y = posy;
}
Testez l'animation.
Pourquoi ca ne marche pas ?
Et bien en fait, la question à se poser est : quelles sont les coordonnées de point_1 ?
Dans la mesure où le référentiel dans lequel on se trouve est boite, on aura donc les coordonnées de point_1 par
rapport à boite. Ce qui pose un problème, car dans ce cas, les coordonnées restent toujours les mêmes, soit (-12;-12),
car point_1 ne change pas de position par rapport à boite.
Il faut donc convertir ces coordonnées pour qu'elles correspondent aux coordonnés de point_1 dans _root.
Pour cela je vais vous présenter deux solutions
Un peu de géométrie
Voilà un schéma tout simple qui va vous aider à comprendre.
Si on est dans le référentiel boite, alors les coordonnées de point_1 sont :
this.point_1._x
this.point_1._y (avec this qui correspond à boite);
Mais si on veut ces mêmes coordonnées dans le référentiel _root, il faut ajouter les coordonnées de boite :
this.point_1._x + this._x
this.point_1._y + this._y (avec this qui correspond à boite);
102 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Bref, le code donnerait :
Code : ActionScript
vrai_x = this.point_1._x+this._x;
vrai_y = this.point_1._y+this._y;
if (_root.obstacle_circulaire.hitTest(vrai_x,vrai_y,true)) {
this._x = posx;
this._y = posy;
}
Et ca fonctionne très bien
Un peu d'ActionScript
Si vous ne voulez pas vous embêter à réfléchir en dessinant des petits schémas, Flash vous offre une fonction qui va
faire le travail pour vous : localToGlobal()
Cette méthode de la classe MovieClip permet de convertir des coordonnées locales d'un clip vers des coordonnées
globales avec _root comme référentiel, et çà quelque soit le clip de départ. L'avantage est donc que cette méthode
fonctionne dans tous les cas
Voilà comment l'utiliser :
Code : ActionScript
var un_point:Object = new Object(); // On créé un objet quelquonque
un_point.x = this.point_1._x; // On donne a cet objet des propriétés x et y
un_point.y = this.point_1._y;
Il faut tout d'abord créer un objet quelconque comme ci-dessus, et initialiser deux propriétés : x et y (et non pas _x et
_y).
Ensuite, la fonction localToGlobal() va travailler un peu :
Code : ActionScript
this.localToGlobal(un_point);
On précise avec this quel était le référentiel local de départ, ici il s'agit de boite, or vu qu'on est dans un bloc de code
lui appartenant, on utilise this.
Entre les parenthèses, on indique juste quel est l'objet portant les propriétés x et y qui doit être converti.
Et c'est tout
Si on adapte çà à notre cas, on arrive à :
Code : ActionScript
103 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
var un_point:Object = new Object();
un_point.x = this.point_1._x;
un_point.y = this.point_1._y;
this.localToGlobal(un_point);
if (_root.obstacle_circulaire.hitTest(un_point.x,un_point.y,true)) {
this._x = posx;
this._y = posy;
}
Comme vous pouvez le voir, c'est plus long. Mais le problème avec l'autre méthode, c'est que quand on cherche les
coordonnées globales d'un clip qui est lui même dans un clip, qui est lui même dans un clip .. ca devient difficile
Alors que là tout se fait automatiquement
Les 3 autres points
Bon, on va donc garder la seconde méthode. Mais maintenant vous savez tout ! Alors un peu à vous de travailler ! Il faut
adapter le code précédent pour que la vérification s'effectue sur les 4 points ! Il faudra bien entendu utiliser une boucle
et ce qu'on a vu ICI
Correction :
Secret (cliquez pour afficher)
Code : ActionScript
for (i=1; i<=4; i++) { // Boucle de 1 à 4 compris
// Conversion des coordonnées
var un_point:Object = new Object();
un_point.x = this['point_'+i]._x;
un_point.y = this['point_'+i]._y;
this.localToGlobal(un_point);
// Test de collision
if (_root.obstacle_circulaire.hitTest(un_point.x,un_point.y,true)) {
this._x = posx;
this._y = posy;
}
}
Et voilà, maintenant la méthode bourrin n'a plus de secrets pour vous
Vous voulez apprendre quelques bonnes astuces pour éviter que votre personnage s'enfonce dans les
murs lors des collisions ? C'est par ici : Régler les problèmes de collision
N'oubliez pas, que ce qu'il faut pour utiliser les collisions, c'est surtout de l'ingéniosité
Fil rouge - On The Road Again
Voilà le TP de fin de chapitre
Vous allez créer votre premier mini-jeu, et pas n'importe lequel : un jeu de voiture pour 2 joueurs (sur un seul clavier
)
Voilà le résultat final de notre futur jeu, que l'on nommera "On The Road Again" :
Jeu : On The Road Again
104 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Point de départ
J'espère que vous avec essayé OTRA (= On The Road Again), ca va vous donner une idée des clips qu'on va avoir besoin de
créer.
Ils sont au nombre de 5 :
Une voiture
Un compteur (de vitesse et de tour, tout intégré
Un feu tricolore
Une route
Des Goals (ou waypoints, ce sont les "tiges" blanches)
Une voiture
Oui, j'ai bien dit une voiture, et une seule. Il suffira de créer deux instances sur scène et de changer leur couleur pour
pouvoir différencier les deux voitures: a et b.
Voilà comment j'ai dessiné la voiture, c'est pas du grand art, mais on reconnaît 4 roues et un
cockpit
Arrangé vous pour centrer la voiture avec le centre du clip, comme çà on aura des
collisions assez précises puisque la voiture est un clip de petite taille.
Surtout il faut que vous dirigiez la voiture comme moi, c'est à dire de gauche à droite. Sinon
vous aurez des problèmes après ...
Créez donc deux occurrences de votre voiture sur la scène, changez un peu la couleur des deux voitures et donnez leur
comme nom voiture_a et voiture_b
Un compteur
Le compteur de vitesse est la pièce maîtresse de ce jeu puisqu'il affiche à la fois la vitesse de la voiture mais aussi le
nombre de tours effectués. On va donc distinguer les deux parties.
Le compteur de tours est un bête champ texte dynamique, on lui assigne la variable tour (attention j'ai bien dit la
variable, pas le nom d'occurrence).
Pour identifier la voiture à laquelle appartient le compteur, créez un champ de texte dynamique de variable voiture
Image utilisateur
Le compteur de vitesse est un peu plus complexe. Il faut dessiner un rectangle coloré (ou blanc si
le fond de votre scène est coloré) qui correspond à la taille maximum du compteur (la vitesse
maximum). Convertissez ce rectangle en un clip que vous nommerez vitesse (là je parle du nom d'occurrence, pas du
nom dans la bibliothèque
). Cette fois positionnez le bord droite du rectangle sur le centre du clip.
Vous allez donc ranger le clip vitesse et les deux champs de texte dynamique de variable tour et voiture dans un
nouveau clip que l'on nommera compteur_a. Créez une autre occurrence de ce clip que vous nommerez compteur_b
(pour l'autre voiture).
Voilà à quoi ressemble vos deux compteurs côte à côte :
Un feu tricolore
Le feu tricolore est un clip que vous nommerez feu_tricolore sur la scène principale. Dedans vous dessinez un rectangle
arrondi foncé. A côté créez un clip blanc circulaire que vous dupliquerez 2 fois pour faire les 3 feux, vous les nommerez
de haut en bas : couleur_1, couleur_2 et couleur_3.
105 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Une route
Ca peut paraître évident, mais sans route, le jeu va être drôlement moins intéressant ! Bref, le circuit c'est un simple
clip nommé route (vous avez j'en suis sûr remarqué l'extrême originalité dont je fais preuve quand je nomme un clip).
Dans ce clip vous dessinez votre route tout bêtement. Au début faites un circuit simple, sans "branches" parce que ca
posera des problèmes au niveaux des waypoints que l'on va voir tout de suite.
Des Goals
Pour l'instant vous ne savez pas encore vraiment comment ils vont fonctionner, mais si vous avez un peu
joué vous savez déjà que si vous vous sortez de la route vous êtes replacé sur le dernier Goal où vous êtes
passé. Les Goals permettent aussi de vérifier que vous avez bien fait tout le tour du circuit avant de
repasser par la ligne de départ.
La ligne de départ et d'arrivée sont d'ailleurs des goals comme les autres, c'est juste qu'on leur donne un
peu de couleur dans leur occurrence.
Vous pouvez le dessiner comme vous le souhaitez, la seule contrainte c'est qu'il doit être a peu près
rectangulaire, dirigée vers le haut avec son centre au niveau du centre du clip.
Ensuite vous allez en placer aux endroits stratégiques de vote route. Vous nommerez le premier (la ligne de
départ) goal0. Ensuite vous avez compris tous les suivants porteront les noms goal1, goal2 ...
Vous pouvez changer les propriétés de la ligne de départ et d'arrivée pour qu'on puisse les identifier plus facilement
106 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Et pour les feignants ?
J'allais oublier pour les plus paresseux d'entre vous, ou tout simplement pour comparer avec ce que vous avez. Je vous
invite quand même à le prendre pour continuer, comme ca vous êtes sur de tout avoir
Source : Point de départ de OTRA
Faire mumuse avec la voiture
On va commencer par s'atteler à la partie la plus fun : le déplacement des voitures
Pour avoir un code propre, on écrira tout le code que je vous donnerais dans ce TP sur la scène principale !
Structure fonctionnelle
On va créer deux tableaux contenant chacun les 3 touches nécessaire au déplacement des voitures. Le premier tableau
contiendra les valeurs des touches pour déplacer la voiture A et le second les valeurs pour la voiture B.
Code : ActionScript
var touches_a:Array = new Array(Key.LEFT, Key.RIGHT, Key.UP);
var touches_b:Array = new Array(81, 68, 90);
Ensuite puisqu'on a deux voiture, on va créer une seule et unique fonction de déplacement qu'on associera aux deux
voitures :
Code : ActionScript
this.controle_voiture = function() {
//Le code pour le déplacement
}
// On associe la fonction aux événement onEnterFrame des deux voitures
this.voiture_a.onEnterFrame = this.controle_voiture;
this.voiture_b.onEnterFrame = this.controle_voiture;
Le problème c'est que je ne veux pas associer les événements à la fonction dès le départ, sinon le jeu commencerait
tout de suite !
On va donc créer une fonction qui activera les voitures ! Et pour l'instant on appelera cette fonction une fois pour
chaque voiture dès le départ pour pouvoir tester nos voitures !
107 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
this.controle_voiture = function() {
//Le code pour le déplacement
}
this.activer_voiture = function(nom) {
this['voiture_'+nom].onEnterFrame = this.controle_voiture;
this['voiture_'+nom].nom = nom; // On donne son nom à la voiture ...
}
this.activer_voiture('a');
this.activer_voiture('b');
Déplacements
On va d'abord s'interroger sur la façon donc va fonctionner la voiture. Elle devra avoir deux variables : rotation et
vitesse.
Rotation
Pour la rotation c'est facile, on va utiliser la propriété _rotation du clip, ca nous fera gagner du temps
On va effectuer une condition assez complexe. On veut vérifier que la touche gauche est pressée. On utilise donc
Key.isDown(latouche)
Mais la valeur de cette touche est contenue dans un tableau sur la scène principale
Key.isDown(this._parent.letableau[latouche])
Le tableau se nomme touches_a ou touches_b selon la voiture, et ca tombe bien puisque que dans la fonction
activer_voiture on a transmis à la voiture son nom dans la variable nom.
Key.isDown(this._parent['touches_'+this.nom][latouche])
Et la touche correspondante à gauche c'est la première valeur du tableau, ce qui nous donne :
Key.isDown(this._parent['touches_'+this.nom][0])
Vous refaites ce raisonnement pour l'autre touche et ca nous donne ce code :
Code : ActionScript
this.controle_voiture = function() {
if (Key.isDown(this._parent['touches_'+this.nom][0])) {
this._rotation += -5;
}
if (Key.isDown(this._parent['touches_'+this.nom][1])) {
this._rotation += 5;
}
}
A ce stade vous pouvez déjà tester votre code en déplaçant les voitures sur la scène avant de compiler. Vous verrez
quelles tournent selon la touche appuyée.
En avant
On sait tourner, mais il faudrait maintenant avancer !
Si vous connaissez un peu la mécanique newtonienne, et si vous ne la connaissez pas vous pouvez l'imaginer, quand vous
appuyez sur l'accélérateur de la voiture vous agissez sur son accélération. La vitesse c'est la dérivée de l'accélération
par rapport au temps, en clair à chaque fois que vous appuyez sur l'accélérateur vous incrémentez la vitesse de la
voiture. Et la position de la voiture, c'est la dérivée de la vitesse par rapport au temps, en clair la position est égale à la
position d'avant plus la vitesse.
Si vous n'avez pas compris c'est pas bien grave, puisque je ne vais pas utiliser de formule de Physique, mais simplement
des équations que tout le monde peut deviner par lui même.
La première chose à faire c'est de créer une variable vitesse pour chaque voiture. Ca va être facile puisqu'on à une
fonction activer_voiture :
Code : ActionScript
108 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
this.activer_voiture = function(nom) {
this['voiture_'+nom].onEnterFrame = this.controle_voiture;
this['voiture_'+nom].nom = nom;
this['voiture_'+nom].vitesse = 0; //La vitesse est nulle au départ
};
Ensuite, il faut faire en sorte d'augmenter la vitesse à chaque fois qu'on appuie sur la touche avant :
Code : ActionScript
this.controle_voiture = function() {
if (Key.isDown(this._parent['touches_'+this.nom][0])) {
this._rotation += -5;
}
if (Key.isDown(this._parent['touches_'+this.nom][1])) {
this._rotation += 5;
}
if (Key.isDown(this._parent['touches_'+this.nom][2])) {
this.vitesse += 0.5;
}
};
Il faut rajouter maintenant une condition pour limiter la vitesse, moi j'ai décidé de fixer une limite à 10pixels/images.
Il faut aussi prendre en compte les frottements, pour tricher avec la physique, on va dire que quand on accélère pas, la
)
voiture perd de la vitesse jusqu'à atteindre la vitesse nulle (sinon elle repart en arrière
Code : ActionScript
if (Key.isDown(this._parent['touches_'+this.nom][2])) {
if (this.vitesse<10) {
this.vitesse += 0.5;
}
} else {
if (this.vitesse>0) {
this.vitesse -= 0.5;
}
}
Le problème c'est que la voiture n'avance pas pour autant
Il va falloir faire un lien entre la vitesse de la voiture et sa vitesse sur l'axe des abscisses et des ordonnées en fonction
de la rotation.
On va donc utiliser les fonctions trigonométriques que sont sinus et cosinus. Pour ceux qui ont lu l'annexe sur la rotation
d'un clip en fonction de la souris vous connaissez déjà la technique !
Sauf que là on fait exactement l'inverse
En fait on va projeter la vitesse sur les deux axes pour
savoir comment faire avancer la voiture.
On cherche le projeté vitesse_x sur l'axe des abscisses et le
projeté vitesse_y sur l'axe des ordonnées. Normalement
depuis le collège vous devriez savoir faire çà.
Sur le schéma à droite j'ai récapitulé les "formules" de base
de trigonométrie dans le triangle rectangle.
Le petit point noir représente la voiture, le trait rouge la
vitesse, et les traits bleus et vert les projetés de cette
vitesse sur les axes. Ce qu'on veut c'est ajouter à la
position de la voiture la valeur de ces projetés.
Flash nous offre les fonctions Math.sin() et Math.cos() qui
fonctionnent en radian. Le problème c'est que _rotation
s'exprime en degré. Pour convertir un degré en radian, il faut le multiplier par PI (Math.PI) et le diviser par 180.
109 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Je vais arrêter le suspens ici et vous laissez contempler le code qui va vous permettre d'avancer :
Code : ActionScript
this.controle_voiture = function() {
if (Key.isDown(this._parent['touches_'+this.nom][0])) {
this._rotation += -5;
}
if (Key.isDown(this._parent['touches_'+this.nom][1])) {
this._rotation += 5;
}
if (Key.isDown(this._parent['touches_'+this.nom][2])) {
if (this.vitesse<10) {
this.vitesse += 0.5;
}
} else {
if (this.vitesse>0) {
this.vitesse -= 0.5;
}
}
this._y += Math.sin(this._rotation*(Math.PI/180))*this.vitesse;
this._x += Math.cos(this._rotation*(Math.PI/180))*this.vitesse;
};
Vous pouvez tester, c'est déjà entièrement fonctionnel. Mais ce que je n'aime pas c'est la tenue de route de la voiture.
J'aimerais qu'elle puisse déraper à fond. Pour donner une conduite un peu plus "fun" à notre voiture, on va faire en sorte
qu'elle ne tourne QUE quand on accélère
En clair, on récupère l'angle de la voiture quand elle accélère et on l'utilise pour calculer les projetés. Quand la voiture
n'accélère pas, on conserve l'angle précédent. Ca nous donne donc :
Code : ActionScript
this.controle_voiture = function() {
if (Key.isDown(this._parent['touches_'+this.nom][0])) {
this._rotation += -5;
}
if (Key.isDown(this._parent['touches_'+this.nom][1])) {
this._rotation += 5;
}
if (Key.isDown(this._parent['touches_'+this.nom][2])) {
if (this.vitesse<10) {
this.vitesse += 0.5;
}
this.direc = this._rotation;
} else {
if (this.vitesse>0) {
this.vitesse -= 0.5;
}
}
this._y += Math.sin(this.direc*(Math.PI/180))*this.vitesse;
this._x += Math.cos(this.direc*(Math.PI/180))*this.vitesse;
};
Libre à vous de conserver le code précédent mais je trouve celui là beaucoup plus intéressant à jouer.
Pour ceux qui voudraient comparer leur source avec la mienne à ce stade :
Source : Faire mumuse avec la voiture
Les goals
Maintenant commence la partie sur les collisions. Ce qu'on veut c'est que la voiture reste sur la route, en clair elle peut
110 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
avancer tant qu'il y a collision entre le clip voiture_a (et voiture_b aussi bien sûr) et le clip route.
Sinon qu'est-ce qui se passe ? On remet la voiture au Goal précédent.
On va devoir tester les collisions entre goals et voiture. Il faudra effectuer un test entre la voiture et le goal suivant. Ca
va être faicle puisque les goals portent les noms goal0 goal1 goal2 ...
Dans activer_voiture vous allez rajouter cette ligne :
Code : ActionScript
this['voiture_'+nom].dernier_goal = -1;
En clair on créé une variable dernier_goal pour chaque voiture. pour l'instant cette variable vaut -1.
On va donc effectuer à chaque image un test de collision entre la voiture et le clip goal suivit du nombre
dernier_goal+1.
Le petit problême qui se pose c'est que les clips goals ne sont pas dnas le même clip que voiture ...
Prenons l'exemple de voiture_a :
voiture_a appartient à _root.
Donc pour accéder à _root depuis voiture_a, on écrit this._parent (on pourrait écrire _root tout simplement, mais je
préfère qu'on s'amuse un peu avec les chemins relatifs).
goalX (avec X représentant le numéro du goal) appartient à route qui appartient à _root
Pour accéder à un goal depuis voiture_a, il faudra donc écrire :
this._parent.route["goal"+X]
Et X représente le numéro du dernier goal franchi plus 1 !
On a donc this._parent.route["goal"+(this.dernier_goal+1)]
Quand on passe par un goal, on va enregistrer la position de la voiture ainsi que sa rotation pour pouvoir la replacer à
l'endroit exact où elle est passée quand elle touchera un mur.
Code : ActionScript
if (this._parent.route["goal"+(this.dernier_goal+1)].hitTest(this._x, this._y, true)) {
this.dernier_goal++;
this.dernier_x = this._x;
this.dernier_y = this._y;
this.dernier_rotation = this._rotation;
}
Vous pouvez testez en incluant un
trace('je passe la porte'+this.dernier_goal);
dans le code précédent, tout fonctionne !
Mais un problême se pose !
Au bout d'un moment on repassera par la porte numéro 0 ! Il va donc falloir ruser
Je
suppose que vous êtes d'accord pour dire que la solution la plus simple est de remettre dernier_goal à -1 quand on passe
la dernière porte. mais comment connaitre le numéro de la dernière porte puisque quand on construit le circuit on en
met autant qu'on veut
Alors on pourrait tout simplement créer une variable nombre_goal où on indiquerait le nombre de portes qu'on a mit.
Mais cette solution ne me satisfait pas, je veux que ce soit fait dynamiquement et que je puisse changer le circuit quand
je veux sans toucher à l'ActionScript.
Bon, je vous donne une solution, qui vaut ce qu'elle vaut (forcément
).
Au tout début début de votre code, on va chercher ce que vaut la variable nombre_goal. Pour celà on va faire une
boucle qui incrémentera la variable nombre_goal tant qu'elle trouvera un goal.
Code : ActionScript
111 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
var nombre_goal = 0;
while (this.route['goal'+nombre_goal] != undefined) {
nombre_goal++;
}
Comme vous pouvez le deviner au bout d'un moment this.route['goal'+nombre_goal] ne fera plus référence à un clip et
deviendra donc vide, c'est à dire undefined
La variable nombre_goal contiendra donc le nombre de portes
Bien entendu vous faites ce calcul qu'une seule et unique fois au début de l'animation, n'allez pas mettre cette boucle
dans le onEnterFrame des voitures
Bon maintenant qu'on sait combien on a de goal, on va rajouter une condition dans controle_voiture
Après le test de collision rajouter ce bloc :
Code : ActionScript
if (this.dernier_goal == (this._parent.nombre_goal-1)) {
this.dernier_goal = -1;
this.tour++;
}
Pas besoin de vous l'expliquer, apr contre vous pouvez vous poser des questions quant à la variable tour. Je viens de
l'introduire, elle va permettre de comtper le nombre de tour de circuit effectuer par la voiture. Mais pour l'instant elle
ne fonctionnera pas, parce qu'on ne l'a pas déclarée à 0 au départ.
Rajouter donc cette ligne dans activer_voiture :
Code : ActionScript
this['voiture_'+nom].tour = 0;
Collisions inside
On a déjà écrit 60% du code, et pourtant il manque quelque chose de primordial : les collisions pour ne pas pouvoir sortir
du circuit !
Vous allez voir c'est très facile ! Toujours dans la fonction controle_voiture, il va falloir tester si la voiture est bien en
collision avec le clip route, et si elle ne l'est pas (c'est à dire si elle est sortie de la route), il va falloir la ramener au
point qu'on avait sauvegardé dans les variables dernier_x, dernier_x et dernier_rotation.
Je pense que vous devriez essayer un peu tout seul, parc que c'est vraiment facile
minutes, la solution est ci-dessous :
Si vous n'avez pas trouvé dans 10
Secret (cliquez pour afficher)
Code : ActionScript
if (!this._parent.route.hitTest(this._x, this._y, true)) {
this._x = this.dernier_x;
this._y = this.dernier_y;
this._rotation = this.dernier_rotation;
this.vitesse = 0;
}
Bah voilà, c'est fini
Vous pouvez remarquer qu'on remet la vitesse à 0 pour éviter que la voiture se prenne un mur en boucle
Source : Collisions inside
112 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Fignolages
Et oui, on a le coeur du système il va falloir fignoler !
Prêt ? Partez !
On va déjà activer notre feu tricolore !
Supprimez les deux lignes suivantes de votre code :
Code : ActionScript
this.activer_voiture('a');
this.activer_voiture('b');
Rajoutez çà à la place :
Code : ActionScript
this.feu_tricolore.onRelease = function() {
this._parent.compteur_temps = 0;
this.onEnterFrame = this._parent.activation_feu;
};
Quand on cliquera sur le feu tricolore, on va initialiser la variable compteur_temps sur _root à 0 et associer
_root.onEnterFrame à une fonction qu'on va écrire maintenant.
Dans cette fonction on va incrémentez de façon constante la variable compteur_temps, et à chaque fois qu'elle
dépassera un certain seuil on allumera une loupiotte du feu tricolore
Code : ActionScript
this.activation_feu = function() {
this._parent.compteur_temps++;
if (this._parent.compteur_temps == 10) {
// Première lampe
} else if (this._parent.compteur_temps == 30) {
// Seconde lampe
} else if (this._parent.compteur_temps == 50) {
// Troisième lampe + départ
} else if (this._parent.compteur_temps>=50) {
// c'est fini, on fait disparaitre le feu et on arrête le onEnterFrame
this._alpha--;
if (this._alpha<=0) {
this.onEnterFrame = null;
}
}
};
Maintenant on va changer la couleur des lampes, allez vite potasser le cours précédents pour retrouver les fonctions qui
permettent de colorer un clip
Je vous rappelle qu'il va falloir importer des librairies tout au début du code :
Code : ActionScript
import flash.geom.ColorTransform;
import flash.geom.Transform;
Il va falloir créer des transformations de couleurs
Code : ActionScript
113 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
/* -> Couleur rouge */
var couleur_rouge:ColorTransform = new ColorTransform();
couleur_rouge.rgb = 0xFF0000;
/* -> Couleur verte */
var couleur_vert:ColorTransform = new ColorTransform();
couleur_vert.rgb = 0x00FF00;
Il faut aussi créer des transformations pour les clips du feu tricolore :
Code : ActionScript
var vers_rouge_1:Transform = new Transform(feu_tricolore.couleur_1);
var vers_rouge_2:Transform = new Transform(feu_tricolore.couleur_2);
var vers_vert:Transform = new Transform(feu_tricolore.couleur_3);
Et ensuite il ne reste plus qu'à associer les deux et à lancer la partie. Donc pour reprendre le code dans sa totalité, on a
:
Code : ActionScript
import flash.geom.ColorTransform;
import flash.geom.Transform;
// -TOUT LE RESTE DU CODE DEJA MIS
/* Démarrage du jeu - feu tricolore */
/* -> Couleur rouge */
var couleur_rouge:ColorTransform = new ColorTransform();
couleur_rouge.rgb = 0xFF0000;
/* -> Couleur verte */
var couleur_vert:ColorTransform = new ColorTransform();
couleur_vert.rgb = 0x00FF00;
/* -> Assignation des transformations aux clips */
var vers_rouge_1:Transform = new Transform(feu_tricolore.couleur_1);
var vers_rouge_2:Transform = new Transform(feu_tricolore.couleur_2);
var vers_vert:Transform = new Transform(feu_tricolore.couleur_3);
this.activation_feu = function() {
this._parent.compteur_temps++;
if (this._parent.compteur_temps == 10) {
vers_rouge_1.colorTransform = couleur_rouge;
} else if (this._parent.compteur_temps == 30) {
vers_rouge_2.colorTransform = couleur_rouge;
} else if (this._parent.compteur_temps == 50) {
vers_vert.colorTransform = couleur_vert;
this._parent.activer_voiture('a');
this._parent.activer_voiture('b');
} else if (this._parent.compteur_temps>=50) {
this._alpha--;
if (this._alpha<=0) {
this.onEnterFrame = null;
}
}
};
/* -> Lancement du jeu si clique de la souris */
this.feu_tricolore.onRelease = function() {
this._parent.compteur_temps = 0;
this.onEnterFrame = this._parent.activation_feu;
};
Activation des voitures et du compteur
Comme vous pouvez le constater, au départ les voitures ne sont pas placées sur le ligne de départ. Nous allons y
remédier en créant une fonction qui place tout bien au départ :
Code : ActionScript
114 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
this.creer_voiture = function(nom) {
var voiture = this['voiture_'+nom];
voiture.nom = nom;
voiture._x = this.route.goal0._x;
voiture._y = this.route.goal0._y;
voiture._rotation = this.route.goal0._rotation;
voiture.vitesse = 0;
voiture.dernier_goal = -1;
voiture.tour = 0;
};
this.creer_voiture('a');
this.creer_voiture('b');
Comme vous pouvez le constater cette fonction ressemble beaucoup à activer_voiture, mais elle est appelée dès le
départ !
Rajoutez dans cette fonction ces quelques lignes :
Code : ActionScript
var compteur = this['compteur_'+nom];
compteur.nom = nom;
compteur.voiture = 'Voiture '+nom;
compteur.tour = '0 / '+this.nombre_tour;
compteur.vitesse._xscale = 0;
Cela permet d'initialiser les compteurs.
On va d'ailleurs s'en occuper des compteurs !
On va créer une fonction qui va leur permettre d'aller chercher les infos qui les intéressent dans le clip voiture, ce qui va
être facile puisqu'on a introduit dans chaque compteur un nom qui correspond au nom de la voiture (a ou b).
Code : ActionScript
this.controle_compteur = function() {
this.tour = this._parent['voiture_'+this.nom].tour+' / '+this._parent.nombre_tour;
this.vitesse._xscale = 10*this._parent['voiture_'+this.nom].vitesse;
};
Et il faut bien sûr associer cette fonction au onEnterFrame de chaque compteur dans la fonction activer_voiture.
Rajoutez donc dedans :
Code : ActionScript
this['compteur_'+nom].onEnterFrame = this.controle_compteur;
Voilà maintenant tout est parfaitement fonctionnelle ! On a juste oublié un tout petit détail
La fin du jeu !
C'est tout bête, il suffit de créer un champ de texte dynamique sur la scène principale portant la variable gagnant.
Ensuite allez chercher cette ligne de code :
Code : ActionScript
if (this.dernier_goal == (this._parent.nombre_goal-1)) {
this.dernier_goal = -1;
this.tour++;
}
Et faites fonctionner vos méninges pour savoir ce qu'il faut y rajouter
Solution :
115 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Secret (cliquez pour afficher)
Code : ActionScript
if (this.dernier_goal == (this._parent.nombre_goal-1)) {
this.dernier_goal = -1;
this.tour++;
if ((this.tour == this._parent.nombre_tour) && (_root.gagnant == null)) {
_root.gagnant = 'Le gagnant est voiture '+this.nom;
}
}
Des améliorations
On va apporter une petite amélioration, et ensuite vous pourrez proposer les vôtres dans les commentaires
Personnellement j'adore les effets de transparence et je trouve que ca ne se voit pas assez quand on passe par une
porte.
On va donc créer une fonction qui baisse la transparence au cours du temps jusqu'à 50% :
Code : ActionScript
this.controle_goal = function() {
if (this._alpha>50) {
this._alpha--;
}
};
Et on va l'associer avec le onEnterFrame de chaque goal dans la boucle qu'on utilisait pour déterminer le nombre de
porte, qui devient donc :
Code : ActionScript
while (this.route['goal'+nombre_goal] != undefined) {
this.route['goal'+nombre_goal].onEnterFrame = this.controle_goal;
nombre_goal++;
}
Faites attention à placer la fonction controle_goal AVANT la boucle, sinon l'association ne pourra pas se faire puisque la
fonction n'existe pas encore pour Flash.
Maintenant c'est à vous de faire fonctionner vos méninges et d'apporter vos propres améliorations pour faire un petit jeu
conviviales. Je peux vous donner quelques pistes :
- permettre de faire plusieurs chemins possibles (problème des goals, il faut actuellement passer par tous, alors on ne
peut pas en mettre dans les branches ...)
- Rajouter des armes
(un super pouvoir pour chaque voiture activable une seule fois par exemple, qui créé un
tremblement de terre ou stop la voiture ennemie ...) Si ce que vous avez fait ne fonctionne pas ou mal, ou que vous
n'avez pas compris certains passages de mon tutorial, voilà la source du jeu fini et (plus ou moins) commenté :
Source : On The Road Again
Bon après un gros tuto comme çà, je vais aller prendre quelques semaines de sommeil moi
j'en profite pour précisez que si vous avez des idées pour le fil rouge du 6eme chapitre (c'est pas demain la veille),
A la fin de ce chapitre vous avez toutes les connaissances requises pour
donnez les maintenant que je m'y prépare
faire ce que vous voulez avec Flash. Cependant Flash seul ne suffit plus, il va falloir le coupler avec une technologie
côté serveur
116 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Partie 4 : Communication client-serveur
Voilà un chapitre qui fera appel à toutes vos connaissances !
Si vous ne connaissez pas le PHP, allez lire ce tuto sur le sujet et revenez plus tard
Si vous êtes débutant en PHP, ne vous inquiétez pas on ira doucement ... pour l'instant !
-
Prérequis :
Maîtriser l'IDE de Flash (créer des clips, savoir où placer le code)
Maîtriser les bases et les fonctions avancées de l'ActionScript
Connaître le fonctionnement d'un site Web (Requêtes HTTP, HTML ...)
Connaître les bases du PHP
But :
- Comprendre le système de sécurité du lecteur Flash
- Charger des variables
- Charger du contenu multimédia (photos, vidéos, animations Flash)
=> Radio-Blog !
Sécurité et Flash
Nous allons étudier dans la suite de ce chapitre de nombreuses méthodes qui permettent de charger du contenue
dynamique ou non.
Mais depuis sa version 7, le flashplayer intègre un nouveau dispositif de sécurité qui empêche le chargement de données
à partir d'un domaine distant.
Cette protection n'est pas active quand vous testez vos animations avec l'IDE de Flash
crossdomain.xml
Imaginons que vous ayez une animation Flash sur votre site. Si vous lui demandé de charger des données textes ou
binaires (images ou animations Flash) dans le même domaine, il n'y a pas de problème. Par même domaine, j'entends
que vous utilisez un chemin d'accès relatif pour accéder aux données comme "monfichiertexte.txt" si le fichier est dans
le même dossier que l'animation.
Maintenant, si vous utilisez un chemin d'accès complet pour accéder aux données, Flash ne se posera pas la question de
savoir si le domaine est le même que celui de l'animation ou pas : il refusera l'accès aux données !
Sauf si vous placez à la racine du domaine un fichier bien spécial, un fichier texte au format XML pour être précis, il
s'agit du fichier : crossdomain.xml
Structure de crossdomain.xml
Maintenant placez vous du côté du webmaster qui veut ou ne veut pas de faire charger des données à partir d'une
animation hébergée sur un autre site.
Il va devoir placer un fichier crossdomain.xml à la racine de son site Web pour préciser les autorisations. Ce fichier sera
chargé automatiquement par une animation Flash qui tenterait d'accéder aux données sur le domaine.
117 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Voici un schéma résumant la situation
Bref, ne sachant pas si vous utiliserez des chemins d'accès absolus ou pas, on va prévenir tout risque et installer notre
petit fichier XML à la racine de notre site.
Voilà comment se présente un crossdomain.xml classique :
Code : XML
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="domaine_a_autoriser" />
</cross-domain-policy>
Il vous suffit de remplacer domaine_a_autoriser par le domaine que vous souhaitez autoriser.
Par exemple, si le Site du Zéro voulait autoriser l'accès à son site aux animations Flash, il faudrait que le Webmaster
place à la racine du site (http://www.siteduzero.com/crossdomain.xml) un fichier xml qui autorise l'accès provenant de
tous les domaines, on utilise donc l'étoile * comme "joker" :
Code : XML
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
On pourrait aussi accepter que les données ne soient chargées que de sites possédant un nom de domaine français en .fr
et allemand .de :
Code : XML
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*.fr" />
<allow-access-from domain="*.de" />
</cross-domain-policy>
Je pense que vous avez bien compris
Nouveautés de FlashPlayer 8
Le Flashplayer 8 offre une nouveauté intéressante, il nous permet de spécifier le chemin d'accès à un fichier
crossdomain.xml
C'est une option qui n'est pas très utile, car tout le monde ne possédant pas le dernier FlashPlayer il est préférable de
conserver le fichier crossdomain.xml à la racine des sites Web.
Voilà comment s'y prendre, le fichier crossdomain.xml doit toujours être placé dans le site, mais il n'est plus
118 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
indispensable qu'il se trouve à la racine. Il faudra par contre préciser dans l'animation Flash où il se trouve.
Code : ActionScript
System.security.loadPolicyFile("http://www.tondomaine.com/crossdomain.xml");
Cette ligne de code est en fait superflue, puisque FLash irait de toute façon chercher le crossdomain.xml à la racine du
site !
Mais vous pourriez tout aussi bien vous adapter à un fichier de police placé de façon non standard :
Code : ActionScript
System.security.loadPolicyFile("http://www.tondomaine.com/undossier/unfichier.xml");
Contourner la protection
Nous allons maintenant voir une petite astuce toute bête permettant de "contourner" cette protection. J'écris
"contourner" entre guillemet, car cette protection n'est pas là pour embêter le créateur d'une animation ou l'utilisateur
lambda, elle permet seulement aux Webmaster qui le souhaitent de protéger leur site Web d'un téléchargement abusif
s'effectuant à partir des clients exécutant l'animation.
Alors qu'avec notre astuce, l'animation téléchargera les données en passant par un script sur votre serveur. Ca ne sera
donc pas à votre avantage de faire télécharger des données d'un site web de façon abusive, puisque ca encombrera le
votre !
Vous allez déjà placer un crossdomain.xml à la racine de votre site pour éviter les ennuis.
Ensuite vous allez créer un fichier chargement.php :
Code : PHP
<?PHP
readfile($_GET['lien']);
?>
Ainsi, si vous devez charger un fichier dans votre animation et que ce fichier est placé sur un autre site Web sans
crossdomain.xml, vous pourrez passer par votre fichier chargement.php.
Si par exemple vous voulez charger dans votre animation la liste des news du SDZ à cette adresse
http://www.siteduzero.com/Templates/xml/news_fr.xml, mais puisque www.siteduzero.com ne possède pas de
crossdomain.xml, vous aller charger cette page :
chargement.php?lien=http://www.siteduzero.com/Templates/xml/news_fr.xml
En fait, il est même préférable "d'encoder" le lien avec la fonction escape() de Flash que nous avons déjà vu dans un
chapitre précédent.
une fois encodée au format URL, votre animation chargerait en fait :
chargement.php?lien=http%3A%2F%2Fwww%2Esiteduzero%2Ecom%2FTemplates%2Fxml%2Fnews%5Ffr%2Exml
Mais il faudrait alors décoder le lien dans le script PHP :
Code : PHP
<?PHP
$lien = urldecode($_GET['lien']);
readfile($lien);
?>
Bon pour l'instant vous ne savez pas encore comment charger ce fichier dans FLash, mais vous connaissez au moins la
Vous l'aurez compris, pour être tranquille, il est indispensable de créer un fichier crossdomain.xml à la
théorie
racine des sites d'où vous désirez charger du contenu.
119 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
L'utilité de System.security.loadPolicyFile() peut vous paraître superflue, mais nous verrons peut-être beaucoup plus
loin dans ce tutorial, que cette méthode à son importance quand on possède un serveur xmlsocket.
Vous devez aussi garder en tête, que cette protection permet surtout de protéger le Webmaster d'un site qui ne souhaite
pas se faire "voler" des centaines de mégaoctets Néanmoins, il est très facile de contourner cette protection en utilisant
un script PHP, mais dans ce cas, les données circuleront par le site Web hébergeant l'animation.
Voici un exemple de crossdomain.xml
Images et Animations
Nous allons tout d'abord appendre à charger dans notre animation d'autres animations et/ou des images aux formats
JPG, PNG et GIF (support des PNG et GIF à partir de Flash player 8) de façon dynamique.
Flash intègre depuis ses dernières versions une classe sensée faciliter le chargement de fichiers images ou SWF externes
(la classe MovieClipLoader), mais puisqu'on est des pros on va s'en passer.
Durant tout ce tuto, nous nous efforcerons de charger cette image :
Vous pouvez donc dès maintenant rajoutez cette variable en haut de votre code :
Code : ActionScript
lien = 'http://www.endirectdemoi.com/e2dm/gallerie/src_444d18cc7ef6b.jpg';
L'image est lourde, si elle pèse plus de 800ko c'est pour pouvoir observer son chargement avec un preloader.
Dans un clip ou un niveau
Il existe deux fonctions pour charger une image (ou un SWF) dans votre animation :
loadMovieNum(lien,niveau)
MovieClip.loadMovie(lien)
loadMovieNum(lien,niveau)
120 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Nous allons vite passer sur la première fonction, car nous ne l'utiliserons pas. Elle permet de charger le contenu dans un
niveau de l'animation. Attention ne confondez pas niveau et profondeur ! Les profondeurs c'est pour les clips, les
niveaux c'est uniquement des "calques" dans lesquels vous pouvez placer des animations complètes. D'ailleurs même sans
charger une animation externe avec loadMovieNum(), il existe déjà un niveau dans votre animation : le niveau 0. Vous
pouvez y accéder grâce à _level0
_root est en fait une référence au level dans lequel vous tapez votre code. La plupart du temps _root et _level0 sont
donc confondus !
Vous pouvez d'ailleurs le vérifier aisément avec la fonction trace() :
Code : ActionScript
trace(_root); // Affiche _level0 dans la fenêtre Sortie
Donc pour vous faire plaisir, je vous montre comment charger notre astronaute avec cette fonction, mais nous ne
l'utiliserons plus après !
Code : ActionScript
lien = 'http://www.endirectdemoi.com/e2dm/gallerie/src_444d18cc7ef6b.jpg';
loadMovieNum(lien,1);
On peut croire que rien ne se passe une fois l'animation lancée, en fait il faut patienter quelques
dizaines de secondes (voir minutes pour les oubliés de l'ADSL) pour charger les 800 ko de l'image.
MovieClip.loadMovie(lien)
Vous remarquez déjà que contrairement à l'autre fonction, celle là appartient à une
Cette méthode me plait mieux
classe, et pas n'importe laquelle : MovieClip !
On va donc charger notre image dans un clip, et pour être plus précis on va même remplacer ce clip par l'image, il ne
faudra donc rien laisser d'important dans ce clip, car tout sera supprimé par l'image !
Un petit code qui nous permet de charger l'image dans un clip vide créé dynamiquement :
Code : ActionScript
lien = 'http://www.endirectdemoi.com/e2dm/gallerie/src_444d18cc7ef6b.jpg';
this.createEmptyMovieClip('image',1) // Créé un clip vide;
this.image.loadMovie(lien); // Remplace le clip par l'image
Encore une fois soyez patient ! Il faut le temps de charger l'image !
Un chargeur
Moi je veux bien attendre une minute que l'image se charge, mais comment afficher l'état d'avancement
?
Pour cela on va créer un chargeur (ou preloader en anglais dans le texte).
Je vais vous montrer deux méthodes de la classe MovieClip.
getBytesLoaded et getBytesTotal
Ce sont sûrement les méthodes les plus simples à utiliser !
121 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
monclip.getBytesTotal() renvoie la taille en octet d'un clip
monclip.getBytesLoaded() renvoie en octet ce qui a été chargé pour l'instant du clip
Donc si on veut connaître le pourcentage de chargement d'un clip, on fait :
Code : ActionScript
pourcentage = (unclip.getBytesLoaded() / unclip.getBytesTotal() ) * 100;
Chargeur texte
Voilà un code qui permet d'afficher la progression du chargement, la zone de texte se créer en haut à gauche de
l'animation dynamiquement :
Code : ActionScript
lien = 'http://www.endirectdemoi.com/e2dm/gallerie/src_444d18cc7ef6b.jpg';
// On créé deux clips, un pour recevoir l'image, l'autre pour le preloader
this.createEmptyMovieClip('image', 1);
this.createEmptyMovieClip('chargeur', 2);
// On crée un champ de texte dans chargeur et on charge l'astronaute dans image
this.chargeur.createTextField('pourcentage', 1, 0, 0, 100, 20);
this.image.loadMovie(lien);
// On regarde à chaque image où en est le chargement
this.chargeur.onEnterFrame = function() {
this.pourcentage.text =
(this._parent.image.getBytesLoaded()/this._parent.image.getBytesTotal())*100;
};
Ce code fonctionne, mais on ne peut pas dire que ce soit ce qu'il y a de plus beau, on va donc lui apporter quelques
améliorations :
on ne va pas répéter 2 fois dans le code this._parent.image qui est trop long
Il faut enlever les 13 chiffres après la virgules qui ne servent à rien !
pourcentage.text est une variable de type String (= chaîne de caractères) et on lui donne un nombre, c'est pas
très propre !
On va donc :
Créer une variable faisant référence à image, et la réutiliser ensuite.
Arrondir le nombre avec Math.round()
Convertir le nombre en texte avec toString()
Ce qui nous donne :
Code : ActionScript
lien = 'http://www.endirectdemoi.com/e2dm/gallerie/src_444d18cc7ef6b.jpg';
// On créé deux clips, un pour recevoir l'image, l'autre pour le preloader
this.createEmptyMovieClip('image', 1);
this.createEmptyMovieClip('chargeur', 2);
// On crée un champ de texte dans chargeur et on charge l'astronaute dans image
this.chargeur.createTextField('pourcentage', 1, 0, 0, 100, 20);
this.image.loadMovie(lien);
// On regarde à chaque image où en est le chargement
this.chargeur.image = this.image;
this.chargeur.onEnterFrame = function() {
this.pourcentage.text =
(Math.round(((image.getBytesLoaded()/image.getBytesTotal())*100)).toString())+' %';
};
122 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
this.chargeur.image = this.image; permet de créer un référence à image directement dans le clip chargeur et
nous fait gagner du temps ensuite.
Math.round(((image.getBytesLoaded()/image.getBytesTotal())*100)) arrondit le nombre.
le_nombre.toString() convertit le nombre en texte, ce qui permet de rajouter le % à la fin de la chaîne de
caractères.
Chargeur graphique
Le texte c'est bien, facile à programmer, mais c'est pas très esthétique.
On va donc dessiner une barre de progression. On pourrait la dessiner complètement en ActionScript grâce aux méthodes
de dessin qu'on avait vu, mais rassurez vous on va les dessiner nous même avec l'IDE de Flash.
Créez donc un clip sur la scène principale et donner lui pour nom d'occurrence : chargeur
Dans ce clip dessinez deux rectangles, ils doivent être de la même taille et se superposer, celui du dessous devrait un
peu déborder sur les côtés. Transformez celui du dessus en un clip auquel vous donnerez comme nom d'occurrence :
barre. Placez le centre de barre comme vous le souhaitez par rapport au rectangle selon l'effet que vous souhaiterez
obtenir.
Vous allez voir, on ne va presque rien changer dans le code précédent.
Il ne sert plus à rien de créer le clip chargeur, puisqu'on l'a déjà, donc on supprime la ligne.
Idem pour la zone de texte qui est devenue inutile, puisqu'on affiche la progression sous forme graphique.
On ne va plus affecter le pourcentage à la propriété text d'une zone de texte, mais à la propriété _xscale de barre. On
doit donc transmettre un nombre, on enlève donc le % et le tostring(). Éventuellement on peut aussi enlever le
Math.round() qui ne sert plus à grand chose non plus.
Ca nous donne donc :
Code : ActionScript
lien = 'http://www.endirectdemoi.com/e2dm/gallerie/src_444d18cc7ef6b.jpg';
// On créé un clips pour recevoir l'image
this.createEmptyMovieClip('image', 1);
// On charge l'astronaute dans image
this.image.loadMovie(lien);
// On regarde à chaque image où en est le chargement
this.chargeur.image = this.image;
this.chargeur.onEnterFrame = function() {
this.barre._xscale = (image.getBytesLoaded()/image.getBytesTotal())*100;
};
Au cas où vous auriez décroché au cours de ce tuto, voilà la SOURCE
Redimensionner l'image
Par contre, vous l'aurez remarqué je l'espère, on a un petit problème !
L'image se charge bien, mais elle est tellement grande qu'elle ne rentre pas dans l'animation.
Pas de problème, rajoutons après avoir créé le clip :
Code : ActionScript
this.image._width = Stage.width;
this.image._height = Stage.height;
Stage.width et Stage.height (sans _ avant la propriété) contiennent la largeur et la hauteur de
l'animation
123 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Ca marche pas ! L'image n'est même plus du toute affichée !
Et bien oui, on n'a fait une erreur ! On a donné une taille à un clip qui était encore vide ! Même si vous mettez ce code
juste après le loadMovie() vous aurez le même problème, car l'image n'étant pas chargée complètement, Flash ne peut
toujours pas redimensionner le clip vide !
Il faut donc attendre que l'image soit chargée pour la redimensionner !
Dans le bloc de code de chargeur on va donc rajouter une condition qui redimensionne l'image une fois qu'elle est
chargée, on a donc :
Code : ActionScript
this.chargeur.onEnterFrame = function() {
this.barre._xscale = ((image.getBytesLoaded()/image.getBytesTotal())*100);
if (image.getBytesLoaded() == image.getBytesTotal()) {
image._width = Stage.width;
image._height = Stage.height;
}
};
Ca marche toujours pas !
Et oui en effet, essayez de deviner pourquoi, n'oubliez pas d'utiliser la fonction trace() !
Secret (cliquez pour afficher)
Avant que l'image soit chargée, le clip image existe déjà ! Et il est complètement chargé (en plus il est
vide). Notre condition est donc validée au début avant même le chargement de l'image. Or on a vu au
dessus, qu'il ne fallait surtout pas redimensionner un clip vide avant que l'image ne soit chargé, sinon ca ne
fonctionne pas.
Il faut donc rajouter une condition supplémentaire : il faut vérifier que le clip ne soit pas vide, on aura donc
:
Code : ActionScript
this.chargeur.onEnterFrame = function() {
this.barre._xscale = ((image.getBytesLoaded()/image.getBytesTotal())*100);
if ((image.getBytesLoaded() == image.getBytesTotal()) &&
(image.getBytesTotal()>0)) {
image._width = Stage.width;
image._height = Stage.height;
}
};
Tout bête, n'est-ce pas ?
Ensuite, c'est à vous de trouver le code pour conserver les proportions de l'image lors du redimensionnement, vous en
trouverez sur internet pour de nombreux langages, il ne restera plus qu'à l'adapter à votre animation !
Particularité du chargement des animations
Et oui, charger une animation dans un clip d'une autre animation, ca peut vite devenir un casse-tête style poupées
russes !
124 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Car l'animation qu'on charge peut contenir du code ActionScript. Tant que les références à l'intérieur de cette animation
se font de façon relative : pas de problème ! Mais imaginez que vous utilisiez _root dans l'animation qui est chargée dans
le clip ...
Oui vous avez compris, le _root ne sera pas le _root de l'animation chargée, mais le _root de l'animation chargeur : un
vrai problème !
Alors soit vous récrivez toutes vos animations pour vous assurez que vous n'utilisez jamais _root (et si vous avec bien
suivi ce cours vous ne devriez n'avoir jamais utilisé _root jusqu'ici), soit vous suivez l'astuce suivante.
ActionScript depuis la version 7 possède une nouvelle propriété pour les clips : _lockroot
C'est une variable booléenne (elle prend les valeurs true ou false). Par exemple si vous chargez une animation qui
contient des chemins d'accès absolus (utilisant _root) dans le clip image de tout à l'heure, il faudra préciser avant de
charger l'animation :
Code : ActionScript
this.image._lockroot = true;
this.image.loadMovie(lien);
Et grâce à cette propriété, l'animation chargée conservera son _root propre !
Pour pouvoir tester le preloader, nous avons chargé une image distante, mais vous pouvez aussi tester le
chargement avec une image locale en activant "simuler le téléchargement" dans le menu "affichage" du
testeur d'animations de Flash.
Vous savez maintenant charger du contenu graphique (image et SWF) externe ! Vous pouvez donc déjà créer des
animations complexes qui peuvent charger dynamiquement des parties trop lourdes. Vous pouvez aussi commencer
l'élaboration d'une galerie basique en Flash !
Mais il existe aussi d'autres types de contenu qu'on peut charger dans une animation : les variables et la musique
Transfert de variables
Nous avons appris comment charger des photos ou des animations Flash dynamiquement. C'est bien beau, mais encore
faudrait-il savoir quel est le nom de l'image à télécharger !
On va donc s'intéresser à la classe LoadVars qui permet d'effectuer une requête HTTP sur une page Web, ce qui nous
permettra de récupérer des variables contenant ce dont on a besoin
La vieille technique
Je vais d'abord vous présenter l'ancienne technique, car elle vous permettra de mieux comprendre les différents
mécanismes.
Mettons nous en situation
On va prendre la situation la plus simple possible
Supposons que vous souhaitez afficher la progression d'un projet avec un petit graphique en Flash.
125 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
On pourrait passer directement les données à l'animation comme nous l'avons
fait dans Transmission des variables. Mais nous allons utiliser la technique
inverse : c'est l'animation qui va aller chercher elle même les informations qui
l'intéresse !
On va déjà créer une petite animation toute bête, avec 4 barres colorées qui
vont représenter la progression de votre projet dans 4 domaines différents. On
donnera comme nom d'occurrence : barre_1, barre_2, barre_3 et barre_4.
En haut de votre graphique, vous pouvez rajouter un champ de texte dynamique
de variable : titre
Vous pouvez télécharger la source de départ
Les variables à charger
Flash va charger 5 variables : la progression pour les 4 barres, et le titre du graphique.
On va donc enregistrer ces variables dans un fichier texte et on va encoder ces variables au format urlencode, comme
nous l'avions déjà fait quand nous passions directement les variables à l'animation.
Créez donc un fichier graphique.txt :
Citation : graphique.txt
titre=Mon+graph&barre_1=50&barre_2=75&barre_3=15&barre_4=89
N'oubliez pas d'enregistrer votre fichier texte au format UTF-8. Dans le Bloc-Notes, par exemple, il faut faire Fichier->
Enregistrez Sous -> Codage -> UTF-8.
Pensez tout de même à utiliser un éditeur de texte plus avancé que le bloc-note, car il existe plusieurs
façons d'enregistrer un fichier en UTF-8, et celle du bloc-note est mal supportée par PHP. (En fait PHP n'aime
pas la signature unicode BOM utilisée d'office par le Bloc-Notes)
Grâce à l'UTF-8, vous n'aurez pas de problème avec les accents et caractères spéciaux, vous pourriez même mettre du
chinois mandarin dans le titre de votre graphique
Ais-je besoin de rappeler que si vous mettez votre animation en ligne, il faudra penser au
crossdomain.xml pour pouvoir charger des variables ?
Du côté d'ActionScript
Maintenant qu'on a toutes les ressources nécessaires, reprenons notre animation et passons à l'ActionScript.
La fonction loadVariables(url:String, target:Object); permet de charger les variables d'un fichier externe dans un objet.
Nous allons donc devoir créer un clip qui va être chargé de recevoir les variables que nous allons charger, car les
variables portant le même nom que des objets sur la scène, il y aurait un risque à les charger directement dans _root.
Ca commence donc comme ça :
Code : ActionScript
126 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
this.createEmptyMovieClip("variables", this.getNextHighestDepth());
loadVariables("graphique.txt", variables);
Ensuite il ne reste plus qu'à faire correspondre les variables :
Code : ActionScript
_root.titre=variables.titre;
for (var i=1;i<=4;i++) {
_root['barre_'+i]._yscale = variables['barre_'+i];
}
Histoire de ne pas devoir écrire 4 fois barre_1._yscale = variables.barre_1, j'ai fait une petite boucle qui va le faire
pour moi
Maintenant testons l'animation
Pourquoi ça marche pas ?
Parce qu'on a oublié un "détail" gênant. On essaye d'utiliser des variables qui ne sont pas encore nécessairement
chargées ! En effet, le temps de charger le fichier graphique.txt, Flash a déjà exécuté le code pour faire correspondre
les variables...
Nous allons donc devoir attendre que toutes les variables soient chargées avant de les faire correspondre. Pour cela nous
allons exécuter à chaque image un script qui vérifiera que la dernière variable du fichier texte (barre_4) soit bien
chargée. Le cas échéant, on fait correspondre les variables et on arrête le code.
Allez, je vous ai tout dit : à vous de bosser maintenant !
Secret (cliquez pour afficher)
Code : ActionScript
this.createEmptyMovieClip("variables", this.getNextHighestDepth());
loadVariables("graphique.txt", variables);
variables.onEnterFrame = function() { // On se place directement dans "variables"
if (this.barre_4) { // Si barre_4 est défini
_root.titre = this.titre; // On est dans "variables", "this.titre"
correspond à ce qui a été chargé du fichier texte
for (var i = 1; i<=4; i++) {
_root['barre_'+i]._yscale = this['barre_'+i];
}
delete this.onEnterFrame; // Fait la même chose que
"this.onEnterFrame = null;"
}
};
Et maintenant tout fonctionne parfaitement ! Vous pouvez même vérifier que les caractères accentués passent bien
dans le titre.
Avantages et inconvénients
Cette méthode possède l'avantage d'être rapide à mettre en oeuvre au niveau du code. Par contre, elle n'est pas très
propre car elle fait appel à un onEnterFrame. Et dans une grosse animation, l'accumulation de ce genre de méthodes
peut rendre l'application très lourde.
Nous allons donc passer à une méthode plus belle
)
127 sur 166
(comme quoi la programmation n'est qu'une affaire d'esthétique
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Chargement avec LoadVars
Voilà la classe qui va tous nous sauver : LoadVars
Nous allons reprendre le même exemple que précédemment, et le mettre à la sauce LoadVars ! Vous pouvez déjà
supprimer tout le code utilisant LoadVariables().
On n'a plus besoin du clip variables, on va utiliser par contre un objet loadvars pour charger les données. Pour ne pas se
dépayser, on l'appellera aussi variables.
Code : ActionScript
var variables:LoadVars = new LoadVars();
Maintenant on va utiliser l'événement onLoad livré avec la classe LoadVars et qui va grandement nous faciliter la tâche.
Cet événement est en effet appelé lorsque le chargement est terminé, plus besoin d'utiliser d'astuce avec onEnterFrame
!
Code : ActionScript
variables.onLoad = function() {
_root.titre = this.titre;
for (var i = 1; i<=4; i++) {
_root['barre_'+i]._yscale = this['barre_'+i];
}
};
Il suffit de reprendre le code précédent et de changer onEnterFrame par onLoad. De plus onLoad possède un argument
bien pratique qui permet de savoir si le chargement a fonctionné ou pas. Notre code donnera donc :
Code : ActionScript
variables.onLoad = function(succes:Boolean) {
if (succes) {
_root.titre = this.titre;
for (var i = 1; i<=4; i++) {
_root['barre_'+i]._yscale = this['barre_'+i];
}
} else {
trace("Quelque chose n'a pas fonctionné");
}
};
Il ne reste plus que le plus important : le code pour charger les données.
Il faut utiliser la méthode load() qui demande le chemin d'accès au fichier contenant les données comme argument. Le
code complet sera donc le suivant :
Code : ActionScript
var variables:LoadVars = new LoadVars();
variables.onLoad = function(succes:Boolean) {
if (succes) {
_root.titre = this.titre;
for (var i = 1; i<=4; i++) {
_root['barre_'+i]._yscale = this['barre_'+i];
}
} else {
trace("Quelque chose n'a pas fonctionné");
}
};
variables.load("graphique.txt");
Et voilà ! Votre animation fonctionne parfaitement et proprement
128 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Envoyer des variables
C'est bien beau de pouvoir charger des variables, mais dans de nombreux cas, les variables que l'on chargera dépendront
de la requête.
Imaginons que l'état d'avancement de votre projet ne doit être accessible que par mot de passe. On pourrait bien
entendu conserver l'animation précédente et rajouter un champ de texte avec une bête vérification du mot de passe
directement avec ActionScript avant de charger les données externes. Mais ca ne serait pas sécurisé, car il est possible
de décompiler une animation Flash pour voir son code ActionScript et donc le mot de passe voire directement l'adresse
du script auquel on fait appel !
Alors que si c'est le script php qui fait la vérification et ne renvoie les données que si le mot de passe est bon, le
système devient inviolable. (théoriquement
)
Nous allons donc transmettre le mot de passe par la méthode GET à notre script lors de la requête.
Du côté de PHP
Pour tester cet exemple il faut bien entendu le mettre en-ligne ou alors utiliser un serveur php en local
(comme le permet easyphp ou wamp) pour que le script php soit exécuté.
Intéressons nous déjà au script php qui va vérifier le mot de passe et renvoyer les données.
Nous allons créer un fichier graph_pass.php en UTF-8.
Ce script recevra le mot de passe dans la variable $_GET['password']. (Nous prendrons comme mot de passe : sdz
)
Maintenant, à vous de jouer : faites moi ce petit script PHP !
Secret (cliquez pour afficher)
Code : PHP
if ($_GET['password'] == 'sdz') {
echo 'titre=Mon+graphique&barre_1=50&barre_2=75&barre_3=15&barre_4=89';
} else {
echo 'titre=Accès+refusé';
}
Du côté de Flash
Rajoutez sur la scène un champ de saisie et donnez lui comme nom d'occurrence (je ne parle pas du nom de variable) :
password
Maintenant, nous avons deux possibilités pour envoyer le mot de passe (contenu dans la propriété text du champ de
texte password, c'est à dire dans password.text) au script php.
- Soit on reprend le code précédent et on rajoute soi-même la variable pour avoir une ligne de ce genre :
Code : ActionScript
variables.load("graph_pass.php?password="+this.password.text);
- Soit on utilise un second objet loadVars qui aura pour seul fonction d'envoyer la variable.
Méthode rapide
Je vous ai montré comment faire pour pouvoir envoyer rapidement la variable au script, à vous de modifier le code
précédent pour que les données soient chargées lorsque l'utilisateur appuie sur "Entrée".
Correction possible :
Secret (cliquez pour afficher)
129 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
var variables:LoadVars = new LoadVars();
variables.onLoad = function(succes:Boolean) {
if (succes) {
_root.titre = this.titre;
for (var i = 1; i<=4; i++) {
_root['barre_'+i]._yscale = this['barre_'+i];
}
} else {
trace("Quelque chose n'a pas fonctionné");
}
};
this.onEnterFrame = function() {
if (Key.isDown(Key.ENTER)) {
variables.load("http://www.jouhaud.eu/sdz/graph_pass.php?password="+this.password.text
this.password._visible = false;
}
};
Méthode lente
Continuons avec le code que nous venons d'écrire.
Dans cette méthode nous allons créer un second objet LoadVars tout au début du script :
Code : ActionScript
var a_envoyer:LoadVars = new LoadVars();
Lors de l'appuie sur "Entrée", nous allons préciser les données à transférer par a_envoyer
Code : ActionScript
a_envoyer.password = this.password.text;
Et ensuite, nous allons modifier la ligne qui envoie le tout pour qu'elle puisse utiliser les deux loadVars en même temps :
Code : ActionScript
a_envoyer.sendAndLoad("http://www.jouhaud.eu/sdz/graph_pass.php",variables,"GET");
Expliquons un peu cette ligne. L'objet qui contient les données à envoyer est l'objet qui porte la méthode
sendAndLoad() : il s'agit ici de a_envoyer. Ensuite, en second argument on doit préciser le nom de l'objet qui recevra
les données retournées par le script PHP : variables. Enfin en troisième argument on précise la méthode de
transmission, ici c'est "GET".
Le code complet donne donc :
Code : ActionScript
130 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
var variables:LoadVars = new LoadVars();
var a_envoyer:LoadVars = new LoadVars();
variables.onLoad = function(succes:Boolean) {
if (succes) {
_root.titre = this.titre;
for (var i = 1; i<=4; i++) {
_root['barre_'+i]._yscale = this['barre_'+i];
}
} else {
trace("Quelque chose n'a pas fonctionné");
}
};
this.onEnterFrame = function() {
if (Key.isDown(Key.ENTER)) {
a_envoyer.password = this.password.text;
a_envoyer.sendAndLoad("http://www.jouhaud.eu/sdz/graph_pass.php",variables,"GET");
this.password._visible = false;
}
};
C'est un peu plus long que l'autre méthode. Mais imaginez qu'on ait beaucoup de variables à transmettre, et si en plus on
devait utiliser la méthode POST, alors on serait obligé d'utiliser la seconde méthode avec les deux objets LoadVars
Exercice : Zozor dynamique
Vous vous souvenez de notre premier fil rouge avec le Zozor qui parle ?
Vous pouvez visionner ici le résultat qu'on avait obtenu.
Nous allons le rendre dynamique, c'est à dire que nous stockerons sa réplique dans un fichier texte qui sera chargé et qui
pourra être modifié par l'animation
Téléchargez ici la source de notre Zozor comme il était à la fin de notre précédent fil rouge.
Côté serveur - PHP
Il vous faut créer deux fichiers :
zozor.txt qui accueillera la réplique de Zozor
zozor.php qui fait le lien entre le fichier texte et l'animation
Enregistrez zozor.txt en UTF-8 et surtout, surtout, n'oubliez pas de mettre son CHMOD à 777 grâce à votre logiciel de
transfert FTP. Sinon votre script ne pourra pas modifier le fichier.
Pour l'instant vous pouvez mettre ça comme réplique :
Citation : zozor.txt
Salut je m'appelle Zozor, symbole du SDZ
Maintenant nous allons coder un petit script php qui va aller lire ou écrire dans zozor.txt selon la requête qu'on lui
transmet.
Si l'animation veut lire la réplique elle enverra la variable suivante au script PHP en POST :
action=lire
Si l'animation veut écrire une nouvelle réplique, elle devra en plus envoyer un mot de passe pour s'authentifier :
action=ecrire
password=sdz
replique=une nouvelle réplique
La première partie de notre script donnera donc :
Code : PHP
131 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
if ($_POST['action'] == 'lire') {
echo 'replique='.file_get_contents('zozor.txt');
}
Maintenant nous allons rajouter la partie qui permet de changer la réplique et qui renvoie ensuite la nouvelle réplique :
Code : PHP
if ( ($_POST['action'] == 'ecrire') && ($_POST['password'] == 'sdz') ) {
$zozor = fopen('zozor.txt','w');
fwrite($zozor, $_POST['replique']);
fclose($zozor);
echo 'replique='.file_get_contents('zozor.txt');
}
Ensuite, on n'a plus qu'à mettre tout ça bout à bout et à prendre en compte le cas où l'animation envoie un mauvais code
d'action ou un mauvais mot de passe. Au total ca donne :
Code : PHP
if ($_POST['action'] == 'lire') {
echo 'replique='.file_get_contents('zozor.txt');
} else if ( ($_POST['action'] == 'ecrire') && ($_POST['password'] == 'sdz') ) {
$zozor = fopen('zozor.txt','w');
fwrite($zozor, $_POST['replique']);
fclose($zozor);
echo 'replique='.file_get_contents('zozor.txt');
} else {
echo 'replique=ca+bug+...';
}
Côté client - Flash
Reprenez donc notre Zozor là où nous l'avions abandonné. Dans le code déjà écrit supprimer tout sauf la partie qui gère
les yeux. Supprimez même la partie qui gère le bonnet, il nous servira de bouton pour valider : il doit donc être tout le
temps affiché.
Pour la réception simple de la réplique, le code est facile, il n'y a rien de nouveau :
Code : ActionScript
////- CONTENU DE LA BULLE
//var a_recevoir:LoadVars = new LoadVars();
var a_envoyer:LoadVars = new LoadVars();
//-- Lecture
a_recevoir.onLoad = function(succes:Boolean) {
if (succes) {
_root.bulle.htmlText = this.replique;
} else {
trace("Quelque chose n'a pas fonctionné");
}
};
a_envoyer.action = 'lire';
a_envoyer.sendAndLoad("zozor.php", a_recevoir, "POST");
Maintenant, nous allons concevoir la partie "écriture". Commencez par créer une zone de saisie et donnez lui comme
nom d'occurrence (je ne parle pas du nom de variable) : password
On va rendre cette zone invisible :
Code : ActionScript
password._visible = false;
132 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Il ne reste plus qu'à écrire ce qui doit se passer quand l'utilisateur clique sur le bonnet :
Code : ActionScript
bonnet.onRelease = function() {
if (!password._visible) {
a_envoyer.action = 'ecrire';
a_envoyer.replique = bulle.text;
password._visible = true;
password.text = 'mot de passe ?';
} else {
password._visible = false;
a_envoyer.password = password.text;
a_envoyer.sendAndLoad("zozor.php", a_recevoir, "POST");
}
};
Ais-je besoin d'expliquer ?
L'utilisateur peut modifier la bulle, ensuite il clique sur le bouton. Flash stocke alors dans a_envoyer l'action qu'on
souhaite effectuer 'ecrire' et la nouvelle réplique. Il affiche la zone de saisie où on peut rentrer un mot de passe.
Ensuite quand on reclique, le mot de passe est ajouté à a_envoyer et le tout est transmis au script php !
Ensuite, quand Flash reçoit les données transmises par le script, c'est la partie qu'on a déjà écrite qui est exécutée car
on utilise aussi a_recevoir, la bulle est donc mise à jour.
Vous pouvez télécharger la source du projet fini au format flash 8
Surtout, n'hésitez pas à vous entraîner à utiliser les LoadVars, ce sont des objets indispensables.
Maintenant vous avez la capacité de créer un mini-chat en conjuguant Flash avec un script PHP et éventuellement une
base de donnée !
Musique !
On sait charger des images, des animations et des variables. Maintenant, nous allons apprendre à lire des sons puis à
charger des musiques au format mp3.
Préparation du terrain
Flash possède la classe sound (son en français) qui permet une gestion simple des effets sonores en ActionScript.
Import statique
Avant de commencer à charger dynamiquement des sons, nous allons les charger dans Flash. Pour cela cliquez sur
Fichier->Importer->Importer dans la bibliothèque.
Puis choisissez la musique que vous désirez.
133 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Votre son apparaît ensuite dans la bibliothèque, vous pouvez même l'écouter en utilisant les deux petits boutons, stop et
lecture, dans la fenêtre de prévisualisation de la bibliothèque. (Le premier qui dit que j'ai des goûts de chio**e, je le
sors
)
Qualité et compression
Image utilisateur
En sélectionnant votre son dans la bibliothèque puis en cliquant sur Propriétés, vous pouvez
modifier sa compression.
Vous pouvez conserver la compression originale du fichier importé, ou alors en décochant la case Utiliser la qualité mp3
importée, vous pourrez utiliser vos propres paramètres. Flash recompressera le son automatiquement lors de la
compilation de l'animation, qui pourra durer alors très longtemps pour peu que votre fichier son soit lourd.
En général, il est intéressant de convertir le son en Mono, puisque de toute façon sur le Web, on se fiche un peu que le
son sortant de chaque baffle soit différent. De même, une vitesse de transmission de 64 kbits/s est dans la plupart des
cas largement suffisante.
L'option Qualité vous permet de préciser la "qualité" de l'encodage subi par votre son. Plus la qualité sera haute, plus le
temps mis lors de la publication sera long et plus la qualité propre du son sera bonne. Attention, la qualité de l'encodage
n'influe pas sur la taille du fichier audio.
En dessous, Flash vous indique en temps réel une estimation du poids de votre fichier son une fois compressé. Pour être
sûr que la musique ne soit pas trop dégradée avec vos paramètres, vous pouvez cliquer sur le bouton Tester en haut de
la fenêtre.
Nom de liaison
Et comme pour tous les objets qui sont dans la bibliothèque et que nous devons utiliser dans ActionScript, il va falloir lui
donner un nom de liaison.
Il suffit de sélectionner le son et de cliquer sur Liaison...
Image utilisateur
Vous atterrissez sur la plus-que-connue fenêtre de liaison ActionScript. Vous devez donc cocher Exporter pour
ActionScript puis donner un nom de liaison pour votre fichier audio dans Identifiant
Lecture
134 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
B.A. BA
Il nous faut donc déjà créer un nouvel objet Sound qui va "porter" notre fichier son. C'est le rôle du script ci-dessous qui
après avoir initialiser l'instance musique de la classe Sound va utiliser la méthode attachSound() pour "attacher" une
musique de la bibliothèque à notre nouvel objet.
Code : ActionScript
var musique:Sound = new Sound();
musique.attachSound("Hallelujah"); // Faites gaffe aux majuscules dans votre nom de liaison
Ensuite, il ne reste plus qu'à lancer la musique :
Code : ActionScript
var musique:Sound = new Sound();
musique.attachSound("Hallelujah");
musique.start();
start() et stop() => et la pause ?
La méthode start() permet de lancer la lecture de notre son, elle possède deux arguments : le premier correspond à la
position en secondes où Flash doit commencer la lecture du son, et le deuxième correspond au nombre de fois que le
son doit être lu.
Nous voulons lire une musique de plusieurs minutes, nous n'utiliserons donc pas le second argument, car la lecture en
boucle ne nous est pas utile.
Créez donc trois boutons sur votre scène : arret, pause et lecture (je sais que le mot pause se colore en bleu dans le
panneau action, signifiant qu'il est utilisé par une autre classe, mais je vous assure qu'il n'y aura pas de conflit
)
On écrit le code ci-dessous, qui permet de contrôler la lecture et l'arrêt de notre musique.
Code : ActionScript
var musique:Sound = new Sound();
musique.attachSound("Hallelujah");
arret.onRelease = function() {
musique.stop();
};
lecture.onRelease = function() {
musique.start();
};
Maintenant, un problème se pose : quid du bouton pause ? Il n'existe pas de méthode pause() pour l'objet Sound.
Par contre, il existe une propriété position qui permet de connaître en millisecondes la position actuelle du curseur de
lecture ! D'ailleurs stop() ne remet pas la musique à zéro, il ne fait que la mettre en pause, si la musique recommence
du début, c'est car on ne transmet pas d'argument à start(), qui va donc commencer la lecture du départ.
Maintenant, c'est à vous de bosser pour me rajouter le code qu'il faut pour faire fonctionner ce bouton pause ! Quand on
clique dessus : la chanson s'arrête. Quand on clique sur lecture : la chanson reprend là où elle était
Correction possible :
Secret (cliquez pour afficher)
135 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
var musique:Sound = new Sound();
musique.attachSound("Hallelujah");
var vraie_position:Number = 0; // On créé une variable pour conserver la "vraie"
position
arret.onRelease = function() {
vraie_position = 0;
// Quand on stope on l'a met à zéro
musique.stop(); // Et on la stope tout de suite après
};
pause.onRelease = function() {
vraie_position = musique.position; // Quand on pause, on la met à la
dernière position connue.
musique.stop();
};
lecture.onRelease = function() {
musique.start(vraie_position/1000);
// Il faut diviser par mille, car
start() demande la position en secondes, pas en millisecondes !
};
Vous l'aurez compris, la seule difficulté était de bien penser à la conversion des millisecondes en secondes avec une
bête division par 1000.
Curseur de lecture
Affichage
Dessinez maintenant un rectangle gris foncé à bords noirs allongé horizontalement sur votre scène.
Transformez seulement l'intérieur du rectangle en clip que vous nommerez curseur (il s'agit du nom d'occurrence bien
sûr). Surtout mettez bien le centre du clip en haut à gauche de votre rectangle !
C'est ce clip qui va afficher de façon continue la position de lecture actuelle de la musique.
Pour faire cela, je vais vous donner plusieurs indices :
- utiliser un onEnterFrame
- utiliser musique.position
- utiliser musique.duration (temps total de la musique en millisecondes)
- utiliser _xscale
Tous les indices que je vous aie donnés, prennent déjà plus de place que le script que vous allez écrire maintenant et
qui va permettre de faire fonctionner ce curseur
Secret (cliquez pour afficher)
Code : ActionScript
curseur.onEnterFrame = function() {
this._xscale =(musique.position/musique.duration)*100;
}
C'est une bête règle de trois
(ou règle de proportionnalité si vous préférez)
Interactivité
Reste le problème de l'interactivité : on voit la position de la musique, mais on ne peut pas naviguer !
136 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Il va donc falloir inverser le processus.
Créez déjà un nouveau clip, exacte copie de curseur : même position, même taille, même centre en haut à gauche du
rectangle. Mais il faut que ce clip soit en dessous de curseur et de couleur gris clair. Nommez-le : selecteur.
On va capter la position de la souris quand elle cliquera sur selecteur, et à partir de là trouver la position à laquelle on
doit mettre la musique
On va travailler dans ce bloc :
Code : ActionScript
selecteur.onRelease = function() {
//-- Code à écrire
}
On peut déjà y mettre que la musique doit être stoppée. Car la propriété position est en lecture seule, c'est à dire qu'on
ne peut pas la modifier. Il faut donc arrêter et relancer la chanson en indiquant la position de départ.
Code : ActionScript
selecteur.onRelease = function() {
musique.stop();
}
Maintenant il faut faire une règle de trois dans le sens inverse.
On a la position de la souris par rapport au centre de selecteur grâce à this._xmouse.
On connaît la taille totale du clip grâce à selecteur._width
Et on connaît même la durée totale de la musique : musique.duration
Notre inconnu est donc la position que l'on doit donner à la musique. Une bête règle de trois nous donnera ce code (à
condition de ne pas oublier la conversion des millisecondes en secondes) :
Code : ActionScript
musique.start((this._xmouse*musique.duration)/(this._width*1000));
Pour l'instant, voilà notre script dans sa totalité :
Code : ActionScript
137 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
var musique:Sound = new Sound();
musique.attachSound("Hallelujah");
var vraie_position:Number = 0;
arret.onRelease = function() {
vraie_position = 0;
musique.stop();
};
pause.onRelease = function() {
musique.stop();
};
lecture.onRelease = function() {
musique.start(vraie_position/1000);
};
curseur.onEnterFrame = function() {
this._xscale = (musique.position/musique.duration)*100;
};
selecteur.onRelease = function() {
musique.stop();
musique.start((this._xmouse*musique.duration)/(this._width*1000));
};
Chargement dynamique
Conservez toute votre animation, mais supprimez votre musique de la bibliothèque.
Vous allez voir toute la simplicité de Flash sous vos yeux ébahis
code et le chargement va devenir dynamique.
: nous allons modifier une seule et unique ligne de
Supprimez :
Code : ActionScript
musique.attachSound("Hallelujah");
et remplacez par :
Code : ActionScript
musique.loadSound("Hallelujah.mp3", true);
Et ça fonctionne déjà
Le second argument de loadsound() permet de définir si la lecture peut se faire en streaming ou non. En clair, si vous
mettez false, il faudra attendre que la musique soit entièrement chargée avant de pouvoir l'écouter...
Mais quand je charge une grosse musique et que l'animation est sur internet, le curseur de lecture
devient complètement fou ! Qu'est-ce qu'il se passe ?
Ca aurait été trop facile aussi
! En fait, le problème vient de la propriété duration qui ne correspond pas à la durée
totale de la musique mais à la durée qui a été chargée dans le lecteur Flash...
En fait, il n'y a aucun moyen de connaître avec exactitude la durée totale de votre fichier audio tant qu'il ne sera pas
chargé complètement. Si vous regardez dans l'aide vous verrez qu'il est possible de récupérer les tags id3 des musiques
que l'on charge. Ces tags incorporent ce qu'on appelle des méta-données sur la musique : son titre, le compositeur ... Il
existe même un tag qui indique la durée de la musique. Mais voilà le problème : on trouvera le tag TIME, qui correspond
au temps total, sur très très peu de musiques.
Il va donc falloir faire fonctionner les méninges
au moins l'approximer.
Si on ne peut connaître exactement la durée de la musique, on peut
Barre de chargement
138 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
On va utiliser selecteur comme barre de chargement. Puisque sa taille va changer au cours du temps, nos règles de trois
ne seront plus valables. Il va donc falloir enregistrer au début de l'animation la taille maximale de la barre pour l'utiliser
dans nos calculs.
On a donc avoir avec cette modification :
Code : ActionScript
var musique:Sound = new Sound();
musique.loadSound("Hallelujah.mp3", true);
var position_pause:Number = 0;
var largeur:Number = selecteur._width; // On stocke la largeur maximale de la barre
arret.onRelease = function() {
musique.start(0);
musique.stop();
};
pause.onRelease = function() {
musique.stop();
};
lecture.onRelease = function() {
musique.start(musique.position/1000);
};
curseur.onEnterFrame = function() {
this._alpha = 0;
this._xscale = (musique.position/musique.duration)*100;
};
selecteur.onRelease = function() {
musique.stop();
musique.start((this._xmouse*musique.duration)/(largeur*1000)); // Pour pouvoir
l'utiliser dans les calculs
};
Vous remarquerez, que j'ai effectué une autre petite modification : j'ai enlevé la variable vraie_position. Quand on
utilise attachSound(), elle est indispensable, mais quand on charge le son dynamiquement, écrire start(0) remet
réellement la position à zéro, ce qui n'est pas le cas avec la méthode statique (bug ?).
Il ne reste plus qu'à modifier la largeur de selecteur selon le pourcentage correspondant au chargement de notre
musique. Pour ça : pas de problème, on retrouve les mêmes méthodes que pour les images et les animations. On peut
donc rajouter à la fin de notre code :
Code : ActionScript
selecteur.onEnterFrame = function() {
this._xscale = (musique.getBytesLoaded()/musique.getBytesTotal())*100;
if (this._xscale == 100) { // Une fois la musique complètement chargée
delete this.onEnterFrame; // On supprime le onEnterFrame
}
};
Si vous désactivez le curseur qui vous cache la barre de chargement, vous pourrez voir selecteur qui grandit au fur et à
mesure du chargement de votre musique.
Approximation de la durée totale
On connaît maintenant suffisamment de données pour pouvoir calculer une approximation de la durée totale en
considérant que le poids de la chanson est proportionnelle à sa durée.
On va donc introduire la variable tduration qui correspondra à la durée approximative totale de la musique.
Pour trouver la valeur de cette variable, c'est toujours et encore une bête règle de trois, il faut diviser la durée chargée
par le pourcentage de chargement.
Code : ActionScript
tduration = (musique.getBytesTotal()*musique.duration)/musique.getBytesLoaded();
On placera ce code dans selecteur.onEnterFrame car ce dernier se détruit de lui même une fois que la musique est
complètement chargée.
139 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Ensuite, il ne reste plus qu'à modifier l'affichage de curseur pour qu'il se base sur tduration et non plus sur
musique.duration qui est faussé.
Notre code complet :
Code : ActionScript
var musique:Sound = new Sound();
musique.loadSound("Hallelujah.mp3", true);
var largeur:Number = selecteur._width;
arret.onRelease = function() {
musique.start(0);
musique.stop();
};
pause.onRelease = function() {
musique.stop();
};
lecture.onRelease = function() {
musique.start(musique.position/1000);
};
curseur.onEnterFrame = function() {
this._xscale = (musique.position/tduration)*100;
};
selecteur.onRelease = function() {
musique.stop();
musique.start((this._xmouse*musique.duration)/(largeur*1000));
};
selecteur.onEnterFrame = function() {
this._xscale = (musique.getBytesLoaded()/musique.getBytesTotal())*100;
if (this._xscale == 100) {
delete this.onEnterFrame;
}
tduration = (musique.getBytesTotal()*musique.duration)/musique.getBytesLoaded();
};
Vous savez tout sur les sons et le chargement dynamique de musique
Vous pouvez voir un exemple d'utilisation de ce mini-lecteur sur mon blog. Ca peut vous donner des idées
Vous pouvez télécharger les sources complètes du mini-lecteur que nous venons de créer ensemble.
Vous êtes maintenant apte à créer une "radio-blog" comme on en trouve un peu partout sur le web. Ca sera d'ailleurs le
sujet de notre prochain fil rouge : la création d'une radio-blog complète
Vidéos
Voilà la dernière partie de nos tribulations au pays des chargements dynamiques de ressources
Nous apprendrons maintenant à charger des vidéos dans Flash. Attention, les seules vidéos acceptées par Flash sont au
format FLV. Nous verrons donc en premier comment convertir une vidéo dans ce format
Riva FLV Encoder
Un outil est fourni avec Flash pour convertir vos vidéos au format FLV, mais il n'est pas très puissant et plutôt lent.
Un éditeur allemand a publié un logiciel gratuit plus complet et beaucoup plus intuitif qui vous permettra d'encoder vos
vidéos : Riva FLV Encoder (cliquez sur l'image "download now")
140 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Une fois le logiciel lancé, vous pourrez changer la langue dans la barre de menu du haut pour le français
(sprache->französisch ou language->french).
Ci-dessous l'interface du logiciel avec les différentes étapes. Dans la troisième étape, en verte, je ne donne que des
conseils pour pouvoir avoir une vidéo avec un minimum de poids, mais la perte de qualité sera assez conséquente ! C'est
donc à vous de faire vos propres réglages selon l'utilisation que vous ferez de votre vidéo !
Le lecteur que nous allons réaliser en Flash fera 320*240 pixels, mais vous pourrez changer cette taille très facilement.
La fréquence correspond au nombre d'images par seconde (15 dans notre exemple), et le bitrate au débit des données
en bit par seconde (sachez que plus c'est grand, mieux la qualitée est, mais plus le ficheir est lourd)
Le logiciel vous permet aussi de "couper" votre vidéo si vous connaissez le temps en seconde à partir duquel la coupe
doit s'effectuer (Start Offset) et la durée du fichier de Sortie (Duration)
Ensuite il ne vous reste plus qu'à lancer la conversion, qui peut durer de quelques secondes, à quelques minutes.
Vous devriez voir apparaître un fichier .flv, c'est celui qui sera chargé par Flash !
Au cas où vous n'auriez pas de vidéo sous la main, j'ai encodé pour vous la vidéo de présentation du SDZ qui était passée
): télécharger Ztélé au format FLV.
à la télévision (québécoise apparemment
Vous pouvez voir le résultat final de la vidéo jouée dans Flash sur mon blog
141 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Un nouvel objet
L'import d'une vidéo de façon statique n'ayant aucun intérêt, nous passons directement au chargement dynamique d'une
vidéo
Je vous avais présenté, il y a longtemps de ça maintenant, les différents
objets de Flash. On avait vu qu'en gros il y avait les formes et les symboles
(clips, graphiques et boutons).
Mais il existe deux autres objets qu'on peut trouver dans la bibliothèque : les
polices et les vidéos.
Nous nous intéresserons bien sûr à cette seconde catégorie
Cliquez donc avec le bouton droit de la souris sur un espace vide de votre
bibliothèque et dans le menu contextuel, choisissez : Nouvelle Vidéo ...
Donnez lui le nom qui vous chante, ca n'a pas d'importance.
Ensuite, glissez cette vidéo sur votre scène pour en créer une occurrence.
Donnez ces différentes propriétés à votre occurrence :
nom d'occurrence : video
largeur : 320px
hauteur: 240px
Nous sommes maintenant prêt à accueillir une vidéo dans notre animation
Trois classes pour le prix d'une
Pour le son c'était simple : une seule classe.
Pour la vidéo ça se complique drôlement ! Nous avons droit à trois classes différentes, chacune remplissant son rôle
(plus ou moins bien défini).
netconnection
Sûrement une des classes les plus simples de Flash : elle n'a qu'une seule méthode et pas de propriété
En fait, son rôle paraît un peu obscur. En effet, une fois l'objet créé, on appelle sa méthode connect() à laquelle on est
censé passer une URL. Mais dans la documentation, on précise, je cite :
Citation : Aide de Flash
targetURI:String - Pour ce paramètre, vous devez transmettre null.
Bref, on ne sait pas à quoi ça sert, mais on obéit : on mettra donc en haut de notre code :
Code : ActionScript
var connection:NetConnection = new NetConnection();
connection.connect(null);
Ce qu'il faut retenir : NetConnection permet d'ouvrir une connexion (dans le vide puisqu'on transmet null) qu'on pourra
associer ensuite à la vidéo.
netstream et Video
Là on rentre dans le vif du sujet, cette classe s'occupe du transfert et du contrôle de la vidéo
142 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Petite particularité du constructeur de cette classe (c'est à dire dans la façon de créer une nouvelle instance) : on doit
passer en argument une instance de NetConnection (c'est la dernière fois qu'on le reverra celui-là). :
Code : ActionScript
var connection:NetConnection = new NetConnection();
connection.connect(null);
var flux_video:NetStream = new NetStream(connection); // un NetConnection en argument
Pour la suite ca fonctionne comme pour la musique. On appelle la méthode attachVideo() qui est une méthode de la
classe Video et qui va faire le lien entre l'objet video sur la scène et l'objet NetStream fraîchement créé.
Code : ActionScript
var connection:NetConnection = new NetConnection();
connection.connect(null);
var flux_video:NetStream = new NetStream(connection);
video.attachVideo(flux_video);
Enfin, il ne reste plus qu'à donner l'URL de la vidéo FLV en elle même grâce à la méthode play() de la classe NetStream.
Code : ActionScript
var connection:NetConnection = new NetConnection();
connection.connect(null);
var flux_video:NetStream = new NetStream(connection);
video.attachVideo(flux_video);
flux_video.play("ztele.flv");
Ce qu'il faut retenir c'est que NetStream s'occupe du chargement et du contrôle de la vidéo et que Video ne s'occupe
que de l'affichage du film (et NetConnection on s'en fiche
).
Contrôle du flux
Lecture, pause et arrêt
Créez deux boutons sur votre scène : lecture et arret. Le bouton lecture permettra aussi de faire pause si on clique
dessus alors que la vidéo est déjà en cours de lecture.
Le code pour le bouton lecture va être très simple car il existe une méthode pause() dans la classe NetStream.
Si on ne passe aucun argument à cette méthode, elle mettra la vidéo en pause si elle est en lecture et en lecture si elle
est en pause : exactement ce qu'on veut
Code : ActionScript
lecture.onRelease = function() {
flux_video.pause();
};
Un brin plus compliqué, voyons maintenant le code pour le bouton arret. Ce bouton a pour rôle de remettre la vidéo au
début. Mais la classe ne possède pas de méthode stop().
Il va donc falloir ruser !
Il existe une méthode seek() qui permet de se positionner à un endroit de la vidéo en
transmettant l'instant en seconde comme argument, un peu l'équivalent de la méthode play() de la classe Sound.
On va donc positionner la vidéo à l'instant 0 et la mettre en pause immédiatement après. Le problème c'est que pause()
ne met en pause que si la vidéo était en lecture, or nous on veut que la vidéo s'arrête à tous les coups ! Heureusement,
on peut passer un argument à pause() : true si on veut arrêter la vidéo et false si on veut reprendre la lecture. Ce qui
nous fait :
Code : ActionScript
143 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
arret.onRelease = function() {
flux_video.seek(0);
flux_video.pause(true);
};
Curseur de lecture
Comme pour le son nous allons créer un curseur de lecture tout simple. Dessinez un rectangle plein foncé horizontal et
convertissez seulement l'intérieur en clip qu'on nommera : curseur. Faites attention à bien placer le centre du clip en
haut à gauche du rectangle !
Vous allez voir qu'on va retrouver le même problème que pour le son : on connaît la position actuelle de la tête de
lecture en seconde avec la propriété time de NetStream. Par contre on ne connaît pas la durée totale. Alors on pourrait
utiliser la même astuce avec approximation de la durée total, mais il existe une autre technique. Si les tags ID3 sont peu
répandus pour les mp3, la plupart des vidéos FLV possèdent des métadonnées plus complètes.
La classe NetStream incorpore un événement onMetaData qui va nous permettre de récupérer facilement la donnée qui
nous intéresse. Cette méthode possède un argument, que nous appellerons metadata et qui contient justement les
métadonnées du clip vidéo. Il ne reste plus qu'à savoir que la métadonnée qui contient la durée s'appelle duration et le
tour est joué. On stockera la durée totale de notre vidéo dans la variable tduration :
Code : ActionScript
flux_video.onMetaData = function(metadata) { // On donne un nom à la variable fournie par
onMetaData
tduration = metadata.duration; // Et on récupère la valeur de cette variable
}
Je ne vous représente pas le principe de la proportionnalité
donc :
, pour faire avancer notre curseur, nous rajouterons
Code : ActionScript
curseur.onEnterFrame = function() {
this._xscale = (flux_video.time/tduration)*100;
}
dupliquez maintenant le clip curseur pour faire un clip selecteur de même taille et de même position mais plus clair de
couleur et positionné en-dessous (au niveau des calques) de curseur.
Nous allons ajouter du code pour pouvoir positionner la vidéo facilement en cliquant sur selecteur. Encore une fois, le
code est très ressemblant à celui pour le son, il faut juste enlever la division par mille puisqu'ici tout est donné en
secondes et ne pas oublier que la méthode pour se placer dans une vidéo est seek(). Si on reprend tout le code depuis le
début, on aura donc :
Code : ActionScript
144 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
var connection:NetConnection = new NetConnection();
connection.connect(null);
var flux_video:NetStream = new NetStream(connection);
video.attachVideo(flux_video);
flux_video.play("ztele.flv");
lecture.onRelease = function() {
flux_video.pause();
};
arret.onRelease = function() {
flux_video.seek(0);
flux_video.pause(true);
};
flux_video.onMetaData = function(metadata) {
tduration = metadata.duration;
}
curseur.onEnterFrame = function() {
this._xscale = (flux_video.time/tduration)*100;
}
selecteur.onRelease = function() {
flux_video.seek((this._xmouse*tduration)/this._width);
}
Des fois, quand je clique pour changer la position, la vidéo se place un peu plus loin, il y a un bug ?
Non, c'est le comportement normal. En effet seek() ne place pas la tête de lecture exactement à un instant donné en
secondes, mais à l'image clé de la vidéo la plus proche. Alors si les images-clés de votre vidéo sont très espacées, il y
aura un petit décalage, imperceptible la plupart du temps.
Chargeur
Il ne nous reste plus qu'à rendre la taille de selecteur proportionnelle à l'état de chargement de la vidéo.
Bizarrement, les méthodes getBytesLoaded() et getBytesTotal() n'existent pas dans la classe NetStream ...
Les
développeurs ont préféré utiliser des propriétés bytesLoaded et bytesTotal, on se demande bien pourquoi ...
Le code pour la barre de chargement sera donc le suivant :
Code : ActionScript
selecteur.onEnterFrame = function() {
this._xscale = (flux_video.bytesLoaded/flux_video.bytesTotal)*100;
if (this._xscale == 100) {
delete this.onEnterFrame;
}
};
Mais, comme pour le son, la taille de selecteur étant devenue variable, il va falloir la stocker dans la variable et utiliser
largeur à la place de this._width par la suite.
En bref, voici le code complet et fonctionnel :
Code : ActionScript
145 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
var connection:NetConnection = new NetConnection();
connection.connect(null);
var flux_video:NetStream = new NetStream(connection);
video.attachVideo(flux_video);
flux_video.play("ztele.flv");
var largeur:Number = selecteur._width;
// On stocke la largeur maximale
lecture.onRelease = function() {
flux_video.pause();
};
arret.onRelease = function() {
flux_video.seek(0);
flux_video.pause(true);
};
flux_video.onMetaData = function(metadata) {
tduration = metadata.duration;
};
curseur.onEnterFrame = function() {
this._xscale = (flux_video.time/tduration)*100;
};
selecteur.onRelease = function() {
flux_video.seek((this._xmouse*tduration)/largeur);
};
selecteur.onEnterFrame = function() {
this._xscale = (flux_video.bytesLoaded/flux_video.bytesTotal)*100;
if (this._xscale == 100) {
delete this.onEnterFrame;
}
};
Vous connaissez maintenant tout ce qu'il faut savoir sur le chargement de données externes par requête HTTP : le
chargement de variables, d'images, d'animations, de musiques et de vidéos n'a plus de secret pour vous !
Fil Rouge - Radio-Blog
Et voilà notre traditionnel petit fil rouge de fin de chapitre. On a appris pas mal de choses dans cette partie, nous
utiliserons principalement vos connaissances dans le transfert de variables et le chargement dynamique de musique.
Dans un premier temps, voilà le résultat final que nous devrons obtenir.
En maintenant, voilà la source sur laquelle nous allons nous baser pour commencer
.
Il y a déjà tous les composants, mais vous ne trouverez aucun code ActionScript. Je tiens à remercier yash pour le design
Du côté de PHP
Ais-je besoin de préciser que pour fonctionner correctement, votre fichier PHP doit être uploadé sur
votre serveur ou que vous devez avoir installé un serveur PHP sur votre ordinateur ? De même n'oubliez pas
d'envoyer un crossdomain.xml sur votre serveur pour éviter les problèmes
Bon cette partie va être facile pour moi, je vais vous donner le code minimum du côté PHP, car c'est pas mon boulot de
vous apprendre ce langage. Cela étant dit, je vous encourage fortement à compléter ce script pour le rendre plus
dynamique et vous permettre de mettre à jour facilement votre radio-blog.
146 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Nous allons transmettre toujours de la même façon les données à Flash, en utilisant une succession de variable. Le
script PHP devra donc retourner une chaîne de caractères de ce genre :
Citation : Chaîne à transmettre
radio=Radio du SDZ&total=1&lien_0=Hallelujah.mp3&infos_0=hallelujah+-+jeff+buckley
radio représente le titre que nous allons donner à la radio.
total contient le nombre de musiques que contient la playlist.
lien_X donne le lien vers la musique numéro X.
infos_X donne des informations sur la musique numéro X.
Bon, vous avez 500 techniques différents pour coder cette partie, moi je ne me suis pas embêté, toute la playlist est
enregistrée en "dur" dans le script php. Il faut donc le modifier à chaque fois qu'on change la playlist, même si c'est
moyennement pratique. Le nom de mon script php est lecteur.php et est encodé en UTF-8 bien entendu
Code : PHP
<?PHP
$racine = 'http://www.votresite.com/'; // Répertoire contenant les musiques
$radio = 'Radio du SDZ'; // Nom de la radio
$lien[0] = 'Hallelujah.mp3'; // Lien vers la première musique
$infos[0] = 'Hallelujah - Jeff Buckley'; // Infos de la première musique
$lien[1] = 'calypso.mp3';
$infos[1] = 'Harry Belafonte - Calypso';
$retour = 'radio='.$radio; // On créé une chaine pour stoquer les donénes à envoyer
$retour .= '&total='.count($lien); // On compte le nombre d'entrées pour la variable
"total"
for ($i=0;$i<count($lien);$i++) {
$retour .=
'&lien_'.$i.'='.$racine.urlencode($lien[$i]).'&infos_'.$i.'='.urlencode($infos[$i]);
// On oublie surtout pas "d'urlencoder" les données pour que la transmission bug pas au
premier titre contenant un & ou un =
}
echo $retour; // On affiche la chaîne contenant les données
?>
Il ne vous reste plus qu'à coupler ce script à une base de données ou à un bête fichier texte et une interface vous
permettant de gérer simplement la playlist.
Je vous conseille de compléter pour la suite du fil-rouge la playlist avec au moins un quinzaine de musique pour pouvoir
coder les boutons de défilement de la liste dans le lecteur.
Chargement de la Playlist
Allons dans l'ordre, et avant de commencer à jouer une musique, chargeons déjà les données qui leurs correspondent.
On va donc créer un nouvel objet LoadVars load_playlist qui se chargera de cette tâche :
Code : ActionScript
var load_playlist:LoadVars = new LoadVars();
load_playlist.load('lecteur.php');
load_playlist.onLoad = function(succes) {
if (succes) {
// A coder :D
} else {
_root.infos = 'ERREUR dans le chargement'; // En cas d'erreur
}
};
147 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
La question maintenant c'est : comment donc récupérer les chansons et les stocker ?
Ma solution, et elle vaut ce qu'elle vaut
, c'est de créer une occurrence du clip ligne présent dans la bibliothèque par
chanson. L'occurrence aurait donc non-seulement un rôle d'interface, mais chaque clip contiendrait les informations sur
sa chanson. L'avantage de cette méthode c'est qu'elle est rapide, et très "Flash" dans l'idée. On aurait aussi très bien pu
séparer l'interface des données (et ça aurait d'ailleurs été plus propre pour un programmeur venant d'un autre langage),
nous aurions stocké les données dans un tableau, et associé chaque ligne de la liste avec une ligne du tableau par un
numéro d'identifiant.
Pour l'instant, suivons mon idée ! Nous allons donc créer une occurrence de ligne pour chaque lien transmis par le script
PHP. Nous allons donc utiliser une boucle, qui ira de zéro à ...
Secret (cliquez pour afficher)
la valeur de total transmise par le script PHP
Code : ActionScript
load_playlist.onLoad = function(succes) {
if (succes) {
for (var i = 0; i<this.total; i++) { // Boucle de 0 au nombre total de
chansons
var temp = _root.attachMovie('ligne', 'ligne_'+i, i); // Création
d'une ocurence de ligne
}
radio.htmlText = this.radio; // On donne le titre à la radio
total = this.total; // On stoque le nombre total de titres dans une
variable de _root
} else {
_root.infos = 'ERREUR dans le chargement';
}
};
On est dans un bloc de code de load_playlist, pour accéder à un de ses objets (c'est à dire à une des variables
transmises), on passe par this.lavariable.
Nous devons transmettre maintenant plusieurs informations à se clip fraîchement créé, et donc on a une référence
simple donné par temp
On doit lui donner déjà une position. Sur l'axe horizontal, c'est facile, il vous suffit de prendre la règle pour situer
la position sur l'axe des abscisses à 17 pixels. On aura donc temp._x = 17;.
Pour l'axe des ordonnées, ça se complique un peu, car chaque clip devra être en dessous du précédent. En fait, la
solution est simple, il faut multiplier le numéro du clip courant (donné par la variable i de la boucle) par la
hauteur du clip ligne (c'est à dire 20 pixels) et ajouter la position de départ par rapport au haut (soit 95 pixels).
Ca nous fait temp._y = 95+i*20;.
Nous allons donner à notre clip aussi un numéro identificateur, qui correspondra à la valeur de i quand il est créé.
On aura donc des clips avec des numéros d'identification de 0 jusqu'à (total-1). Ces numéros nous permettront de
gérer facilement le passage d'une musique à la suivante (ou la précédente)
On doit afficher les infos concernant la musique dans la zone de texte nommée infos du clip ligne. Mais comment
accéder à la variable infos_X quand on ne connaît pas le X à l'avance. Il suffit d'utiliser la même technique que
pour se brancher sur un clip donc on ne connaît pas le nom à l'avance, ici X étant i. Donc temp.infos.text =
this['infos_'+i];
Bien entendu, l'occurrence doit connaître le lien vers la musique, sinon ca va être difficile de la charger ... Là,
pas de complication : temp.lien = this['lien_'+i];
Vous l'avez peut-être pas remarqué, mais ligne possède un clip nommé lecture qui signifie qu'il est en cours de
lecture justement
. Il faut donc faire disparaître ce clip pour chaque ligne, quitte à le faire réapparaître
après pour la première chanson. temp.lecture._visible = false; (on aurait aussi pu utiliser temp.lecture._alpha =
0;)
Il va falloir assigner une fonction à l'événement onRelease de la ligne qui va charger la chansons quand on
cliquera dessus. Nous n'avons pas encore créé de fonction qui s'occupera du chargement, mais on peut déjà
l'appeler chargeur(), qui prendra un unique argument : le numéro de la ligne, la fonction ira chercher les données
toute seule. Il faut donc lui envoyer l'identifiant
temp.onRelease = function() {
chargeur(this.id);
};
Pour finir, un peu de fignolage esthétique. Il faut préciser que si la ligne dépasse du cadre du bas (à 271 pixels),
148 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
elle doit être invisible et complètement transparente, nous verrons plus tard pourquoi
if (temp._y>271) {
temp._visible = false;
temp._alpha = 0;
}
Vous pouvez maintenant tester votre animation
! Ca devrait fonctionner
(j'utilise le conditionnel, car il y a
toujours des Zéros qui arrivent à se compliquer la vie
) Pour ces dernier, voilà le code complet pour l'instant, j'y ai
rajouté tout de même une ligne, qui transmet à notre future fonction chargeur() les données pour la première chanson
de la liste histoire de commencer la lecture aussi tôt que possible
Code : ActionScript
//-// CHARGEMENT DES DONNEES
//-var load_playlist:LoadVars = new LoadVars();
load_playlist.load('lecteur.php');
load_playlist.onLoad = function(succes) {
if (succes) {
for (var i = 0; i<this.total; i++) {
var temp = _root.attachMovie('ligne', 'ligne_'+i, i);
temp._y = 95+i*20;
temp._x = 17;
temp.id = i;
temp.infos.text = this['infos_'+i];
temp.lien = this['lien_'+i];
temp.lecture._visible = false;
temp.onRelease = function() {
chargeur(this.id);
};
if (temp._y>271) {
temp._visible = false;
temp._alpha = 0;
}
}
radio.htmlText = this.radio;
total = this.total;
chargeur(0); // La ligne que j'ai rajoutée :D
} else {
_root.infos = 'ERREUR dans le chargement';
}
};
Gestion de la musique
Interface de base
Nous avons déjà vu la majeure partie dans le tutorial précédent Musique !, auquel je vous invite à vous reporter si vous
souhaitez comprendre quelque chose à la suite
On va en effet passer sur les explications déjà données quant au chargement de la musique et de l'approximation
effectuée sur sa durée totale.
Voilà notre code de départ qu'on peut reprendre d'avant :
Code : ActionScript
149 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
var tduration:Number = 0; // Variable stoquant la durée approximée totale de la musique
var largeur:Number = selecteur._width; // Largeur de la barre de navigation
var musique:Sound = new Sound(); // Notre objet son
arret.onRelease = function() {
musique.start(0); // On remet la musique à zéro
musique.stop(); // Pour l'arrêter tout de suite après
};
pause.onRelease = function() {
musique.stop();
};
lecture.onRelease = function() {
musique.start(musique.position/1000); // "position" donné en milliseconde
};
curseur.onEnterFrame = function() {
this._xscale = (musique.position/tduration)*100;
};
selecteur.onRelease = function() {
musique.stop();
musique.start((this._xmouse*musique.duration)/(largeur*1000));
};
selecteur.onEnterFrame = function() {
this._xscale = (musique.getBytesLoaded()/musique.getBytesTotal())*100;
tduration = (musique.getBytesTotal()*musique.duration)/musique.getBytesLoaded();
};
Comme vous le constatez, on n'a aucune ligne qui s'occupe du chargement de la chanson : c'est normal
On a dit en
effet que nous allions construire une fonction chargeur() qui s'en occuperait. Cette fonction prend pour argument la
variable id que chaque ligne lui transmet :
Code : ActionScript
chargeur = function (id) {
musique.start(0); // On remet la musique à zéro
// Le code
};
On a le numéro de la ligne et on connaît la structure du nom des clips ligne que nous avons créé : ligne_X
On utilisera donc la même syntaxe que d'habitude pour aller chercher nos petites infos :
Code : ActionScript
chargeur = function (id) {
musique.start(0);
musique.loadSound(this['ligne_'+id].lien, true);
info.text = this['ligne_'+id].infos.text;
};
On pouvait aussi bien écrire _root['ligne_'+id] à chaque fois, ca n'aurait rien changé.
Maintenant le petit fignolage de dernière minute, on va faire disparaître la petite flèche lecture de la ligne qui n'est
plus lue et la rajouter à celle qui est lue.
Comment je connais l'id de la ligne qui n'est plus lue ?
Bah, il suffit de faire intervenir une nouvelle variable : var id_encours = 0;
Ensuite, dans notre fonction, on va rendre invisible la flèche du clip correspondant à id_encours, afficher celle de id et
mettre à jour la valeur de id_encours avec la nouvelle musique. (Et bien sûr dans cet ordre là, sinon, il y aurait un petit
)
problème
Code : ActionScript
150 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
chargeur = function (id) {
this['ligne_'+id_encours].lecture._visible = false; // On la fait disparaitre
this['ligne_'+id].lecture._visible = true; // On la fait apparaitre
id_encours = id; // Et on met à jour l'id du nouveua titre
musique.start(0);
musique.loadSound(this['ligne_'+id].lien, true);
info.text = this['ligne_'+id].infos.text;
};
Petit récapitulatif de cette première partie :
Code : ActionScript
var tduration:Number = 0;
var id_encours = 0;
var largeur:Number = selecteur._width;
var musique:Sound = new Sound();
chargeur = function (id) {
this['ligne_'+id_encours].lecture._visible = false;
this['ligne_'+id].lecture._visible = true;
id_encours = id;
musique.start(0);
musique.loadSound(this['ligne_'+id].lien, true);
info.text = this['ligne_'+id].infos.text;
};
arret.onRelease = function() {
musique.start(0);
musique.stop();
};
pause.onRelease = function() {
musique.stop();
};
lecture.onRelease = function() {
musique.start(musique.position/1000);
};
curseur.onEnterFrame = function() {
this._xscale = (musique.position/tduration)*100;
};
selecteur.onRelease = function() {
musique.stop();
musique.start((this._xmouse*musique.duration)/(largeur*1000));
};
selecteur.onEnterFrame = function() {
this._xscale = (musique.getBytesLoaded()/musique.getBytesTotal())*100;
tduration = (musique.getBytesTotal()*musique.duration)/musique.getBytesLoaded();
};
Vous pouvez exécuter votre animation, et miracle, la plupart des fonctions sont déjà opérationnelles
!
Précédent, suivant et passage automatique
Il manque les nouvelles fonctions inhérentes à l'utilisation d'une playlist : les boutons précédent, suivant et le passage
automatique à la chanson suivante à la fin de celle en cours.
Pour les boutons précédent et suivant, ca pourrait paraître facile, il y a cependant un petit piège : arrivé à la dernière
chanson, il faut revenir au début ! De même si on est à la première chanson, et que l'utilisateur fait précédent il faudra
aller à la dernière !
Bon, je vous laisse créer le code (les boutons ont pour nom d'occurrence precedent et suivant)
Correction possible :
Secret (cliquez pour afficher)
151 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
precedent.onRelease = function() {
if (id_encours>0) {
chargeur(id_encours-1);
} else {
chargeur(total-1);
}
};
suivant.onRelease = function() {
if (id_encours<total-1) {
chargeur(id_encours+1);
} else {
chargeur(0);
}
};
Maintenant, je vais vous présenter un événement pratique dans notre cas de la classe Sound : onSoundComplete
Cet événement se déclenche, comme son nom l'indique, quand une musique arrive à sa fin.
On aura donc :
Code : ActionScript
musique.onSoundComplete = function() {
if (id_encours<total-1) {
chargeur(id_encours+1);
} else {
chargeur(0);
}
};
Maintenant, on peut constater que le code est le même que pour le bouton suivant, on peut donc lier les deux pour
gagner un peu de place :
Code : ActionScript
suivant.onRelease = musique.onSoundComplete =function() {
if (id_encours<total-1) {
chargeur(id_encours+1);
} else {
chargeur(0);
}
};
Allez courage, on a déjà fait plus de la moitié
Le volume - startDrag() notre ami
La gestion du volume n'est en elle même pas bien complexe. Si vous vous souvenez de la méthode setVolume(), il n'y
devrait pas y avoir de problème.
Sur la scène vous pouvez voir une petite barre de volume nommée volume (les noms simples sont toujours les meilleurs
). Si vous rentrez dans ce clip, vous trouverez le petit curseur qui s'appelle, allez, essayez de deviner ... OUI ! :
curseur.
Bref, comme d'habitude, on va devoir lui appliquer une petite règle de trois qui va nous permettre de transformer sa
position en volume. Tout à gauche (_x = 0) le volume est nulle, tout à droite (_x = 60) le volume est à fond.
Les positions 0 et 60 pixels sont les positions de curseur à l'intérieur de volume, pas sa vraie position sur
152 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
scène. Et heureusement pour nous ! Ca nous simplifie grandement le travaille !
Pour restreindre curseur dans ses déplacements, on a plusieurs solutions. on peut lui appliquer un
onEnterFrame pour suivre la souris sur l'axe des abscisses et se limiter de 0 à 60. Une solution énormément
plus simple est d'utiliser la fonction startDrag() qui fait tout ça à elle toute seule. startDrag(souris_centrée?,
agauche, enhaut, adroite, enbas) demande pas mal d'argument, le premier précise si la souris doit être
verrouillée sur le centre du clip, les 4 suivants demandent les positions limites du clip. Quand vous appelez
cette méthode pour un clip, il suivra alors la souris, tout bêtement.
Voyons si vous avez bien compris comment fonctionnait startDrag() et donner moi le code qui ira dans
volume.curseur.onPress
Solution :
Secret (cliquez pour afficher)
Code : ActionScript
volume.curseur.onPress = function() {
this.startDrag(false, 0, 0, 60, 0);
};
On a en effet pas besoin que le curseur soit verrouillé au centre du clip, le curseur ne doit ni allé vers le haut, ni vers le
bas. Il est limité à 0 à gauche et à 60 à droite !
Le problème, c'est que une fois la souris relâchée, le curseur continue de la suivre. Il faut donc utiliser la méthode
stopDrag() qui ne demande par d'argument et qui arrêtera la poursuite. Appelez cette fonction quand la souris est
relâchée, que ce soit à l'intérieur ou à l'extérieur du clip !
Code : ActionScript
volume.curseur.onRelease = volume.curseur.onReleaseOutside=function () {
this.stopDrag();
};
Il manque encore le plus utile, c'est à dire le onEnterFrame qui va ajuster le volume en fonction de la position. Je vais
supposer que vous connaissez la proportionnalité (soit par la logique, soit par l'école, soit par les exemples que j'ai
donné jusque maintenant), c'est donc à vous de jouer
Secret (cliquez pour afficher)
Code : ActionScript
volume.curseur.onEnterFrame = function() {
musique.setVolume((this._x*100)/60);
};
Voilà donc le petit récapitulatif de la partie sur la gestion du volume :
Code : ActionScript
153 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
//-// GESTION DU VOLUME
//-volume.curseur.onEnterFrame = function() {
musique.setVolume((this._x*100)/60);
};
volume.curseur.onPress = function() {
this.startDrag(false, 0, 0, 60, 0);
};
volume.curseur.onRelease = volume.curseur.onReleaseOutside=function () {
this.stopDrag();
};
Encore un peu de courage, tout fonctionne maintenant, il ne reste plus que les détails
L'ascenceur
Certes, ce ne sont que des détails, mais il vont nous prendre pas mal de temps
!
Commençons par créer deux fonction qui attachées à un onEnterFrame feraient apparaître et disparaître
progressivement le clip :
Code : ActionScript
apparition = function () {
this._alpha += 5; // On le fait apparaitre de 5 à chaque image
this._visible = true; // On le rend visible au cas où il aurait été rendu invisible
if (this._alpha>=100) { // Une fois complétment affiché
delete this.onEnterFrame; // On supprime l'événement
}
};
disparition = function () {
this._alpha -= 5;
if (this._alpha<=0) {
this._visible = false;
delete this.onEnterFrame;
}
};
Le code des deux fonctions n'est pas très compliqué.
Le reste va être plus dur. Si vous ouvrez le clip ascenseur, vous trouverez en haut un clip haut et en bas un clip ... bas !
On va ajouter des actions à ces deux boutons pour faire respectivement descendre et monter la liste.
Je vais vous montrer pour haut, et vous extrapolerez pour bas.
On commence par les événement "presque" vides :
Code : ActionScript
ascenceur.haut.onPress = function() {
this.onEnterFrame = function() {
// Notre code
};
};
ascenceur.haut.onRelease = ascenceur.haut.onReleaseOutside=function () {
delete this.onEnterFrame;
};
On va donc créer une événement onEnterFrame quand on appuiera sur le bouton. Il faut rajouter le code qui fera
monter les lignes si la ligne numéro 0 n'est pas en dessous de 95 pixels.
Code : ActionScript
154 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
ascenceur.haut.onPress = function() {
this.onEnterFrame = function() {
if (ligne_0._y<95) {
// Le code
}
};
};
Nous allons donc devoir créer une boucle, qui va effectuer sur chaque ligne_X avec X variant de 0 à (total-1) une
augmentation de la coordonnée _y :
Code : ActionScript
ascenceur.haut.onPress = function() {
this.onEnterFrame = function() {
if (ligne_0._y<95) {
for (var i = 0; i<total; i++) {
_root['ligne_'+i]._y += 5;
}
}
};
};
Il ne reste plus qu'à rajouter deux conditions qui vont utiliser les deux fonctions écrites en début de partie pour faire
apparaître les lignes selon qu'elle sortent ou qu'elle rentrent dans le cadre :
Code : ActionScript
ascenceur.haut.onPress = function() {
this.onEnterFrame = function() {
if (ligne_0._y<95) {
for (var i = 0; i<total; i++) {
_root['ligne_'+i]._y += 5;
if (_root['ligne_'+i]._y>=95) {
_root['ligne_'+i].onEnterFrame = apparition;
}
if (_root['ligne_'+i]._y>=271) {
_root['ligne_'+i].onEnterFrame = disparition;
}
}
}
};
};
Je vous laisse donc faire la même chose pour le bouton bas, n'hésitez pas à tâtonner, à regardez à la règle les positions
limites des clips ...
Le code complet pour la gestion de l'ascenseur est ci-dessous :
Code : ActionScript
155 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
//-// GESTION DE L'ASCENCEUR
//-apparition = function () {
this._alpha += 5;
this._visible = true;
if (this._alpha>=100) {
delete this.onEnterFrame;
}
};
disparition = function () {
this._alpha -= 5;
if (this._alpha<=0) {
this._visible = false;
delete this.onEnterFrame;
}
};
ascenceur.haut.onPress = function() {
this.onEnterFrame = function() {
if (ligne_0._y<95) {
for (var i = 0; i<total; i++) {
_root['ligne_'+i]._y += 5;
if (_root['ligne_'+i]._y>=95) {
_root['ligne_'+i].onEnterFrame
}
if (_root['ligne_'+i]._y>=271) {
_root['ligne_'+i].onEnterFrame
}
}
}
};
};
ascenceur.haut.onRelease = ascenceur.haut.onReleaseOutside=function ()
delete this.onEnterFrame;
};
ascenceur.bas.onPress = function() {
this.onEnterFrame = function() {
if (_root['ligne_'+(total-1)]._y>271) {
for (var i = 0; i<total; i++) {
_root['ligne_'+i]._y -= 5;
if (_root['ligne_'+i]._y<=271) {
_root['ligne_'+i].onEnterFrame
}
if (_root['ligne_'+i]._y<=95) {
_root['ligne_'+i].onEnterFrame
}
}
}
};
};
ascenceur.bas.onRelease = ascenceur.bas.onReleaseOutside=function () {
delete this.onEnterFrame;
};
= apparition;
= disparition;
{
= apparition;
= disparition;
Et la source finale tant attendue, que j'ai même pris la peine de convertir au format Flash MX 2004 pour
que ceux qui ne se sont pas encore mis à jour puissent en profiter
Que rajouter sur ce TP ? Si ce n'est qu'il vous ouvre déjà pas mal de perspectives pour l'utilisation de Flash sur votre
site-web.
Soyez donc bien sûr que vous avez tout compris, car dans le chapitre prochain je considérerais ce que nous avons vu
comme un acquis et passerai plus rapidement sur les fonctions triviales Maintenant vous savez tout ! Les chapitres
suivants seront plus pointus et dévoileront des fonctions propres aux dernières versions de Flash
Partie 5 : Techniques complexes
Si vous avez tenu jusque là, vous connaissez à peu près tout ce qui est possible de faire avec les anciennes versions de
156 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Flash. Mais Flash a toujours été avant-gardiste, et intègre donc des technologies en pleine expansion comme le XML ou
l'upload de fichiers contrôlé.
Bref tout ce qui est nécessaire pour créer un projet Flash complexe !
Prérequis :
- Maîtriser très bien le logiciel (interface et Actionscript vu jusque là)
- Connaître suffisamment le PHP
But :
- Utilisation du XML avec Flash
- Envoie de fichiers
=> Galerie Photo !
Gestion du XML
Si vous avez un peu bourlingué sur le web ou même juste dans l'aide de Flash, vous avez du tomber au moins une fois sur
cet étrange acronyme : XML
Que se cache-t-il dans ces trois lettres, et en quoi peuvent-elles nous aider quand on programme une application en
Flash ?
Voilà la question à laquelle nous allons tenter de répondre !
Rappel sur le XML
XML est l'acronyme de Extensible Markup Language. En français, ça veut dire : langage de balise extensible. Vous allez
me dire que ça ne nous avance pas beaucoup, et vous n'avez pas tout à fait tort
!
En gros avec le XML on pourra enregistrer des informations qui seront rangées grâce à des balises.
Si vous voulez des infos sur le XML et sa structure, allez faire un tour sur le tuto : Le point sur XML. Moi
je passe directement à la suite
Pour pouvoir s'amuser nous allons prendre un petit exemple trivial de fichier XML :
Code : XML
157 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
<?xml version='1.0' encoding="UTF-8" ?>
<bibliotheque>
<livre isbn="2-02-022212-4">
<titre>Don Quichotte de la Manche</titre>
<auteur>Miguel De Cervantes</auteur>
<tome>1</tome>
</livre>
<livre isbn="2-02-022213-2">
<titre>Don Quichotte de la Manche</titre>
<auteur>Miguel De Cervantes</auteur>
<tome>2</tome>
</livre>
<livre isbn="2-07-037924-8">
<titre>Du côté de chez Swann</titre>
<auteur>Marcel Proust</auteur>
</livre>
<livre isbn="2-7116-0519-1">
<titre>De la recherche de la vérité</titre>
<auteur>Malebranche</auteur>
<tome>2</tome>
</livre>
<livre isbn="2-07-032325-0">
<titre>La psychanalyse du feu</titre>
<auteur>Gaston Bachelard</auteur>
</livre>
</bibliotheque>
Pour l'instant, je vous demanderais d'enregistrer ce fichier XML dans le même dossier que votre animation, vous lui
donnerez comme nom : bibliotheque.xml
Chargement
On va encore utiliser une classe spéciale
Il s'agit, vous l'aurez deviné, de la classe XML
Comme d'habitude, on va commencer par l'instanciation :
Code : ActionScript
var bibliotheque:XML = new XML();
Ignorer les blancs
Intéressons nous à la propriété ignoreWhite de la classe XML. Non elle n'a rien de raciste
, elle est au contraire très
utile !
Si on la laisse à false (valeur par défaut), rien ne changera dans le fichier XML, si on la met à true, elle supprimera tous
les espaces, tabulations et autres retours à la ligne qui ne font pas partie d'un noeud texte !
En gros elle transformera :
Code : XML
<mon_xml>
<noeud_texte> salut les amis ! </noeud_texte>
<noeud_vide> </noeud_vide>
</mon_xml>
En
Code : XML
<mon_xml><noeud_texte> salut les amis ! </noeud_texte><noeud_vide /></mon_xml>
Elle n'a pas altéré le noeud contenant le texte, mais elle a simplifié le noeud qui ne contenait qu'un espace, supposant
alors qu'il était vide.
158 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Dans notre exemple de bibliotheque, on n'a aucun noeud contenant uniquement des espaces, on utilisera donc
ignoreWhite uniquement pour que vous vous rappeliez de cette propriété
Code : ActionScript
var bibliotheque:XML = new XML();
bibliotheque.ignoreWhite = true;
load() et onLoad()
En fait, on retrouve les mêmes méthodes qu'on utilisait avec la classe LoadVars et XML. Donc si vous vous souvenez bien
des chapitres précédents, le code ci-dessous ne devrait pas vous poser de problème :
Code : ActionScript
var bibliotheque:XML = new XML();
bibliotheque.ignoreWhite = true;
bibliotheque.onLoad = function(succes) {
if (succes) {
trace(this);
} else {
trace("Une erreur s'est produite");
}
};
bibliotheque.load("bibliotheque.xml");
Le ignoreWhite étant sur la valeur true, la fenêtre de sortie devrait vous afficher ça :
Code : XML
<?xml version='1.0' encoding="UTF-8" ?><bibliotheque><livre isbn="2-02-022212-4"><titre>Don
Quichotte de la Manche</titre><auteur>Miguel De
Cervantes</auteur><tome>1</tome></livre><livre isbn="2-02-022213-2"><titre>Don Quichotte de
la Manche</titre><auteur>Miguel De Cervantes</auteur><tome>2</tome></livre><livre
isbn="2-07-037924-8"><titre>Du côté de chez Swann</titre><auteur>Marcel
Proust</auteur></livre><livre isbn="2-7116-0519-1"><titre>De la recherche de la
vérité</titre><auteur>Malebranche</auteur><tome>2</tome></livre><livre
isbn="2-07-032325-0"><titre>La psychanalyse du feu</titre><auteur>Gaston
Bachelard</auteur></livre></bibliotheque>
Le fichier XML a donc bien été chargé dans l'objet bibliotheque, et nous allons voir comment l'exploiter !
Sachez qu'il existe d'autres façons de créer un objet XML dans Flash. Vous pourriez très bien charger le
fichier avec l'objet LoadVars et ensuite utiliser la méthode parseXML() pour le passer à un objet XML.
Une grande famille !
Un document XML peut se représenter sous la forme d'un arbre, c'est pour cela qu'on parle de noeuds entre les branches,
il y a des noeuds enfants et noeuds parents.
A l'intérieur de notre objet XML nommé bibliotheque, on va trouver des noeuds qui sont en fait chacun une instance de
la classe XMLNode, dont on va voir quelques propriétés et méthodes.
Le premier enfant
La propriété la plus basique est firstChild. Elle fait référence au premier enfant du noeud courant. Pour l'instant, dans
l'objet bibliotheque, on ne s'est encore placé dans aucun noeud, même pas le noeud racine matérialisé par les balises
<bibliotheque>[...]</bibliotheque>.
Pour voir ce qui se passe, changez donc le trace(this); par trace(this.firstChild);
Cela renvoie le tout premier noeud rencontré, qui se trouve être le noeud racine, c'est à dire tout ce qui se trouve entre
<bibliotheque>[...]</bibliotheque>, les balises inclues.
159 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Donc, en suivant cette logique, qu'elle serait la valeur de this.firstChild.firstChild ?
Le premier noeud de bibliotheque correspond au premier livre, cette variable vaudrait donc (en la remettant en forme
pour plus de lisibilité) :
Code : XML
<livre isbn="2-02-022212-4">
<titre>Don Quichotte de la Manche</titre>
<auteur>Miguel De Cervantes</auteur>
<tome>1</tome>
</livre>
Les frères, les soeurs et le cadet !
Voyons rapidement les autres propriétés du même acabit.
Le cadet
lastChild renvoit, à l'inverse de firstChild, le dernier noeud de la branche courante.
Par exemple this.firstChild.lastChild correspond au dernier livre de la liste.
Notez qu'on aurait très bien pu écrire this.lastChild.lastChild, qui aurait la même signification, car le
noeud racine est à la fois premier et dernier noeud de sa branche
Les frères et soeurs
Les anglais ont la chance d'avoir un mot qui veut dire "frères et soeurs", il s'agit de "sibling". On trouve ainsi une
propriété nextSibling qui retourne le noeud suivant sur la même branche que le noeud courant, c'est à dire un noeud
frère.
this.firstChild.firstChild correspondait au premier livre.
this.firstChild.firstChild.nextSibling correspond donc à son frère suivant, c'est à dire le second livre de la liste.
Et on peut continuer ainsi autant que vous le voulez. Par exemple, cette affreuse ligne renvoie au dernier livre de la
liste :
this.firstChild.firstChild.nextSibling.nextSibling.nextSibling.nextSibling
Il existe aussi la propriété previousSibling qui correspond au frère précédent.
Le parent
Là je vous ai montré les propriétés qui permettent de "descendre" dans la généalogie. Sachez qu'il existe aussi la
propriété parentNode qui permet de remonter au noeud parent.
Par exemple, this.firstChild.parentNode, revient au même que this.
Types et attributs
Les types
Chaque noeud possède un type précis auquel on peut accéder par la propriété nodeType.
Nous verrons seulement les 2 types les plus courants, vous trouverez le tableau complet des valeurs dans
l'aide de Flash
Intéressons nous au type du noeud racine :
Code : ActionScript
160 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
trace(this.firstChild.nodeType);
Ce qui nous renvoie 1, c'est à dire qu'il s'agit d'un noeud élément qui contient donc d'autres noeuds.
C'est aussi le type du premier noeud "livre", ainsi que de son premier noeud qui est "titre".
Cela peut paraître étonnant, car <titre>[...]</titre> contient du texte et pas d'autres éléments. En fait ActionScript
considère que ce qu'il y a un l'intérieur de balises est toujours un noeud, il faut donc aller encore au noeud enfant pour
trouver vraiment le texte !
Code : ActionScript
trace(this.firstChild.firstChild.firstChild); // Correspond au noeud "titre"
trace(this.firstChild.firstChild.firstChild.nodeType); // Renvoie 1
trace(this.firstChild.firstChild.firstChild.firstChild); // Correspond au texte à
l'intérieur de "titre"
trace(this.firstChild.firstChild.firstChild.firstChild.nodeType); // Renvoie 3, car le
noeud est textuel
Ce qui nous permet de constater qu'un noeud texte a le type 3.
Les attributs
Les attributs en XML sont les valeurs qu'on explicite à l'intérieur même d'une balise. Dans notre exemple, il s'agit du
numéro ISBN qui est présent dans chaque balise "titre".
Pour récupérer ce numéro, il faut utiliser la propriété attributes, qui ne retourne non pas un tableau des attributs du
noeud, mais un objet avec les attributs comme propriété.
Pour accéder à l'ISBN du premier livre, il faudra donc taper :
Code : ActionScript
trace(this.firstChild.firstChild.attributes.isbn);
XML tabulaire
Un tableau !
Rassurez vous, pour naviguer dans notre document XML, il existe une propriété beaucoup plus simple ! Elle renvoit un
tableau de tous les noeuds composant la branche courante.
Dans notre exemple, le code ci-dessous renvoit tous les noeuds "livre", chacun dans une cellule du tableau :
this.firstChild.childNodes
On peut donc accéder au premier livre de cette façon : this.firstChild.childNodes[0]
Avouez que c'est tout de même plus simple ?
Maintenant, petit exercice tout simple, faites moi apparaître dans la fenêtre de sortie tous les titres des livres !
Secret (cliquez pour afficher)
161 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
var bibliotheque:XML = new XML();
bibliotheque.ignoreWhite = true;
bibliotheque.onLoad = function(succes) {
if (succes) {
var livres:Array = this.firstChild.childNodes;
for (var i=0;i<livres.length;i++) {
trace(livres[i].firstChild.firstChild);
}
} else {
trace("Une erreur s'est produite");
}
};
bibliotheque.load("bibliotheque.xml");
Comme vous le voyez, pour simplifier la boucle, j'ai créé une référence au tableau des livres que j'ai justement appelé
livres.
Vous vous demandez peut-être pourquoi j'ai écrit deux fois firstChild pour afficher le titre :
En fait, comme nous l'avons vu tout à l'heure, quand on parle de noeud, on comprend les balises qui le matérialisent
avec. Or nous on ne veut pas les balises <titre>[...]</titre> dans notre fenêtre de sortie. On rajoute donc un firstChild
qui fait référence au noeud dit "texte", c'est à dire au contenu du noeud.
Dans le code ci-dessus, j'ai fait une "erreur" au niveau du typage des variables. En fait, il ne faut pas
oublier que firstChild ne renvoie pas une chaîne de caractères, mais un objet XMLNode. Il faut donc rajouter
nodeValue, qui va renvoyer la valeur sous forme d'une chaîne. J'aurais donc du écrire
trace(livres[i].firstChild.firstChild.nodeValue);
Même si dans le cas d'un trace() on s'en fiche, pour d'autres utilisations, il est préférable de respecter le type
des variables !
Exerice de style
Un tuto de ce genre a toujours besoin d'un petit exercice de style pour pouvoir bien appliquer les connaissances !
On va essayer de combler un manque dans les outils que nous donne Flash pour manipuler le XML. Quand on utilise
childNodes, on a un tableau des noeuds enfants. Par exemple, si je suis dans le noeud "livre" et que je veux accéder au
"titre", il faudra que j'écrive childNode[0], car je sais que "titre" est le premier noeud. Le problème, c'est que "titre" ne
sera peut-être pas toujours le premier noeuds, d'ailleurs, dans un document XML, l'ordre est susceptible de changer ...
Vous allez donc créer une méthode pour la classe XMLNode qui va renvoyer un tableau de tous les noeuds qui ont un
certain nom de balise. On lui donnera le même nom que son homologue dans le langage Javascript :
getElementByTagName
Deux nouvelles connaissances pour réaliser cette méthode :
La propriété nodeName
Vous aurez besoin de la propriété nodeName qui renvoie le nom de la balise du noeud courant.
Ainsi, dans notre exemple this.firstChild.nodeName correspond à la chaîne de caractères "bibliothèque" qui est bien le
nom de notre noeud racine.
Les prototypes
J'ai bien précisé que vous alliez créer une méthode, et non pas une fonction (Une méthode est une fonction qui
appartient à une classe). On devra donc l'utiliser de cette façon :
Code : ActionScript
trace(un_noeud.getElementByTagName('nom_balise'));
Ce qui devra renvoyer un tableau des balises s'appelant "nom_balise" dans les enfants directs de un_noeud.
Il faut donc utiliser la notion de prototype, qui permet de rajouter des méthodes à une classe.
Je vous donne donc notre méthode, vide du code, il ne vous reste plus qu'à la compléter !
162 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Code : ActionScript
XMLNode.prototype.getElementByTagName = function(Tag:String):Array
// Le code
}
{
Sachez qu'à l'intérieur de cette méthode, this correspond au noeud qui portera la méthode et que Tag sera le nom de la
balise à chercher, passée en argument.
Je rappelle que la méthode doit renvoyer un tableau (d'où le :Array à la fin de la ligne) !
Je vous souhaite bonne chance pour cet exercice, car c'est l'un des plus compliqué depuis le début du
tutorial complet, car il fait appel à beaucoup de nouvelles notions. Je vous conseille donc de le faire sans
tricher, car si vous le finissez par vous même, c'est que vous aurez déjà assimilé des concepts très importants
en AS ! Si vous bloquez, utilisez l'aide de Flash !
Correction possible :
Secret (cliquez pour afficher)
Code : ActionScript
XMLNode.prototype.getElementByTagName = function(Tag:String):Array {
var bons_noeuds = new Array();
var tous_noeuds = this.childNodes;
for (var i:Number = 0; i<tous_noeuds.length; i++) {
noeud_courant = tous_noeuds[i];
if (noeud_courant.nodeName == Tag) {
bons_noeuds.push(noeud_courant);
}
}
return (bons_noeuds.length<=0)? null : bons_noeuds;
};
//-var bibliotheque:XML = new XML();
bibliotheque.ignoreWhite = true;
bibliotheque.onLoad = function(succes) {
if (succes) {
trace(this.firstChild.nodeName);
var livres:Array = this.firstChild.childNodes;
for (var i = 0; i<livres.length; i++) {
trace(livres[i].getElementByTagName('titre'));
}
} else {
trace("Une erreur s'est produite");
}
};
bibliotheque.load("bibliotheque.xml");
Avant de continuer, un bon conseil : travaillez à fond ce que vous venez de voir ! C'est très très important, y compris les
explications qui n'ont pas de rapport direct avec le XML, comme les prototypes par exemple !
Partie 6 : Annexes
Cette annexe comportera quelques astuces ou morceaux de code choisis.
Je ferais en sorte d'accumuler ici les astuces en suivant l'ordre du cours
Rotation d'un clip vers la souris
163 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Ce sujet est aussi traité dans le cours
La rotation d'un clip vers la position de la souris est un effet souvent utilisé. Il permet de faire bouger les yeux des
personnages, ou de créer des effets de traînés derrière la souris.
Dans notre exemple nous allons utiliser une flèche toute bête qui indique la position de la souris
Création du clip
Il vous faut d'abord dessiner une flèche.
Dessinez-là indiquant le côté droit de votre écran, c'est important pour la suite !
Important aussi : positionnez le point d'ancrage au milieu de la flèche, pour qu'elle puisse tourner autour de cet axe.
Transformer en clip que vous nommerez dans l'onglet propriété : flèche (tout bêtement)
Explication géométrique
Nous allons voir un peu plus en détail comment faire en sorte que la flèche se tourne vers la souris.
Pour cela, nous allons faire appel à vos connaissances en trigonométrie (sinus, cosinus, tangente ...). Si vous n'en avez
jamais entendu parlé, patientez un peu, votre prof de Maths vous montrera tout ça bien assez tôt
Plantons déjà le décors avec les données qu'on a :
164 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Maintenant, voyons si vous ne reconnaissez pas quelques chose de connu ...
Vous avez trouvé ?
La solution consiste à tracer un simple triangle rectangle :
Et là, vous devez reconnaître une formule trigonométrique, en français :
tangente (angle) = (côté opposé) / (côté adjacent)
Ce qui revient à écrire la formule sur le schéma.
Avec
Dy = _ymouse - this._y
Dx = _xmouse - this._x
165 sur 166
17/03/2007 22:16
Introduction à l'ActionScript - ActionScript / Flash - Lecture d'un tutori...
http://www.siteduzero.com/tuto-29-276-0-introduction-a-l-actionscript...
Une fois qu'on arrive à faire le lien avec son cours de Maths, ca paraît beaucoup plus simple
Le code
Bref. Nous avons l'explication mathématique, nous avons le clip fleche, maintenant passons au code
Nous connaissons déjà Dx et Dy, l'inconnu de l'équation est donc _rotation.
Le problème vient de la fonction tangente... Il faut utiliser la fonction réciproque qui correspond à Math.atan2 en Flash.
L'équation devient donc _rotation = Math.atan2(Dy/Dx);
Un dernier problème sur notre chemin, atan2 renvoie l'angle en radians et _rotation demande un angle en degrés.
Pour convertir en degrés, un angle connu en radian, il faut le diviser par PI / 180
On a donc enfin l'expression qu'on va écrire dans Flash (avec this correspondant au clip que l'on fait tourner):
Code : ActionScript
this._rotation = Math.atan2(_ymouse-this._y, _xmouse-this._x)/(Math.PI/180);
Et il nous faut utiliser l'événement onMouseMove ou onEnterFrame :
Code : ActionScript
fleche.onEnterFrame = function() {
this._rotation = Math.atan2(_ymouse-this._y, _xmouse-this._x)/(Math.PI/180);
}
Et sous vos yeux ébahis, le résultat :
Flèche dirigée par la souris
L'auteur du tutorial étant en prépa MPSI, il ne continuer le tutorial que ponctuellement (et rarement !)
166 sur 166
17/03/2007 22:16