Action Script

  • Uploaded by: Vincent ISOZ
  • 0
  • 0
  • January 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Action Script as PDF for free.

More details

  • Words: 41,020
  • Pages: 166
Loading documents preview...
Flash 5 - ActionScript Travaux Dirigés

Version 1.4 17 janvier 2002

Eric Schrafstetter

Table des mati` eres 1 Outils de base 1.1 Initialisation de variables . . . . . . . 1.2 Position souris . . . . . . . . . . . . . 1.3 Fenˆetres et navigateurs . . . . . . . . . 1.3.1 Fermer une fenˆetre . . . . . . . 1.3.2 Plein ´ecran . . . . . . . . . . . 1.4 Lecteur autonome . . . . . . . . . . . 1.5 Chargement . . . . . . . . . . . . . . . 1.5.1 Version ´el´ementaire . . . . . . . 1.5.2 Version avec % . . . . . . . . . 1.5.3 Barre de chargement . . . . . . 1.5.4 Chargement d’une biblioth`eque 1.5.5 Version 2 . . . . . . . . . . . . 1.6 Couleurs . . . . . . . . . . . . . . . . . 1.6.1 D´efinir . . . . . . . . . . . . . . 1.6.2 Al´eatoires . . . . . . . . . . . . 1.6.3 Remplissages transparents . . . 1.6.4 Effet de torche . . . . . . . . . 1.6.5 Jeux de couleurs . . . . . . . . 1.7 Jouer un fichier MIDI . . . . . . . . . 1.8 Cookies . . . . . . . . . . . . . . . . . 1.9 Boutons . . . . . . . . . . . . . . . . . 1.9.1 Bouton On/Off/Clignotant . . 1.9.2 Bouton transparent . . . . . . 1.9.3 D´eplacement d’objets . . . . . 1.10 Information . . . . . . . . . . . . . . . 1.10.1 Scroll sur texte . . . . . . . . . 2 La vid´ eo 2.1 Vid´eo 2.1.1 2.1.2 2.1.3 2.1.4

dans une fenˆetre s´epar´ee . Param`etres g´en´eraux pour Windows Media Player . QuickTime . . . . . . . . Real Video . . . . . . . . 1

. . les . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

6 6 7 7 7 7 8 8 8 9 9 10 11 12 12 12 12 12 13 14 16 18 18 19 20 21 21

. . . . vid´eos . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

22 22 23 23 23 24

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

` TABLE DES MATIERES

Eric Schrafstetter

2.2 2.3 2.4 2.5 2.6

2.7

2.8

QuickTime dans Flash . . . . . . . . . Le cas des fichiers AVI . . . . . . . . . MPG et autres effets sp´eciaux . . . . . Poser 4 . . . . . . . . . . . . . . . . . Real Player . . . . . . . . . . . . . . . 2.6.1 .smil . . . . . . . . . . . . . . . 2.6.2 RealEncoder/RealProducer G2 2.6.3 Un exemple . . . . . . . . . . . 2.6.4 Cr´eer un vrai .rm . . . . . . . . Streaming . . . . . . . . . . . . . . . . 2.7.1 Avec Real Player . . . . . . . . 2.7.2 Le streaming sous Flash . . . . Questions/R´eponses . . . . . . . . . . 2.8.1 Son QuickTime . . . . . . . . . 2.8.2 Convertir un .swf en .avi . . . . 2.8.3 Une suite ? . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

24 25 25 26 27 27 27 27 28 29 29 30 30 30 31 31

3 Maths 3.1 Nombres al´eatoires . . . . . . . . 3.1.1 M´elanges . . . . . . . . . 3.2 3D . . . . . . . . . . . . . . . . . 3.2.1 Matrices de rotation . . . 3.2.2 Boules dans l’espace . . . 3.3 D´eformation d’un triangle (Partie 3.4 Anaglyphes g´eom´etriques 3D . . 3.5 Perspectives frontales et obliques 3.5.1 M´ethode pratique . . . . 3.5.2 Les formules... . . . . . . 3.5.3 Manipulation d’un cube .

. . . . . . . . . . 1) . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

33 33 33 33 33 34 36 41 44 44 44 47

4 Physique 4.1 Collision ´elastique de 2 boules . 4.1.1 Rappels . . . . . . . . . 4.1.2 La th´eorie . . . . . . . . 4.1.3 Application . . . . . . . 4.2 Vitesse d’un objet avec freinage 4.3 Fil ´elastique . . . . . . . . . . . 4.4 Tableau blanc . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

52 52 52 52 55 58 60 61

5 Visualisation 5.1 Powerpoint . . . . . . . . . . . . 5.2 Sons, Cookies et Diaporamas . . 5.2.1 Partie HTML - javascript 5.2.2 Partie Images . . . . . . . 5.2.3 Partie Flash . . . . . . . . 5.3 Visionneuse . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

63 63 63 64 66 67 68

Travaux dirig´es d’ActionScript

2

` TABLE DES MATIERES

Eric Schrafstetter

5.4

. . . . . . . . . . . . 2) . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

71 71 71 74 77 79 80 80 82

6 Outils de conversions 6.1 Bitmap vers Vectoriel . . . . . . . 6.2 Images vers swf . . . . . . . . . . . 6.3 Diaporama en swf . . . . . . . . . 6.3.1 Introduction . . . . . . . . 6.3.2 Quelques remarques . . . . 6.3.3 Les indispensables ! . . . . . 6.3.4 Exemple d’utilisation . . . . 6.4 Films vers swf . . . . . . . . . . . . 6.5 Microsoft Office . . . . . . . . . . . 6.5.1 La barre de dessin . . . . . 6.5.2 Powerpoint vers Flash . . . 6.5.3 Flash vers PowerPoint . . . 6.5.4 Powerpoint-Flash ou PDF ?

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

83 83 85 85 85 85 86 86 86 86 86 87 89 89

7 SmartClips 7.1 Variateur . . . . . . . 7.2 Fenˆetres volantes . . . 7.3 Biblioth`eque commune 7.4 SmartClip Calendrier .

5.5 5.6 5.7 5.8

Cr´eer un QCM . . . . . . . . . 5.4.1 Les questions . . . . . . 5.4.2 Le QCM sous Flash . . Camembert . . . . . . . . . . . Panorama 360 . . . . . . . . . . Rotation autour d’un objet . . 360◦ autour d’un objet (version 5.8.1 Changement de curseur 5.8.2 L’objet . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

93 93 95 96 97

8 Jeux 8.1 Le morpion . . . . . . . . . . . 8.2 Jeu de l’Hexagone . . . . . . . 8.2.1 Les probl`emes . . . . . . 8.2.2 Le clip pion . . . . . . . 8.2.3 Le clip plateau . . . . . 8.2.4 Sc`ene principale . . . . 8.3 Le tangram . . . . . . . . . . . 8.4 Votre Tetris . . . . . . . . . . . 8.4.1 La brique de base . . . . 8.4.2 Les pi`eces . . . . . . . . 8.4.3 Le plateau . . . . . . . . 8.4.4 La pi`ece suivante . . . . 8.4.5 Le bouton commande . 8.4.6 Suppression d’une ligne

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

101 101 104 104 106 107 108 109 111 111 112 112 113 113 116

Travaux dirig´es d’ActionScript

. . . .

. . . .

. . . .

. . . .

3

` TABLE DES MATIERES

Eric Schrafstetter

8.5

8.6

8.7

8.8

8.4.7 Le tempo . . . . . . . . . . . . . . . . 8.4.8 Niveaux et score . . . . . . . . . . . . 8.4.9 Compl´ements . . . . . . . . . . . . . . 8.4.10 Le programme complet . . . . . . . . Les machines de Turing . . . . . . . . . . . . 8.5.1 Alan Turing . . . . . . . . . . . . . . . 8.5.2 Description de la machine . . . . . . . 8.5.3 Exemple de machine . . . . . . . . . . 8.5.4 Simulation sous Flash . . . . . . . . . 8.5.5 Cr´eation de programmes . . . . . . . . 8.5.6 Chargements . . . . . . . . . . . . . . 8.5.7 Conversions . . . . . . . . . . . . . . . 8.5.8 La machine . . . . . . . . . . . . . . . 8.5.9 Version AUTO . . . . . . . . . . . . . 8.5.10 Le fichier Flash fourni . . . . . . . . . 8.5.11 Les fichiers txt . . . . . . . . . . . . . Jeux de plateforme . . . . . . . . . . . . . . . 8.6.1 Danger-S´ecurit´e . . . . . . . . . . . . . 8.6.2 L’ennemi . . . . . . . . . . . . . . . . 8.6.3 Actions simultan´ees : Touche - Souris 8.6.4 Actions simultan´ees : Touche - Touche Le Top10 (version MySQL) . . . . . . . . . . 8.7.1 Affichage du Top10 . . . . . . . . . . . 8.7.2 Proposer un score . . . . . . . . . . . S´ecurit´e . . . . . . . . . . . . . . . . . . . . . 8.8.1 Jouer Online . . . . . . . . . . . . . . 8.8.2 Mot de passe . . . . . . . . . . . . . . 8.8.3 ActionScript Viewer . . . . . . . . . .

9 PHP 9.1 Ming . . . . . . . . . . . . . . . 9.1.1 Tester un swf . . . . . . 9.1.2 Notions de base . . . . . 9.1.3 Dessiner . . . . . . . . . 9.1.4 Camembert 3D online . 9.1.5 D´eplacement . . . . . . 9.1.6 Texte . . . . . . . . . . 9.1.7 Morphing . . . . . . . . 9.1.8 Loadmovie . . . . . . . 9.2 Echange de variables . . . . . . 9.2.1 Exemple du poids id´eal 9.2.2 Compteur de visiteurs .

Travaux dirig´es d’ActionScript

4

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

117 118 118 119 123 123 124 124 125 125 126 126 128 129 130 131 131 131 132 134 135 136 136 137 138 138 140 140

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

141 141 142 142 143 148 150 152 153 154 156 156 157

` TABLE DES MATIERES

Eric Schrafstetter

10 C++ 10.1 Introduction . . . . . . . . . . . . . . 10.2 C++ vers Flash . . . . . . . . . . . . 10.2.1 Cr´eation de l’animation Flash 10.2.2 Cr´eation de l’interface C++ . 10.2.3 Ins´erer l’animation . . . . . . 10.2.4 Le programme . . . . . . . . 10.2.5 SetVariable . . . . . . . . . . 10.3 Flash vers C++ . . . . . . . . . . . . 10.3.1 Cr´eation de l’animation Flash 10.3.2 Cr´eation du programme C++

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

158 158 158 158 159 159 160 162 162 162 163

11 Liens 11.1 Forums Flash . . . . 11.2 Flash . . . . . . . . . 11.2.1 Sites Internet 11.2.2 Livres . . . . 11.3 PHP . . . . . . . . . 11.4 Ming . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

164 164 164 164 165 165 165

Travaux dirig´es d’ActionScript

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

5

. . . . . .

. . . . . .

. . . . . .

Chapitre 1

Outils de base Introduction ` a ce document Ces quelques pages sont, `a l’origine, un aide-m´emoire personnel de trucs et astuces d´ecouverts sur le net ou par moi-mˆeme. La pr´esentation des animations se fait sous forme de travaux dirig´es, c’est-`a-dire que vous ne pourrez voir le r´esultat que si vous faites les manipulations vous-mˆeme ! T´el´echargez les .fla sur le site de ce document et n’h´esitez pas `a m’encourager ou `a me donner des id´ees en envoyant un mail `a [email protected]. Je suppose que le lecteur a d’assez bonnes notions d’ActionScript et de math´ematiques, dans le cas contraire certaines explications vous paraˆıtront certainement obscures. . . Ce document est une version 1.4 revue, corrig´ee et augment´ee, n’h´esitez pas `a me communiquer vos remarques et suggestions pour une version 1.5 ! A titre indicatif, ce document a ´et´e cr´e´e en LATEXet export´e au format PDF grˆace `a dvipdfm.

1.1

Initialisation de variables

Pour n’initialiser des variables qu’une seule fois dans une image cl´e, cr´eez un clip vide et placez-en une occurrence sur la sc`ene principale avec l’action : onClipEvent (load) { ..initialisation des variables ... } onClipEvent (enterFrame) { ..suite du programme ... }

6

Eric Schrafstetter

1.2

CHAPITRE 1. OUTILS DE BASE

Position souris

Sur la sc`ene principale : – Placez une zone de texte avec les options suivantes : Texte dynamique et Variable = x. – Faˆıtes un copier/Coller de cette zone de texte et remplacez x par y – Cr´eez un clip vide (CTRL+F8 et nom = drag) que vous placerez n’importe o` u sur la sc`ene. – Associez l’action suivante au clip drag : onClipEvent (load) { startDrag (""); } onClipEvent (enterFrame) { _root.x=this._x; _root.y=this._y; }

1.3

Fenˆ etres et navigateurs

1.3.1

Fermer une fenˆ etre

Pour quitter un programme Flash visualis´e dans une fenˆetre en utilisant un bouton, vous pouvez : 1. Cr´eez l’apparence du bouton qui servira `a quitter le programme en fermant la fenˆetre. 2. Placez une occurrence de ce bouton sur la sc`ene et lui associer l’action : on (press) { getURL ("Javascript: self.close()"); } La commande fscommand ("quit"); ferme la projection.

1.3.2

Plein ´ ecran

Pour afficher votre animation Flash en plein ´ecran : 1. Dans les param`etres de publication HTML, choisir 100% pour la hauteur et la largeur. 2. Cr´eez la page HTML ci-dessous, o` u essai.html est le nom du fichier HTML publi´e par Flash. <script>
Travaux dirig´es d’ActionScript

7

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

taille=’resizable=no,directories=no, menubar=no,scrollbars=no,’; taille+=’width=’+screen.width+’,height=’+screen.height; Nouveau=window.open(chemin,"voir",taille); Nouveau.moveTo(-5,-25); } //--> Lancer l’animation Pensez `a ajouter un bouton dans votre animation permettant de fermer l’animation ! (voir paragraphe pr´ec´edent).

1.4

Lecteur autonome

Pour masquer certaines options du bouton droit lorsqu’un programme Flash est lanc´e en mode autonome, faire : fscommand ("fullscreen", "true"); fscommand ("allowscale", "false"); fscommand ("showmenu", "false"); – La premi`ere ligne permet de mettre l’affichage en plein ´ecran – La seconde ligne assure que l’´echelle de l’animation ne sera pas modifi´ee – La derni`ere ligne efface le menu contextuel (sauf le ”A propos de Flash Player”)

1.5 1.5.1

Chargement Version ´ el´ ementaire

Avant de lancer le programme proprement dit, vous voudriez ˆetre sˆ ur que tous les ´el´ements n´ecessaires ont bien ´et´e charg´es. Imaginons par exemple que pour lancer la sc`ene go, l’animation doit avoir charg´e les donn´ees jusqu’`a la sc`ene fin image 20. On pourra utiliser la m´ethode suivante : 1. Cr´eez un petit clip qui permettra de faire patienter l’internaute 2. Sur la sc`ene principale, mettre le clip `a l’image cl´e 1 3. A l’image 5, ins´erez une image cl´e avec l’action : ifFrameLoaded ("fin",20) { gotoAndPlay ("go",1); }

Travaux dirig´es d’ActionScript

8

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

4. A l’image 6, ins´erez une image cl´e avec l’action : gotoAndPlay (2);

1.5.2

Version avec %

1. Cr´eez un clip nomm´e charge et placez `a l’image 1 une zone de texte dynamique ayant pour nom chargement 2. Mettre une occurrence de ce clip `a l’image 1 de la sc`ene principale (ou sur une sc`ene sp´ecialement r´eserv´ee au chargement) et donner l’action suivante au clip : onClipEvent (load) { _root.gotoAndStop(1); taille = _root.getBytesTotal(); if (taille<1000) { unite = Math.floor(taille)+"bytes"; } else if (taille>1000000) { unite = Math.floor(taille/1000000)+"mb"; } else { unite = Math.floor(taille/1000)+"kb"; } } onClipEvent (enterFrame) { chargement = unite+" || " + Math.floor(_root.getBytesLoaded()/taille*100)+"%"; if (chargement == unite+" || 100%") { _root.gotoAndPlay(2); } } Lorsque le fichier .swf est charg´e, l’animation continue `a l’image 2 de la sc`ene principale. Dans le cas d’une sc`ene sp´ecialement r´eserv´ee au chargement, ne rien mettre apr`es l’image 1 de sorte que l’animation passera directement `a la sc`ene 2.

1.5.3

Barre de chargement

1. Cr´eez un clip nomm´e barre avec un rectangle allong´e sur l’image 1Utilisez la barre d’outils info pour placer le coin haut gauche du rectangle `a la position X=0 et Y=0 2. Placez une occurrence de ce clip sur la sc`ene principale et lui donner le nom ligne 3. Associez l’action suivante `a cette occurrence :

Travaux dirig´es d’ActionScript

9

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

onClipEvent (load) { taille = _root.getBytesTotal(); } onClipEvent (enterFrame) { chargement = Math.floor(_root.getBytesLoaded()/taille*100); this._xscale = chargement; if (chargement == 100) { _root.gotoAndPlay(2); } } 4. Placez une action stop(); `a la premi`ere image de la sc`ene principale. 5. Placez une grosse image (plusieurs Ko) `a l’image cl´e 2 de la sc`ene principale et une action stop(); 6. Lancez l’animation. L’image devrait apparaˆıtre rapidement. Faites alors D´eboguer - 14,4 puis Affichage- Afficher le train de lecture. Vous devriez maintenant voir la barre grandir.

1.5.4

Chargement d’une biblioth` eque

Il ne s’agit pas de charger une biblioth`eque pendant la cr´eation d’une animation (Fichier-Ouvrir comme une biblioth`eque) mais bien d’un t´el´echargement de symboles `a la vol´ee au cours de la lecture d’une animation. Par exemple, on peut imaginer un joueur ayant la possibilit´e de charger en direct les pi`eces d’un puzzle choisi `a l’´ecran, ceci afin d’´eviter d’avoir un fichier .swf trop volumineux et de pouvoir actualiser la base de donn´ees. 1. Ouvrez une nouvelle animation et enregistrez-la sous le nom de piece.fla 2. Cr´eez un clip repr´esentant par exemple un rectangle 3. Ouvrez la biblioth`eque de l’animation et faire Bouton droit - Liaison sur le clip. Choisir : Exporter ce symbole et lui donner le nom p1 4. Reprendre les deux points pr´ec´edents en dessinant un disque et en l’exportant sous le nom p2 5. Compilez l’animation (remarquez qu’il n’y a absolument rien sur la sc`ene principale) pour cr´eer piece.swf 6. Ouvrez une nouvelle animation et enregistrez-la sous plateau.fla 7. Cr´eez un clip vide et mettre une occurrence nomm´ee jeu de ce clip sur la sc`ene principale 8. Cr´eez un bouton aillant ayant par exemple la forme d’une boule (peu importe) 9. Placez une occurrence de ce bouton sur la sc`ene principale, ´ecrire 1 dessus et associez-lui l’action : on (release) { jeu.loadMovie("pieces.swf"); }

Travaux dirig´es d’ActionScript

10

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

L’animation piece.swf va alors se charger dans le clip jeu lorsque l’on pressera le bouton 1. 10. Placez une autre occurrence du bouton, ´ecrire 2 dessus et lui associer l’action : on (release) { jeu.attachMovie("p1", "q1", 2); jeu.attachMovie("p2", "q2", 3); jeu.q1._x = 10; jeu.q1._y = 50; jeu.q2._x = 100; jeu.q2._y = 50; } En cliquant sur le bouton 2, on r´ecup`ere les objets p1 et p2 de l’animation pieces.swf. On cr´ee ensuite des occurrences q1 et q2 que l’on place sur la sc`ene. Utilisez la fonction removeMovieClip (jeu.q1); pour d´echarger l’occurrence q1.

1.5.5

Version 2

Au lieu de charger le .swf `a l’int´erieur d’un clip (voir exemple pr´ec´edent), vous pouvez le charger `a un certain niveau par la commande loadMovieNum("nom.swf",numero);. 1. Reprendre l’animation pieces.swf pr´ec´edente. 2. Ouvrir une nouvelle animation et mettre un stop(); `a l’instant 1. 3. Cr´eez un bouton quelconque et placez une occurrence sur la sc`ene principale, avec l’action : on (release) { loadMovieNum("pieces.swf",1); _level0.gotoAndStop(2); } L’animation piece.swf va alors se charger au niveau 1 (rappelons que _root est au niveau 0). 4. Placez une autre occurrence du bouton `a l’image cl´e 2 lui associer l’action : on (release) { for (i=1; i<=2; i++) { _level1.attachMovie("p"+i, "q"+i, i+1); _level1["q"+i]_x = 100; _level1["q"+i]._y = 100*i-100; } }

Travaux dirig´es d’ActionScript

11

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

_level1 acc`ede `a l’animation pieces.swf et .attachMovie pour r´ecup´erer les ´el´ements de sa biblioth`eque.

1.6 1.6.1

Couleurs D´ efinir

Consid´erons un clip d’occurrence r et une variable k contenant le texte k = "0xFF00AA". Pour mettre le clip r de la couleur k, faˆıtes : couleurobj = new Color("r");; couleurobj .setRGB(parseInt(k));

1.6.2

Al´ eatoires

Voici une m´ethode pour attribuer une couleur rgb (Red - Green - Blue) al´eatoire `a un objet. r = Math.floor(Math.random()*256); g = Math.floor(Math.random()*256); b = Math.floor(Math.random()*256); couleurobj = new Color("nom_clip"); couleurobj.setRGB(r << 16 | g << 8 | b);

1.6.3

Remplissages transparents

Pour les personnes n’ayant pas lu le manuel de base ”Utilisation de Flash” jusqu’`a la page 160, voici un moyen de cr´eer un d´egrad´e (lin´eaire ou radial) d’une couleur quelconque vers rien (alpha=0). Ceci peut cr´eer des effets tr`es int´eressants en pla¸cant un tel masque sur une image par exemple. 1. Cliquez sur le pot de peinture 2. Faites Fenˆetre - Panneaux - Remplir et Mixeur 3. Dans le panneau Remplir, choisir d´egrad´e lin´eaire et cliquez sur la seconde couleur (celle qui doit disparaˆıtre) 4. Dans le mixeur, mettre alpha `a 0 !

1.6.4

Effet de torche

1. Cr´eez un disque et remplissez-le avec un d´egrad´e radial (jaune au milieu et rouge au bord). Transformez ce disque en clip et en mettre une occurrence sur la sc`ene principale avec pour nom torche 2. Ins´erez un calque nomm´e Mask au dessus du calque de la torche. 3. Dessinez des rectangles, ovales `a l’image 1 de cette couche. Si vous ´ecrivez ´egalement du texte, s´eparez les lettres ( CTRL+B) 4. Faites Bouton droit sur le calque Mask et choisissez Masque

Travaux dirig´es d’ActionScript

12

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

5. Ajoutez l’action suivante `a l’image 1 du calque Mask : startDrag (_root.torche, true); stop(); 6. Compilez, lancez et d´eplacez la souris...

1.6.5

Jeux de couleurs

N´ecessite le logiciel Publisher ou PowerPoint . Si vous n’ˆetes pas graphiste ou avez peur de ne pas choisir des couleurs harmonieuses entre elles, voici une solution pour r´ecup´erer les jeux de Publisher ou PowerPoint. Avez-vous lu les pages 160 `a 164 du manuel ’Utilisation de Flash’ ? Pour ceux qui ont une version d’´evaluation de Flash, r´ecup´erez les manuels de r´ef´erence au format PDF sur http ://www.macromedia.com/support/flash/documentation.html. Avec Publisher 1. Lancez Publisher et quittez le catalogue pour avoir une feuille blanche 2. Dessinez 5 carr´es et choisissez un jeu de couleur (Format - Jeux de couleurs) 3. Cliquez maintenant sur le premier carr´e puis sur le pot de peinture (ou Format - Couleur de remplissage) et choisissez la premi`ere couleur de la s´erie de 6 propos´ees 4. Recommencez avec le second carr´e et la seconde couleur, etc. 5. Vous avez maintenant 5 carr´es de couleurs diff´erentes 6. S´electionnez les 5 carr´es en les entourant avec la souris puis Copier 7. Lancez Flash et Coller 8. Affichez le Nuancier par Fenˆetre - Panneau - Nuancier 9. Nous allons effacer toutes les couleurs du nuancier (pas de panique !) et mettre nos nouvelles couleurs. Remarquez la petite fl`eche I en haut `a droite de la fenˆetre du Nuancier. 10. Cliquez dessus et choisir ’Effacer les couleurs’ ! Oups ! Je vous sens pˆalir ! 11. Cliquez maintenant sur l’onglet Mixeur puis sur le rectangle en couleur. Utilisez la pipette pour r´ecup´erer la couleur du premier carr´e import´e de Publisher. 12. Cliquez sur la fl`eche I en haut `a droite de la fenˆetre du Mixeur puis ’Ajouter un nuancier’. 13. Recommencez avec les 4 autres couleurs 14. Affichez l’onglet Nuancier puis I - Enregistrez les couleurs. 15. Choisir le type ’Jeu de Couleurs Flash’ et lui donner le nom du jeu de Publisher.

Travaux dirig´es d’ActionScript

13

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

16. Recommencez depuis le d´ebut avec les diff´erents jeux qui vous int´eressent. 17. Enfin, faites Nuancier - I - Charger les couleurs par d´efaut pour retrouver toutes vos couleurs... 18. Si vous voulez charger un jeu de couleurs, faites : Nuancier - I - Remplacer des couleurs. 19. Pour ajouter des d´egrad´es, afficher la fenˆetre Remplir par Fenˆetre - Panneau - Remplir 20. Cr´eez un d´egrad´e lin´eraire ou radial puis cliquez sur la petite disquette en bas `a droite. Avec PowerPoint 1. Lancez PowerPoint, choisir une pr´esentation vierge et diapo blanche 2. Avec la barre de dessin, dessinez 6 carr´es sur la diapo 3. Faites Bouton droit sur la diapo et ’Appliquer un mod`ele...’ (ou Format Appliquer un mod`ele) et choisir un mod`ele quelconque 4. Cliquez sur le premier carr´e puis sur le pot de peinture et choisir parmi les 6 couleurs diff´erentes de noir ou blanc 5. Recommencez avec les 5 autres carr´es et les 5 autres couleurs 6. S´electionnez les 6 carr´es et copiez-les 7. Lancez Flash. Si vous utilisez PowerPoint 2000 faites Edition - Collage Sp´ecial et choisissez Image (M´etafichier) sinon faites simplement Coller. 8. Suivre maintenant la proc´edure comme pour Publisher...

1.7

Jouer un fichier MIDI

Je ne parlerai pas de l’insertion de fichiers MP3 dans une animation Flash, c’est classique. En revanche, voici un exercice permettant par une animation Flash de lire ou de stopper un fichier MIDI (invisible `a l’´ecran). 1. Le principe est le suivant : Cr´eer un index.html contenant 2 frames ayant les noms anim pour l’animation Flash et lecteur pour le cadre qui contiendra le lecteur MIDI. 2. Voici le script de index.html <TITLE>Page d’accueil

Travaux dirig´es d’ActionScript

14

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

Il est grand temps de changer de navigateur ! 3. Le fichier blank.htm est ce que l’on imagine : <TITLE>Rien 4. T´el´echargez pour l’exercice un fichier MIDI quelconque et enregistrez-le dans le mˆeme dossier que index et blank (musicrobot.com). 5. Lancez Flash et enregistrez sous le nom son.fla 6. Cr´eez un bouton quelconque et placez 2 occurrences de ce dernier sur la sc`ene principale. 7. Au premier bouton, ajouter l’action : on (release) { fscommand ("joue", "nom.mid"); } o` u nom.mid est le nom du fichier `a jouer. 8. Au second bouton, ajouter l’action : on (release) { fscommand ("stop"); } 9. Ajouter une action stop(); `a l’image cl´e 1 de la sc`ene principale. 10. Aller dans les param`etres de publication puis, dans l’onglet HTML, choisir Flash avec FSCommand. 11. Publiez l’animation et ouvrez le fichier son.html cr´e´e dans le bloc-note. 12. Changez la fonction son_DoFSCommand par : function son_DoFSCommand(command,args) { if (command=="stop"){ parent.lecteur.location.href="blank.htm"; } if (command=="joue"){ var z=parent.lecteur.document; z.open(); if (navigator.appName == "Netscape") {

Travaux dirig´es d’ActionScript

15

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

z.write( "<embed src=" + args + " hidden=true autostart=true loop=true>"); } else { z.write(""); } z.close(); } } Ainsi, lorsque l’on presse le bouton joue, la fenˆetre lecteur est r´e´ecrite grˆace `a Javascript, en distinguant le type de navigateur. L’action stop efface la fenˆetre lecteur et le son s’arrˆete. Attention, si vous compilez `a nouveau votre animation Flash, le programme ci-dessus sera ´ecras´e ! Enfin, une derni`ere remarque, si vous voulez convertir un fichier MIDI en MP3, vous pouvez utilisez Wingroove (shareware).

1.8

Cookies

Nous allons cr´eer une animation qui demande un nom puis l’enregistre dans un cookie lorsque l’on clique sur un bouton. 1. Cr´eez une animation vide et enregistrez-la sous le nom cookie.fla 2. Cr´eez une zone de texte de saisie et nommez-l`a nom. 3. Placez l’action suivante `a l’image 1 : getURL ("javascript:getCookie();"); 4. Cr´eez un bouton quelconque et placez-le `a cˆot´e de la zone de texte. Donnez l’action suivante au bouton : on (release) { getURL("javascript:setCookie();"); } Les fonctions getCookie() et setCookie() ´etant d´efinies dans la page HTML (voir ci-dessous). 5. Publiez votre animation et ´editez le fichier source. Placez les fonctions ci-dessous dans la tˆete du document HTML. Les cookies avec Flash <SCRIPT LANGUAGE=JavaScript>
Travaux dirig´es d’ActionScript

16

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

var chaine="nom="+flashObj().GetVariable(’nom’)+ ";"; var expire = new Date("March 1, 2010"); expire = expire.toGMTString(); chaine = chaine + "expires=" + expire; document.cookie = chaine; } function getCookie() { if(document.cookie == ’’){ return; }else{ flashObj().SetVariable(’nom’,unescape(Recherche(’nom’))); } } function Recherche(name){ var chaine = document.cookie; var Premier = chaine.indexOf(name); if(Premier != -1) { Premier += name.length + 1; var Dernier= chaine.indexOf(’;’, Premier); if(Dernier == -1){ Dernier= chaine.length; } return chaine.substring(Premier, Dernier); } else { return ""; } }

function flashObj() { if(navigator.appName=="Netscape") { return document.embeds[0] } else { return window[’animation’] } } //--> 6. Dans le corps du document, donnez un nom `a votre animation grˆace `a la commande id. Par exemple, ici, nous lui donnons le nom animation.

Travaux dirig´es d’ActionScript

17

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

<param name=movie value="cookie.swf"> <param name=quality value=high> <param name=bgcolor value=#FFFFFF> <embed src="cookie.swf" swliveconnect=TRUE width="100%" height="100%" quality=high bgcolor=#FFFFFF type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/..."> 7. Lancez votre navigateur et ouvrez cookie.html. Il n’y a normalement aucun nom dans la zone de saisie. Tapez un nom et cliquez sur le bouton. 8. Effacez le nom puis actualisez la page, le nom r´eapparaˆıt. Pour voir les cookies d’un document, tapez dans la barre d’adresse : javascript:alert(document.cookie.split(’;’).join(’\n’))

1.9 1.9.1

Boutons Bouton On/Off/Clignotant

1. Cr´eez un clip avec 3 images cl´e nomm´ees on (image 1), off (image 2) et blink (image 3) 2. A l’image 1, dessinez l’image du bouton off 3. A l’image 2 et 3, celui du bouton on 4. Ins´erez une image cl´e vide `a l’instant 10 (ou moins pour un clignotement plus rapide) 5. Ins´erez une nouvelle couche nomm´ee Action et placez `a l’image 1 et 2 l’action stop(); 6. Ins´erez une image cl´e en 10 avec l’action gotoAndPlay(3)

Travaux dirig´es d’ActionScript

18

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

Sur la sc`ene principale, placez une occurrence de ce clip et lui donner le nom boutonPour voir par exemple le bouton sur on, utilisez l’action : _root.bouton.gotoAndPlay("on");

1.9.2

Bouton transparent

Lorsque vous voulez rendre une partie de l’´ecran sensible `a l’action de la souris, vous placez un bouton transparent dont la zone du cliqu´e couvre cette partie. – Cr´eez un symbole bouton nomm´e bouton – Ne rien mettre dans les images Haut, Dessus et Abaiss´ e – Dessinez une forme pour l’image Cliqu´ e – Revenez sur la sc`ene principale et placez une occurrence du bouton. – Lancez l’animation. L’´ecran reste vide mais une zone est devenue sensible au passage de la souris. Astuce Pour ´eviter de voir apparaˆıtre la main au dessus de la zone sensible, cr´eez un clip et placez le bouton dedans ! 1. Cr´eez un bouton bouton avec un rectangle sur haut et Cliqu´ e 2. Cr´eez un clip et mettre une occurrence du bouton bouton `a la premi`ere image 3. Ajouter l’action suivante au bouton : on (press) { _root.press = 1; } on (release, releaseOutside) { _root.press = 0; } 4. Placer une occurrence du clip sur la sc`ene principale et lui affecter l’action : onClipEvent (load) { startDrag (this, true); } Ainsi, lorsque l’animation d´emarre, le clip devient glissable et suit les mouvements de la souris. La variable press permet de savoir si le bouton est press´e (1) ou non (0). 5. Sur la sc`ene principale, dessinez une zone de texte dynamique et affectezlui le nom de variable x 6. Cr´eez un nouveau clip vide nomm´e controles. Placez une occurrence sur la sc`ene principale avec l’action : onClipEvent (enterFrame) { if (_root.press==1) { _root.x++;

Travaux dirig´es d’ActionScript

19

Eric Schrafstetter

CHAPITRE 1. OUTILS DE BASE

} } 7. Lancez l’animation et pressez le bouton gauche de la souris, le compteur augmente. Relˆachez, il s’arrˆete.

1.9.3

D´ eplacement d’objets

– Cr´eez un rectangle et transformez-le en clip ayant pour nom rect. – Placez une occurrence de ce clip sur la sc`ene principale et lui donner le nom rect1

Action sur l’image 1 for (i=2; i<=10; ++i) { duplicateMovieClip ("rect1", "rect"+i, i); this["rect"+i]._y += (rect1._height*(i-1)); r = Math.floor(Math.random()*255); g = Math.floor(Math.random()*255); b = Math.floor(Math.random()*255); colourobj = new Color("rect"+i); colourobj.setRGB(r << 16 | g << 8 | b); } stop(); On duplique 9 fois le clip rect1 en leur donnant les noms ”rect”+i. La m´ethode Color.setRGB sp´ecifie la couleur de l’objet.

Action sur le clip rect1 onClipEvent (mouseDown) { // La souris touche-t-elle le clip en pressant ? if (this.hitTest(_root._xmouse, _root._ymouse)) { // Met au 1er plan this.swapDepths(10); // Le rectangle suit la souris startDrag (""); } } onClipEvent (mouseUp) { stopDrag (); } Lorsque vous pressez un rectangle, vous pouvez d´eplacer —startDrag(””)— et celui-ci est plac´e au premier plan —this.swapDepths(10)—D`es que vous relˆachez la souris, le rectangle se pose —stopDrag—.

Travaux dirig´es d’ActionScript

20

Eric Schrafstetter

1.10

Information

1.10.1

Scroll sur texte

CHAPITRE 1. OUTILS DE BASE

Voici un premier moyen de cr´eer un scroll sur un texte : 1. Cr´eez un bouton bouton avec une petite fl`eche dirig´ee vers le haut comme apparence 2. Cr´eez une zone de texte dynamique avec pour nom de variable TexteEcran. Mettre en forme cette zone (choix de la couleur, de la police...). 3. Ins´erez une occurrence de bouton (qui servira `a faire d´efiler le texte vers le haut) 4. Ins´erez une seconde occurrence de bouton en utilisant l’outil de transformation pour faire pivoter l’image de 180◦ et avoir la fl`eche dirig´ee vers le bas. 5. Cr´eez une couche action sur la sc`ene principale et mettre en 1 une image cl´e avec l’action : TexteAide = "BIENVENUE...#MERCI DE ...#SUITE DE L\’AIDE..."; Texte2 = new Array(); Texte2=String(TexteAide).split("#"); TexteEcran=Texte2.join(chr(13)); stop(); Vous ´ecrivez votre texte d’aide dans la variable TexteAide avec le symbole # lorsque vous voulez retourner `a la ligne. La premi`ere fonction convertit le texte en tableau et la seconde fonction joint tous les ´el´ements avec le s´eparateur chr(13) qui est le code du retour chariot. 6. Associez au bouton `a la fl`eche vers le haut l’action : on (press) { if (TexteEcran.scroll > 1) { TexteEcran.scroll--; } } 7. Pour le bouton `a la fl`eche vers le bas : on (press) { if (TexteEcran.scroll < TexteEcran.maxscroll) { TexteEcran.scroll++; } }

Travaux dirig´es d’ActionScript

21

Chapitre 2

La vid´ eo 2.1

Vid´ eo dans une fenˆ etre s´ epar´ ee

Voici comment lancer des vid´eos `a partir d’une animation Flash : 1. T´el´echargez une vid´eo .avi (par exemple sur Fundelire.com) 2. Comme pour le paragraphe sur les fichiers MIDI, cr´eez une page nomm´ee index.html ayant le code : <TITLE>Page d’accueil Il est grand temps de changer de navigateur ! 3. Reprendre le fichier blank.htm du paragraphe sur les fichiers MIDI 4. Lancez Flash et enregistrez sous le nom lanceur.fla 5. Cr´eez un bouton quelconque et associez-lui l’action : on (release) { fscommand ("joue", "video.avi"); } o` u video.avi est le nom de votre fichier vid´eo. 6. Ajoutez l’action stop(); `a l’image cl´e 1 de la sc`ene principale. 7. Choisir param`etres de publication HTML avec FSCommand 22

´ CHAPITRE 2. LA VIDEO

Eric Schrafstetter

8. Publiez et remplacez lanceur_DoFSCommand par : function lanceur_DoFSCommand(command,args) { if (command=="joue"){ var z=parent.lecteur.document; z.open(); z.write( "<embed src="+args+" autostart=true loop=0> "); z.close(); } }

2.1.1

Param` etres g´ en´ eraux pour les vid´ eos

Commande ALIGN BORDER WIDTH HEIGHT SRC LOOP

2.1.2

Description Aligne la console (RIGHT, LEFT, TOP, BOTTOM) Largeur de la bordure (en pixels) Largeur de la vid´eo (en pixels) Hauteur de la vid´eo (en pixels) Adresse de la vid´eo Nombre de fois o` u la vid´eo est jou´ee (-1 = infini)

Windows Media Player

Commandes propres `a Windows Media Player (true par d´efaut) AUTOSTART, AUTOLOAD,CONTROLS

2.1.3

QuickTime

Commandes propres `a QuickTime (true par d´efaut) : AUTOPLAY, PLAYEVERYFRAME (joue vid´eo au fur et `a mesure) CONTROLLER, HREF , TARGET

Travaux dirig´es d’ActionScript

23

´ CHAPITRE 2. LA VIDEO

Eric Schrafstetter

2.1.4

Real Video

Pour Real Video, la commande CONTROLS peut prendre les valeurs suivantes : All, ControlPanel, InfoVolumePanel InfoPanel, Statusbar, Playbutton, Stopbutton Le script se composant de deux parties (une pour la vid´eo l’autre pour le contrˆole), voici un exemple de script : function son_DoFSCommand(command,args) { if (command=="joue"){ var z=parent.lecteur.document; z.open(); z.write(""); z.write("<EMBED SRC=’video.rm’ type=’audio/x-pn-realaudio-plugin’ "); z.write("CONSOLE=’Clip’ CONTROLS=’ImageWindow’"); z.write(" HEIGHT=240 WIDTH=320 AUTOSTART=false>"); z.write("
<EMBED type=’audio/x-pn-realaudio-plugin’ CONSOLE=’Clip’ "); z.write("CONTROLS=’Playbutton,Stopbutton’ HEIGHT=40 WIDTH=100 "); z.write("AUTOSTART=true>"); z.close(); } }

2.2

QuickTime dans Flash

L’exercice suivant va vous permettre de cr´eer des effets sp´eciaux `a partir d’une animation QuickTime. Il est essentiel de noter que le fichier de sortie ne sera pas un .swf mais un fichier QuickTime ! Flash n’est l`a ”que” pour cr´eer des effets et/ou ajouter de l’interactivit´e. 1. T´el´echargez ou cr´eez une animation QuickTime .mov. 2. Lancez Flash et enregistrez sous le nom effets.fla 3. Fichier - Importer puis choisissez le fichier .mov 4. Etendre la premi`ere image cl´e jusqu’`a la fin de l’animation QuickTime par F5 5. Ajoutez une nouvelle couche au dessus de celle r´eserv´ee `a la vid´eo 6. Cr´eez une petite animation, utilisez des effets alpha (pour voir la vid´eo au travers) 7. Dans les param`etres de publication, d´ecochez Flash (.swf) et cochez QuickTime (.mov)

Travaux dirig´es d’ActionScript

24

´ CHAPITRE 2. LA VIDEO

Eric Schrafstetter

8. Dans l’onglet QuickTime, choisir : Alpha = Transparent Alpha ; Calque = Au dessus ; Controleur = Standard et Fichier = Aplatir 9. Publiez et ouvrez l’explorateur windows pour lancer effets.mov.

2.3

Le cas des fichiers AVI

La manipulation est quasi-identique sauf qu’il faudra choisir Type = tous au moment de l’importation : 1. Lancez Flash, enregistrez l’animation sous le nom video.fla puis faites Fichier - Importer 2. Choisir Type = tous, s´electionnez votre animation .avi puis importez 3. Etendre par F5 jusqu’au nombre de frames du clip (les images apparaissent au fur et `a mesure) 4. R´eduire les dimensions de votre animation principale `a celle de la vid´eo (ce n’est pas obligatoire). 5. Ajoutez ´eventuellement une couche pour les effets sp´eciaux en Flash (voir QuickTime dans Flash) 6. Dans les param`etres de publication, d´ecochez Flash (.swf) et cochez QuickTime (.mov) 7. Choisir ´eventuellement quelques options dans l’onglet QuickTime (par exemple Contrˆoleur Standard pour avoir les boutons Play, Stop et Pause) 8. Publiez l’animation par MAJ+F12 9. Utilisez l’explorateur windows et lancez le .mov cr´e´e ! Remarque : C’est donc un moyen tr`es simple de convertir un .avi en .mov !

2.4

MPG et autres effets sp´ eciaux

Voici quelques outils pour cr´eer des effets sp´eciaux ou convertir des vid´eos : 1. Pour convertir des fichiers .mpg ou .avi en .avi avec des effets sp´eciaux, vous pouvez utilisez le logiciel gratuit VirtualDub. Voici un exemple de manipulation pour convertir un fichier .avi en noir et blanc : (a) Ouvrir un fichier vid´eo avec VirtualDub (b) Menu Video-Filter et Add pour choisir le filtre threshold. Quant au param`etre, choisissez par exemple 50% (`a ajuster ensuite) (c) Faites avancer le curseur pour visualiser les images et modifiez ´eventuel/lement le param`etre (d) Choisir Video - Full Processing Mode (e) File - Save AVI et enregistrez la video filtr´ee sous un nouveau nom

Travaux dirig´es d’ActionScript

25

´ CHAPITRE 2. LA VIDEO

Eric Schrafstetter

2. Vous pouvez donc ensuite convertir le fichier AVI en QT4 et le manipuler sous Flash. Cependant, si votre fichier comporte peu d’images, je vous conseille de t´el´echarger le logiciel gratuit AVIDecomposer qui permet de d´ecomposer une vid´eo AVI en une multitude d’images .jpg plus un fichier .wav pour le son ! Lancez ensuite Flash et importez la premi`ere imageFlash vous demande alors si vous d´esirez importer toute la suite (il voit tout le bougre !), dˆıtes oui. C’est la technique que j’ai utilis´ee pour cr´eer l’animation de la femme sur le site de ce documentLes images JPG ont ´et´e converties une `a une en Bitmap par l’outil Modification - Tracer Bitmap.

2.5

Poser 4

Il existe un plug-in qui permet de convertir une animation Poser en swf (que je ne connais pas). Voici un autre moyen de conversion (Tous les outils utilis´es sont gratuits (sauf Poser ! !)) : 1. T´el´echargez l’excellent logiciel de visualisation www.irfanview.com. 2. T´el´echargez et installez ras2vec (voir paragraphe sur le passage du bitmap au vectoriel) 3. Installez AVIDecomposer 4. Cr´eez une animation avec Poser 5. Choisir un affichage Silhouette CTRL+1, mettre fond du d´ecors en blanc et personnage en noir 6. Exportez au format .avi par Animation - Make Movie (D´esolez, je n’ai qu’une version d’´evaluation en Anglais) avec Quality = Current Display Settings. Faites OK puis choisir Trames non compress´ees. 7. Lancez AVIDecomposer puis File Name - Browse et choisir le fichier AVI cr´e´e. D´ecomposez la vid´eo. 8. Lancez IrfanView et File-Batch Conversion (ou tapez la lettre B) 9. S´electionnez tous vos fichiers puis Add et Work As - Batch Conversion 10. Output Format = BMP et Advanced Options - Change Color Depth = 2 colors (Black/White) 11. Choisir Use this Directory as Output puis Start pour d´emarrer la conversion des jpg en bmp noirs et blancs 12. Ouvrez une fenˆetre DOS dans le r´epertoire des fichiers BMP et tapez la commande : ras2vec -d -m *.bmp Vous avez maintenant des fichiers .emf 13. Lancez Flash et importez la premi`ere image image1.emf, Flash vous propose d’importer les autres. R´epondre oui. 14. Eventuellement s´eparez les dessins par CTRL+B et optimisez les lignes par CTRL+MAJ+ALT+C

Travaux dirig´es d’ActionScript

26

´ CHAPITRE 2. LA VIDEO

Eric Schrafstetter

2.6

Real Player

Nous utilisons RealPlayer 8 Basic, freeware t´el´echargeable (5Mo) sur real.com ou disponible sur beaucoup de CD-Rom gratuits de connexion `a Internet (Recherchez un fichier ayant pour nom rp8*). Ce player est en fait beaucoup plus qu’un simple lecteur, c’est plutˆot un navigateur qui n’aurait qu’un d´efaut... ne pas lire le HTML !

2.6.1

.smil

Le langage SMIL (Synchronized Multimedia Integration Language) permet de synchroniser des fichiers multim´edias sur Internet. Les fichiers vid´eos ´etant assez volumineux, ils sont encod´es de mani`ere `a pouvoir ˆetre ”stream´es”. Le ” stream ” ´etant le flux de donn´ees qui permet `a l’internaute de commencer `a visualiser la vid´eo avant que celle-ci ne soit compl`etement charg´ee. L’encodage peut se faire suivant au moins 3 technologies diff´erentes : – Real Audio et Real Video de Real Networks – Quicktime de Apple – ASF de Microsoft Real Player est capable d’utiliser un fichier Flash en tant que ressource au mˆeme titre que les fichiers audios, images ou fichiers textes. La vid´eo peut aussi ˆetre mise en forme dans un habillage en coh´erence avec les param`etres d´etect´es chez l’internaute spectateur. SMIL permet donc de synchroniser des flux Audio et Vid´eos en fonction des param`etres de chaque internaute. La technique Les fichiers SMIL sont des fichiers textes. De simples ´editeurs de textes sont suffisants pour faire du SMIL. En tant qu’extension de XML, elle utilise les mˆemes r`egles syntaxiques. Une page SMIL est compos´ee de 2 ´el´ements principaux : 1. Une entˆete qui d´efinira toutes les r´egions n´ecessaires a l’affichage des ´el´ements. 2. Un corps qui contiendra toutes les instructions de synchronisation.

2.6.2

RealEncoder/RealProducer G2

Les freewares RealEncoder 5.0 ou RealProducer G2 permettent de convertir facilement des fichiers .avi, .mov, .wav ou .au en .ra (Audio) ou .rm (Vid´eo). L’adresse sur le site officielle real.com m’´echappe mais vous trouverez facilement ce logiciel en tapant renc51.exe ou RealProducer G2 freeware (3,2 Mo) dans un moteur de recherche (par exemple sur www.google.fr). Prenez soin de passer le fichier t´el´echarg´e `a l’anti-virus ! Ce freeware permet ´egalement de capturer et transformer en .rm des images provenant d’une webcam ou d’une source externe (K7 VHS, TV...).

2.6.3

Un exemple

Travaux dirig´es d’ActionScript

27

´ CHAPITRE 2. LA VIDEO

Eric Schrafstetter

ATTENTION ! N’utilisez que des actions Flash 4, l’exportation au format RealPlayer n’est pas compatible avec ActionScript. Pour ne pas vous tromper, faites Fichier - Param`etres de publication puis dans l’onglet Flash, choisissez en bas Flash 4 et OK. Si vous ins´erez une action, ne prenez pas les fonctions surlign´ees en jaunes, ceux sont celles propres `a la version 5. Toujours dans l’onglet Flash, cliquez sur le bouton D´ efinir `a cˆot´e du Train Audio. Choisir Compression : Brut (Obligatoire) et Taux : 22kHz par exemple (44kHz ´etant de meilleure qualit´e). 1. Donnez `a l’animation les dimensions 200 × 200 pixels (Modification - Animation) 2. Importez un son (wav ou mp3) sous flash par Fichier - Importer 3. Ouvrez la biblioth`eque ( CTRL+L) et placez une occurrence du son sur la sc`ene. 4. Dans l’´echelle temporelle contenant le son, ´etendre par F5 jusqu’au temps 10 (par exemple). 5. Fenˆetre - Panneau - Son (ou bouton droit sur l’´echelle temporelle - Panneau - Son) et choisir Sync : En continu. C’est le seul format accept´e pour la publication. 6. Cr´eez une nouvelle couche et placez-y une animation quelconque (interpolation de forme par exemple). 7. Fenˆetre - Param`etres de publication. Choisir Real Player comme format d’exportation. Un onglet RealPlayer apparaˆıt alors. Cliquez dessus et choisir : – Exportation r´eglages Flash. Choisir 34Kps pour le taux (valeur classique pour les modems 56Kps) – Exportation Audio : SureStream = voix ou musique ou... Modem = 56K – Exportation SMIL (Vous pouvez ´egalement r´egler les propri´et´es du projet qui seront ´eventuellement visibles `a la publication de la page) Il faut bien voir que le fichier .smil cr´e´e n’est l`a que pour int´egrer l’animation Flash dans Real Player. Il n’y a donc aucune compression suppl´ementaire par rapport au .swf. Ouvrez le fichier .smil cr´e´e par Flash avec le bloc-notes pour voir sa structure.

2.6.4

Cr´ eer un vrai .rm

Cette fois on perd presque tout (interactivit´e, images vectorielles, clips...) mais on compresse fortement la vid´eo et le son pour former un unique fichier .rm (Real Movie) beaucoup plus petit que le .swf correspondant. Voici la manip : 1. Reprenez l’animation de la partie pr´ec´edente (Une piste son et une interpolation de forme par exemple). 2. Faites Fichier - Exporter l’animation et choisir Windows AVI. Choisir le Format vid´eo = Couleur 24 bits et le format Audio 44Kz Mono ou St´er´eo. Utilisez des trames non compress´ees pour avoir la meilleure qualit´e possible.

Travaux dirig´es d’ActionScript

28

´ CHAPITRE 2. LA VIDEO

Eric Schrafstetter

3. Vous r´ecup´erez en sortie un fichier .avi g´en´eralement assez gros. La manipulation est identique (choisir type=WAV) si vous d´esirez cr´eer un unique fichier contenant la piste sonore de votre animation. Lancez alors Real Encoder ou RealProducer G2 et choisissez Record From File - OK et Suivant. 4. Browse et retrouvez votre fichier .avi 5. Donnez ´eventuellement un titre, Auteur et Copyright 6. Choisissez 56K si c’est pour une diffusion sur le web 7. Les formats audios sont assez explicitent 8. Pour la qualit´e vid´eo, la premi`ere option (Smoothest Motion) est int´eressante s’il y a peu de mouvements (interview par exemple), la seconde (Sharpest Image) s’il y a beaucoup de mouvements et la derni`ere (Slide Show) affiche des images nettes mais saccad´ees. 9. Donnez un nom de sortie, par exemple video.rm 10. Options - Advanced Mode puis cliquez sur Settings... en bas `a droite. Choisir Total = 34 Kbps, ajustez le son (5 Kps par exemple), la vid´eo sera alors bas´ee sur 34-5=29 Kps. Faites des tests en baissant le taux sur la vid´eo jusqu’`a la limite du supportable ! 11. Cliquez sur Start pour lancer la conversion. 12. Le r´esultat, g´en´eralement 10 `a 20 fois plus petit que le .swf, se lit avec Real Player.

2.7

Streaming

2.7.1

Avec Real Player

Le streaming vid´eo permet de commencer `a voir une vid´eo d`es le d´ebut de son chargement, ce qui ´evite les temps d’attente. En effet, au lieu de charger l’ensemble de la vid´eo pour qu’elle puisse ˆetre regard´ee, le streaming permet de voir les premi`eres images d`es le d´epart, en mˆeme temps que le film est charg´e. Pendant que vous regardez le d´ebut de cette vid´eo la suite des informations arrive dans votre ordinateur. 1. Encoder un fichier avec Real Producer G2 (ex : titre.rm). 2. Ouvrez le bloc notes 3. Ecrivez l’adresse o` u se trouvera votre fichier .rm (ex : http ://monsite.com/titre.rm) 4. Enregistrer votre fichier en .ram (ex : monfichier.ram), pour cela choisir Type = Tous au lieu de Type = Texte 5. Envoyer les 2 fichiers (titre.rm et monfichier.ram) vers votre site. 6. Le lien pour le streaming pointera vers le fichier .ram (ex : http ://monsite.com/monfichier.ram) A HREF="lance.ram">Voir la vid´ eo...

Travaux dirig´es d’ActionScript

29

´ CHAPITRE 2. LA VIDEO

Eric Schrafstetter

7. Ou encore en tant que vid´eo int´egr´ee sur la page web avec le code : <param name="src" value="monfichier.ram"> <param name="controls" value="ImageWindow,ControlPanel,Statusbar"> <param name="autostart" value="true"> <embed src="monfichier.ram" autostart="true" controls="ImageWindow,ControlPanel,Statusbar" width="200" height="200" >

2.7.2

Le streaming sous Flash

Comment imposer une cadence de 25 frames par seconde (par exemple) `a une animation sans connaˆıtre la puissance de la machine du visiteur ? Vous l’aurez devin´e, en utilisant la technique du stream. Certaines images ne seront pas montr´ees afin que l’animation suive la cadence impos´ee. Voici la m´ethode (voir l’original en anglais ) : 1. Cr´eez un silence d’environ 0,1 seconde sous le nom silence.wav 2. Sous Flash, importez le fichier silence.wav (Fichier - Importer) 3. Ins´erez une couche nomm´ee silence et placez une occurrence de silence.wav sur la sc`ene 4. Faites Fenˆetre - Panneau - Son ou Bouton droit sur l’´echelle temporelle et Panneau - Son 5. Choisir Sync = En continu et Boucles = 1. 6. Sur d’´eventuelles autres couches, placez de vrais sons avec la propri´et´e Sync = Ev´enement 7. Dans les param`etres de publication, sous l’onglet Flash, choisir : – Train audio = ADPCM, 5kHz, 2 bit Mono – Ev´enement audio = ADPCM, 11kHz, 4 bit Mono – Et neutralisez les param`etres audio en cochant la case du dessous. 8. Il ne reste plus qu’`a compiler votre animation.

2.8 2.8.1

Questions/R´ eponses Son QuickTime

Flash sait importer des vid´eos .mov mais pas leurs pistes sonores. Dans une note technique , Macromedia propose d’utiliser les logiciels payants SoundEdit 16 ou QuickTime Pro afin de convertir la piste son en .wav ou .aiff. Je vous propose une solution gratuite (vous commencez `a me connaitre non ?) : 1. T´el´echargez sur www.radgametools.com le freeware RAD Video Tools

Travaux dirig´es d’ActionScript

30

´ CHAPITRE 2. LA VIDEO

Eric Schrafstetter

2. Installez le logiciel, lancez-le programme radvideo.exe et choisissez le fichier .mov qui sera `a importer sous flash 3. Cliquez sur Convert a file, d´ecochez Convert Video et choisir un format de sortie pour le son, par exemple 8-bit/stereo. Le fichier de sortie (en haut) doit ˆetre un .wav. 4. Cliquez sur le bouton Convert. Vous avez maintenant un fichier son qui s’importe facilement sous Flash. Remarquez au passage que ce logiciel permet de convertir un .mov en .avi. Une question A part l’excellent logiciel (payant) WinGroove qui permet de lire et convertir des fichiers .mid en .wav, quelqu’un connaˆıt-il un moyen gratuit d’arriver au mˆeme r´esultat ? Je pensais avoir un bon d´ebut de r´eponse en utilisant tout simplement le lecteur (gratuit) QuickTime Player 5.0.1 qui, lorsqu’il ouvre un fichier audio .mid propose de le convertir en .mov (qui en plus a une taille comparable au .mid d’origine !). H´elas, RAD Video Tools ne semble pas reconnaˆıtre ce format ! L’autre id´ee ´etait d’utiliser WinAmp et sa fameuse commande Disk Writer ( CTRL+P - Output) qui permet par exemple de convertir des fichiers .mp3 en .wav. En ajoutant le plug-in VidAmp qui offre `a WinAmp la possibilit´e de lire des fichiers vid´eos (entre autres les .mov), j’ai cru `a tort qu’il pourrait convertir le son d’un .mov en .wav. Donc pour le moment je ne sais pas convertir gratuitement un .mid (ou .mov audio) en .wav ou .mp3 afin de l’importer sous Flash. A d´efaut, existe-t-il un ´equivalent gratuit de Total Recorder qui permet d’enregistrer en .wav ou .mp3 n’importe quel son provenant d’une application ou de l’ext´erieur ? ?

2.8.2

Convertir un .swf en .avi

Une fonction ma foi tr`es originale du freeware RAD Video tools est de pouvoir convertir directement un fichier .swf en .avi ! Bien entendu, cela n’a d’int´erˆet que si vous partez d’un .swf dont vous n’avez pas ou plus la source. Si vous avez le .fla, utilisez plutˆot la proc´edure vue plus haut. De plus, si l’animation comporte de l’ActionScript, il est peu probable que la conversion se passe bien... Utilisez ensuite le freeware VirtualDub pour cr´eer des effets sp´eciaux sur la vid´eo. Le fichier .avi peut alors ˆetre converti en : – .mpg par les freewares AVI2MPG2 ou ULEAD MPEG Converter. – .rm par le freeware Real Encoder 5.0 ou RealProducer – .swf ou .mov en l’important sous Flash (Fichier - Importer - Type = Tous) et en le publiant. Pour que le fichier soit un .mov autonome du .swf, il faut choisir Aplatir dans l’onglet QuickTime des param`etres de publication.

2.8.3

Une suite ?

Ces quelques pages se veulent une introduction tr`es rapide au passage de Flash `a Real Player et au streaming. N’h´esitez pas `a me communiquer vos

Travaux dirig´es d’ActionScript

31

´ CHAPITRE 2. LA VIDEO

Eric Schrafstetter

remarques en vue d’am´eliorer ce suppl´ement. En attendant, voici quelques liens utiles : – Utiliser RealProducer – Des guides (en PDF) sur le site de real.com` u – Flash et le streaming – Un tutorial int´eressant sur Flash et le streaming – Optimiser le son sous Flash

Travaux dirig´es d’ActionScript

32

Chapitre 3

Maths 3.1

Nombres al´ eatoires

3.1.1

M´ elanges

Voici une m´ethode pour m´elanger les donn´ees d’un tableau : 1. Affectez `a l’image 1 de la sc`ene principale l’action : tableau=new Array(); for (i=0; i<=9; i++) { tableau[i]="v"+i; } trace (tableau); // M´ elange par permutations taille=tableau.length; for (i=0; i
3.2 3.2.1

3D Matrices de rotation

La rotation d’un angle φ autour de l’axe z (voir figure 3.1) peut ˆetre d´ecrite par la matrice Rφ suivante : 33

Eric Schrafstetter

CHAPITRE 3. MATHS



 cos φ 0 − sin φ  0 1 0 Rφ =  − sin φ 0 cos φ et la matrice Rθ d’un angle θ autour de l’axe  cos θ − sin θ Rθ =  − sin θ cos θ 0 0

y (voir figure 3.1) :  0 0  1

Plus g´en´eralement, la transformation M (a, b, c) → Rφ Rθ (M ) s’´ecrit :   a cos(θ) cos(φ) − b sin(φ) − c sin(θ) cos(φ) Rφ Rθ (M ) =  a cos(θ) sin(φ) + b cos(φ) − c sin(θ) sin(φ)  −a sin(θ) + c cos(θ) Conversion en fonctions Flash : function rx (a,b,c,theta,phi) { with (Math) { return a*cos(theta)*cos(phi)-b*sin(phi)-c*sin(theta)*cos(phi); } } function ry (a,b,c,theta,phi) { with (Math) { return a*cos(theta)*sin(phi)+b*cos(phi)-c*sin(theta)*sin(phi); } } function rz (a,b,c,theta,phi) { with (Math) { return -a*sin(theta)+c*cos(theta); } }

3.2.2

Boules dans l’espace

Voici un exercice sur la rotation de 4 boules dans l’espace. A cela s’ajoute un effet de scale sur la profondeur. 1. Cr´eez le clip boule repr´esentant une. . . boule. Mettre une occurrence de ce clip `a l’image 1 de la sc`ene principale et lui donner le nom boule et ´etendre par F5 jusqu’`a l’image 3. 2. Placez ´egalement 3 zones de texte de saisie avec les noms a, b et c. 3. Cr´eez une nouvelle couche pour les actions 4. Ajoutez l’action suivante `a l’image 1 de la couche d’action i = 1; while (i<=4) {

Travaux dirig´es d’ActionScript

34

Eric Schrafstetter

CHAPITRE 3. MATHS

duplicateMovieClip (boule, "b"+i, i); this["tx"+i] = 200*Math.random()-100; this["ty"+i] = 200*Math.random()-100; this["tz"+i] = 200*Math.random()-100; i++; } a=b=c=0.1; On cr´ee 4 boules d’occurrence b1, b2..`a partir de boule et on les place al´eatoirement sur l’´ecran. Les 3 lignes suivantes attribuent des coordonn´ees tri-dimensionnelles `a ces 4 boules. La derni`ere ligne permet de donner la valeur 0.1 aux 3 variables. 5. Mettre l’action suivante `a l’image 2 de la couche action with (Math) { sa = sin(a); ca = cos(a); sb = sin(b); cb = cos(b); sc = sin(c); cc = cos(c); } i = 1; while (i<=4) { rx1 = this["tx"+i]; ry1 = ca*this["ty"+i]-sa*this["tz"+i]; rz1 = sa*this["ty"+i]+ca*this["tz"+i]; rx2 = rx1*cb+rz1*sb; rz2 = -rx1*sb+rz1*cb; rx3 = rx2*cc-ry1*sc; ry3 = rx2*sc+ry1*cc; this["tx"+i] = rx3; this["ty"+i] = ry3; this["tz"+i] = rz2; scale = 100-rz2/3; if (scale<0) { scale = 1; } this["b"+i]._alpha = scale; this["b"+i]._x = 200+rx3; this["b"+i]._y = 200-ry3; this["b"+i]._xscale = this["b"+i]._yscale=scale; this["b"+i].swapDepths((1000-rz2)*500); i++; }

Travaux dirig´es d’ActionScript

35

Eric Schrafstetter

CHAPITRE 3. MATHS

On retrouve dans les calculs des rx et ry les matrices de rotation explicit´ees au paragraphe pr´ec´edent. A cela s’ajoute un effet de scale et de transparence alpha suivant la profondeur z. Les coordonn´ees (200, 200) sont celles du centre du rep`ere. 6. Mettre l’action gotoAndPlay (2); `a l’image cl´e 3 de la couche action. 7. Lancez l’animation. Mettre b et c `a 0 pour voir tourner les 4 boules suivant l’axe 0x. Augmentez la valeur d’une variable pour acc´el´erer le mouvement.

3.3

D´ eformation d’un triangle (Partie 1)

Cet exercice est inspir´e d’un tutorial de Pavils Jurjans. Quelques formules, notament sur le calcul de S et h, ont ´et´e simplifi´ees par rapport `a l’original. Il s’agit de transformer par les fonctions _xscale, _yscale et _rotation de Flash, un triangle ´equilat´eral en un triangle impos´e par la donn´ee de 3 points A,B et C. Contrairement aux apparences, c’est loin d’ˆetre simple ! Heureusement, comme le montre le nombre croissants d’applications `a la 3D, le jeu en vaut la chandelle. Questions : 1. On suppose dans un premier temps que la droite (CB) est horizontale. Montrez que le rapport m/n est ´egal `a : m OA2 + OC 2 = −1 n OA × CB 2. Inversement, soit γ un r´eel positif fix´e. Montrez que la valeur α du _xscale dilatant horizontalement ce triangle dans un rapport m/n ´egal `a γ est : OC

α= p

OA((γ + 1)CB − 1)

3. On suppose le triangle ABC ´equilat´eral (voir figure 3.3)Montrez que le α calcul´e pr´ec´edemment est donn´e par : r 3 α= 1 + 2γ 4. Soit ABC un triangle quelconque de plus grand cˆot´e (AC). – Montrez que sa surface est ´egale `a : S=

| (xB − xA )(yC − yA ) − (xC − xA )(yB − yA ) | 2

– En d´eduire que la hauteur h est : h=

Travaux dirig´es d’ActionScript

36

2S AC

Eric Schrafstetter

CHAPITRE 3. MATHS

Z R

φ

R θ Y X

Fig. 3.1 – Les rotations ´el´ementaires

O

A

m n h

β C

B

Fig. 3.2 – Relations dans un triangle

γ=2

A m

_xscale

n C

A’

α = 77,46 m=n

B

C’

m = 2n

Fig. 3.3 – Transformation dans le cas γ = 2

Travaux dirig´es d’ActionScript

37

B’

Eric Schrafstetter

CHAPITRE 3. MATHS

– Montrez que le signe de (xB − xA )(yC − yA ) − (xC − xA )(yB − yA ) permet de d´eterminer si le point B est au dessus ou en dessous de la droite (AC). – Calculez les coordonn´ees du barycentre d’un triangle ´equilat´eral. En d´ eduire que la distance entre le milieu de la hauteur et le barycentre est √ 3AC ' 0, 144 × AC. 12 R´ eponses : 1. Cela provient des relations ´el´ementaires suivantes : n = CB cos β m = AC − n OA AC = cos β donc

OA m = −1 n CB cos2 β

D’autre part sin β = et

h OC =√ CB OA2 + OC 2

cos2 β = 1 − sin2 β

Il suffit de remplacer cos2 β par son ´ecriture suivant les termes OC, CB et OA. 2. En substituant OA `a αOA, et CB `a αCB dans la premi`ere ´equation on obtient : α2 OA2 + OC 2 −1=γ α2 OA × CB On isole ensuite le α. 3. On a OA =

CB 2

et OC = h = CB

√ 3 2 ,

2

α2 CB 4 +

d’o` u:

3CB 2 4

α2 CB 2 2

−1=γ

et l’on isole le α. 4. Triangle quelconque : −−→ – S est la demi somme de la norme du produit vectoriel des vecteurs AB −→ et AC, d’o` u: ¯ ¯ 1 ¯¯ xB − xA xC − xA ¯¯ S= ¯ 2 yB − yA yC − yA ¯ On a bien le r´esultat annonc´e. – La surface d’un rectangle est la base par la hauteur sur 2.

Travaux dirig´es d’ActionScript

38

Eric Schrafstetter

CHAPITRE 3. MATHS

– On compare les pentes des droites (AB) et (AC), c’est-`a-dire les nombres (yB −yA ) (yC −yA ) (xB −xA ) et (xC −xA ) . – L’ordonn´ ee du barycentre G est ´egal au tiers de la hauteur, soit yG = √ √ 3AC 3AC Le centre ayant pour ordonn´ e e , la diff´erence donne bien 4 √ 6 3AC 12 . Une fois que l’on a transform´e le triangle ´equilat´eral dans un rapport m/n, on place par rotation le grand cˆot´e (AC) horizontalement, on effectue un _xscale puis un _yscale afin qu’il ait les dimensions voulues puis une nouvelle rotation pour le mettre dans la bonne direction. Passons `a la pratique ! Application fondamentale : 1. Cr´eez un clip nomm´e equi avec le dessin d’un triangle ´equilat´eral dans le sens 4. 2. Utilisez la fenˆetre info pour lui donner les dimensions L = 100 et H = 86, 6 √ (qui correspond `a la hauteur 1002 3 ) 3. Mettre le barycentre du triangle exactement sur la croix (coordonn´ees centre X = 0 et Y = −14, 4)Voir figure 3. L=100 et H=86,6 Départ

centre en X=0 Y=0

clip equi

Mettre centre en X=0 Y= -14.4

clips tri3 tri2

Mettre centre en X=0 Y= 0

Fig. 3.4 – Positions des centres des clips 4. Cr´eez un clip nomm´e tri3 et mettre une occurrence du clip equi sur son image 1 avec pour nom type. 5. Cr´eez un clip nomm´e tri2 et mettre une occurrence du clip tri3 sur son image 1 avec pour nom base. 6. Sur la sc`ene principale, mettre une occurrence du clip tri2 avec pour nom tri1. Pourquoi tant de niveaux ? Parce que nous devons effectuer plusieurs scales et rotations. Essayez d’appliquer une rotation `a un clip puis un _xscale, vous verrez que ce dernier n’est pas appliqu´e horizontalement mais suivant l’angle de la rotation ! 7. Cr´eez un bouton bt repr´esentant un petit disque (L = H = 6 par exemple) 8. Cr´eez un clip nomm´e ptA avec une occurrence du bouton bt au centre du clip (X = Y = 0)Ajoutez l’action suivante au bouton :

Travaux dirig´es d’ActionScript

39

Eric Schrafstetter

CHAPITRE 3. MATHS

on (press) { startDrag ("", true); } on (release) { stopDrag(); } 9. Mettre une occurrence du clip ptA sur la sc`ene principale avec pour nom A 10. De la mˆeme fa¸con, cr´eez deux autres clips ptB et ptC avec leurs occurrences respectives B et C sur la sc`ene principale. 11. Cr´eez un clip vide et placez-en une occurrence sur la sc`ene principale avec l’action : onClipEvent (mouseMove) { with (_root) { Tracer(tri1, A._x, A._y, B._x, B._y, C._x, C._y);; } } onClipEvent (mouseUp) { with (_root) { Tracer(tri1, A._x, A._y, B._x, B._y, C._x, C._y);; } } 12. Action sur l’image 1 de la sc`ene principale function Tracer (triangle, x1, y1, x2, y2, x3, y3) { abx = x1-x2; aby = y1-y2; cax = x3-x1; cay = y3-y1; bcx = x2-x3; bcy = y2-y3; S = abx*cay-cax*aby; dir = (S<0) ? 1 : -1; ab = abx*abx+aby*aby; ca = cax*cax+cay*cay; bc = bcx*bcx+bcy*bcy; with (Math) { mx = max(ab, max(ca, bc)); hh = S*S/mx; with (triangle) { if (mx == ab) { r = (bc-hh)/(ca-hh); _rotation = atan2(-aby, -abx)*180/PI;

Travaux dirig´es d’ActionScript

40

Eric Schrafstetter

CHAPITRE 3. MATHS

base.type._rotation = 0; _x = x2; _y = y2; } else if (mx == bc) { r = (ca-hh)/(ab-hh); _rotation = atan2(-bcy, -bcx)*180/PI; base.type._rotation = 240; _x = x3; _y = y3; } else { r = (ab-hh)/(bc-hh); _rotation = atan2(-cay, -cax)*180/PI; base.type._rotation = 120; _x = x1; _y = y1; } pp = 1.73205081/sqrt(1+2*sqrt(r)); rr = sqrt(pp*pp+3)/2; base._xscale = 100*pp; base._rotation = atan(1.73205081/pp)*180/PI; _xscale = sqrt(mx)/rr; _yscale = 1.15470054*sqrt(hh)*rr/pp*dir; } } } Tracer(tri1, A._x, A._y, B._x, B._y, C._x, C._y);; stop(); 13. Compilez, lancez et d´eplacez les points A, B et C. Si le triangle ne touche pas exactement les trois points mobiles, assurez-vous du bon positionnement des centres des clips (voir figure 3).

3.4

Anaglyphes g´ eom´ etriques 3D

Avant de vous lancer dans cet exercice, il faudra vous munir d’une paire de lunette avec des verres rouge/vert ou rouge/bleu Obtenir des adresses). La conversion d’images bitmap en anaglyphes 3D est une chose assez simple `a faire, soit en utilisant des logiciels (voir freeware sur http ://www.stereoeye.com/) ou directement par manipulation sous Photoshop/Paint Shop Pro (voir ma page 3D). Le principe repose sur le Th´eor`eme de Thal`es (voir figure 3) : OG OD OOG = GD OG

et

OG OD =

Travaux dirig´es d’ActionScript

OOG × GD OOG + GOG 41

Eric Schrafstetter

CHAPITRE 3. MATHS

P OD

OG

O

D G oeil

Fig. 3.5 – Principe des anaglyphes Dans la pratique, l’´ecartement des yeux est GD ' 6, 3cm et la distance yeux´ecran vaut environ GOG ' 70cm. Par exemple, si vous voulez que votre point apparaˆısse `a 25cm hors de l’´ecran, la distance entre les points bleu et rouge devra ˆetre de OG OD ' 1, 66cm. Manipuler un triangle dans l’espace : S’il y a de petits enfants qui font ce tutorial ( ? !), je pense vraiment que l’abus de ces lunettes devant ton ´ecran n’est pas bon pour tes yeux... 1. Reprendre la manipulation sur la d´eformation d’un triangle et ajoutez une occurrence du clip tri2 sur la sc`ene principale avec pour nom trirouge. 2. Pour cr´eez le triangle bleu ciel `a partir de tri1, utilisez le panneau effet avec les options : Avanc´e - Rouge=(-100%×R)-255, Vert =( 10%×V)+255, Bleu=(100%×B)+255, Alpha=(50%×A)+0. Pour ajuster correctement les coefficients, prendre vos lunettes, regardez le triangle bleu uniquement `a travers le filtre bleu et faites varier la valeur de la composante verte (ne pas toucher au rouge) jusqu’`a ce que le triangle disparaisse. Regardez ensuite le triangle bleu `a travers le filtre rouge, vous devez le voir correctement. 3. Idem avec le triangle rouge trirouge : Avanc´e - Rouge=(100%×R)+255, Vert =( -100%×V)+0, Bleu=(-100%×B)+0, Alpha=(50%×A)+0 4. Faites un copier-coller des trois points A, B et C de la sc`ene et renommezles A2, B2 et C2Vous avez maintenant 6 points sur la sc`ene principale, un clip vide et 2 triangles : un bleu et un rouge. 5. Utilisez le panneau info pour superposer les points A et A2, idem avec les points B et B2 puis C et C2. 6. Mettre un effet alpha=0 sur les 6 points afin qu’il disparaissent pendant l’animation. 7. Changez la fin de l’action sur l’image 1 de la sc`ene principale en : function Tracer (triangle, x1, y1, x2, y2, x3, y3) { ... _yscale = 1.15470054*sqrt(hh)*rr/pp*dir;

Travaux dirig´es d’ActionScript

42

Eric Schrafstetter

CHAPITRE 3. MATHS

} } A._y=A2._y; B._y=B2._y; C._y=C2._y; if (A._x>A2._x) { A._x=A2._x; } if (B._x>B2._x) { B._x=B2._x; } if (C._x>C2._x) { C._x=C2._x; } } Tracer(tri1, A._x, A._y, B._x, B._y, C._x, C._y); Tracer(trirouge, A2._x, A2._y, B2._x, B2._y, C2._x, C2._y); stop(); Ceci permet de mettre d’une part le triangle bleu toujours `a gauche du triangle rouge et d’autre part que les ordonn´ees des points soient bien align´ees horizontalement. 8. Changez l’action du clip vide en : onClipEvent (keyDown) { if (key.isDown(Key.DOWN)) { _root[lettre]._x--; } else if (key.isDown(Key.UP)) { _root[lettre]._x++; } else if (key.isDown(65)) { lettre = "A"; } else if (key.isDown(66)) { lettre = "B"; } else if (key.isDown(67)) { lettre = "C"; } with (_root) { Tracer(tri1, A._x, A._y, B._x, Tracer(trirouge, A2._x, A2._y, } } onClipEvent (mouseMove) { with (_root) { Tracer(tri1, A._x, A._y, B._x, Tracer(trirouge, A2._x, A2._y, }

Travaux dirig´es d’ActionScript

43

B._y, C._x, C._y); B2._x, B2._y, C2._x, C2._y);

B._y, C._x, C._y); B2._x, B2._y, C2._x, C2._y);

Eric Schrafstetter

CHAPITRE 3. MATHS

} onClipEvent (mouseUp) { with (_root) { Tracer(tri1, A._x, A._y, B._x, B._y, C._x, C._y); Tracer(trirouge, A2._x, A2._y, B2._x, B2._y, C2._x, C2._y); } } onClipEvent (load) { lettre = "B"; } Ainsi, vous pourrez avec le clavier choisir le point `a modifier (A, B ou C) et ´eloigner ou rapprocher ce point avec les fl`eches haut et bas. 9. Compilez et lancez l’animation. Mettez vos lunettes et restez appuyez sur la fl`eche vers le bas, un des coins doit sortir de l’´ecran (c’est le point B)Tapez sur la touche A et `a nouveau sur la fl`eche vers le bas, un autre coin sort de l’´ecran. 10. Vous pouvez ´egalement modifier la forme du triangle grˆace `a la souris.

3.5

Perspectives frontales et obliques

Merci au centre IGESA de Biscarrosse avec leurs chalets aux chambres cubiques de m’avoir donn´e cette id´ee d’exercice...

3.5.1

M´ ethode pratique

La figure 3.6 montre comment tracer un cube en perspective `a partir de ses projections en plan (vue du dessus) et en ´el´evation (vue de cˆot´e). Le point V repr´esente le point de vue (l’oeil est sur la figure un peu au dessus du cube), le plan T est le plan vertical (imaginaire) sur lequel prend place le dessin, dans notre cas l’´ecran de l’ordinateur. La m´ethode peut se r´esumer `a : 1. Tracez le point V et la droite T (repr´esentant le plan vu de cˆot´e). Mettre les mˆeme distances entre V et T sur les 2 coupes. 2. Dessinez les vues de l’objet (pas n´ecessairement un cube !). 3. Tracez les segments [V A], [V B]... qui coupent la droite T en certains points. 4. Tracez les perpendiculaires `a T en ces points. 5. Utilisez les points d’intersections de ces nouvelles droites pour tracer l’objet en perspective.

3.5.2

Les formules...

Exercices 1. Soit V un point de vue dans l’espace, T un plan ne passant pas par V et A un point dans le demi-espace ne contenant pas V (voir figure 3.7). D´eterminez

Travaux dirig´es d’ActionScript

44

Eric Schrafstetter

CHAPITRE 3. MATHS

−−→ −→ → −−→0 → le vecteur V A0 en fonction des vecteurs V A et − n = V V o` u− n est normale (perpendiculaire) au plan T. 2. Cas particulier de la projection sur le plan Oxy. D´eterminez les coor−−→ → donn´ees du vecteur V A0 lorsque V (x0 , y0 , z0 ) avec z0 < 0, − n = (0, 0, −z0 ) (c’est-`a-dire que l’oeil est `a la distance | z0 | de l’´ecran) et A(xA , yA , zA ) avec zA > 0. 3. Int´erieur d’un cube : (a) Tracez sur l’´ecran T= Oxy la perspective d’un cube de rayon R et de centre O lorsque le point de vue en V (0, 0, R). (b) On suppose que l’´ecran de l’ordinateur est carr´e et de cˆot´e L. Trouvez les formules donnant les coordonn´ees d’un point (x, y, z) du cube sur l’´ecran. (c) Par quel facteur doit-on multiplier ces coordonn´ees pour que la face arri`ere du cube prenne tout l’´ecran ? (Cas particulier : L = 400 et R = 100) Corrig´ e 1. Remarquons que le plan T est l’ensemble des points M v´erifiant : −−0−→ → V M .− n =0 −−−→ − C’est-`a-dire les points tels que le vecteur V 0 M soit orthogonal `a → n . Par la relation de Chasles, ceux sont donc ´egalement les points M v´erifiant : −−→ −−→ → (V 0 V + V M ).− n =0 soit :

−−→ → V M .− n = n2 → o` u n est la norme du vecteur − n. −−→0 −→ Comme V A est de la forme λV A et que le point A0 appartient au plan T, le r´eel λ doit v´erifier : −→ → λV A.− n = n2 d’o` u −−→0 n2 −→ V A = −→ V A − V A.→ n −−→ 2. Dans le cas particulier, les coordonn´ees du vecteur V A0 dans le plan Oxy sont donc : −−→0 VA

½

z0 x0 + (xA − x0 ) z0 −z A z0 y0 + (yA − y0 ) z0 −z A

−→ − puisque V A.→ n = (xA − x0 ) × 0 + (yA − y0 ) × 0 + (zA − z0 ) × (−z0 ) et n2 = 02 + 02 + (−z0 )2 = z02 .

Travaux dirig´es d’ActionScript

45

Eric Schrafstetter

CHAPITRE 3. MATHS

T C D

V

B A-B

C-D

A GH

F

E-F

E

G-H C-G

D-H

B-F

A-E

Vue de droite

T

Vue du dessus V Fig. 3.6 – Perspective d’un cube

A

A’ V

V’ T Fig. 3.7 – Projection sur le plan T

Travaux dirig´es d’ActionScript

46

Eric Schrafstetter

CHAPITRE 3. MATHS

3. Int´erieur d’un cube (a) Voir la construction figure 3.8. (b) On utilise les questions pr´ec´edentes pour voir que les coordonn´ees sont : ½ 0 R x = x R−z R 0 y = y R−z (c) Comme le point C a pour coordonn´ees C(− R2 , R2 , − R2 ), on trouve : ½ 0 x = − R3 C0 = y 0 = R3 (d) On passera du carr´e CDGH de cˆot´e 2R a l’´ecran L×L en multipliant 3 ` 3L par le coefficient 2R . Ainsi, pour tracer le cube en perspective au centre de l’´ecran, nous avons la formule g´en´erale : ( 3L xecran = L2 + 2(R−z) x L 3L ecran y = 2 − 2(R−z) y Dans le cas particulier L = 400 et R = 100, le coefficient vaut 6 et l’on a donc : ½ ecran 600 x x = 200 + 100−z 600 ecran y = 200 − 100−z y

3.5.3

Manipulation d’un cube

Nous avons tous les ingr´edients pour tracer un objet 3D et le manipuler ! 1. Lancez Flash puis Modification - Anima/-tion pour mettre les dimensions de l’animation `a 400 × 400 2. Cr´eez une ligne du centre vers le bas `a droite `a 45◦ avec pour fenˆetre info : L = 100, H = 100, X = 0 et Y = 0 (Cf exercice sur le fil ´elastique) 3. Transformez cette ligne en symbole nomm´e ligne et en mettre une occurrence sur la sc`ene principale avec pour nom arete. Ce sera le mod`ele de l’arˆete de notre cube. 4. A l’image 1 de la sc`ene principale mettre l’action : R = 100; L = 100; cangle = Math.cos(Math.PI/18); sangle = Math.sin(Math.PI/18); var coins = [1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1, 1]; var faces = [0, 1, 2, 3, -1, 4, 7, 6, 5, -1, 0, 4, 5, 1, -1, 1, 5, 6, 2, -1, 2, 6, 7, 3, -1, 4, 0, 3, 7, -1]; for (i=0; i<=faces.length-1; i++) {

Travaux dirig´es d’ActionScript

47

Eric Schrafstetter

CHAPITRE 3. MATHS

arete.duplicateMovieClip("ar"+i, 1+i); } ecran = new Array(); function affiche () { for (i=0; i<=7; i++) { coeff = 3*L/(2-coins[3*i+2])/2; ecran[2*i] = 200+coins[3*i]*coeff; ecran[2*i+1] = 200+coins[3*i+1]*coeff; } for (i=0; i=0) { this["ar"+i]._x = ecran[2*p]; this["ar"+i]._y = ecran[2*p+1]; q = faces[i+1]; if (q == -1) { q = faces[i-3]; } this["ar"+i]._xscale = ecran[2*q]-ecran[2*p]; this["ar"+i]._yscale = ecran[2*q+1]-ecran[2*p+1]; } } } } function rotx (d) { for (i=0; i<=7; i++) { tz = coins[3*i+2]; ty = coins[3*i+1]; coins[3*i+2] = tz*cangle-ty*d*sangle; coins[3*i+1] = ty*cangle+tz*d*sangle; } } function roty (d) { for (i=0; i<=7; i++) { tx = coins[3*i]; tz = coins[3*i+2]; coins[3*i] = tx*cangle-tz*d*sangle; coins[3*i+2] = tz*cangle+tx*d*sangle; } } affiche(); stop(); Quelques explications sur le script : Les coordonn´ees (x, y, z) des coins sont plac´ees dans le tableau coins et les diff´erentes liens (de 0 `a 1, puis de

Travaux dirig´es d’ActionScript

48

Eric Schrafstetter

CHAPITRE 3. MATHS

1 `a 2, de 2 `a 3 et de 3 `a 0. Recommencer de 4 `a 7, puis de 7 `a 6...). Pourquoi ce format ? Parce que vous pouvez facilement r´ecup´erer ces coordonn´ees en enregistrant un objet au format VRML. Par exemple avec l’excellent logiciel 3D gratuit Blender, ou encore avec Corel 3D, 3D Studio Max... La formule donnant le coefficient coeff s’obtient par : 3L 1 xR 3L = R 2 R−z2 2 R(2 − z) Les coordonn´ees des points `a l’´ecran sont mis dans le tableau ecran. 5. Cr´eez un bouton repr´esentant une fl`eche vers le haut et lui mettre l’action : on (release) { rotx(-1); affiche(); } 6. Cr´eez un bouton repr´esentant une fl`eche vers le bas et lui mettre l’action : on (release) { rotx(1); affiche(); } 7. Cr´eez un bouton repr´esentant une fl`eche vers la gauche et lui mettre l’action : on (release) { roty(1); affiche(); } 8. Cr´eez un bouton repr´esentant une fl`eche vers la droite et lui mettre l’action : on (release) { roty(-1); affiche(); } 9. Cr´eez un second bouton repr´esentant une fl`eche vers le haut et lui mettre l’action : on (release) { _root.L-=5; if (_root.L<5){ _root.L=5; } affiche(); }

Travaux dirig´es d’ActionScript

49

Eric Schrafstetter

CHAPITRE 3. MATHS

Ceci aura pour effet d’´eloigner le cube. 10. Cr´eez un second bouton repr´esentant une fl`eche vers le bas et lui mettre l’action : on (release) { _root.L+=5; affiche(); } Ceci aura pour effet de rapprocher le cube. 11. Compilez et lancez l’animation. Utilisez les fl`eches pour manipuler le cube. Si vous trouvez que la perspective est ”s´ev`ere”, n’oubliez pas que nous sommes dans le cas particulier ou l’oeil est situ´e `a la distance R du plan T ! Vous pouvez modifier la distance en rempla¸cant : coeff = 3*L/(2-coins[3*i+2])/2; par : coeff = R*L/(L-coins[3*i+2]); Il faudrait ´ecrire z0 `a la place de L pour rester coh´erent avec les notations pr´ec´edentes.

Travaux dirig´es d’ActionScript

50

Eric Schrafstetter

CHAPITRE 3. MATHS

plan T B

A

T

C

D

G

H

V

F

R Vue de droite

E C-G

D-H

R

T B-F

Vue du dessus

A-E

R V

Fig. 3.8 – Construction de la perspective

Travaux dirig´es d’ActionScript

51

Chapitre 4

Physique 4.1

Collision ´ elastique de 2 boules

La partie th´eorique suppose des notions de physique niveau bac .

4.1.1

Rappels

− 1. Le vecteur quantit´e de mouvement → p d’un point de masse m et de vitesse − → − → − → v est par d´efinition p = m v . − 2. L’´energie cin´etique d’un point de masse m et de vitesse → v est, toujours par d´efinition : Ec =

1 mv 2 2

→ o` u v est la norme du vecteur − v. 3. On consid`ere deux points mat´eriels A1 et A2 de masses m1 et m2 . Une loi de la physique ´enonce que la quantit´e de mouvement totale d’un syst`eme de 2 masses ponctuelles en collision se conserve quelque soit le r´ef´erentiel : −−→ − → → p1 + − p2 = Cte 4. Une autre loi affirme qu’il y a conservation de l’´energie totale, ce qui se traduit, dans le cas d’une collision ´elastique, par : Ec1 + Ec2 = Cte o` u Ec1 est l’´energie cin´etique du point A1 .

4.1.2

La th´ eorie

52

Eric Schrafstetter

CHAPITRE 4. PHYSIQUE

1. Montrez que dans le cas d’une collision directe, c’est `a dire lorsque les vecteurs vitesses avant et apr`es le choc sont colin´eaires (parall`eles), alors les vitesses v10 et v20 apr`es le choc sont donn´ees par : v10 =

2m2 v2 + (m1 − m2 )v1 m1 + m2

v20 =

2m1 v1 − (m1 − m2 )v2 m1 + m2

et R´ eponse

La conservation de la quantit´e de mouvement avant et apr`es le choc permet d’´ecrire que : m1 v1 + m2 v2 = m1 v10 + m2 v20 et celle de l’´energie totale que : 1 1 1 1 m1 v12 + m2 v22 = m1 v102 + m2 v202 2 2 2 2 On en d´eduit que : ½ m1 (v10 − v1 ) = m2 (v2 − v20 ) m1 (v102 − v12 ) = m2 (v22 − v202 ) d’o` u, par division de la ligne 2 par la ligne 1 : ½ m1 (v10 − v1 ) = m2 (v2 − v20 ) v10 + v1 = v2 + v20 Les valeurs de v10 et v20 s’obtiennent alors en r´esolvant ce syst`eme de 2 ´equations `a 2 inconnues. 2. Lors d’une collision en un point de contact K de 2 objets arrivant avec des → − vecteurs vitesse − v1 et → v2 (voir figure 4.1), seules les composantes v1x et v2x interviennent. On n´eglige ici les effets de frottements (voir par exemple le cours de M´ecanique de JPhPerez (Niveau Classes Pr´epas)). 3. Nous obtenons la m´ethode de construction de la figure 4.2. Les quantit´es 0 0 v1x et v2x sont obtenus par les formules pr´ec´edentes. D´eterminez les coor0e 0 0e , v1y ) en fonction de ϕ, v1y et v1x . donn´ees `a l’´ecran de v10e = (v1x R´ eponse 0e 0 La composante v1x est la somme des projet´es de v1y et v1x sur l’axe ho0 rizontal. L’angle entre v1y et l’axe horizontal est ϕ + π2 et de ϕ pour v1x . D’o` u: 0e 0 v1x = v1x cos ϕ − v1y sin ϕ

puisque cos(ϕ + π2 ) = − sin ϕ. De mˆeme, on projecte les 2 vecteurs sur l’axe vertical et on en fait la somme : 0e 0 v1y = v1x sin ϕ + v1y cos ϕ

Travaux dirig´es d’ActionScript

53

Eric Schrafstetter

CHAPITRE 4. PHYSIQUE

v 1x A ,m2 2

v 1 v

v

1y

K

v 2y

2 v2x

A1,m1

Fig. 4.1 – Contact des 2 boules

v1x v’ 1x

v1

v1y

θ θ

2

v2y

v 1 v2 2x ϕ

v’ 2 v’ 2x A2,m2

v’ 1

A1,m1

Fig. 4.2 – Construction des vecteurs vitesse

Travaux dirig´es d’ActionScript

54

Eric Schrafstetter

4.1.3

CHAPITRE 4. PHYSIQUE

Application

1. Lancez Flash et CTRL+M pour donner les dimensions 500 × 400 `a la sc`ene et cadence 50. 2. Dessinez une boule (avec son centre sur la croix centrale). Convertissez-l`a en bouton nomm´e boule 3. Cr´eez un clip b1 et mettre une occurrence du bouton boule sur la croix (les 2 croix sont alors superpos´ees) 4. Ajoutez l’action suivante au bouton : on (press) { _root.drag1 = true; startDrag (""); } on (release, releaseOutside) { _root.drag1 = false; stopDrag (); } 5. Mettre une occurrence du clip b1 avec pour nom boule1 sur la sc`ene principale 6. De mˆeme, cr´eez un clip b2 et mettre une occurrence du bouton boule sur la croix 7. Ajoutez l’action suivante au bouton : on (press) { _root.drag2 = true; startDrag (""); } on (release, releaseOutside) { _root.drag2 = false; stopDrag (); } 8. Mettre une occurrence du clip b2 avec pour nom boule2 sur la sc`ene principale 9. Ajoutez une couche pour les actions 10. A l’image 1 de la sc`ene principale, sur la couche action, mettre : gauche = 0; droite = 500; haut = 0; bas = 400; r1 = boule1._width/2; r2 = boule2._width/2; a1a2 = (r1+r2)*(r1+r2); mass1 = 1; mass2 = 4;

Travaux dirig´es d’ActionScript

55

Eric Schrafstetter

CHAPITRE 4. PHYSIQUE

fric = 0.98; v1xe = 10; gravite = 1.5; function affiche () { cdx = boule2._x-boule1._x; cdy = boule2._y-boule1._y; with (Math) { phi = atan2(cdy, cdx); v1 = sqrt(((x1-ox1)*(x1-ox1))+((y1-oy1)*(y1-oy1))); v2 = sqrt(((x2-ox2)*(x2-ox2))+((y2-oy2)*(y2-oy2))); angle1 = atan2(v1ye, v1xe); angle2 = atan2(v2ye, v2xe); v1x = v1*cos(angle1-phi); v1y = v1*sin(angle1-phi); v2x = v2*cos(angle2-phi); v2y = v2*sin(angle2-phi); v1px = (2*mass2*v2x+(mass1-mass2)*v1x)/(mass1+mass2); v2px = (2*mass1*v1x-(mass1-mass2)*v2x)/(mass1+mass2); v1xe = cos(phi)*v1px-sin(phi)*v1y; v1ye = sin(phi)*v1px+cos(phi)*v1y; v2xe = cos(phi)*v2px-sin(phi)*v2y; v2ye = sin(phi)*v2px+cos(phi)*v2y; x1 = ox1; y1 = oy1; x2 = ox2; y2 = oy2; } } 0 et v1xe Il n’y a rien `a dire sur le script sinon que v1x est v1x , v1px est v1x 0e est v1x .

11. A l’image 2 de la couche action, ajouter : ox1 = x1; oy1 = y1; v1ye += gravite; x1 = boule1._x; y1 = boule1._y; // Calculs des vitesses if (drag1 == 1) { v1xe = x1-ox1; v1ye = y1-oy1; } else { x1 += v1xe; y1 += v1ye; } ox2 = x2;

Travaux dirig´es d’ActionScript

56

Eric Schrafstetter

CHAPITRE 4. PHYSIQUE

oy2 = y2; v2ye += gravite; x2 = boule2._x; y2 = boule2._y; if (drag2) { v2xe = x2-ox2; v2ye = y2-oy2; } else { x2 += v2xe; y2 += v2ye; } // Touche-t-on un bord ? if ((x1+r1)>=droite) { x1 = droite-r1; v1xe *= -1; } if (gauche>=(x1-r1)) { x1 = gauche+r1; v1xe *= -1; } if ((y1+r1)>=bas) { y1 = bas-r1; v1ye *= -1; } if (haut>=(y1-r1)) { y1 = haut+r1; v1ye *= -1; } if ((x2+r2)>=droite) { x2 = droite-r2; v2xe *= -1; } if (gauche>=(x2-r2)) { x2 = gauche+r2; v2xe *= -1; } if ((y2+r2)>=bas) { y2 = bas-r2; v2ye *= -1; } if (haut>=(y2-r2)) { y2 = haut+r2; v2ye *= -1; } dist = (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); if ((dist<=a1a2)) {

Travaux dirig´es d’ActionScript

57

Eric Schrafstetter

CHAPITRE 4. PHYSIQUE

affiche(); } // Nouvelles positions boule1._x = x1; boule1._y = y1; boule2._x = x2; boule2._y = y2; // On ralentit les boules v1xe *= fric; v1ye *= fric; v2xe *= fric; v2ye *= fric; if (v1xe*v1xe<0.1) { v1xe = 0; } if (v2xe*v2xe<0.1) { v2xe = 0; } Cette partie semble un peu longue mais les tests de collision sur les bords prennent beaucoup de lignes... A noter – La variable a1a2 ne repr´esente pas la distance de A1 `a A2 mais le carr´e de cette distance. Ceci ´evite d’utiliser la fonction racine carr´ee. – Le calcul de la vitesse est obtenu en effectuant le quotient de la distance entre la position pr´ec´edente et courante de la boule sur le temps mis pour parcourir cette distance. On met ce temps `a 1 par convention (il suffit de changer la cadence de l’animation) – L’intervention de fric (pour friction) qui permet de ralentir la vitesse des boules. – La variable gravite (pour gravit´e), je rappelle ici que la vitesse de la chute d’un corps est de la forme v(t) = gt + Cte. – Lors d’un choc sur un cˆot´e de l’´ecran, la composante normale (perpendiculaire) au bord change de signe. Si vous voulez ajouter des objets (tables, raquettes...) sur la sc`ene, faites les tests de collisions avec les coordonn´ees des clips ( table._y...) 12. A l’image 3 de la couche action, ajoutez : gotoAndPlay (2); 13. Enfin, ´etendre par F5 la couche contenant les objets jusqu’`a l’image 3. Chalenge concernant le fichier .fla associ´e `a cet exercice : M’envoyer un .swf avec les ballons qui tournent !

4.2

Vitesse d’un objet avec freinage

Travaux dirig´es d’ActionScript

58

Eric Schrafstetter

CHAPITRE 4. PHYSIQUE

Vous lancez un objet `a l’aide de la souris, celui-ci rebondit sur les bords de l’´ecran puis s’arrˆete apr`es freinage. Donnez `a votre animation les dimensions 400 × 400 1. Cr´eez un bouton rectangulaire 2. Cr´eez un clip rect et placez le bouton rectangulaire dessus. Etendre sur les image 1 `a 3 par F5. 3. Mettre l’action stop sur l’image 1 de ce clip 4. L’action sur l’image 2 est la suivante : posX = this._x; vitessex = posX-ancienX; ancienX = posX; posY = this._y; vitessey = posY-ancienY; ancienY = posY; 5. et l’action gotoAndPlay (2); sur l’image 3 6. Donnez au bouton l’action suivante : on (press) { startDrag (""); gotoAndPlay (2); pause = true; } on (release, releaseOutside) { stopDrag (); gotoAndStop (1); pause = false; } Ainsi, lorsque vous presserez et d´eplacerez une occurrence du rectangle rect, son clip tournera en boucle entre les images 2 et 3 et permettra de calculer sa vitesse. Placez une occurrence de rect sur la sc`ene principale et lui donner le nom obj. Ecrivez l’action suivante sur cette occurrence : onClipEvent (load) { friction = 0.95; obj.ancienX = this._x; obj.ancieny = this._y; } onClipEvent (enterFrame) { if (not(pause)) { nouvx = this._x+vitessex; nouvy = this._y+vitessey; vitessex *= friction; vitessey *= friction;

Travaux dirig´es d’ActionScript

59

Eric Schrafstetter

CHAPITRE 4. PHYSIQUE

if (vitessex*vitessex+vitessey*vitessey<0.5) { pause = true; } if ((nouvx<0) || (nouvx>400)) { nouvx=Math.max (nouvx,0); nouvx=Math.min (nouvx,400); vitessex *= -friction; } if ((nouvy<0) || (nouvy>400)) { nouvy=Math.max (nouvy,0); nouvy=Math.min (nouvy,400); vitessey *= -friction; } this._x = nouvx; this._y = nouvy; } } Lorsque vous pressez et d´eplacez le rectangle, la variable pause est `a true et le clip rect tourne entre les images 2 et 3, permettant d’obtenir sa vitesse de d´epart. Une fois le bouton relˆach´e, pause passe `a false et les nouvelles positions nouv sont calcul´ees jusqu’`a une vitesse inf´erieure `a 0.5 o` u l’objet s’arrˆete.

4.3

Fil ´ elastique

Tracer une ligne entre les centres de 2 points mobiles. 1. Cr´eez un clip carr´ e avec un petit carr´e sur l’image 1 2. Placez 2 occurrences de carr´ e sur la sc`ene principale avec pour noms pt1 et pt2. 3. Cr´eez le clip ligne suivant : – Tracer une ligne du centre vers le bas `a droite `a 45◦ (utilisez la touche MAJ en tra¸cant) – S´electionnez la ligne et allez dans la fenˆetre info. Mettre L = 100, H = 100 – Toujours dans la fenˆetre info, cliquez sur le carr´e haut-gauche puis X = 0 et Y = 0.

Fig. 4.3 – Coin en haut `a gauche plac´e en X=0 et Y=0 Mettre l’action suivante sur le clip pt1

Travaux dirig´es d’ActionScript

60

Eric Schrafstetter

CHAPITRE 4. PHYSIQUE

onClipEvent (mouseDown) { // La souris touche-t-elle le clip en pressant ? if (this.hitTest(_root._xmouse, _root._ymouse)) { // suis-moi ! startDrag (""); } } onClipEvent (mouseUp) { stopDrag (); } Idem avec le clip pt2Placer une occurrence de la ligne sur la sc`ene principale et lui affecter l’action : onClipEvent (enterFrame) { this._x = _root.pt1._x; this._y = _root.pt1._y; this._xscale = _root.pt2._x-_root.pt1._x; this._yscale = _root.pt2._y-_root.pt1._y; }

4.4

Tableau blanc

Voici une application directe de la section pr´ec´edente sur le fil ´elastique. Il s’agit de cr´eer un tableau blanc sur lequel on pourra dessiner librement. 1. Cr´eez un bouton transparent avec un petit carr´e sur l’image cl´e cliqu´ e. 2. Cr´eez un clip nomm´e crayon et placez-y une occurrence du bouton. 3. Ajoutez l’action suivante au bouton : on (press) { _root.souris=1; _root.x1=0; } on (release) { _root.souris=0; } 4. Sur la sc`ene principale, placez une occurrence du clip crayon et lui donner le nom mc. 5. Cr´eez maintenant un clip ligne comme dans la rubrique fil ´elastique (angle de 45◦ vers le bas `a droite, L = 100, H = 100, haut-gauche en (0, 0)) et en placer une occurrence sur la sc`ene principale avec pour nom trait. 6. Etendre par F5 l’image cl´e 1 jusqu’en 3 7. Ajoutez pour les actions et placez `a l’image cl´e 1 l’action :

Travaux dirig´es d’ActionScript

61

Eric Schrafstetter

CHAPITRE 4. PHYSIQUE

_root.souris=0; startDrag (_root.mc, true); 8. A l’image cl´e 2 de la couche d’action, placez : if (souris if (x1 x1 y1 } else x0 y0 if

== 1) { == 0) { = mc._x; = mc._y; { = mc._x; = mc._y; ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)>2) { nb++; duplicateMovieClip (trait, "trait"+nb, nb); this["trait"+nb]._x = x1; this["trait"+nb]._y = y1; this["trait"+nb]._xscale = x0-x1; this["trait"+nb]._yscale = y0-y1; x1 = x0; y1 = y0;

} } } 9. Et `a l’image cl´e 3 du calque action : gotoAndPlay (2); 10. Lancez l’animation et pressez la souris pour dessiner.

Travaux dirig´es d’ActionScript

62

Chapitre 5

Visualisation 5.1

Powerpoint

Pour ins´erer un objet flash en format SWF dans PowerPoint, suivez ces diff´erentes ´etapes : 1. Se placer dans une diapositive o` u l’on veut ins´erer le fichier *.SWF 2. Cliquez sur le menu : ”Affichage” et ensuite sur le menu ”Barre d’outils”. 3. S´electionnez ”Boˆıte `a Outils Contrˆoles” si cette boˆıte n’est pas d´ej`a s´electionn´ee. 4. Cliquez sur ”Autres contrˆoles” (bouton avec le marteau et la cl´e) 5. S´electionner ”Shockwave Flash Object” 6. Dessinez un contrˆole dans la diapositive de la taille souhait´ee pour int´egrer l’objet Flash 7. Faites un clic droit sur l’objet et s´electionner ”Propri´et´es” 8. Pour la propri´et´e ”Movie” tapez le chemin d’acc`es du fichier *.SWF (exemple : C:\Mes documents\Nom.swf) ou son URL 9. S’assurez que la propri´et´e ”Playing” est param´etr´ee sur ’True’ 10. Se mettre en mode d’affichage DIAPORAMA

5.2

Sons, Cookies et Diaporamas

Il s’agit de cr´eer rapidement un diaporama sonore et autonome compos´e d’images .gif, .jpg ou .png. Nous ajouterons 3 boutons afin que le spectateur puisse, s’il le veut, retourner `a la premi`ere diapo, passer `a la diapo suivante ou pr´ec´edente. L’id´ee est la suivante : Cr´eez dynamiquement en javascript des pages qui contiendront le num´ero de l’image `a afficher (image1.jpg, image2.jpg...) ainsi que la bande son qui sera dans une animation Flash. La partie Flash permettra de g´erer le passage d’une diapo `a une autre et les cookies de m´emoriser le

63

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

num´ero de l’image courante.

5.2.1

Partie HTML - javascript

Cr´eez une page index.html du type : Diaporama sonore <noframes>

Cette page utilise des cadres.

Le fichier haut.htm contiendra l’initialisation du cookie et sera invisible (hauteur = 0). Le fichier principal sera ppt.htm La page haut.htm a pour code : <script> Ceci permet de placer un cookie ayant pour valeur n=0 sur la machine client. La page ppt.htm contient le code : Diaporama sonore <script>
Travaux dirig´es d’ActionScript

64

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

document.cookie=’n=0’; location.href=location; } function precedent(){ n=eval(document.cookie.substring(2, 10))-2; if (n<0) { n=0; } document.cookie="n="+n; location.href=location; }; function suivant(){ n=eval(document.cookie.substring(2, 10)); document.cookie="n="+n; location.href=location; }; //--> <script language="JavaScript">
<script language="JavaScript"> ’); document.write(’’); document.write(’<EMBED src="image’+n+’.swf"’); document.write(’WIDTH="200" HEIGHT="5" ’); document.write(’TYPE="application/x-shockwave-flash">’); document.write(’’);

Travaux dirig´es d’ActionScript

65

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

//-->
<script language="JavaScript"> "); //-->
<script language="JavaScript"> – Le script de la partie est compos´e de 3 fonctions permettant d’avancer, de reculer et de retourner `a la premi`ere diapo. Le num´ero de l’image courante ´etant dans la variable n plac´ee dans un cookie. – Le premier script de la partie r´ecup`ere la variable n, l’augmente de 1 et remplace le cookie existant. – Le second script place l’animation Flash nomm´ee image1.swf (son associ´e `a l’image 1) ou image2.swf ... – Le troisi`eme script place l’image elle-mˆeme – Le dernier script ajoute le num´ero de l’image courante – Les actions onclick permettent de g´erer les boutons Home, suivant et pr´ec´edent – La fonction location.href=location recharge la page

5.2.2

Partie Images

Veillez `a ce que vos images aient pour noms image1.jpg ou image1.gif . Si vous utilisez PowerPoint, faˆıtes Fichier - Enregistrez sous, choisir GIF, JPG ou PNG comme type d’exportation et donnez un nom au dossier o` u seront plac´ees vos images.

Travaux dirig´es d’ActionScript

66

Eric Schrafstetter

5.2.3

CHAPITRE 5. VISUALISATION

Partie Flash

Il vous faut un fichier son (.wav ou .mp3) par image. Nous allons cr´eer un mod`ele d’animation qui permettra de g´en´erer rapidement tous les .swf. 1. Lancez Flash et enregistrez sous sontype.fla 2. Donnez `a votre animation la taille 200x20 (par exemple) 3. Nommez sc` ene1 par chargement (Fenˆetre - Panneaux - Sc`ene) 4. Cr´eez une barre de chargement comme vu dans un chapitre pr´ec´edent (voir .fla joint). Ceci permettra de faire patienter l’internaute pendant le chargement du son (Les plus forts pourront utiliser un LoadMovie pour commencer `a charger le son de la diapo suivante). 5. Cr´eez une nouvelle sc`ene par Insertion - Sc`ene et lui donner le nom son 6. Cr´eez 2 couches, une pour le son et une pour les actions. 7. Importez le son par Fichier - Importer et placez `a partir de la biblioth`eque ( CTRL+L ) une occurrence du son sur la couche son 8. Etendre l’image cl´e par F5 jusqu’`a la fin du son 9. Sur la couche des actions, placez apr`es la fin du son une image cl´e vide par F7 (voir figure 5.1)

Fig. 5.1 – Apparence de la couche son et action Action sur cette image cl´ e getURL ("ppt.htm", "bas"); qui pr´ecise que l’on doit recharger l’animation ppt.htm dans le cadre du bas nomm´e bas 10. Ins´erez une nouvelle image cl´e juste apr`es avec l’action stop(); 11. Faˆıtes Fichier - Param`etres de publication ( CTRL+MAJ+F12 ), choisir uniquement le format .swf (nous n’avons pas besoin du fichier .htm) et cliquez sur Publier. 12. Avec l’explorateur Windows, retrouvez le sontype.swf cr´e´e et le nommer image1.swf 13. Retournez sous Flash, ouvrez la biblioth`eque, s´electionnez l’objet son et cliquez sur l’icˆone Propri´et´es (le petit ”i” dans un cercle bleu en bas de la fenˆetre de la biblioth`eque)

Travaux dirig´es d’ActionScript

67

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

14. Choisir Importer et r´ecup´erez le son de la seconde image 15. Ajustez l’emplacement des 2 actions par rapport `a ce nouveau son et publiez `a nouveau comme pr´ec´edemment. 16. Recommencez avec les autres sons. 17. Il ne vous reste plus qu’`a ouvrir index.html pour voir le r´esultat

5.3

Visionneuse

Nous allons cr´eer une visionneuse d’images avec un effet de transition gauche → droite ou droite → gauche (Voir le .swf joint).

Fig. 5.2 – Vue g´en´erale de la Time-Line 1. Cr´eez les 4 calques (boutons, cadre, masque et images) comme sur la figure 5.2 2. Dessiner un rectangle plein ayant les dimensions des images `a diffuser sur la premi`ere image cl´e de la couche masque. 3. Cr´eez un clip nomm´e images et placez sur les images cl´es 1,2,3. . . les diff´erentes images `a afficher (utilisez le panneau info pour ˆetre sˆ ur qu’elles sont bien superpos´ees) 4. Ajoutez une action stop(); `a sa premi`ere image cl´e. 5. Cr´eez un clip nomm´e diapo et y placer 2 occurrences du clip images, l’une `a cˆot´e de l’autre (voir figure 5.3)

Fig. 5.3 – Les deux occurrences du clip images cˆote `a cˆote

Travaux dirig´es d’ActionScript

68

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

6. Nommez le clip de gauche image1 et celui de droite image2 (bouton droit sur l’image - Panneaux - Occurrence et Nom = image1 ) 7. Revenez sur la sc`ene principale et placez une occurrence du clip diapo `a l’image 1 de la couche images . Faˆıtes bien en sorte que l’image de gauche soit sous le rectangle dessin´e sur la couche masque (voir figure 5.4)

Fig. 5.4 – L’image de gauche est sous le rectangle bleu servant de masque 8. Donnez le nom diapo `a l’occurrence du clip diapo 9. Cr´eez un clip vide nomm´e charge et en mettre une occurrence sur la sc`ene principale avec l’action : onClipEvent (load) { _root.nbtotal = 4; _root.courant = 1; } Ceci permettra d’initialiser les variables lors du premier chargement de l’animation. La variable nbtotal contient le nombre total d’image et courant le num´ero de l’image courante `a afficher. 10. Ajoutez l’action suivante `a l’image 1 de la couche boutons diapo.image1.gotoAndStop(courant); stop (); Le clip image1 du clip diapo s’arrˆete sur l’image courante (celle que l’on voit) 11. Cr´eez 2 boutons et les placer sur la sc`ene principale (couche boutons). Ils serviront `a avancer ou `a reculer dans le diaporama. Au bouton de droite, ajoutez l’action : on (press) { vieux = courant; courant++; if (courant>nbtotal) { courant = 1; }

Travaux dirig´es d’ActionScript

69

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

gotoAndPlay ("avance"); } On m´emorise dans la variable vieux l’ancien num´ero et courant augmente de 1. Si courant d´epasse le nombre total de photos, on boucle en remettant courant `a 1. L’effet de transition s’effectuera `a l’´etiquette avance 12. De mˆeme, ajoutez l’action suivante au bouton de gauche : on (press) { vieux = courant; courant--; if (courant<1) { courant = nbtotal; } gotoAndPlay ("recule"); } 13. Les effets de transition : – Cliquez sur F6 pour ins´erer une nouvelle image cl´e au temps 2 de la couche images. – Cliquez `a nouveau sur F6 au temps 10 et d´eplacez le clip diapo de sorte que l’image de droite se retrouve sur l’ancienne image de gauche, c’est `a dire juste sous le rectangle bleu. – Cr´eez une interpolation de mouvement entre les temps 2 et 10 – Au temps 2 de la couche images, ajoutez l’action : diapo.image1.gotoAndStop(vieux); diapo.image2.gotoAndStop(courant); – Au temps 10, ajoutez l’action gotoAndPlay(1); – Donnez le nom avance `a l’image cl´e 2 (bouton droit sur l’image cl´e 2 Panneaux - Image - Etiquette = avance) – Cliquez sur F6 au temps 11 et au temps 20, remettre le clip diapo comme il ´etait au temps 2. – Ajoutez une interpolation de mouvement entre 11 et 20, nommez l’image 11 recule et ajoutez l’action gotoAndPlay(1); au temps 20. – Au temps 11, ajoutez l’action : diapo.image2.gotoAndStop(vieux); diapo.image1.gotoAndStop(courant); Remarquez bien que les noms image1 et image2 ont ´et´e invers´es ! L’id´ee est toute simple, l’image actuellement affich´ee a le num´ero vieux (qui est le num´ero de l’ancienne image) et celle qui lui est adjacente le num´ero courant (qui est celui de la future image `a afficher). On effectue ensuite un d´eplacement du clip diapo de gauche `a droite ou de droite `a gauche. 14. Etendre par F5 la couche masque jusqu’au temps 20. Cr´eez ´eventuellement un cadre sur la couche cadre pour faire joli. 15. Il ne reste plus qu’`a rendre actif le masque par bouton droit sur le nom de la couche masque et Masque.

Travaux dirig´es d’ActionScript

70

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

16. Ajustez la cadence comme bon vous semble (Modification - Animation) 17. Compilez l’animation et utilisez les boutons pour visionner le diaporama. 18. Pour les personnes qui utilisent mon freeware Diaporama, vous pouvez remplacez le clip images par un LoadMovie.

5.4

Cr´ eer un QCM

Nous allons cr´eez un mod`ele de QCM ayant `a chaque fois 3 choix possibles. Les questions seront cr´e´ees avec PowerPoint qui est, nous l’avons d´ej`a dit, plus conviviale pour la mise en page.

5.4.1

Les questions

1. Lancez PowerPoint 2. Cr´eez une page de titre ( CTRL+M et 1er choix) 3. Cr´eez quelques diapositives avec, sur chaque diapo, une question et 3 choix num´erot´es 1,2 et 3. 4. N’h´esitez pas `a ajouter des organigrammes, des ClipArts, des images jpg, des formules (insertion objet - Microsoft ´equation), des calendriers (insertion objet - Contrˆole calendrier), des tableaux (insertion - tableau), etc. 5. Enregistrez sous le nom qcm.ppt 6. Faites Fichier - Enregistrez sous et choisir M´etafichier windows comme type d’enregistrement. R´epondre oui pour que toute la s´erie des diapos soit enregistr´ee. 7. Mettre un fond uni `a votre pr´esentation. Si vous d´esirez n´eanmoins un fond, cr´eez-le sous Flash dans une couche s´epar´ee.

5.4.2

Le QCM sous Flash

1. Lancez Flash et enregistrez sous le nom qcm.fla 2. Nommez la premi`ere couche actions, la seconde ppt et la troisi`eme boutons. Image cl´ e1 1. Placez l’action suivante `a l’image 1, couche actions : ntotal=15; transfo = new Object(); rep = []; nq = 1; corrige = 0; var bon = [2,2,1,2,3,1,2,2,2,1,2,3,1,2,3]; enonces.gotoAndStop(1); stop();

Travaux dirig´es d’ActionScript

71

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

– La variable ntotal repr´esente le nombre total de questions dans l’animation PowerPoint (le titre n’est pas compt´e comme une question). – rep contiendra les futures r´eponses. – La variable nq correspond au num´ero de la question courante. – La variable corrige permet de savoir si on est en mode corrig´e ou non. – Le tableau bon contient la suite des bonnes r´eponses au QCM. – Le clip enonces contiendra les diapos, il pointe pour le moment sur la premi`ere image (diapo contenant le titre). 2. Cr´eez un bouton de forme rectangulaire et nommez-le bt (voir le fichier .fla pour un beau bouton `a la i-Mac !) 3. Revenir sur la sc`ene principale de l’animation et placez une occurrence du bouton bt `a l’image cl´e 1. Lui associer l’action suivante : on (release) { gotoAndPlay (2); } Ce bouton servira simplement `a lancer le QCM. 4. Cr´eez un clip nomm´e diapos, cliquez sur sa premi`ere image cl´e et Affichage - Zoom - Afficher une image pour bien centrer le clip. 5. Faites Fichier - Importer et rechercher la premi`ere diapo .wmf qui a ´et´e cr´e´ee avec PowerPoint. 6. R´epondre oui pour importer toute la s´erie. 7. Placez une occurrence du clip diapo sur la sc`ene principale couche ppt et lui donner le nom de enonces. 8. Sur cette occurrence, faites Bouton droit - Modifier en place et avancez dans le clip pour voir si les questions ne d´ebordent pas de l’animation. Image cl´ e2 1. Cr´eez un clip nomm´e choix et placez une occurrence du bouton bt sur sa premi`ere image cl´e. Mettre l’action suivante au bouton : on (release) { _root.rep[_root.nq-1]=Number(nom); _root.nq++; _root.gotoAndPlay("choix"); } La premi`ere ligne permet de r´ecup´erer le num´ero du bouton (1,2 ou 3) et de le placer dans le tableau rep des r´eponses `a la position nq-1 ( rep[0] correspondant `a la premi`ere donn´ee du tableau). On passe alors directement `a la question suivante par _root.nq++. 2. Ajoutez une couche au dessus de celle contenant le bouton et cr´eez une zone de texte dynamique ayant pour nom nom. Ce sera le texte correspondant `a ce bouton.

Travaux dirig´es d’ActionScript

72

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

3. Ouvrez la biblioth`eque par CTRL+L et bouton droit sur le clip choix puis D´efinir les param`etres du clip 4. Ajoutez le param`etre nom et mettre 1 comme valeur par d´efaut. 5. Revenir sur la sc`ene principale de l’animation et placez sur la couche boutons `a l’image cl´e 2 trois occurrences du clip choix. Faites bouton droit - Panneaux - Param`etres du clip sur chacun des clips et mettre la valeur de nom `a 1,2 puis 3. 6. Nommez choix1 le clip de param`etre 1, choix2 le clip de param`etre 2 et choix3 le dernier. 7. Sur la couche actions image cl´e 2, mettre l’action : if (nq<=ntotal) { enonces.gotoAndStop(nq+1); for (i=1; i<=3; i++) { couleur = new Color("choix"+i); if (i == rep[nq-1]) { transfo = {ra:-100,rb:0,ga:100,gb:0,ba:-100,bb:0,aa:100,ab:0}; } else { transfo = {ra:100,rb:0,ga:100,gb:0,ba:100,bb:0,aa:100,ab:0}; } couleur.setTransform(transfo); } if (corrige == 1) { couleur = new Color("choix"+bon[nq-1]); transfo = {ra:0,rb:255,ga:0,gb:255,ba:0,bb:255,aa:100,ab:0}; couleur.setTransform(transfo); } } else { gotoAndPlay ("fin"); } On affiche la question nq qui est `a la diapo nq+1. Puis on colorie les boutons suivant les r´eponses pr´ec´edemment choisies (test i==rep[nq]). Si le test est en phase de correction (test corrige == 1), alors on met en blanc la bonne r´eponse. 8. Donnez le nom choix `a l’image cl´e 2 (Fenˆetre - Panneaux - Image) Image cl´ e3 1. Sur la couche actions, image cl´e 3, mettre l’action stop();. 2. Etendre par F5 les images cl´es 1 des couches boutons et ppt jusqu’en 3. Image cl´ e4 1. Mettre 2 occurrences du bouton bt `a l’image cl´e 4 de la couche actions de la sc`ene principale.

Travaux dirig´es d’ActionScript

73

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

2. A un des boutons associez l’action : on (release) { corrige=1; nq=1; gotoAndPlay ("choix"); } Bouton qui permet de lancer le corrig´e. 3. A l’autre bouton mettre l’action : on (release) { nq=1; gotoAndPlay ("choix"); } qui lui donnera la possibilit´e de voir et/ou corriger ses r´eponses. 4. Ajoutez une zone de texte dynamique nommez score sur la sc`ene image 4. 5. Et enfin, sur la couche actions image cl´e 4, mettre l’action : if (corrige == 1) { score = 0; for (i=1; i<=ntotal; i++) { if (rep[i-1] == bon[i-1]) { score++; } } score = Math.floor(score/ntotal*200)/10 +"/20"; } else { score = ""; } stop(); De cette fa¸con, si nous sommes en mode corrig´e, le nombre de bonnes r´eponses est calcul´e par la boucle et la note sur 20 est affich´ee (avec une d´ecimale).

5.5

Camembert

Nous voulons repr´esenter, sous forme de camembert, les donn´ees suivantes : Valeurs 20 5 50 37 10

Travaux dirig´es d’ActionScript

Cat´egories crayons bleus crayons verts crayons roses crayons turquoises crayons violets 74

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

Placez ces valeurs dans un fichier donnees.txt sous la forme : donneValeurs=20,5,50,37,10&couleurs=0000cc,669999,cc66cc,00cccc,9933cc &categories=crayons bleus,crayons verts,crayons roses,crayons turquoises,crayons violets Veillez bien `a ce que ce fichier soit dans le mˆeme r´epertoire que le fichier .swf que vous allez cr´eer. 1. Cr´eez image cl´e en 1 et placez l’action stop(); sur la couche 1 2. Cr´eez un clip vide nomm´e controle. Placez une occurrence de ce clip sur la sc`ene principale `a l’image 1 et lui donner comme nom lirevaleurs 3. Action associ´ee au clip lirevaleurs : onClipEvent(load) { this.loadVariables("donnees.txt"); } onClipEvent(data) { aVal = donneValeurs.split(","); aCoul = couleurs.split(","); aCat = categories.split(","); for (var i in aVal) { aVal[i] = Number(aVal[i]); } for (var i in aCoul) { aCoul[i] = parseInt(aCoul[i], 16); } for (item in this) { _root[item] = this[item]; } _root.gotoAndStop("dessin"); } – Les variables sont lues grˆace `a la commande this.loadVariables. – La commande split permet de convertir les chaˆınes de caract`eres en tableau en utilisant le s´eparateur ,. Utilisez la fonction trace (aVal[i]); apr`es la ligne aVal[i] = Number(aVal[i]); pour visualiser ce qui se passe. – La fonction parseInt convertit une chaˆıne en entier et l’argument 16 permet de pr´eciser la base utilis´ee. 4. Cr´eez un clip pie ayant sur sa premi`ere image un quartier de 3, 6◦ (Voir figure 5.6)Bien placer la pointe sur la croix + 5. Cr´eez une image cl´e en 2 et donnez-lui le nom dessin. Effacer l’occurrence du clip controle sur cette image. 6. Placez une occurrence de pie `a l’image dessin et lui donner le nom quartier

Travaux dirig´es d’ActionScript

75

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

7. Cr´eez un clip label avec en image 1 une zone de texte dynamique de nom nom. Utilisez le panneau info pour placer le centre de la zone de texte sur la croix. 8. Placez une occurrence du clip label `a l’image dessin de la sc`ene principale et lui donner le nom label. 9. Cr´eez un clip symbole avec en image un le dessin d’un petit carr´e color´e. Utilisez le panneau info pour placer le centre du carr´e sur la croix (Ainsi, les carr´es et les noms des labels seront bien align´es) 10. Placez n’importe o` u une occurrence du clip symbole `a l’image dessinde la sc`ene principale et lui donner le nom carre et les dimensions L = 10 et H = 10 11. Placez sur le calque 1 `a l’image dessin l’action : nElements = aCoul.length; aPourc = new Array(nElements); Prof = 1; // Calcule le total for (i=0; i
Travaux dirig´es d’ActionScript

76

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

_root["label"+i].nom = aCat[i]; _root["label"+i]._x = 200; _root["label"+i]._y = i*20+50; // On duplique la portion de camembert for (j=0; j
5.6

Panorama 360

Pour cr´eer assez facilement et gratuitement de vrais panoramas 360◦ (cylindriques ou sph´eriques), je vous conseille Panotools de Helmut Dersch. Une petite doc sera bientˆot `a disposition sur mon site. Ce que nous voulons faire ici, c’est juste naviguer horizontalement dans un Panorama 360◦ . Il vous faudra pour cela trouver ou cr´eer une image se raccordant aux 2 extr´emit´es. 1. Importez votre image sous Flash 2. Convertissez-l`a en symbole ayant pour nom photo 3. Ajustez la taille de votre animation pour que sa largeur soit celle de votre image. 4. Cr´eez un clip nomm´e panorama et mettre une occurrence de photo avec pour nom but `a l’image 1. 5. Placez l’action suivante sur l’image 1 du clip panorama : m=0; largeur=getProperty (but,_width); while (m<3) { m++; duplicateMovieClip (but, "but"+m, m+1); this["but"+m]._x = getProperty (but,_x)+m*largeur; } stop(); Ceci aura pour effet de dupliquer la photo et de placer les images les unes `a cˆot´e des autres.

Travaux dirig´es d’ActionScript

77

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

Fig. 5.5 – Aspect de la sc`ene principale

Fig. 5.6 – Le clip pie est un quartier de disque d’angle 3, 6◦

Fig. 5.7 – R´esultat apr`es quelques ajustages

Travaux dirig´es d’ActionScript

78

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

6. Placez l’action suivante `a l’image 1 de la sc`ene principale : demi=_root._width/2; w=getProperty (_root.nav,_width); speed=45; stop(); Vous pouvez modifier la variable speed qui r`egle la vitesse de d´efilement. 7. Cr´eez un clip vide nomm´e dragControl avec l’action suivante sur l’image 1: xpos=(getProperty(this,_x)-_root.demi)/_root.speed; _root.nav._x = getProperty (_root.nav,_x)-xpos; if (getProperty (_root.nav,_x)<-_root.w) { _root.nav._x = 0; } else if (getProperty (_root.nav,_x) rel="nofollow">0) { _root.nav._x = -_root.w; } 8. Et l’action gotoAndPlay (1); `a l’image 2. 9. A l’image 1 de la sc`ene principale, placez une occurrence du clip panorama nomm´e nav 10. Cliquez sur nav puis CTRL+K pour afficher la fenˆetre d’alignement. Choisir : Vers la sc`ene et r´epartir horizontalement et verticalement. Ceci permet de placer l’occurrence au milieu de la sc`ene. 11. Placez ´egalement une occurrence du clip dragControl et lui donner l’action : onClipEvent (load) { startDrag ("", true); }

5.7

Rotation autour d’un objet

Voici une mani`ere tr`es ´el´ementaire de cr´eer un effet de rotation 3D autour d’un objet. 1. Prendre des photos d’un objet en tournant autour (par exemple 8 photos `a 45◦ d’intervalle). 2. Cr´eez un clip nomm´e objet et placez aux diff´erentes images cl´es les photos (par exemple 8). 3. Placez une occurrence de ce clip sur la sc`ene principale et lui donner le nom objet 4. Cr´eez un clip vide mettre une occurrence de celui-ci sur la sc`ene principale en X = 0 et Y = 0

Travaux dirig´es d’ActionScript

79

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

5. Ajoutez l’action suivante `a ce clip : onClipEvent (load) { nb = _root.nbphotos; L = _root._width; _root.objet.gotoAndStop(1); } onClipEvent (mouseMove) { x = _xmouse; if ((x>0) && (x
360◦ autour d’un objet (version 2)

5.8

Il s’agit d’une version am´elior´ee du travail dirig´e sur la rotation autour d’un objet pr´ec´edent. Le curseur prend maintenant la forme d’une main du type Acrobat Reader (ferm´ee ou ouverte) et la rotation s’effectue `a partir de n’importe quel endroit cliqu´e `a l’´ecran.

5.8.1

Changement de curseur

L’id´ee est vraiment tr`es simple, on cache le curseur existant et on cr´ee un clip qui le remplacera ! 1. Cr´eez un clip nomm´e main et dessinez une petite main ouverte sur la croix sur la premi`ere image cl´ee (Utilisez le .fla joint si vous avez des difficult´es pour la dessiner !) 2. Dessinez une main ferm´ee `a l’image cl´ee n◦ 2 3. Ajoutez l’action stop(); `a la premi`ere image cl´ee 4. Revenez sur la sc`ene principale et mettez une occurrence du clip main n’importe o` u. Donnez-lui le nom main par Bouton droit - Panneaux Occurrence. 5. Mettre l’action suivante `a l’image 1 de la sc`ene principale : Mouse.hide(); nbimages=20; courant=1; stop ();

Travaux dirig´es d’ActionScript

80

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

La premi`ere ligne permet de cacher le curseur de la souris, la variable nbimages contient le nombre total d’images de l’objet, courant est le num´ero de l’image courante affich´ee. 6. Associez au clip main l’action suivante : onClipEvent (load) { startDrag ("", true); enfonce = false; largeur=_root._width/10; } onClipEvent (mouseDown) { _root.main.gotoAndStop(2); position = _x; enfonce = true; } onClipEvent (mouseUp) { _root.main.gotoAndStop(1); enfonce = false; } onClipEvent (mouseMove) { if ((position>_x+largeur) && enfonce) { _root.courant++; if (_root.courant>_root.nbimages-2) { _root.courant = 1; } _root.objet.gotoAndStop(_root.courant); position = _x; } if ((position<_x-largeur) && enfonce) { _root.courant--; if (_root.courant<1) { _root.courant = _root.nbimages-2; } _root.objet.gotoAndStop(_root.courant); position = _x; } } Quelques explications sur le script : – Lors du chargement du script (load), le clip main suivra les mouvements de la souris et l’on pr´ecise ici que la souris n’a pas encore ´et´e enfonc´ee. – Si l’on presse le bouton de la souris (mouseDown), l’aspect du curseur change (image 2 comportant la main ferm´ee) et l’on met enfonce `a vrai. De plus, la position actuelle de la souris est mise en m´emoire. – Quand on relˆache la souris (mouseUp), la variable enfonce repasse `a faux et l’image redevient la main ouverte. – Si maintenant on bouge la souris (mouseMove) et que le bouton n’est

Travaux dirig´es d’ActionScript

81

Eric Schrafstetter

CHAPITRE 5. VISUALISATION

pas enfonc´e, il ne doit rien se passer. Si le bouton est enfonc´e, on regarde si la personne a d´eplac´e la souris suffisamment loin de l’origine du clic. Si c’est le cas, on augmente ou diminue la valeur de courant donnant ainsi le num´ero de l’image `a afficher (toujours avec les probl`emes aux bords). On m´emorise alors la nouvelle position de la souris.

5.8.2

L’objet

Prenez par exemple 18 photos en tournant autour de l’objet par angles de 20◦ . Ajoutez 2 photos, une de dessus et une de dessous. Dans ce cas, la variable nbimages sera ´egale `a 18+2=20. 1. Cr´eez un nouveau clip ayant pour nom objet 2. Importez la premi`ere image par Fichier - Importer. Faites de mˆeme avec les autres images en vous pla¸cant aux images cl´ees 2,3... Le plus simple est de nommer vos photos im1.jpg, im2.jpg... dans ce cas Flash vous proposera d’importer directement toute la s´erie ! Veillez `a ce que les images 19 et 20 soient celles du dessus et du dessous. 3. Ajoutez l’action stop(); `a la premi`ere image du clip objet 4. Revenez sur la sc`ene principale et ins´erez une nouvelle couche SOUS celle contenant la main (sinon la souris sera cach´ee par l’image). Placez sur cette nouvelle couche une occurrence du clip objet avec pour nom objet. 5. Ajoutez 3 boutons quelconques sur la sc`ene principale. Au premier bouton associez l’action : on (release) { _root.objet.gotoAndStop(_root.nbimages); } Ceci permettra de voir l’image du dessus (ou dessous). 6. De mˆeme, au second bouton ajoutez l’action : on (release) { _root.objet.gotoAndStop(_root.nbimages-1); } 7. Et au dernier bouton, qui permet de revenir `a la vision de cˆot´e : on (release) { _root.objet.gotoAndStop(_root.courant); } Il ne reste plus qu’`a compiler, `a appuyer n’importe o` u sur la sc`ene et `a d´eplacer la main ferm´ee vers la gauche ou la droite. Pour ressembler encore plus `a QuickTime VR, ajoutez 2 boutons avec des loupes + et - (c’est un petit exercice facile utilisant les fonctions objet._xscale et objet._yscale)

Travaux dirig´es d’ActionScript

82

Chapitre 6

Outils de conversions 6.1

Bitmap vers Vectoriel

Il y a des dizaines d’utilitaires pour transformer des images Bitmap en images Vectorielles ! Cherchez les mots-cl´e Raster to vector pour vous en convaincre. A quoi bon me direz-vous puisque Flash le fait ma foi fort bien ? Certes. Mais je vous ai trouv´e un petit freeware qui va, je l’esp`ere, vous ´etonner... En tout cas je le trouve fabuleux ! Il permet de convertir des .bmp ou .tif 1 bit (c`ad en 2 couleurs) en .emf (qui est la version 32-bits du .wmf). Cet utilitaire s’appelle ras2vec. Et alors ? Alors voici un exercice pour vous montrer ce que l’on peut faire : 1. T´el´echargez le zip et d´ezippez 2. Copiez le fichier ras2vec.exe se trouvant normalement dans le r´epertoire Testing dans c:\windows\command par exemple (afin qu’il soit accessible de partout) 3. Dessinez avec un logiciel quelconque (Flash par exemple ! !) une image en noir et blanc et enregistrez-l`a sous le nom image.bmp (Fichier - Exporter l’image si vous utilisez Flash) 4. Ouvrez une fenˆetre DOS dans le r´epertoire o` u est l’image. Tapez la ligne de commande suivante : ras2vec -d -m image.bmp Remarque : Tapez ras2vec pour voir les param`etres possibles. Il est ´egalement possible de faire : ras2vec -d -m *.bmp qui convertit toutes les images .bmp en une fois ! ! Supprimez le param`etre -d si vous voulez une version fil de ferLe param`etre optionnel -e tf avec tf ∈ [0, 10] d´efinie le seuil de tol´erance (10 pour tr`es peu de lignes) 5. Lancez Flash et importez le fichier image.emf cr´e´e.

83

Eric Schrafstetter

CHAPITRE 6. OUTILS DE CONVERSIONS

TD - ActionScript nom.bmp

ras2vec -d -m nom.bmp

ras2vec -m nom.bmp

Fig. 6.1 – Exemple avec un texte

femme.bmp

ras2vec -d -m femme.bmp

ras2vec -m femme.bmp

Fig. 6.2 – Exemple avec une image

Travaux dirig´es d’ActionScript

84

Eric Schrafstetter

6.2

CHAPITRE 6. OUTILS DE CONVERSIONS

Images vers swf

Le petit utilitaire gratuit jpeg2swf permet de convertir facilement des images jpg en swf aux formats Flash 3,4 ou 5. N’apporte pas grand chose par rapport `a l’importation direct de l’image sous flash... Quant `a gif2swf, il convertit des fichiers gif en swf. Attention, il ne transforme pas votre gif en image vectorielle ! Ce logiciel gratuit n’est, `a mon humble avis, utile qu’aux personnes ne poss´edant pas Flash 5 et voulant convertir des gifs anim´es en animation Flash.

6.3

Diaporama en swf

Voici un petit programme de mon cru (cr´e´e avec Visual Basic en utilisant la librairie swfobs.dll) qui permet de convertir des fichiers JPG en un unique fichier SWF. Vous pouvez le t´el´echarger ici : diapo.zip.

6.3.1

Introduction

1. Permet de s´electionner toutes les images d’un r´epertoire en une fois 2. Possibilit´e de r´earranger les images, de les supprimer... 3. Deux sorties possibles : – Diaporama autonome avec boutons suivant et pr´ec´edent – Format LoadMovie utilisable directement dans une autre animation Flash 4. Choix de la taille de l’animation, de sa fr´equence d’affichage (en frames / seconde) et de sa couleur du fond 5. La taille des images s’adapte au format de sortie, c’est donc un net avantage par rapport `a une manipulation sous Flash ATTENTION ! Ce programme plantera si vous utilisez des JPG `a compression progressive. Il fonctionne parfaitement avec des JPG `a compression standard en 16 millions de couleurs.

6.3.2

Quelques remarques

Pour convertir une vid´eo AVI en fichier SWF (avec une bonne compression, on divise facilement la taille du AVI par 10), la manipulation peut ˆetre : 1. Utilisez VirtualDub si vous voulez effectuer des effets sp´eciaux sur votre AVI (conversion en noir et blanc, contours, etc...) 2. Utilisez ensuite AVI2JPEG pour d´ecomposer votre animation en images JPEG `a compression standard 3. Lancez Diaporama et ajoutez toutes les images, mettre la dimension de l’animation `a celle des images et la fr´equence `a celle du AVI d’origine. La taille du fichier SWF est pratiquement ´egale `a la somme des tailles des fichiers JPG.

Travaux dirig´es d’ActionScript

85

Eric Schrafstetter

6.3.3

CHAPITRE 6. OUTILS DE CONVERSIONS

Les indispensables !

– Irfanview (freeware) : Lecteur de fichiers (JPG, AVI, MPG...), il permet de convertir des images par paquet (touche B), de renommer tous vos fichiers en nomxxx.jpg etc. – VirtualDub (freeware) : Lecteur de fichier AVI et MPG. Nombreux effets sp´eciaux. Permet aussi de convertir des MPG en AVI. – AVI2JPEG (freeware ou Shareware) : L’outil id´eal ! Transforme vos AVI en images JPG bien num´erot´ees, visualisation de la compression des images et tr`es simple d’utilisation.

6.3.4

Exemple d’utilisation

1. Utilisez diaporama pour cr´eer une animation anim.swf du type LoadMovie avec un Stop sur la derni`ere image. 2. Lancez Flash et cr´eez un clip vide 3. Mettre une occurrence de ce clip sur la sc`ene principale et lui donner le nom film 4. Cr´eez un bouton quelconque et mettre deux occurrences de celui-ci sur la sc`ene 5. Ajoutez l’action suivante au premier bouton : on (release) { _root.film.stop(); } 6. Ajoutez l’action suivante au second bouton : on (release) { _root.film.play(); } 7. Ajoutez l’action suivante `a la premi`ere image cl´e de la sc`ene principale loadMovie ("anim.swf", _root.film); stop(); 8. Compilez et lancez l’animation. anim.swf est charg´ee dans le clip film. 9. Si vous cliquez sur le premier bouton, l’animation s’arrˆete. Le second permet de red´emarrer. Vous pouvez aussi utiliser les actions .nextframe() et .prevframe().

6.4

Films vers swf

Le logiciel vid2swf permet de convertir des images ou des vid´eos en .swf.

6.5

Microsoft Office

6.5.1

La barre de dessin

Travaux dirig´es d’ActionScript

86

Eric Schrafstetter

CHAPITRE 6. OUTILS DE CONVERSIONS

La barre de dessin des logiciels Word, Excel ou PowerPoint peut vous ˆetre d’une grande utilit´e si vous ne poss´edez pas de logiciel de dessin vectoriel (Comme Freehand ou CorelDraw)Voici un exemple tr`es simple d’animation 3D 1. Lancez Word et affichez la barre de dessin 2. Dessinez un cube en commen¸cant par un rectangle puis effet 3D 3. Copiez l’image et allez sous Flash. Faites Edition - Collage Sp´ecial puis choisir Image (m´etafichier)Le cube apparaˆıt (en vectoriel) `a l’´ecran. Ins´erez une image cl´ee vide en 2. 4. Revenir sous Word et afficher la barre de param`etres 3D. Faites tourner l´eg`erement votre cube et retournez `a l’´etape pr´ec´edente ! Cette manipulation fonctionne ´egalement pour les graphiques g´en´er´es par Excel, les formules math´ematiques de l’´editeur d’´equations et bien sˆ ur les cliparts qui peuvent directement ˆetre import´es sous Flash.

6.5.2

Powerpoint vers Flash

Il n’y a (`a ma connaissance) aucun outil permettant la conversion directe d’un diaporama PowerPoint en Flash. L’id´ee est pourtant s´eduisante ! La voie Powerpoint → XML → Flash semble interesser quelques personnes mais je ne vois pas comment les animations PPT pourront ˆetre conserv´ees de cette mani`ere. Ceci dit, si vous trouvez que la mise en forme de texte (titres, listes `a puces...), graphiques, organigrammes. . . est plus rapide `a faire sous PowerPoint (Nous sommes d’accord ?) mais que Flash c’est quand mˆeme plus sympa (toujours d’accord ?), alors voici un exercice qui va vous plaire. Plus s´erieusement, le mode Plan sous PowerPoint est assur´ement plus maniable que la grille sous Flash et, `a titre d’exemple, un petit diaporama (5 diapos sans animation) prenant 35Ko en format .pps (Diaporama PPT) transform´e en .swf (avec quelques animations et les touches de navigation) passe `a 18,3Ko ! 1. Lancez PowerPoint 2. Fichier - Mise en page et choisir Diapositives dimensionn´ees pour affichage `a l’´ecran. 3. Ins´erez une diapo de titre ( CTRL+M et 1er choix) 4. Tapez un titre, un sous-titre 5. Ins´erez une nouvelle diapo avec des listes `a puces. Remplir quelques lignes 6. Nouvelle diapo avec un graphique ou un organigramme 7. Nouvelle diapo avec une image bitmap (jpg par exemple) 8. Pour finir, une autre diapo avec un ClipArt de la biblioth`eque et/ou une figure `a partir de la barre d’outils de dessin. 9. Faites Format-Jeu de couleurs et appliquez un jeu 10. Enregitrez votre animation sous le nom diapo.ppt 11. Faites Enregistrez-sous et choisir Type : M´etafichier Windows (.wmf). R´epondre oui pour que toutes les images soient enregistr´ees. Remarquez

Travaux dirig´es d’ActionScript

87

Eric Schrafstetter

CHAPITRE 6. OUTILS DE CONVERSIONS

que je vous ai fait placer une image bitmap alors que nous enregistrons en un format vectoriel... et bien je ne sais pas pourquoi mais PowerPoint la laisse miraculeusement en bitmap (et c’est tant mieux !). 12. Un dossier du nom de votre diaporama est alors cr´e´e avec toutes les images. 13. Lancez Flash et allez dans Modification - Animation ( CTRL+M)Si votre ´ecran est par exemple en 800×600 mettre ces valeurs en largeur et hauteur (Choisir Unit´es de la r`egle = Pixels). 14. Mettre une couleur de fond `a votre animation 15. Tr` es important ! Faites CTRL+2 ou Affichage - Zoom - Afficher une image pour bien cadrer votre animation au milieu de l’´ecran. 16. Placez-vous `a l’image 1 de votre animation et Fichier-Importer 17. Recherchez la premi`ere diapositive au format .wmf et importez. Flash vous propose d’importer les autres, r´epondre oui. 18. Normalement vos diapos PPT doivent ˆetre parfaitement centr´ees dans l’animation Flash 19. Remarquez aussi que tout est en vectoriel, les organigrammes, les ClipArts, que les textes peuvent ˆetre chang´es en cliquant 2 fois dessus et que les ´el´ements des graphiques peuvent ´egalement ˆetre recolori´es en cliquant 2 fois dessus. 20. Ins´erez maintenant un nouveau calque sous le calque contenant les diapos (voir figure 6.3). 21. Cr´eez un clip vide et mettre une occurrence de celui-ci sur la premi`ere image calque 2Associez-lui l’action suivante : onClipEvent (keyDown) { if (libre) { if (Key.isDown(Key.SPACE) || Key.isDown(Key.RIGHT) || Key.isDown(Key.DOWN) || Key.isDown(Key.PGDN)) { _root.gotoAndStop(_root._currentframe+1); } else if (Key.isDown(Key.LEFT) || Key.isDown(Key.UP) || Key.isDown(Key.PGUP)) { _root.gotoAndStop(_root._currentframe-1); } else if (Key.isDown(Key.HOME)) { _root.gotoAndStop(1); } libre = false; } } onClipEvent (keyUp) { libre = true; } onClipEvent (load) { libre = true; }

Travaux dirig´es d’ActionScript

88

Eric Schrafstetter

CHAPITRE 6. OUTILS DE CONVERSIONS

L’id´ee du script est simple : si l’on tape sur la barre d’espace ou fl`eche de droite ou bas ou page suivante, on avancera dans le diaporama par l’action gotoAndStop. Idem avec les fl`eches gauche, haut et page pr´ec´edent pour revenir `a la diapo pr´ec´edente. J’ai rajout´e une action sur la touche Home qui revient sur la premi`ere diapo. Si vous ne voyez pas `a quoi sert la variable libre, supprimez-l`a ! Simplement, cela ´evite que le diaporama d´efile `a toute vitesse si vous vous endormez en visionnant votre diaporama ! La variable libre passe `a false si la touche est press´ee et bloque le d´efilement. Elle revient `a true lorsque la touche est relˆach´ee ( keyUp). 22. Utilisez la touche F5 pour ´etendre l’image cl´e 1 du second calque jusqu’`a la derni`ere diapo. 23. Enfin, sur la premi`ere image cl´e du second calque, ajoutez l’action : fscommand ("fullscreen", "true"); stop(); De sorte que l’animation prendra tout l’´ecran comme un vrai diaporama PowerPoint. 24. Compilez, lancez et naviguez avec les fl`eches du clavier et la barre d’espace. 25. Pour les plus forts qui se demandent comment on peut ajouter un peu d’animation `a tout cela, voil`a une id´ee : (a) S´electionnez un ou plusieurs ´el´ements `a animer (texte, ClipArt...) (b) Faites F8 pour le transformer en symbole, par exemple clip_txt (c) Puis bouton droit - Modifier en place et `a nouveau F8 Donnez un nom, par exemple txt (d) Animez ce symbole sur la ligne temporelle et ajoutez tous les effets que vous voulez. Mettre une action stop(); `a la fin de cette animation pour ´eviter de boucler. 26. Pour des fonds en d´egrad´e, je vous d´econseille fortement de l’importer de PowerPoint (essayez pour comprendre !)Ajoutez plutˆot sous Flash un troisi`eme calque avec un grand rectangle couvrant toute la surface et utilisez le pot de peinture.

6.5.3

Flash vers PowerPoint

Voir le paragraphe PowerPoint du chapitre Visualisation.

6.5.4

Powerpoint-Flash ou PDF ?

Le format PDF de la soci´et´e Adobe permet certaines options assez difficiles `a obtenir en Flash : 1. Pages simples, en continue ou 4 × 4 2. Bookmarks pour une navigation rapide

Travaux dirig´es d’ActionScript

89

Eric Schrafstetter

CHAPITRE 6. OUTILS DE CONVERSIONS

3. Recherche de texte 4. Boutons de navigation pr´ec´edent-suivant. Je signale ici qu’il est possible de cr´eer des fichiers PDF gratuitement de diff´e/rentes fa¸cons : 1. HTMLDoc qui convertit du HTML en PDF de fa¸con remarquable (mon pr´ef´er´e) 2. Installer une imprimante PostScript virtuelle et GhostView (voir explication sur mon site www.chez.com/revo) 3. Utilisez LATEX2e et dvipdfm (Par exemple avec MikTeX pour windows) 4. Avec PHP et la librairie PDFLib... Revenons `a nos moutons ! Le tandem PowerPoint - Flash peut parfois ˆetre une alternative au PDF. Outre ´evidemment la possibilit´e d’ajouter des animations, Flash permet de d´efinir l’impression de pages sp´ecifiques. Voici un exemple : 1. Lancez PowerPoint et Fichier-Mise en Page. Choisir Diapositives dimensionn´ees pour format A4. 2. Cr´eez quelques diapos (disons 3), utilisez la barre de dessin pour ajouter des effets d’ombres aux titres, des bordures, etc. 3. Enregistrez votre diaporama en diapo.ppt puis Fichier-Enregistrez sous et choisir comme type : M´etafichier windows (wmf) 4. Les diff´erents fichiers wmf sont cr´e´es. Lancez Flash et Modification-Animation, choisir Unit´es en centim`etres et taille = 21 × 29, 7 cm 5. Faites CTRL+2 pour centrer l’image sur la sc`ene. 6. Importez la premi`ere diapo et cliquez sur oui pour ins´erer toute la s´erie. 7. Cliquez sur une image `a imprimer et choisissez Fenˆetre - Panneaux - Image ( CTRL+F)Mettre Etiquette = #p 8. Faites la mˆeme chose avec d’autres diapos (pas toutes pour voir l’int´erˆet de la manipulation). 9. Cr´eez un nouveau clip nomm´e commandes. Dans ce clip, placez un bouton repr´esentant une fl`eche vers la gauche, un autre bouton avec une fl`eche vers la droite, un dernier repr´esentant une imprimante et ajoutez un fond repr´esentant une fenˆetre (voir figure 9). 10. Au bouton avec la fl`eche vers la gauche ajoutez l’action : on (release) { _root.gotoAndStop(_root._currentframe-1); } 11. Au bouton avec la fl`eche vers la droite ajoutez l’action : on (release) { _root.gotoAndStop(_root._currentframe+1); }

Travaux dirig´es d’ActionScript

90

Eric Schrafstetter

CHAPITRE 6. OUTILS DE CONVERSIONS

12. Au bouton d’impression, ajoutez l’action : on (release) { _visible=false; printNum (0, "bmovie"); } Ainsi la petite barre de navigation disparaˆıtra avant que l’impression ne soit lanc´ee. Remarquez qu’il n’y a pas d’image ayant pour nom #b, le format d’impression sera donc celui de l’image (ici 21 × 29, 7) 13. Sur la sc`ene principale, ajoutez un calque nomm´e action au dessus de celui r´eserv´e aux diapos. 14. Sur la premi`ere image de ce calque, mettre une occurrence du clip commandesAjoutezlui l’action : onClipEvent (mouseDown) { if (this.hitTest(_root._xmouse, _root._ymouse)) { startDrag (""); } else if (!_visible) { _visible=true; } } onClipEvent (mouseUp) { stopDrag (); } Ceci permet de d´eplacer la barre de navigation qui pourrait gˆener la lecture. Lorsque l’on presse sur l’imprimante la barre disparaˆıt (pour ne pas ˆetre imprim´ee) et r´eapparaˆıtra lorsque l’on pressera le bouton de la souris. Vous pouvez ´egalement ajouter un petit effet alpha sur l’occurrence du clip... 15. Ajoutez l’action stop(); `a la premi`ere image du calque action. 16. Etendre par F5 la premi`ere image du calque action de la commande jusqu’`a la derni`ere diapositive. 17. Compilez, lancez et testez les boutons de la barre de navigation.

Travaux dirig´es d’ActionScript

91

Eric Schrafstetter

CHAPITRE 6. OUTILS DE CONVERSIONS

Fig. 6.3 – Les deux calques de la projection

Barre de navigation

Fig. 6.4 – La barre de navigation.

Travaux dirig´es d’ActionScript

92

Chapitre 7

SmartClips 7.1

Variateur

Nous cherchons `a construire un variateur ressemblant `a la figure 7.1.

label

10

-50

0

50 Fig. 7.1 – Le variateur : un label et un curseur mobile Le SmartClip aura pour param`etres les variables nom (nom de l’occurrence), min et max. 1. Cr´eez un clip triangle ayant la forme d’un petit triangle C qui servira de curseur. 2. Cr´eez un bouton bouge ayant sur ses 4 images cl´es le clip triangle (vous pouvez bien sˆ ur cr´eer des variations !) 3. Cr´eez un clip curseur o` u vous placerez une occurrence du bouton bouge avec la pointe gauche en X = 0 et Y = −50 (relativement `a la croix centrale). 4. Ajoutez l’action suivante au bouton : 93

Eric Schrafstetter

CHAPITRE 7. SMARTCLIPS

on (press) { startDrag ("", false, 0, 100, 0, 0); _parent.gotoAndPlay(2); } on (release, releaseOutside) { stopDrag (); _parent.gotoAndPlay(1); } 5. Nous allons maintenant cr´eez un clip compteur contenant une occurrence du clip curseurLorsque l’utilisateur pressera le bouton cach´e dans le clip curseur, le clip compteur bouclera entre les images 2 et 3, permettant de r´ecup´erer la hauteur actuelle du triangle. 6. Cr´eez un clip compteur avec 3 couches : une pour les actions, une o` u vous mettrez une occurrence du clip curseur (avec son centre en (0,0)) en lui donnant le nom base et une o` u vous placerez une zone de texte dynamique ayant pour nom label 7. Ajoutez l’action suivante au clip curseur onClipEvent (load) { _parent.label=(_parent.max+_parent.min)/2; } Qui permettra d’initialiser la variable label. 8. Etendre par F5 l’image du clip et de la zone de texte dynamique jusqu’`a l’image 3 du clip compteur. 9. A la premi`ere image cl´e du clip, mettre l’action stop(); 10. Mettre l’action suivante `a l’image 2 du mˆeme clip : temp=min+(100-base._y)*(max-min)/100; label=Math.round (100*temp)/100; 11. Mettre l’action gotoAndPlay (2); `a l’image 3. 12. Ouvrez la biblioth`eque puis faites Bouton droit - D´efinir les param`etres du clip sur compteur. Nom nom min max

Valeur c1 -1 1

Type : Default Default Default

13. Retournez sur la sc`ene principale et mettre une occurrence de compteurFaire Bouton droit - Panneaux - Param`etres du clip et saisir : Nom nom min max

Valeur x -4 1

Type : Default Default Default

14. Lancez l’animation et d´eplacez le curseur, la valeur change entre min et max.

Travaux dirig´es d’ActionScript

94

Eric Schrafstetter

7.2

CHAPITRE 7. SMARTCLIPS

Fenˆ etres volantes

Titre Le contenu de la fenêtre sera ici ! OK Fig. 7.2 – Apparence de la fenˆetre 1. Cr´eez un bouton ayant la forme d’un rectangle ressemblant `a une barre de titre d’une fenˆetre Windows (voir figure 7.2) 2. Cr´eez le bouton OK et celui ayant la forme d’une croix. 3. Cr´eez un clip nomm´e message et mettre l’action suivante `a la premi`ere image nomm´ee off : _name=nom; stop(); 4. Mettre l’action stop(); `a la seconde image nomm´ee on de ce clip. 5. Assurez-vous que la sc`ene du clip message est vide `a l’image 1A l’image 2, placez le dessin d’une fenˆetre (voir figure 7.2) avec 2 zones de textes dynamiques nomm´ees titre pour le titre et contenu pour la zone qui servira `a recevoir la phrase principale. Placez ´egalement les boutons cr´e´es `a l’´etape 1 `a leurs places. 6. Associez l’action suivante aux boutons OK et `a la croix : on (release) { gotoAndStop (1); } Ceci permettra de faire disparaˆıtre la fenˆetre (l’image cl´e 1 du clip ´etant vide). 7. Associez l’action suivante au bouton servant de barre de titre : on (press) { startDrag (_parent.nom); } on (release, releaseOutside) {

Travaux dirig´es d’ActionScript

95

Eric Schrafstetter

CHAPITRE 7. SMARTCLIPS

stopDrag (); } 8. Ouvrez la biblioth`eque et faites Bouton droit sur Message puis D´efinir les param`etres du clip. Cliquez sur le signe + trois fois de sorte que : Nom nom titre contenu

Valeur fenetre Bienvenue Tapez votre texte ici

Type : Default Default Default

9. Revenez `a la sc`ene principale et placez une occurrence du clip (SmartClip maintenant !) messageUn petit cercle apparaˆıt (encore une fois, parce que l’image cl´e 1 du clip est vide)Sur l’occurrence, faites Bouton droit - Panneaux - Param`etres du clip. Mettre : Nom nom titre contenu

Valeur fen1 Mon titre Je tape mon texte ici

10. Cr´eez un bouton quelconque et placez-en une occurrence sur la sc`ene principale avec l’action : on (release) { _root.fen1.gotoAndPlay("on"); } 11. Lancez l’animation et cliquez sur le bouton. La fenˆetre apparaˆıt. Placezvous sur la barre des titres et d´eplacez la souris. Cliquez sur OK ou sur la croix pour fermer. 12. Vous pouvez placer plusieurs occurrences du SmartClip en leur donnant des param`etres diff´erents.

7.3

Biblioth` eque commune

Cr´eation de boutons radio : 1. Ouvrir la biblioth`eque commune de SmartClips 2. Placez 2 occurrences de RadioButton sur la sc`ene principale. 3. Faire Bouton droit sur le premier SmartClip et Panneaux - Param`etres du clip. Entrez : _name=homme checked=true label=homme style=Mac

Travaux dirig´es d’ActionScript

96

Eric Schrafstetter

CHAPITRE 7. SMARTCLIPS

Le premier param`etre permet de d´efinir le nom de l’occurrence, le second pr´ecise que le bouton est enfonc´e, le troisi`eme est le nom visible sur la sc`ene et le dernier le style du bouton. 4. Faˆıtes de mˆeme avec le second SmartClip en mettant : _name=femme checked=false label=femme style=Mac 5. Mettre l’action stop(); `a l’image 1 de la sc`ene principale. 6. Cr´eez sur la sc`ene principale une zone de texte dynamique de nom de variable choix 7. Cr´eez un bouton quelconque et placez-le sur la sc`ene avec l’action : on (release) { choix=_root.homme.getState(); } 8. Lancez l’animation et cliquez sur le bouton radio homme puis sur le bouton, la variable choix doit ˆetre ´egale `a true. Cliquez maintenant sur le bouton radio femme puis le bouton, choix passe `a false. 9. Inversement, l’action : on (release) { choix=_root.homme.setState(true); } permet de s´electionner le bouton homme.

7.4

SmartClip Calendrier

Je vois pas mal d’animations Flash comportant des calendriers et la plupart ont sans doute ´et´e faits ’`a la main’. Voici donc un petit exercice qui permet de cr´eer un SmartClip ayant 3 param`etres : une ann´ee, un mois et une dimension. Le r´esultat sera la cr´eation du calendrier correspondant. 1. Cr´eez un clip nomm´e jour, y placez une zone de texte dynamique avec pour nom de variable numero, d´ecochez ’s´electionnable’ et cochez ’Bordure’. Une fois que vous aurez compris l’exercice, vous reviendrez certainement am´eliorer cette partie (couleur, bouton, animations...). 2. Ouvrez la biblioth`eque par Fenˆetres - Biblioth`eque ( CTRL+L) et bouton droit sur jour puis Liaison. 3. Choisissez ’Exporter ce symbole’ et lui donner le nom jour 4. Cr´eez un nouveau clip nomm´e calend et mettre l’action suivante `a l’image 1 de ce clip :

Travaux dirig´es d’ActionScript

97

Eric Schrafstetter

CHAPITRE 7. SMARTCLIPS

semaine = ["L", "M", "M", "J", "V", "S", "D"]; mois--; cadre = cote+2; for (j=0; j<=6; j++) { n = 50+j; this.attachMovie("jour", "j"+n, n-1); with (this["j"+n]) { _x = cadre*j; _y = 0; _width = _height=cote; } this["j"+n].numero = semaine[j]; } calendrier = new Date(annee, mois, 1); premier = calendrier.getDay(); if (premier == 0) { premier = 7; } aff = false; for (j=0; j<=5; j++) { for (i=1; i<=7; i++) { n = i+7*j; this.attachMovie("jour", "j"+n, n-1); with (this["j"+n]) { _x = cadre*(i-1); _y = cadre*(j+1); _width = _height=cote; } jour = n-premier+1; calendrier = new Date(annee, mois, jour); this["j"+n].numero = calendrier.getDate(); if (jour == 1) { aff = true; } if ((jour != 1) and (this["j"+n].numero == 1)) { aff = false; } if (!aff) { this["j"+n]._alpha = 50; } } } stop(); Quelques explications sur le script : – La fonction getDay renvoie 1 pour lundi, 2 pour mardi et 0 pour di-

Travaux dirig´es d’ActionScript

98

Eric Schrafstetter

CHAPITRE 7. SMARTCLIPS

manche. – Le mois de janvier a pour valeur 0 dans Flash, ce qui explique le mois-permettant de transformer le param`etre mois du SmartClip au bon format. – La fonction attachMovie permet de dupliquer un ´el´ement de la biblioth`eque comportant une liaison. Il faut ´egalement pr´eciser le niveau de chargement en troisi`eme param`etre. – La premi`ere boucle affiche les cases comportant les noms des jours de la semaine. – On trace ensuite dans la seconde boucle 48 cases avec dans chaque case le num´ero du jour (r´ecup´er´e par la fonction getDate). Bien sˆ ur, comme le premier d’un mois ne tombe pas toujours un lundi, on commence pdoncar chercher le jour de la semaine du 1er par la fonction getDay – Il faut bien comprendre que Flash accepte tr`es bien des dates du type Date(2001,7,45) ou Date(2001,7,-5) ! Cela ´evite de regarder si le mois comporte 28,29,30 ou 31 jours... – Si le premier jour du mois est un dimanche (valeur 0), on la met `a 7 – Pour corser, on d´ecide de mettre un effet alpha sur les dates qui ne sont pas dans le mois (fin du mois pr´ec´edent et d´ebut du mois suivant). Pour cela, la variable aff est `a faux au d´ebut (nous ne sommes pas dans le mois), on attend d’entrer dans le mois (test jour == 1), la variable aff passe alors `a vrai et les dates sont affich´ees normalement. Le mois sera termin´e quand la date repassera `a 1 mais que jour sera diff´erent de 1. 5. Ouvrez `a nouveau la biblioth`eque et bouton droit sur calend puis ’D´efinir les param`etres du clip’. Utilisez le bouton + pour d´efinir les param`etres suivants : Nom cote annee mois

Valeur 20 2001 7

La variable cote correspondra `a la largeur en pixels de la zone de texte dynamique que vous avez plac´ee dans le clip jour. Vous pouvez ´egalement placer une bonne fois pour toutes les cases du calendrier avec les noms j1, j2... 6. Revenir `a la sc`ene principale et y mettre une occurrence du SmartClip calend. C’est juste un petit cercle `a l’´ecran correspondant au coin haut gauche du futur calendrier. 7. Faites bouton droit sur cette occurrence et Panneaux-Param`etres du clip. Mettez une longueur pour cote, une ann´ee et un mois. 8. Mettre ´eventuellement d’autres occurrences du SmartClip avec d’autres mois ou ann´ees... 9. Compilez et lancez l’animation.

Travaux dirig´es d’ActionScript

99

Eric Schrafstetter

CHAPITRE 7. SMARTCLIPS

Pour terminer, si vous d´esirez briller dans une soir´ee (ou vous faire jeter !), lisez donc ma page consacr´ee `a la recherche mentale d’un jour de la semaine sur www.univ-angers.fr/cufco/schraf/semaine.htm. Et pour vous entraˆıner, utilisez ma petite animation Flash jointe.

Travaux dirig´es d’ActionScript

100

Chapitre 8

Jeux 8.1

Le morpion

R` egles du jeu Le jeu se compose d’un plateau `a 9 cases. Chaque case peut ˆetre allum´ee (visible) ou ´eteinte (invisible)La position de d´epart est choisie au hasard, par exemple : ◦ ◦





◦ Il s’agit par des manipulations d’obtenir la figure : ◦ ◦ ◦

◦ ◦

◦ ◦ ◦

Les manipulations – Cliquer sur un coin inverse les 4 cases contigu¨es `a ce coin. Inverser signifiant que si une case est allum´ee, elle s’´eteint et inversement. – Cliquer sur le milieu d’un cˆot´e inverse les 3 cases de ce cˆot´e. – Cliquer sur la case centrale inverse les 5 cases suivant une croix +. Cr´ eation du jeu 1. Cr´eez un bouton bt avec le dessin d’une boule sur Haut, Dessus, Abaiss´e et Cliqu´e 2. Cr´eez un clip b et placez une occurrence du bouton bt `a l’image 1Associez `a cette occurrence l’action :

101

Eric Schrafstetter

CHAPITRE 8. JEUX

on (release) { choix = Number(this._name.charAt(1)); _root.x = _root.x ^ _root.change[choix]; _root.score = _root.score ^ (1 << choix); _root.aff(_root.x); if (_root.x == 495) { _root.gotoAndPlay("fin"); } } C’est la partie centrale du programme. La premi`ere ligne va permettre de savoir quelle case a ´et´e choisie. Pour cela, on r´ecup`ere le nom de l’occurrence (this._name) qui est de la forme bi avec i entre 1 et 9Ensuite, la fonction .charAt(1) permet d’atteindre le second caract`ere (le premier a pour position 0), soit "1" ou "2" etc. Le num´ero (entre 1 et 9) s’obtient par Number. La seconde ligne utilise la fonction ou exclusif (XOR) not´ee ^ en ActionScript. La table de v´erit´e de cette fonction logique est : a 0 0 1 1

b 0 1 0 1

a∧b 0 1 1 0

Ainsi, en partant d’une position du jeu x et en lui appliquant un changement change[choix] (voir plus bas), la nouvelle position est calcul´ee par x^change[choix]. La ligne 3 permettra de trouver le score final (voir plus bas). 3. Maintenant, ouvrez la biblioth`eque et faire Bouton droit - Liaisons sur le symbole bChoisir Exporter ce symbole et lui donner comme identifiant bouton. 4. Revenez sur la sc`ene principale et cr´eez une image cl´e en 1. Nous allons initialiser le jeu par l’action : // Creation du plateau for (i=1; i<=3; i++) { for (j=1; j<=3; j++) { rang=3*(i-1)+j; _root.attachMovie("boule","b"+rang,rang); this["b"+rang]._x = 50*j; this["b"+rang]._y = 100+50*i; } } //Choix position de d´ epart x = Math.floor(512*Math.random());

Travaux dirig´es d’ActionScript

102

Eric Schrafstetter

CHAPITRE 8. JEUX

// Table des changements en d´ ecimales change= new Array(); change[1] = 27; change[2] = 7; change[3] = 54; change[4] = 73; change[5] = 186; change[6] = 292; change[7] = 216; change[8] = 448; change[9] = 432; function aff (k) { i = 1; while (i<=9) { if (!(k & (1 << (i-1)))) { this["b"+i]._alpha = 10; } else { this["b"+i]._alpha = 100; } i++; } } _root.aff(x); – Nous utilisons attachMovie au lieu de DuplicateMovie puisque nous n’avons pas placez d’occurrence du clip b sur la sc`ene. – La boucle permet de cr´eer 9 r´epliques de b en leur attribuant les noms b1,. . .,b9 suivant la disposition : b1 ◦ b4 ◦ b7 ◦

b2 ◦ b5 ◦ b8 ◦

b3 ◦ b6 ◦ b9 ◦

– Explication de la table des changements : une case de du jeu pouvant ˆetre visible ou invisible, une position globale est une suite de 0 (invisible) ou 1 (visible) dont 100110110 est un exemple. Dans ce cas, la case 1 est invisible (0), les cases 2 et 3 sont visibles, la case 4 invisible. . . Il est donc int´eressant d’utiliser sa conversion en base 10 : 1001101102 = 0 + 1 × 10 + 1 × 102 + . . . + 1 × 108 = 31010 En utilisant les r`egles d´ecrites plus tˆot, cliquer sur la case 1 revient `a inverser les cases 1,2,4 et 5, soit 0000110112 = 2710 C’est la valeur que vous retrouvez dans change[1]. – La fonction aff va permettre de r´eactualiser l’affichage `a chaque coup du joueur.

Travaux dirig´es d’ActionScript

103

Eric Schrafstetter

CHAPITRE 8. JEUX

5. Ins´erez maintenant une image cl´e nomm´ee affiche `a l’image 2 de la sc`ene principale et placer l’action : stop(); 6. Ins´erez une image cl´e nomm´ee fin `a l’image 3 de la sc`ene principale et placer l’action : best=0; for (i=0; i<=8; i++) { if ((score & 1 <0) { best++; } } score=Math.floor(100*best/coup); stop(); L’astuce ici consiste `a voir que le nombre maximum de coups n´ecessaires `a r´esoudre le probl`eme est 9Si le joueur appuie sur une case puis, plus tard, appuie `a nouveau sur cette mˆeme case, il ´etait en fait inutile de s’en servir (D’un point de vue strictement math´ematiques, les coups sont commutatifs et nilpotent d’ordre 2)Pour connaˆıtre le score du joueur, il suffit de compter le nombre de coups qui ´etaient effectivement n´ecessaires grˆace `a la boucle. 7. Placez `a cette mˆeme image cl´e une zone de texte dynamique de nom score. 8. Lancez le programme et essayez de r´esoudre le puzzle ! Ajoutez ´eventuellement un bouton permettant de r´einitialiser le jeu.

8.2

Jeu de l’Hexagone

Comment d´ecoder le jeu de l’hexagone ? Au moyen des chiffres sur les diff´erentes cases. Chaque chiffre indique le nombre de cases rouges que comporte l’ensemble form´e par cette mˆeme case et celles qui lui sont contig¨ ues. Un exemple de solution est donn´e figure 8.2. Le but de ce travail dirig´e est de cr´eer un programme g´en´erant al´eatoirement ce type d’hexagone et.. de pouvoir y jouer !

8.2.1

Les probl` emes

1. Comment dessiner l’hexagone ? Au moyen d’un unique clip comportant 2 images cl´e (une boule bleue et une boule rouge). La taille de l’hexagone d´ependra de la variable nb. Par exemple nb=3 sur la figure 8.2. 2. Et les valeurs des cases ? Une zone de texte dynamique dans le clip de base suffit. 3. Comment g´en´erer les cases rouges ? Grˆace aux fonctions Math.random et Math.floor. Pour tirer des chiffres 0 ou 1 avec la mˆeme probabilit´e, la formule suivante convient :

Travaux dirig´es d’ActionScript

104

Eric Schrafstetter

CHAPITRE 8. JEUX

Fig. 8.1 – Aspect du bouton bouton

Fig. 8.2 – La solution de l’Hexagone

Travaux dirig´es d’ActionScript

105

Eric Schrafstetter

CHAPITRE 8. JEUX

Math.floor(2*Math.random()) Si vous voulez utiliser des probabilit´es non uniformes (par exemple, la boule sera rouge dans 60% des cas), utilisez plutˆot la formule : 1*(Math.random()<0.6) Le test Math.random()<0.6 renvoie Vrai dans 60% des cas qui, multipli´e par 1, donne 0 ou 1. 4. Comment m´emoriser les cases ? On utilise un tableau nomm´e lignes. Remarquez que l’hexagone a 2nb-1 lignes et que la longueur des lignes augmente de nb `a 2nb-1 puis rediminue jusqu’`a nb. Montrez que la longueur de la ligne i ( i entre 0 et 2nb-2) est nb+i si i
8.2.2

Le clip pion

1. Cr´eez un clip nomm´e pion et dessinez une boule bleue de diam`etre 50 (Panneau info) `a sa premi`ere image cl´e. 2. A sa seconde image cl´e, tapez sur F6 pour ins´erer une nouvelle boule au mˆeme endroit et coloriez-la en rouge

Travaux dirig´es d’ActionScript

106

Eric Schrafstetter

CHAPITRE 8. JEUX

3. Ajoutez une couche pour le texte et une pour un bouton 4. Sur la couche bouton, ins´erez `a l’image 1 un bouton transparent (dessin d’un disque sur l’image cl´e Cliqu´ e) au dessus de la boule bleue et lui ajouter l’action : on (release) { courant = 3-_currentframe; gotoAndStop (courant); if (_parent.lignes[i][j] == 1) { _parent.trouve += (courant == 2) ? 1 : -1; } else { _parent.trouve += (courant == 1) ? 1 : -1; } if (_parent.trouve == _parent.total) { _root.gotoAndPlay(3); } } La formule 3-_currentframe permet de passer de l’image 1 `a l’image 2 et r´eciproquement. Le test du dessous est moins ´evident... Si la case cliqu´ee contient effectivement une case rouge (test de la valeur de lignes[i][j]) et si nous sommes `a l’image courante 2 (A l’affichage, la boule est rouge), alors le joueur a trouv´e une boule, sinon, l’image vient de passer au bleu et le joueur vient d’´eliminer une boule qui ´etait bonne. Inversement, si la case ne contient pas de boule rouge et que l’image courante passe `a 1, le nombre de bonnes boules augmente de 1, sinon il perd 1 point. 5. Ajoutez sur la couche texte, une zone de texte avec pour nom de variable valeur. Ce sera le nombre affich´e sur la boule.

8.2.3

Le clip plateau

Cr´eez un clip nomm´e plateau. A sa premi`ere image cl´e, ajoutez l’action : nb = Number(_root.nb); d = pion._width; total = 0; lignes = new Array(); for (i=0; i<2*nb-1; i++) { longueur = (i
Travaux dirig´es d’ActionScript

107

Eric Schrafstetter

CHAPITRE 8. JEUX

trouve = 0; prof = 1; for (i=0; i<2*nb-1; i++) { longueur = (i
8.2.4

Sc` ene principale

1. A la premi`ere image cl´e de la sc`ene principale, mettre une action stop(). 2. Placez un bouton quelconque avec l’action on (release) { play (); } Ce bouton permettra de lancer le jeu.

Travaux dirig´es d’ActionScript

108

Eric Schrafstetter

CHAPITRE 8. JEUX

3. Mettre une zone de texte de saisie avec pour nom nb, l’utilisateur pourra ainsi pr´eciser le niveau de jeu. 4. A l’image 2 de la sc`ene principale, mettre une occurrence du clip plateau avec pour nom plateau. 5. Toujours `a l’image 2, mettre une action stop() 6. A l’image cl´e 3, mettre un message de fin et l’action : unloadMovie ("plateau"); stop (); qui permettra d’effacer le plateau. 7. Ajouter un bouton quelconque qui renverra vers la premi`ere image par l’action : on (release) { gotoAndPlay (1); }

8.3

Le tangram

Il s’agit de recr´eer le jeu classique du tangram .

Fig. 8.3 – Les 7 pi`eces du Tangram 1. Ouvrez tangram.fla et CTRL+L pour visualiser sa biblioth`eque 2. Cr´eez une nouvelle animation et enregistrez-la sous mon_tangram.fla 3. Cr´eez un bouton nomm´e b_carre et mettre `a sa premi`ere image une occurrence du graphique carre (`a prendre dans la biblioth`eque de tangram.fla ) 4. Etendre par F5 jusqu’ a l’image cl´ee nomm´ee ”Cliqu´e” (Eventuellement, mettre un effet de couleur sur l’image ”Dessus” en ins´erant une autre image cl´ee)

Travaux dirig´es d’ActionScript

109

Eric Schrafstetter

CHAPITRE 8. JEUX

5. Cr´eez un nouveau clip nomm´e c_carre et placez `a sa premi`ere image une occurrence du bouton b_carre . Pourquoi mettre un bouton dans un clip ? Afin d’utiliser la commande startDrag qui permet de d´eplacer un clip (mais pas un bouton). 6. Ajoutez l’action suivante `a ce bouton : on (press) { _root.cible = _target.slice(1); startDrag (""); swapDepths(1); } on (release, releaseOutside) { stopDrag (); } Que se passe-t-il ? Lorsque l’on pressera le carr´e, la variable cible prendra le nom de l’occurrence en cours. Celle-ci ayant pour forme ”/instance1” ou ”/instance2” ou... Nous utilisons la fonction slice qui permet d’extraire la chaˆıne ”instance1”. La fonction swapDepths permet elle de faire passer le carr´e au premier plan. 7. Revenez sur la sc`ene principale et placez une occurrence du clip c_carre 8. Recommencez les manipulations pr´ec´edentes avec les 2 autres types de pi`eces (Un grand triangle et un losange). Les noms des clips seront c_triangle et c_losange . 9. Cr´eez un nouveau bouton nomm´e b_touches avec une image quelconque uniquement sur l’image cl´ee ”Cliqu´e” (nous aurons alors un bouton transparent) 10. Mettre une occurrence du bouton b_touches sur la sc`ene principale (si possible en dehors de l’animation elle-mˆeme) avec l’action : on (keyPress "<space>") { this[_root.cible]._rotation += 45; } on (keyPress "") { this[_root.cible]._rotation -= 45; } on (keyPress "") { this[_root.cible]._x ++; } on (keyPress "") { this[_root.cible]._x --; } on (keyPress "") { this[_root.cible]._y --;

Travaux dirig´es d’ActionScript

110

Eric Schrafstetter

CHAPITRE 8. JEUX

} on (keyPress "<down>") { this[_root.cible]._y ++; } Explication Lorsque l’on clique sur une pi`ece, la variable cible r´ecup`ere son nom (”instance8” par exemple). Si maintenant nous appuyons sur la touche <espace> ( <space> ), l’objet cible va tourner de 45◦ `a droite. Idem avec la touche . Les fl`eches du clavier permettent de d´eplacer la pi`ece dans les 4 directions. 11. Mettre sur la sc`ene principale 5 occurrences du clip c_triangle et 1 occurrence du clip c_losange . 12. Les 2 petits triangles s’obtiennent par r´eduction de 50% des grands tri√ 2 angles et le triangle moyen par une r´eduction de 70,7% (= 2 ) 13. A la premi`ere image cl´ee de la sc`ene principale, ajoutez l’action : cible=""; stop (); Ainsi, la variable cible ´etant vide, les touches <space> , .. seront inop´erantes. 14. Attention, la touche (rappel arri`ere) ne fonctionnera pas en mode ”Tester l’animation”. Il faut publier par F12 .

8.4

Votre Tetris

Le but est de vous aider `a construire votre propre Tetris. Pour ceux qui ne connaissent pas encore ce jeu, voici quelques liens : – www.ms.mff.cuni.cz/ jtom4472/games/tetris/set.html (en javascript) – www.gauss2001.com/red.htm (en Flash)

8.4.1

La brique de base

La premi`ere astuce va ˆetre d’utiliser un unique clip pour `a la fois repr´esenter une brique ou une case vide (ou une couleur quelconque pour les plus forts). Il suffit pour cela de mettre `a ses diff´erentes images cl´es les images voulues. Le d´eplacement d’une brique sera alors un effet d’optique, celui consistant `a effacer cette case et `a allumer celle juste en dessous. – Cr´eez un clip nomm´e carre avec sur sa premi`ere image cl´e un petit carr´e noir (pour vide) de cˆot´e 20x20 (Utilisez la fenˆetre info). – Par F6 sur sa seconde image cl´e, coloriez le nouveau carr´e en rouge, ce sera l’apparence de notre brique. – Mettre une occurrence de ce clip sur la sc`ene principale et lui donner le nom base (fenˆetre Occurrence).

Travaux dirig´es d’ActionScript

111

Eric Schrafstetter

8.4.2

CHAPITRE 8. JEUX

Les pi` eces

Fig. 8.4 – Les 7 pi`eces de base L’apparence mˆeme des diff´erentes pi`eces sera sauvegard´ee dans des variables I, T , L, D, J, S1 et S2. L’ensemble des pi`eces sera enregistr´e dans un tableau pole. I = new Array(0, 0, 1, 0, 0, 1, 0, 0, 1, 0); L = new Array(0, 0, 1, 1, 0, 0, 1, 0, 0, 1); T = new Array(0, 0, 0, 0, 1, 1, 1, 0, 1, 0); D = new Array(0, 0, 1, 1, 0, 1, 1, 0, 0, 0); J = new Array(0, 1, 1, 0, 1, 0, 0, 1, 0, 0); S1 = new Array(0, 1, 0, 0, 1, 1, 0, 0, 1, 0); S2 = new Array(0, 0, 1, 0, 1, 1, 0, 1, 0, 0); pole = new Array(I, L, T, D, J,S1,S2); On acc`ede alors `a une case par la commande pole[k][i].

8.4.3

Le plateau

Nous allons bien sˆ ur nous utiliser le clip pr´ec´edent pour cr´eer le plateau. Sachant que celui-ci a pour dimension 10x20 cases, le programme est le suivant : for (i=0; i<20; i++) { for (j=1; j<11; j++) { position = 10*i+j; base.duplicateMovieClip("x"+position, position); this["x"+position]._x = 20*j; this["x"+position]._y = 20*i; } } On duplique 200 fois le clip base , on les renomme en x1 , x2 . . . x200 et on les place sur la sc`ene. Les coordonn´ees du plateau seront mises dans un tableau nomm´e field et initialis´e par : field = new Array();

Travaux dirig´es d’ActionScript

112

Eric Schrafstetter

CHAPITRE 8. JEUX

for (i=1; i<=201; i++) { field.push(0); } La fonction push(0) ajoute la valeur 0 au tableau field . Je rappelle ici que la premi`ere composante d’un tableau est field[0] et non field[1] .

8.4.4

La pi` ece suivante

Afin d’afficher la pi`ece suivante, dupliquez 9 fois par copier-coller le clip base pr´esent sur la sc`ene principale. Placez et renommez les occurrences de sorte d’obtenir un cadre 3x3 avec pour noms a1,a2. . .,a9 : a1 a4 a7

a2 a5 a8

a3 a6 a9

0 0 0

1 0 0

1 1 1

Exemple

Nous utiliserons alors une fonction aff_suivant pour afficher la pi`ece suivante, cette fonction sera mise dans la partie initialisation du programme principal : function aff_suivant () { for (i=1; i<10; i++) { if (next[i] != 0) { this["a"+i].gotoAndStop(2); } else { this["a"+i].gotoAndStop(1); } } } Le tableau next contient l’apparence de la pi`ece suivante (0 = vide, 1 = brique). Les fonctions gotoAndStop permettent d’afficher le carr´e noir (image 1) ou le carr´e rouge (image 2).

8.4.5

Le bouton commande

D´esignons par X le num´ero de la ligne et Y celui de la colonne de la case en haut `a gauche de la pi`ece qui tombe. L’apparence de la pi`ece courante est enregistr´ee dans le tableau item.

Travaux dirig´es d’ActionScript

113

Eric Schrafstetter

CHAPITRE 8. JEUX

item[1] item[4] item[7]

item[2] item[5] item[8]

item[3] item[6] item[9]

Nous ne pourrons pas d´eplacer cette pi`ece `a gauche si : – Y vaut 1 (premi`ere colonne) et la pi`ece courante n’est pas vide sur sa colonne de gauche (item[1], [4] et [7]). – Y vaut 0 et la pi`ece n’est pas vide sur sa seconde colonne ( item[2], [5] et [8] ). – Y est bien plus grand que 2 mais il y a d´ej`a une pi`ece `a gauche qui bloque. On r´ecup`ere les valeurs des 9 cases de gauche associ´ees `a la pi`ece courante en effectuant une boucle for. Si le test passe avec succ`es, on supprime la pi`ece courante par la fonction supp_piece() , on d´ecr´emente Y de 1 et on affiche la nouvelle pi`ece par aff_piece(). Le raisonnement est identique avec le bord droit. Concernant la touche ” fl`eche vers le haut ” qui permet de faire pivoter la pi`ece, les probl`emes sont : – Si Y vaut 0 (et donc item[1]=item[4]=item[7]=0), on ne pourra pas tourner la pi`ece vers la gauche si item[2] ou item[3] valent 0. – Si Y vaut -1 (les 2 premi`eres colonnes de la table item sont vides), on ne pourra tourner que si item[3] et item[6] sont vides. Mˆeme chose avec le bord droit. Dans le cas o` u on peut tourner, on utilise un tableau auxiliaire rot pour m´emoriser la position de la nouvelle pi`ece puis on v´erifie comme avec les touches gauche et droite que l’on peut placer cette pi`ece. Si c’est le cas, item devient rot et on affiche la pi`ece. Voir compl´ements `a la fin du document pour la formule contenant Math.floor et %. on (keyPress "") { DOWN = 1; } on (keyPress "") { if (Y == 1 && (item[1]+item[4]+item[7] != 0)) { return; } if (Y == 0 && (item[2]+item[5]+item[8] != 0)) { return; } for (i=0; i<9; i++) { if (item[i+1] != 0) { if (field[(X-1+Math.floor(i/3))*10+Y-1+i%3] != 0) { return;

Travaux dirig´es d’ActionScript

114

Eric Schrafstetter

CHAPITRE 8. JEUX

} } } supp_piece(); Y--; aff_piece(); } on (keyPress "") { if (Y == 8 && (item[3]+item[6]+item[9] != 0)) { return; } if (Y == 9 && (item[2]+item[5]+item[8] != 0)) { return; } for (i=0; i<9; i++) { if (item[i+1] != 0) { if (field[(X-1+Math.floor(i/3))*10+Y+1+i%3] != 0) { return; } } } supp_piece(); Y++; aff_piece(); } on (keyPress "") { if (Y == 0 && (item[2]+item[3] != 0)) { return; } if (Y == -1 && (item[3]+item[6] != 0)) { return; } if (Y == 9 && (item[1]+item[2] != 0)) { return; } if (Y == 10 && (item[1]+item[4] != 0)) { return; } for (i=1; i<10; i++) { rot[i] = item[(3*i)%10]; } for (i=0; i<9; i++) { if (rot[i+1] != 0) { if (field[(X-1+Math.floor(i/3))*10+Y+i%3] != 0) { return; }

Travaux dirig´es d’ActionScript

115

Eric Schrafstetter

CHAPITRE 8. JEUX

} } supp_piece(); for (i=1; i<10; i++) { item[i] = rot[i]; } aff_piece(); }

8.4.6

Suppression d’une ligne

La hauteur des pi`eces ne d´epassant pas 3, il y a 3 tests `a effectuer pour savoir si des lignes seront supprim´ees. var k = 1; for (i=((X-1)*10+1); i<(X*10+1); i++) { if (field[i] == 0) { k = 0; } } if (k == 1) { versbas(X); } if (X<20) { k = 1; for (i=(10*X+1); i<((X+1)*10+1); i++) { if (field[i] == 0) { k = 0; break; } } if (k == 1) { versbas(X+1); } } if (X<19) { k = 1; for (i=((X+1)*10+1); i<((X+2)*10+1); i++) { if (field[i] == 0) { k = 0; break; } } if (k == 1) { versbas(X+2);

Travaux dirig´es d’ActionScript

116

Eric Schrafstetter

CHAPITRE 8. JEUX

} } Les lignes au dessus de celle supprim´ee doivent ˆetre d´ecal´ees vers le bas. function versbas (L) { for (i=1; i<11; i++) { field[((L-1)*10+i)] = 0; this["x"+((L-1)*10+i)].gotoAndStop(1); } SCORE += 100; for (j=L-1; j>0; j--) { for (i=1; i<11; i++) { if (field[((j-1)*10+i)] != 0) { this["x"+((j-1)*10+i)].gotoAndStop(1); this["x"+(j*10+i)].gotoAndStop(2); field[(j*10+i)] = field[((j-1)*10+i)]; field[((j-1)*10+i)] = 0; } } } }

8.4.7

Le tempo

Si le joueur ne touche `a rien, la pi`ece doit tout de mˆeme tomber seule. Comment temporiser sa vitesse ? L’astuce consiste `a m´emoriser `a une certaine image un instant de d´epart et `a effectuer une boucle avec l’image cl´e suivante jusqu’`a ce qu’un intervalle de temps se soit ´ecoul´e. L’image 2 de notre animation contenant le programme proprement dit, nous ferons cette boucle entre les images 3 et 4 : Image 2 ... Programme principal ... time = getTimer(); Image 3 Now = getTimer(); Image 4 if (Now
Travaux dirig´es d’ActionScript

117

Eric Schrafstetter

CHAPITRE 8. JEUX

La fonction getTimer() renvoie le nombre de millisecondes depuis le d´ebut de l’animation. L’instant de d´epart est m´emoris´e dans time et la boucle s’effectue entre les images 3 et 4 jusqu’`a ce que la variable Now soit sup´erieure `a time+TO o` u TO est un temps d’attente en fonction du niveau de jeu (voir plus bas).

8.4.8

Niveaux et score

La vitesse s’obtient en changeant la valeur de TO , le num´ero de la pi`ece se tire par Math.random() . Par exemple : TO = (15-LEVEL)*80; k = Math.floor(7*Math.random()); On m´emorise la forme de la pi`ece courante et suivante par la boucle : for (i=1; i<10; i++) { item[i] = next[i]; next[i] = pole[k][i]; }

8.4.9

Compl´ ements

Tests logiques On suppose que X1, X2. . . valent 0 ou 1. Les tests suivants sont ´equivalents : X1 6= 0 ou X2 6= 0 ou ... X1 6= 0 et X2 = 6 0 et ...

⇔ ⇔

X1 + X2 + ... 6= 0 X1 × X2 × ... 6= 0

Tableau index´e Consid´erons un tableau index´e de la fa¸con suivante : 0 3 6

1 4 7

2 5 8

Comment r´ecup´erer le num´ero de la ligne et de la colonne connaissant l’indice de la case ? Remarquez que la colonne est le reste de la division de l’indice par 3. Par exemple, si l’indice est 5, le reste de la division de 5 par 3 est 2, l’indice 5 est bien en colonne 2. La commande ActionScript La ligne est donn´ee par 1+ la division de l’indice par 3. Par exemple, si l’indice est 5, 5 divis´e par 3 donne 1 (sans virgule) qui ajout´e de 1 donne bien la 2e ligne. La commande ActionScript correspondante est 1+Math.floor(i/3).

Travaux dirig´es d’ActionScript

118

Eric Schrafstetter

8.4.10

CHAPITRE 8. JEUX

Le programme complet

Image 1 function versbas (L) { for (i=1; i<11; i++) { field[((L-1)*10+i)] = 0; this["x"+((L-1)*10+i)].gotoAndStop(1); } SCORE += 100; for (j=L-1; j>0; j--) { for (i=1; i<11; i++) { if (field[((j-1)*10+i)] != 0) { this["x"+((j-1)*10+i)].gotoAndStop(1); this["x"+(j*10+i)].gotoAndStop(2); field[(j*10+i)] = field[((j-1)*10+i)]; field[((j-1)*10+i)] = 0; } } } } function aff_suivant () { for (i=1; i<10; i++) { if (next[i] != 0) { this["a"+i].gotoAndStop(2); } else { this["a"+i].gotoAndStop(1); } } } function aff_piece () { for (i=0; i<9; i++) { if (item[i+1] != 0) { this["x"+((X-1+Math.floor(i/3))*10+Y+i%3)].gotoAndStop(2); } } } // Delete function supp_piece () { for (i=0; i<9; i++) { if (item[i+1] != 0) { this["x"+((X-1+Math.floor(i/3))*10+Y+i%3)].gotoAndStop(1); } } } function start () {

Travaux dirig´es d’ActionScript

119

Eric Schrafstetter

CHAPITRE 8. JEUX

TO = 1000; for (i=0; i<20; i++) { for (j=1; j<11; j++) { position = 10*i+j; base.duplicateMovieClip("x"+position, position); this["x"+position]._x = 20*j; this["x"+position]._y = 20*i; } } LEVEL = 1; SCORE = 0; RUNNING = 1; aff_suivant(); aff_piece(); time = getTimer(); gotoAndPlay (3); } I = new Array(0, 0, 1, 0, 0, 1, 0, 0, 1, 0); L = new Array(0, 0, 1, 1, 0, 0, 1, 0, 0, 1); T = new Array(0, 0, 0, 0, 1, 1, 1, 0, 1, 0); D = new Array(0, 0, 1, 1, 0, 1, 1, 0, 0, 0); J = new Array(0, 1, 1, 0, 1, 0, 0, 1, 0, 0); pole = new Array(I, L, T, D, J); X = 1; Y = 4; TO = 1000; RUNNING = 0; DOWN = 0; next = new Array(); item = new Array(); k1 = Math.floor(7*Math.random()); k2 = Math.floor(7*Math.random()); for (i=1; i<10; i++) { item[i] = pole[k2][i]; next[i] = pole[k1][i]; } rot = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0); SCORE = 0; LEVEL = 1; field = new Array(); for (i=1; i<=201; i++) { field.push(0); } stop(); Image 2

Travaux dirig´es d’ActionScript

120

Eric Schrafstetter

CHAPITRE 8. JEUX

var cont = 1; X++; for (i=0; i<9; i++) { if (item[i+1] != 0 && field[(X-1+Math.floor(i/3))*10+Y+i%3] != 0) { X--; cont = 0; } } if (X == 19 && (item[7]+item[8]+item[9] != 0)) { X--; cont = 0; } if (X == 20 && (item[4]+item[5]+item[6] != 0)) { X--; cont = 0; } if (cont == 0) { DOWN = 0; for (i=0; i<9; i++) { if (item[i+1] != 0) { field[(X-1+Math.floor(i/3))*10+Y+i%3] = item[i+1]; } } var k = 1; for (i=((X-1)*10+1); i<(X*10+1); i++) { if (field[i] == 0) { k = 0; } } if (k == 1) { versbas(X); } if (X<20) { k = 1; for (i=(10*X+1); i<((X+1)*10+1); i++) { if (field[i] == 0) { k = 0; break; } } if (k == 1) { versbas(X+1); } }

Travaux dirig´es d’ActionScript

121

Eric Schrafstetter

CHAPITRE 8. JEUX

if (X<19) { k = 1; for (i=((X+1)*10+1); i<((X+2)*10+1); i++) { if (field[i] == 0) { k = 0; break; } } if (k == 1) { versbas(X+2); } } TO = (15-LEVEL)*80; k = Math.floor(5*Math.random()); for (i=1; i<10; i++) { SCORE += item[i]*10; LEVEL = Math.ceil(SCORE/5000); item[i] = next[i]; next[i] = pole[k][i]; } aff_suivant(); X = 1; Y = 5; cont = 1; for (i=0; i<9; i++) { if (item[i+1] != 0) { if (field[(X-1+Math.floor(i/3))*10+Y+i%3] != 0) { cont = 0; break; } } } if (cont == 0) { RUNNING = 0; gotoAndStop (6); } aff_piece(); } else { X--; supp_piece(); X++; aff_piece(); } if (DOWN == 1) { gotoAndPlay (5);

Travaux dirig´es d’ActionScript

122

Eric Schrafstetter

CHAPITRE 8. JEUX

} Image 3 Now=getTimer(); Image 4 if (Now
8.5

Les machines de Turing

Fig. 8.5 – Alan Turing

8.5.1

Alan Turing

Logicien, sp´ecialiste de cryptologie, professeur `a Cambridge. D`es 1937, Turing ”inventa” des machines abstraites, machines de Turing cens´ees interpr´eter des instructions logiques pr´efigurant la th´eorie des algorithmes r´ecursifs et la

Travaux dirig´es d’ActionScript

123

Eric Schrafstetter

CHAPITRE 8. JEUX

construction des ordinateurs : ce terme fut propos´e en France, en 1955, par Jacques Perret. Turing mit ses comp´etences aux services de l’arm´ee britannique lors de la seconde guerre mondiale (1943), en concevant avec Max Newman le Colossus 1, ordinateur capable de d´echiffrer les codes de la c´el`ebre machine allemande Enigma, d’origine hollandaise et utilis´ee pour la transmission des messages secrets. Turing contribuera aussi `a la mise en place du premier puissant ordinateur : le Mark 1, qui vit le jour `a Harvard (U.S.A.). P oursuivi en Angleterre (apr`es la guerre) pour homosexualit´e, Turing se suicida.

8.5.2

Description de la machine

Une machine est compos´ee d’un ruban pouvant comporter des symboles (lettres, chiffres...), d’une tˆete de lecture/´ecriture et d’une variable d’´etat. La tˆete peut avancer ou reculer d’une case sur le ruban, lire un symbole et agir en cons´equent (´ecriture d’un nouveau symbole, d´eplacement `a droite ou `a gauche).

8.5.3

Exemple de machine

Nous allons voir un exemple de machine comptant en binaire. C’est-`a-dire affichant successivement sur le ruban les nombres : s00000 s10000 s01000 s11000 s00100 ... Il faut ´evidement pas mal r´efl´echir pour cr´eer le programme... Analysons celui que je vous propose : Si ´etat 0 0 0 1 1

et si case est s 0 1 1 0

Mettre nouvel ´etat `a 1 0 0 1 0

et ´ecrire s 0 1 0 1

Puis aller `a > < < > <

La machine partira avec l’´etat 0 sur le symbole s. – La premi`ere ligne fait passer l’´etat de la machine de 0 `a 1 lorsqu’elle rencontre le caract`ere s sur le ruban. Puis nous allons vers la droite. – La seconde ligne nous dit que si la machine est dans l’´etat 0 (donc nous n’avons pas trouv´e ou retrouv´e le caract`ere s) et que le caract`ere sur le ruban est un 0, on ne fait rien (en fait on r´e´ecrit le 0) et l’on retourne vers la gauche. – Idem avec l’´etat 0 et la valeur 1. Nous sommes donc `a la recherche du caract`ere s plac´e `a gauche.

Travaux dirig´es d’ActionScript

124

Eric Schrafstetter

CHAPITRE 8. JEUX

– Si maintenant nous sommes dans l’´etat 1 (nous venons donc de voir le caract`ere s quelques instants avant) et que le caract`ere sur le ruban est un 1, nous restons dans cet ´etat mais nous mettons un 0 `a la place puis continuons vers la droite. – Toujours `a l’´etat 1, si le caract`ere est un 0, nous le faisons passer `a 1, remettons l’´etat `a 0 (ce qui forcera la machine `a retrouver le s `a gauche) et repartons vers la gauche ! Vous trouverez sur Internet plusieurs programmes de ce type, par exemple la recherche de palindromes (voir palind.txt joint), addition binaire, v´erification d’un bon parenth`esage (autant d’ouvrantes que de fermantes)... Nous utiliserons la notation suivante pour nos programmes : 0,s,1,s,> 0,0,0,0,< 0,1,0,1,< 1,1,1,0,> 1,0,0,1,< Vous pouvez utiliser la plupart des caract`eres dans vos programmes mais pas & et +. Utilisez le caract`ere _ pour noter une case VIDE.

8.5.4

Simulation sous Flash

Le but de ce tutorial est de cr´eer une machine de Turing capable de lire un programme, un ´etat ainsi qu’un ruban de d´epart et de lancer la simulation.

8.5.5

Cr´ eation de programmes

Les programmes seront tap´es dans des fichiers .txt (ou tout autre extension !) et la liste sera elle-mˆeme tap´ee dans un fichier nomm´e liste.txt. Par exemple, dans le cas o` u nous avons 3 programmes palind.txt, inc.txt et addition.txt, le fichier liste.txt sera de la forme : aff=palind.txt,inc.txt,addition.txt&fin=1& Il est important de voir que nous ajoutons ` a la fin, une variable fin dont la valeur est mise `a 1. Ceci permettra `a Flash de savoir que le chargement des donn´ees est termin´e et de passer `a la suite. Voici le contenu du fichier inc.txt (incr´ementation) aff=0,s,1,s,> 0,0,0,0,< 0,1,0,1,< 1,1,1,0,> 1,0,0,1,< &ruban=s00000&etat=0&fin=1&

Travaux dirig´es d’ActionScript

125

Eric Schrafstetter

CHAPITRE 8. JEUX

Remarquez bien que les lignes du programme sont s´epar´ees par des retours chariot pour des commodit´es de lecture. Il faudra que Flash rep`ere ces retours `a la ligne lorsqu’il enregistrera le contenu du programme dans une variable prgm. De plus les instructions sont s´epar´ees par des virgules. Le ruban initial est mis dans la variable ruban, l’´etat initial dans etat et toujours la variable de fin de chargement.

8.5.6

Chargements

Voici l’id´ee principale concernant le chargement de la liste des programmes ou des programmes eux-mˆemes : 1. Mettre un bouton sur la sc`ene principale avec pour action : on (release) { fin = 0; loadVariablesNum ("liste.txt", 0); gotoAndPlay ("charge"); } On met la variable fin `a 0, pr´ecisant ainsi que le chargement n’est pas fini. On commence ensuite `a charger les variables au niveau de la sc`ene principale (niveau 0) et on saute vers l’image de nom "charge". 2. A l’image cl´e nomm´ee "charge", mettre l’action : if (Number(fin)>0) { gotoAndPlay ("suite"); } On regarde si la valeur de la variable fin est pass´ee `a 1. Si c’est le cas, on passe `a la suite de l’animation. 3. A l’image cl´e suivante, mettre l’action : gotoAndPlay (_currentframe-1); qui permet de retourner `a l’image "charge". Ainsi, lorsque nous arrivons `a l’image cl´e "suite", nous sommes sˆ urs que toutes les variables ont ´et´e charg´ees.

8.5.7

Conversions

Si vous ne connaissez pas les fonctions join et split, vous allez pouvoir observer leur puissance respective ! Commen¸cons par afficher la liste des diff´erents programmes disponibles `a l’´ecran. 1. A l’image cl´e "suite" de la sc`ene principale, mettre une zone de texte dynamique sur plusieurs lignes avec pour nom liste. 2. Apr`es le chargement des variables, la variable aff contient tous les programmes sous la forme :

Travaux dirig´es d’ActionScript

126

Eric Schrafstetter

CHAPITRE 8. JEUX

aff=palind.txt,inc.txt,addition.txt Nous voulons que les noms soient affich´es par ligne dans la zone liste. Il suffit d’ajouter l’action suivante `a l’image cl´e "suite" : affprg = aff.split(","); liste = affprg.join("\r"); stop (); La premi`ere ligne va permettre de cr´eer un tableau affprg dont chacune des composantes comportera le nom d’un programme ( affprg[0]="palind.txt", affprg[1]="inc.txt"...). Ce tableau nous servira plus tard. La seconde ligne regroupe toutes les composantes du tableau affprg en une seule chaˆıne de caract`eres s´epar´ee par le caract`ere "\r" (ou chr(13)) qui est le code du retour chariot. Chargement du programme : L’id´ee est la mˆeme, un bouton invisible est plac´e sur la liste des noms de programmes disponibles. Lors d’un clic sur le bouton, la position verticale du curseur permet de savoir quelle ligne a ´et´e choisie (regardez le code source du .fla). On peut alors charger les nouvelles variables comme pr´ec´edement. 1. La variable aff contient le programme `a simuler avec, rappelons-le, des retours chariot en fin de ligne et des virgules entre chaque codage. 2. Compilez le fichier .fla joint et chargez un programme, par exemple inc.txt 3. Faˆıtes D´eboguer - Liste des variables et regardez la valeur de aff, vous voyez : Variable _level0.aff = "0,s,1,s,>\r\n0,0,0,0,<\r\n0,1...\r\n" Il y a donc `a la fin de chaque ligne, un retour chariot ( \r) et un saut de ligne ( \n) ! 4. Voici maintenant la manipulation fondamentale de ce tutorial, `a savoir, effectuer un Edition - Remplacer sur une chaˆıne de caract`eres. Comme premier exemple, supprimons tous les caract`eres "\r" de la variable aff et mettons le r´esultat dans la variable liste liste = aff.split("\r").join(""); La commande aff.split("\r") d´ecompose la chaˆıne de caract`eres aff en un tableau en se servant du s´eparateur "\r". A l’inverse, la fonction join remet ce tableau en une unique chaˆıne avec ici un s´eparateur ´egal `a un vide. 5. R´ecup´erons maintenant le programme dans un tableau prgm dont chaque composante sera une instruction. Par exemple, pour le programme inc.txt, la variable prgm sera ´egale `a :

Travaux dirig´es d’ActionScript

127

Eric Schrafstetter

CHAPITRE 8. JEUX

prgm = 0:"0", 1:"s", 2:"1", 3:"s", 4:">", 5:"0", 6:"0", 7:"0", 8:"0", 9:"<", 10:"0", ... 23:"1", 24:"<", 25:"" L’id´ee est de commencer par remplacer les sauts de lignes par des virgules et les _ par des espaces. Ensuite, on cr´ee un tableau en utilisant un split(","). prgm = liste.split("\n").join(","); prgm = prgm.split("_").join(" ").split(","); Il faut lire la premi`ere ligne comme cela : Remplacer tous les \n de la variable liste par des virgules. Le ruban qui va ˆetre cr´e´e par la machine sera mis dans un tableau de taille variable. Il est initialis´e grˆace `a la variable ruban. D’apr`es le guide de r´ef´erence d’ActionScript, la commande ruban.split("") DEVRAIT renvoyer un tableau contenant les diff´erents caract`eres de ruban. H´elas, il s’agit d’un Bug ! Nous sommes donc oblig´es, en attentant Flash 6, d’utiliser une boucle : ruban = ruban.split("_").join(" "); trub = new Array(); for (i=0; i
8.5.8

La machine

La programmation de la machine est tr`es simple ! Pour une position donn´ee, on recherche l’´etat courant dans la liste des ´etats propos´es dans le programme prgm. On regarde ensuite si la case visit´ee est la mˆeme que celle du programme. Si oui, une action est effectu´ee, sinon, on continue `a explorer prgm. La variable indice permet de faire tourner le ruban `a l’affichage et longueur correspond on nombre de lignes de codes du programme. on (release) {

Travaux dirig´es d’ActionScript

128

Eric Schrafstetter

CHAPITRE 8. JEUX

avance(); } o` u avance() est la fonction d´efinie par : encore = 1; i = 0; while (i") { indice++; } else { indice--; } encore = 0; affiche(); } i++; } Les ´el´ements prgm[5*i] contiennent les ´etats `a tester, prgm[5*i+1] les valeurs des cases correspondantes, prgm[5*i+2] le nouvel ´etat `a mettre, prgm[5*i+3] la nouvelle valeur `a ´ecrire et prgm[5*i+4] la direction o` u aller. La fonction affiche() actualise les cases affich´ees `a l’´ecran. Elle est d´efinie par : function affiche () { for (i=0; i<6; i++) { this["case"+i] = trub[indice+i]; if (this["case"+i]==null) { this["case"+i] = " "; } this["n"+i] = indice+i; } } Il y a 6 cases d’affich´ees et si la valeur du tableau trub correspondant au ruban n’est pas d´efinie, on remplace la valeur null par un blanc.

8.5.9

Version AUTO

Pour que la machine puisse fonctionner seule, nous allons cr´eer un bouton avec l’action : on (release) { if (encours) { encours = false; auto.gotoAndStop(1);

Travaux dirig´es d’ActionScript

129

Eric Schrafstetter

CHAPITRE 8. JEUX

} else { encours = true; auto.play(); } } Explications 1. Si la machine ´etait d´ej`a en cours de marche (variable encours est `a vrai) alors on arrˆete par encours=false et le clip auto (voir plus bas) s’arrˆete sur l’image cl´e 1 2. Si encours ´etait `a faux (la machine ne fonctionne pas pour le moment), on la lance par auto.play(); Le clip auto 1. Ce clip comporte 4 images cl´e et rien sur sa sc`ene principale. 2. Image 1 : Action stop(), ce sera la position de repos lorsque la machine est arrˆet´ee 3. Image 2 : _root.avance(); temps=getTimer(); On ex´ecute la fonction avance() identique `a celle du bouton SUIVANT et on note le temps actuel. 4. Image 3 : if (getTimer()>temps+1000) { gotoAndPlay (2); } Si 1 seconde s’est ´ecoul´ee, on retourne `a l’image 2 5. Image 4 : Action gotoAndPlay (3); Il faut bien sˆ ur que la variable encours soit initialis´ee `a false au premier lancement.

8.5.10

Le fichier Flash fourni

Vous avez tous les ´el´ements pour comprendre le programme joint. Son utilisation est simple : 1. Cliquez sur Charger pour charger la liste des programmes disponibles 2. S´electionnez le programe 3. Le ruban et l’´etat initial s’affichent. Vous pouvez modifier l’´etat manuellement ainsi que le ruban (cliquez sur MAJ (Mise `a Jour)) 4. Utilisez les fl`eches gauche et droite sur le ruban pour pr´eciser la position de d´epart de la machine 5. Le bouton SUIVANT permet de faire fonctionner la machine pas par pas 6. Le bouton AUTO lance la machine de fa¸con autonome. L’arrˆeter en recliquant sur AUTO.

Travaux dirig´es d’ActionScript

130

Eric Schrafstetter

8.5.11

CHAPITRE 8. JEUX

Les fichiers txt

– Le fichier palind.txt recherche si un mot compos´e de ”a” et de ”b” est un palindrome ou non (lisible dans les 2 sens). Un ruban de d´epart est sous la forme abbax avec un x terminal. Partir avec un ´etat 0 et le curseur sur la lettre la plus `a gauche. Le programme s’arrˆete sur F si le mot n’est pas un palindrome, sur V sinon. – Le fichier inc.txt est le fichier permettant de compter en binaire. Exemple de ruban de d´epart : s11001. Partir avec ´etat 0 et curseur sur le s – Le fichier multiunaire.txt permet d’effectuer la multiplication de nombres unaires, par exemple : 111 × 111 = 111111111 (3 × 3 = 9). Exemple de ruban de d´epart : 111_111__. Partir avec ´etat q0 et curseur sur le 1 de gauche. Le programme s’arrˆete sur F. Vous pouvez m’envoyer vos r´ealisations o` u trouvailles ! [email protected]

8.6 8.6.1

Jeux de plateforme Danger-S´ ecurit´ e

Tr`es souvent, lorsqu’un joueur agit sur un ´el´ement d’un jeu, ce dernier a un certain comportement compos´e de 3 phases. Une phase de danger (en rouge sur la figure 8.6) puis de s´ecurit´e (en vert) et `a nouveau de danger (en rouge).L’id´ee est donc de placer sur une couche Action des drapeaux pr´ecisant l’´etat de l’´el´ement (en danger ou en s´ecurit´e) et sur une autre couche son apparence.

Fig. 8.6 – Zones danger-s´ecurit´e Construction 1. Cr´eez un nouveau symbole graphique nomm´e boule 2. Cr´eez un bouton bouton ayant le symbole boule sur Haut, Dessus, Abaiss´e et Cliqu´e. 3. Cr´eez un clip nomm´e mobile avec une couche pour les actions et une autre pour les animations. – A l’image 1 du calque des animations de ce clip, placez une occurrence du bouton bouton avec l’action : on (press) { gotoAndPlay (2); }

Travaux dirig´es d’ActionScript

131

Eric Schrafstetter

CHAPITRE 8. JEUX

– A l’image 1 du calque action du clip mobile, mettre l’action : _root.endanger=1; stop(); En clair, le joueur est potentiellement en danger tant qu’il ne cliquera pas sur le bouton bouton. – A l’image 2 du calque des animations du clip mobile, placez une occurrence du symbole graphique bouleVeillez bien `a ce qu’il n’y ait plus l’occurrence du bouton de l’image 1, en effet, c’est l`a le plus important, lorsque le joueur a cliqu´e, il ne devient plus maˆıtre de la situation ! – Cr´eez une interpolation comme sur la figure 8.6. Par exemple l’objet qui se soul`eve en utilisant un scale. – Sur la couche des actions, placez par exemple une image cl´e en 5 avec l’action _root.endanger=0; qui met hors de danger le joueur (donc il est en danger de 1 `a 5 !) – Toujours sur la couche des actions, placez en 15 (par exemple) l’action _root.endanger=1; qui remet le joueur en danger.

8.6.2

L’ennemi

L’ennemi peut ˆetre consid´er´e comme un clip (voir figure 8.7) qui apparaˆıt al´eatoirement `a l’´ecran, ayant une couche Action comportant son ´etat de danger et une couche pour sa trajectoire.

Fig. 8.7 – Le clip de l’ennemi

Cr´ eation du clip ennemi 1. Cr´eez un clip nomm´e apparence avec un dessin quelconque sur l’image 1 (ou plusieurs images !) 2. Cr´eez un clip nomm´e mcenn (pour Movie Clip de l’ennemi) comportant 2 couches comme sur la figure 8.7. 3. A l’image 1 de la couche Action, mettre l’action : _root.danger=0; stop(); signifiant qu’au repos, ce clip est sans danger. 4. A l’image 5 (par exemple) de cette mˆeme couche, placez l’action :

Travaux dirig´es d’ActionScript

132

Eric Schrafstetter

CHAPITRE 8. JEUX

_root.danger=1; 5. Et `a l’image 15, l’action : _root.danger=0; L’ennemi sera donc actif entre les images 5 et 14. 6. Sur l’autre couche, dessiner une trajectoire quelconque en utilisant une occurrence du clip apparence. Utilisation de l’ennemi 1. Cr´eez 2 couches sur la sc`ene principale, une pour les actions et l’autre pour les objets. 2. Placez une occurrence du clip mcenn `a l’image 1 de la couche objet et lui donner le nom ennemiTapez F5 au temps 2 pour ´etendre l’image fixe. 3. A l’image 1 de la couche action de la sc`ene principale, placez l’action : h = Math.floor(10*Math.random ()); if (h == 0) { _root.ennemi.play(); }; 4. ins´erez une image cl´e `a l’instant 2 de la couche action avec l’action : gotoAndPlay (1); 5. Si vous lancez le clip, vous verrez le clip ennemi se mettre en action `a des moments al´eatoires (Placez une zone de texte dynamique nomm´ee danger sur la sc`ene principale pour observer les instants o` u l’ennemi peut provoquer un danger) Lien Ennemi-Joueur 1. Sur la sc`ene principale pr´ec´edente (Voir Cr´eation du clip ennemi), cr´eez une nouvelle couche et placez une occurrence de mobile qui repr´esente le joueur. 2. A l’image 5 de la sc`ene principale, mettre une image cl´e avec pour nom finPlacez un texte quelconque signifiant que le jeu est termin´e. 3. Modifiez l’action de l’image 1 par : h = Math.floor(10*Math.random ()); if (h == 0) { _root.ennemi.play(); }; if (((danger == 1)) && (endanger == 1)) { _root.gotoAndStop("fin"); }; Ainsi, le jeu s’arrˆete lorsque le joueur ´etait en danger et que le danger est effectivement apparu.

Travaux dirig´es d’ActionScript

133

Eric Schrafstetter

8.6.3

CHAPITRE 8. JEUX

Actions simultan´ ees : Touche - Souris

Voici une version ´el´ementaire pour qu’un joueur puisse tourner tout en tirant 1. Cr´eez un clip trait repr´esentant un petit trait. 2. Cr´eez un clip tir avec une occurrence de trait `a l’image cl´e 1. 3. Cr´eez une nouvelle image cl´e en 10 et d´eplacez l’occurrence (ce sera la trajectoire du missile), ajoutez une interpolation de mouvement entre 1 et 10. 4. Mettre l’action stop(); `a l’image cl´e 10 du clip tir. 5. Placez sur la sc`ene principale une occurrence nomm´ee missile du clip tir et la positionner en x = 200 et y = 200 (voir fenˆetre info). 6. Ajoutez l’action stop(); `a l’image cl´e 1 de la sc`ene principale. 7. Cr´eez un clip vide, le placer `a l’image 1 de la sc`ene principale et lui donner l’action suivante : onClipEvent (load) { _root.param = new Object(); _root.param.feu = 0; _root.param.angle = 0; _root.nb = 0; } onClipEvent (mouseMove) { _root.param.angle = Math.atan2(_root._ymouse-200, _root._xmouse-200); } onClipEvent (keyDown) { if (Key.getCode() == Key.SPACE) { _root.param.feu = 1; } } onClipEvent (keyUp) { if (Key.getCode() == Key.SPACE) { _root.param.feu = 0; } } onClipEvent (enterFrame) { if ((_root.nb<10) && (_root.feu == 1)) { _root.nb++; duplicateMovieClip (_root.boule, "b"+_root.nb, _root.nb); _root["b"+_root.nb]._rotation = _root.param.angle*180/Math.PI; } else if (_root.feu == 1) { _root.nb = 0; } } Dans le programme, nb repr´esente le nombre de missile envoy´es. Lorsque nb d´epasse 10, on remplace les anciens missiles par les nouveaux. Si un

Travaux dirig´es d’ActionScript

134

Eric Schrafstetter

CHAPITRE 8. JEUX

joueur presse la barre d’espace, un missile est envoy´e. S’il d´eplace la souris, l’angle de tir change. Les 2 mouvements peuvent ˆetre faits simultan´ement.

8.6.4

Actions simultan´ ees : Touche - Touche

Voici un exercice o` u l’utilisateur pourra presser 2 touches `a la fois afin de diriger un petit bolide. 1. Cr´eez un clip avec le dessin d’un petit v´ehicule (un rectangle suffira ! !) 2. Mettre une occurrence de ce clip sur la sc`ene principale 3. Associez l’action suivante au clip : onClipEvent (load) { function position (y,rot) { _x + = 3*Math.cos(rot*Math.PI/180+y*Math.PI); _y + = 3*Math.sin(rot*Math.PI/180+y*Math.PI); } rot=0; y=0; } onClipEvent (enterFrame) { if (Key.isDown(Key.LEFT)) { rot-=5; _rotation=rot; } else if (Key.isDown(Key.RIGHT)) { rot+=25 _rotation=rot; } if (Key.isDown(Key.UP)) { position(0,rot); } else if (Key.isDown(Key.DOWN)) { position(1,rot); } }

La variable y dans la fonction position permet de choisir l’orientation du bolide (on rajoute pi `a l’angle en cas de marche arri`ere). La valeur 3 correspond `a la vitesse (ici constante) du v´ehicule et la valeur 5 `a 5◦ dans la rotation. 4. Si vous voulez donner un effet d’acc´el´eration, vous pouvez changer l’action en :

Travaux dirig´es d’ActionScript

135

Eric Schrafstetter

CHAPITRE 8. JEUX

onClipEvent (enterFrame) { if (Key.isDown(Key.LEFT)) { rot-=5; _rotation=rot; } else if (Key.isDown(Key.RIGHT)) { rot+=5; _rotation=rot; } if (Key.isDown(Key.UP)) { coeff++; vit=(0.3+coeff/2)*(0.3+coeff/2); } else if (Key.isDown(Key.DOWN)) { vit/=1.5; coeff=Math.sqrt(vit); if (vit<0.2) { vit=0; } } _x = _x+vit*Math.cos(rot*Math.PI/180+y*Math.PI)/10; _y = _y+vit*Math.sin(rot*Math.PI/180+y*Math.PI)/10; } onClipEvent (load) { rot=0; vit=0; coeff=2; } Lorsque l’on presse la fl`eche vers le haut, la vitesse augmente globalement suivant le carr´e de coeffLorsque l’on presse la √ touche vers le bas, la vitesse est divis´ee par 1,5 et le coefficient passe `a vitIl faut bien entendu ajuster les diff´erents coefficients pour obtenir l’effet voulu.

8.7 8.7.1

Le Top10 (version MySQL) Affichage du Top10

Il s’agit simplement d’afficher la liste des 10 premiers joueurs avec leurs scores. 1. Cr´eez une base de donn´ee nomm´ee topten et une table nomm´ee resultats avec deux champs nom et —score—. 2. Mettre 10 noms et 10 scores. 3. Cr´eez le script scores.php suivant :

Travaux dirig´es d’ActionScript

136

Eric Schrafstetter

CHAPITRE 8. JEUX

La requˆete signifiant que l’on s´electionne les 2 champs (*) et que l’on classe les enregistrements par ordre d´ecroissant (DESC) du score. 4. Cr´eez une animation Flash score.fla et enregistr´ee l`a dans le mˆeme dossier que le script avec une action stop(); `a l’image cl´e 1 5. Ins´erez 10 zones de textes dynamiques nomm´ees nom1,nom2..sur la sc`ene 6. Ins´erez en face 10 autres zones de textes dynamiques nomm´ees score1, score2... 7. Cr´eez un bouton quelconque et en mettre une occurrence sur la sc`ene principale avec l’action : on (release) { loadVariablesNum ("scores.php", 0, "POST"); } 8. Compilez l’animation, lancez score.html et cliquez sur le bouton. Les scores s’affichent.

8.7.2

Proposer un score

Voici une premi`ere version non s´ecuris´ee dans le sens o` u une personne mal intentionn´ee utilisant ActionScript Viewer pourra voir l’adresse du script PHP utilis´e et ´egalement le nom des variables probablement utilis´ees par le script (type nom et score)Il faudrait crypter le nom et le score avant de les envoyer. 1. Cr´eez le script change.php suivant :
Travaux dirig´es d’ActionScript

137

Eric Schrafstetter

CHAPITRE 8. JEUX

$i=0; while($ligr=mysql_fetch_array($result)){ $i++; $n="nom".$i; $s="score".$i; ${$n}=$ligr["nom"]; ${$s}=$ligr["score"]; }; if ($score>$score10){ $qry="update resultats set score=".$score.",nom=’"; $qry.=$name."’ where score="; $qry.=$score10." and nom=’"; $qry.=$nom10."’"; $result = mysql_query($qry); $result = mysql_query("select * from resultats order by score DESC "); $i=0; while($ligr=mysql_fetch_array($result)){ $i++; $n="nom".$i; $s="score".$i; echo $n.’=’.$ligr["nom"]."&"; echo $s.’=’.$ligr["score"]."&"; } echo "perdu=0"; } else { echo "perdu=1"; } mysql_close(); ?> Ce script r´ecup`ere les meilleurs scores, les classes par ordre d´ecroissant du score et regarde si le score du joueur est sup´erieur au plus petit score10Si c’est le cas, on met `a jour la base de donn´ees en rempla¸cant nom10 et score10 par les nouveaux. On reclasse le tableau et on envoie le r´esultat `a Flash. Dans le cas o` u le score n’est pas assez ´elev´e, on renvoie perdu=1.

8.8 8.8.1

S´ ecurit´ e Jouer Online

Voici une m´ethode (non fiable `a 100% mais n´ecessitant une manipulation non triviale pour la contourner !) afin d’´eviter qu’un joueur t´el´echarge votre fichier .swf et s’en serve sans ˆetre connect´e `a votre site.

Travaux dirig´es d’ActionScript

138

Eric Schrafstetter

CHAPITRE 8. JEUX

1. A la premi`ere image de votre animation mettre l’action : if ((substring (_url.toLowerCase(), 1, 26)) eq "http://www.univ-angers.fr/") { gotoAndPlay (3); } La propri´et´e _url renvoie l’url du fichier .swf d’o` u le clip a ´et´e t´el´echarg´e. On teste simplement si cet url est celle de notre site. 2. A l’image 2 de l’animation, placez l’action gotoAndPlay(1);. Sinon, il suffit de faire CTRL+ fl`eche vers la droite pour ´eviter le test ! 3. Le programme commence `a l’image 3. Et voici la parade pour le pirate ! <TITLE>Version pirate <SCRIPT LANGUAGE=JavaScript> <EMBED SRC="jeux.swf" NAME=jeux swLiveConnect=TRUE WIDTH=100% HEIGHT=100% QUALITY=high BGCOLOR=#FFFFFF

Travaux dirig´es d’ActionScript

139

Eric Schrafstetter

CHAPITRE 8. JEUX

TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/...">
Allez directement ` a l’image 3 ! Vous pouvez am´eliorer ( ?) ce script pour aller directement au num´ero d’un frame entr´e dans une zone de saisie...

8.8.2

Mot de passe

Ne jamais mettre un mot de passe `a l’int´erieur d’une animation Flash, il est extrˆemenent facile de le r´ecup´erer (voir par exemple le programme ActionScript Viewer qui permet d’extraire les scripts, symboles etc `a partir d’un .swf mˆeme prot´eg´e)Si vous comprenez `a l’instant que tous vos programmes pourront facilement ˆetre lus, j’en suis sinc`erement d´esol´e. Esp´erons que Macromedia, certainement press´e de sortir la version 5 alors qu’Adobe annon¸cait LiveMotion, saura rem´edier `a cette tr`es grˆave ”lacune”.

8.8.3

ActionScript Viewer

Ce logiciel permet de d´ecompiler les animations Flash et de r´ecup´erer les codes. Actuellement, je ne connais qu’une seule parade (pour combien de temps ?). Il s’agit de mettre au d´ebut de chaque frame o` u il y a une action `a cacher le code : void 0(!0); Il existe ´egalement Scan SWF File.

Travaux dirig´es d’ActionScript

140

Chapitre 9

PHP Si vous voulez tester les scripts de ce chapitre, je vous conseille d’installer le pack easyphp disponible sur http ://www.easyphp.org/Vous aurez ainsi en quelques minutes (`a peine) un serveur Apache, PHP et MySQL sur votre machine. Les scripts .php pourront ˆetre plac´es dans le r´epertoire www/flash.

9.1

Ming

Cette librairie de cr´eation `a la vol´ee de fichiers SWF est disponible pour PHP sur le site http ://www.opaque.net/mingLe manuel de r´ef´erence de PHP 4.0 (http ://snaps.php.net/manual/) contient un chapitre de description des fonctions de la librairie ming. Si vous avez install´e easyphp, ouvrez votre page d’accueil et cliquez sur le bouton ’test ming’. T´el´echargez ´egalement les utilitaires ming-winutils.zip dont entre autres makefdb (voir rubrique texte plus loin) et swftophp qui permet de convertir un fichier swf de Flash 4 en script php ! Pour l’utiliser, voici mes conseils : 1. Ce programme fonctionnant sous DOS, ajoutez `a votre bouton droit un menu contextuel Fen^ etre DOS qui vous permettra d’ouvrir une fenˆetre DOS dans un dossier s´electionn´e. Pour ce faire, ouvrez la base de registre (D´emarrer - Ex´ecuter - regedit) puis allez `a la cl´e : HKEY_CLASSES_ROOT\Folder\shell Cr´eez une cl´e nomm´ee Fen^ etre DOS, une sous-cl´e command et lui donnez la valeur command.com. Si vous avez peur de changer la base de registre ou si vous avez un doute, ne changez rien ! ! 2. Placez le programme swftophp dans un dossier accessible par l’autoexec.bat, par exemple dans C:\windows\command. 3. Ouvrez une fenˆetre DOS dans le dossier o` u est le fichier `a convertir. Faire bouton-droit et propri´et´es de la fenˆetre DOS, choisir l’onglet Divers et cochez Souris - Edition rapide.

141

Eric Schrafstetter

CHAPITRE 9. PHP

4. Supposons que le fichier s’appelle essai.swf. Tapez : swftophp essai.swf > essai.txt La conversion du fichier .swf en PHP-Ming est alors ´ecrite dans le fichier essai.txt.

9.1.1

Tester un swf

Lorsque vous lancez une page .php, le fichier .swf cr´e´e est plac´e dans le dossier temporaire. Mˆeme si vous fermez la fenˆetre de visualisation puis changez votre script php, votre navigateur affichera encore votre ancienne version ! La premi`ere id´ee est de supprimer `a chaque fois les fichiers temporaires mais cela devient tr`es vite p´enible. Une solution est d’ajouter les lignes suivantes : header(’Content-type: application/x-shockwave-flash’); header(’http-equiv="pragma" content="no-cache"’); header(’http-equiv="Expires" content="0"’); La premi`ere ligne est toujours n´ecessaire comme vous le constaterez dans les prochains programmes. La seconde ligne ´evite que le navigateur mette le fichier en m´emoire cache (remarquez que Affichage - Source n’est plus disponible) et la derni`ere donne une dur´ee de vie nulle `a la page. D´esormais, la manipulation est de fermer la fenˆetre d’affichage, de changer votre script et de relancer la page ! Une autre solution consiste `a utiliser un lien hypertexte du type : Charger l’animation ! la commande ?1 for¸cant le navigateur a t´el´echarger l’animation sur le site d’origine.

9.1.2

Notions de base

Il y a un rapport de 20 entre la taille de l’animation Flash et celle utilis´ee par ming. Par exemple, une animation de 550px par 400px, `a un taux de 12 images/s et avec un fond blanc se d´efinit par : setRate(12.0); $m->setDimension(11000, 8000); $m->setFrames(1); $m->setBackground(0xff, 0xff, 0xff); /* -------------------------*/ /* Le programme de cr´ eation */ /* -------------------------*/

Travaux dirig´es d’ActionScript

142

Eric Schrafstetter

CHAPITRE 9. PHP

header(’Content-type: application/x-shockwave-flash’); $m->output(); ?>

9.1.3

Dessiner

1. Un rectangle vert de longueur longueur, de hauteur hauteur dont le coin haut gauche est en (x,y) function rect($x,$y,$longueur,$hauteur){ $s1 = new SWFShape(); $s1->movePenTo($x,$y); $s1->setRightFill(0x00, 0xff, 0x00); $s1->drawLine($longueur, 0); $s1->drawLine(0, $hauteur); $s1->drawLine(-$longueur, 0); $s1->drawLine(0,-$hauteur ); return $s1; } Exemple : setRate(12.000000); $m->setDimension(11000, 8000); $m->setFrames(1); $m->setBackground(0xff, 0xff, 0xff); $m->add(new SWFAction("stop();")); function rect($x,$y,$longueur,$hauteur){ $s1 = new SWFShape(); $s1->movePenTo($x,$y); $s1->setRightFill(0x00, 0x66, 0xcc); $s1->drawLine($longueur, 0); $s1->drawLine(0, $hauteur); $s1->drawLine(-$longueur, 0); $s1->drawLine(0,-$hauteur ); return $s1; } $i1 = $m->add(rect(800,1000,1600,800));; $m->nextFrame();

header(’Content-type: application/x-shockwave-flash’); $m->output();

Travaux dirig´es d’ActionScript

143

Eric Schrafstetter

CHAPITRE 9. PHP

?> 2. Cercle de rayon R Le plus simple est de repr´esenter un cercle comme une suite de lignes droites (voir l’exemple du camembert 3D online plus loin)Nous allons voir une m´ethode plus rapide dans le principe mais certainement moins maniable d’un point de vue intellectuel ! Il s’agit d’utiliser 8 courbes de B´ezier. Rappelons l’algorithme de Casteljau dans le cas de N + 1 points : Soit zi , i = 0, .., N des points du plan complexe. La courbe de B´ezier d’ordre N est donn´ee par :

z(t) =

N X

Cnk tk (1 − t)n−k zk

k=0

³

´ Cas particulier : Si z0 = √R2 , √R2 , z1 = (x1 , y1 ) et z2 = (R, 0), alors la courbe de B´ezier d’ordre 2 a pour ´equation param´etrique : ( z(t) =

(1 − t)2 √R2 + 2t(1 − t)x1 + Rt2 (1 − t)2 √R2 + 2t(1 − t)y1

Exercice : Cherchez l’unique polynˆome du second degr´e Pc approchant √ ¡ ¢ ¡ ¢ la courbe t → cos π4 (1 − t) pour t ∈ [0, 1] avec Pc (0) = cos π4 = 22 , √ Pc (1) = cos(0) = 1 et Pc0 (0) = π4 × 22 . R´eponse : Ã ! √ √ π 2 2 π 2 1 cos t2 (1 − t) ' Pc (t) = + t+ 1− −√ 4 2 8 8 2 ³π



´

De mˆeme pour l’approximation de t → sin

¡π

4 (1

(9.1)

¢ − t) :

à √ ! √ √ ´ 2 π 2 π 2 1 sin (1 − t) ' Ps (t) = − t+ −√ t2 4 2 8 8 2 ³π

(9.2)

En particulier, une approximation de l’arc de cercle ayant pour ´equation π t → Rei 4 (1−t) avec t ∈ [0, 1] sera r´ealis´ee lorsque le couple (x1 , y1 ) v´erifiera : (

¡ ¢ R cos π4 (1 − t) = (1 − t)2 √R2 + 2t(1 − t)x1 + Rt2 ¡π ¢ R sin 4 (1 − t) = (1 − t)2 √R2 + 2t(1 − t)y1

(9.3)

En rempla¸cant (9.1) et (9.2) dans (9.3) puis en identifiant les coefficients des polynˆomes, on obtient : √ √ π 2+8 2 ' 0, 9848 ' 1 x1 = 16

Travaux dirig´es d’ActionScript

144

Eric Schrafstetter

et

CHAPITRE 9. PHP

√ √ −π 2 + 8 2 1 √ y1 = ' 0, 4294 ' 16 1+ 2

Ceci donne un moyen de tracer un arc de cercle de 45◦ d’un cercle de rayon R et de centre O (voir figure 9.1) en utilisant l’approximation x1 = R et R√ y1 = 1+R√2 . Un petit calcul montre que ξ = √2(1+ et que la distance 2) de z1 `a z2 est

R√ . 1+ 2

z0

ξ 45°

ξ z1

45°

0

z2

Fig. 9.1 – Arc de cercle par courbe de B´ezier setRate(12.0); $m->setDimension(1500, 1500); $m->setFrames(1); $m->setBackground(0xff, 0xff, 0xff); $m->add(new SWFAction("stop();")); $s1 = new SWFShape(); $R=500; $s1->movePenTo($R/sqrt(2), -$R/sqrt(2)); $s1->setLine(20, 0x00, 0x00, 0x00); $s1->drawCurve($R/(2+sqrt(2)),$R/(2+sqrt(2)),0,$R/(1+sqrt(2))); $i1 = $m->add($s1); $i1->moveTo(1000, 1000); $m->nextFrame(); header(’Content-type: application/x-shockwave-flash’); $m->output(); ?>

Travaux dirig´es d’ActionScript

145

Eric Schrafstetter

CHAPITRE 9. PHP

3. Tracer un cercle - M´ethode 1 : Boucle for setRate(12.000000); $m->setDimension(1500, 1500); $m->setFrames(1); $m->setBackground(0xff, 0xff, 0xff); $m->add(new SWFAction("stop();")); function cercle($R){ $s1 = new SWFShape(); $c = new SWFSprite(); $r1=2.414213562; $r2=1.414213562; $s1->movePenTo($R/$r2, -$R/$r2); $s1->setLine(20, 0x00, 0x00, 0x00); $s1->drawCurve($R/$r1/$r2,$R/$r1/$r2,0,$R/$r1); for($i=0;$i<=7;$i++){ $i1 = $c->add($s1); $i1->moveTo(1000, 800); $i1->rotateto(45*$i); } $c->nextFrame(); return $c; } $m->add(cercle(500)); $m->nextFrame(); header(’Content-type: application/x-shockwave-flash’); $m->output(); ?> 4. Tracer un cercle - M´ethode 2 : Ecriture explicite des 8 courbes de B´ezier setRate(12.000000); $m->setDimension(11000, 8000); $m->setFrames(1); $m->setBackground(0xff, 0xff, 0xff); function cercle($R){ $s1 = new SWFShape(); $s1->movePenTo(0, 0); $s1->setLine(20, 0x00, 0x00, 0x00); $coeff1=$R*(2-sqrt(2))/2; $coeff2=$coeff1*sqrt(2);

Travaux dirig´es d’ActionScript

146

Eric Schrafstetter

CHAPITRE 9. PHP

$s1->drawCurve($coeff1, $coeff1, 0, $coeff2); $s1->drawCurve(0, $coeff2, -$coeff1, $coeff1); $s1->drawCurve(-$coeff1, $coeff1, -$coeff2, 0); $s1->drawCurve(-$coeff2, 0, -$coeff1, -$coeff1); $s1->drawCurve(-$coeff1, -$coeff1, 0, -$coeff2); $s1->drawCurve(0, -$coeff2, $coeff1, -$coeff1); $s1->drawCurve($coeff1, -$coeff1, $coeff2, 0); $s1->drawCurve($coeff2, 0, $coeff1, $coeff1); return $s1; } $i1 = $m->add(cercle(500)); $i1->moveTo(2000, 2000); $m->nextFrame(); header(’Content-type: application/x-shockwave-flash’); $m->output(); ?> 5. De fa¸con plus g´en´erale, si l’on veut tracer un arc de cercle d’angle α et de rayon R, avec 0 ≤ α ≤ π4 , On place z0 en (R cos(α), R sin(α)), z2 en (R, 0) et on se sert du point z1 de coordonn´ees : 2 cos(α) + α sin(α) R 2 2 sin(α) − α cos(α) y1 = R 2

x1 =

Voici un exemple de script tra¸cant des arcs de cercles d’angles α pour α entre 0 et π4 setRate(12.000000); $m->setDimension(1500, 1500); $m->setFrames(1); $m->setBackground(0xff, 0xff, 0xff); $m->add(new SWFAction("stop();")); function cercle($R,$a,$x,$y){ $s1 = new SWFShape(); $c = new SWFSprite(); $ca=cos($a); $sa=sin($a); $rca=$R*$ca; $rsa=$R*$sa; $s1->movePenTo($rca, -$rsa); $s1->setLine(20, 0x00, 0x00, 0x00); $s1->drawCurve($a*$rsa/2,$a*$rca/2,

Travaux dirig´es d’ActionScript

147

Eric Schrafstetter

CHAPITRE 9. PHP

$R*(1-($sa*$a+2*$ca)/2),$R*(2*$sa-$a*$ca)/2); $i1 = $c->add($s1); $i1->moveTo($x, $y); $c->nextFrame(); return $c; } for($i=0;$i<=45;$i++){ $m->add(cercle(300,M_PI*$i/180,1000-10*$i,1000)); } header(’Content-type: application/x-shockwave-flash’); $m->output(); ?>

9.1.4

Camembert 3D online

Fig. 9.2 – Aspect final du camembert Voici un petit script facilement attachable `a une base de donn´ees qui permet de r´ealiser `a la vol´ee un camembert 3DContrairement `a la section pr´ec´edente o` u nous utilisions des courbes de B´ezier, nous choisissons ici de tracer l’ellipse `a partir de petits segments de droites. Voici quelques explications sur le programme : 1. Le graphique se compose de 2 parties, les diff´erentes parts et le socle. Le socle n’´etant visible que pour les angles entre 0 et π. 2. La fonction secteur permet de dessiner un secteur entre les angles $depart et $angle `a la position $x,$y avec la couleur $coul 3. Le test ci-dessous permet d’arrˆeter le socle `a π : if($angle+$depart>M_PI){

Travaux dirig´es d’ActionScript

148

Eric Schrafstetter

CHAPITRE 9. PHP

$nb=(M_PI-$depart)*180/M_PI; } 4. Il ne faut pas confondre les fonctions drawline et drawlineto, la premi`ere dessinant une ligne du point courant jusqu’`a un d´eplacement (δx, δy) relativement `a ce point et la seconde dessinant une ligne du point courant jusqu’`a un autre point (x, y). 5. Vous pouvez `a titre d’exercice transformer les clips $c en boutons de sorte que si l’on passe la souris dessus, la valeur de la portion de camembert soit affich´ee ! setRate(12.000000); $m->setDimension(800, 400); $m->setFrames(1); $m->setBackground(0xff, 0xff, 0xff); $m->add(new SWFAction("stop();")); function secteur($depart,$angle,$x,$y,$coul){ global $depart; $haut=80; $s1 = new SWFShape(); $c = new SWFSprite(); $f=$s1->addFill($coul,$coul,$coul); $s1->setRightFill($f); $s1->movePenTo(0, 0); $s1->setLine(20, 0x00, 0x00, 0x00); $nb=$angle*180/M_PI; if($depart<=M_PI){ $s2 = new SWFShape(); $f=$s2->addFill($coul,$coul,$coul); $s2->setRightFill($f); $s2->movePenTo($x*(1+cos($depart)),$y*(1+sin($depart))); $s2->setLine(20, 0x00, 0x00, 0x00); $s2->drawline(0,$haut); if($angle+$depart>M_PI){ $nb=(M_PI-$depart)*180/M_PI; } for($k=0;$k<=$nb;$k++){ $s2->drawlineto($x*(1+cos($k*M_PI/180+$depart)),$haut+ $y*(1+sin($k*M_PI/180+$depart))); } $s2->drawlineto($x*(1+cos($depart+$nb*M_PI/180)), $haut+$y*(1+sin($depart+$nb*M_PI/180)));

Travaux dirig´es d’ActionScript

149

Eric Schrafstetter

CHAPITRE 9. PHP

$s2->drawline(0,-$haut); $s2->drawlineto($x*(1+cos($depart)),$y*(1+sin($depart))); $i1 = $c->add($s2); } $nb=$angle*180/M_PI; for($k=0;$k<=$nb;$k++){ $s1->drawlineto($x*cos($k*M_PI/180+$depart), $y*sin($k*M_PI/180+$depart)); } $depart+=$angle; $s1->drawlineto($x*cos($depart),$y*sin($depart)); $s1->drawlineto(0,0); $i1 = $c->add($s1); $i1->moveTo($x, $y); $c->nextFrame(); return $c; } $a=200; $b=100; $couleurs=array(0xff,0xcc,0x50,0xaa); $valeurs=array(5,10,3,20); $compte=sizeof($valeurs); $depart=0; $somme=0; for($i=0;$i<=$compte-1;$i++){ $somme+=$valeurs[$i]; } for($i=0;$i<=$compte-1;$i++){ $part=2*M_PI*$valeurs[$i]/$somme; $t=$m->add(secteur($depart,$part,$a,$b,$couleurs[$i])); $t->moveto($a,$b); } header(’Content-type: application/x-shockwave-flash’); $m->output(); ?>

9.1.5

D´ eplacement

1. D´eplacement d’un symbole sur la sc`ene principale : setRate(12.000000); $m->setDimension(11000, 8000);

Travaux dirig´es d’ActionScript

150

Eric Schrafstetter

CHAPITRE 9. PHP

$m->setFrames(10); $m->setBackground(0xff, 0xff, 0xff); /* -- Dessin rectangle -- */ $s1 = new SWFShape(); $s1->movePenTo(5000, 5000); $s1->setRightFill(0x00, 0x66, 0xcc); $s1->drawLine(-2000, 0); $s1->drawLine(0, -1500); $s1->drawLine(2000, 0); $s1->drawLine(0, 1500); /* -- Symbole rectangle -- */ $s2 = new SWFSprite(); $j1 = $s2->add($s1); $s2->nextFrame(); /* -- On place une occurrence du rectangle sur la sc` ene */ $i1 = $m->add($s2); for($i=1;$i<=10;$i++){ $x=5000-200*$i; $y=5000-500*$i; $i1->moveTo($x, $y); $m->nextFrame(); if($i==9) { $m->add(new SWFAction("stop();")); } } header(’Content-type: application/x-shockwave-flash’); $m->output(); ?> 2. En attendant une version de MING compatible avec ActionScript, nous voil`a oblig´e de nous replonger dans les actions propres `a Flash 4..Voici un exemple tout `a fait ´el´ementaire de la fonction startDrag. Il place un petit rectangle `a l’´ecran ayant le comportement d’un bouton, lorsque vous pressez dessus, vous pouvez le d´eplacer et lˆachez le bouton de la souris pour le poser. setRate(12.0); $m->setDimension(8000, 8000); $m->setFrames(1); $m->setBackground(0xff, 0xff, 0xff); $m->add(new SWFAction("stop();"));

Travaux dirig´es d’ActionScript

151

Eric Schrafstetter

CHAPITRE 9. PHP

$s1 = new SWFShape(); $s1->movePenTo(0, 0); $s1->setRightFill(0x00, 0x66, 0xcc); $s1->drawLine(500, 0); $s1->drawLine(0, 500); $s1->drawLine(-500, 0); $s1->drawLine(0, -500); $s2 = new SWFButton(); $s2->addShape($s1, SWFBUTTON_HIT | SWFBUTTON_DOWN | SWFBUTTON_OVER | SWFBUTTON_UP); $a = new SWFAction("startDrag(’’, 0);"); $s2->addAction($a, SWFBUTTON_MOUSEDOWN); $a = new SWFAction("stopDrag();"); $s2->addAction($a, SWFBUTTON_MOUSEUP); $i1 = $m->add($s2); $i1->moveTo(4000, 4000); $m->nextFrame(); header(’Content-type: application/x-shockwave-flash’); $m->output(); ?>

9.1.6

Texte

Soit vous utilisez les polices de base _serif, _sans ou _typewriter, soit vous utilisez ’vos’ propres polices d’extension .fdbVoici comment cr´eer une telle police : 1. Placez l’utilitaire makefdb (voir intro) dans un r´epertoire accessible. 2. Lancez Flash et cr´eez un fichier police.fla 3. Cr´eez une zone de texte et tapez quelques lettres, par exemple abc. 4. Choisissez une police, par exemple Wingdings 5. Dans les param`etres de publication, d´ecochez les formats SWF et HTML et cochez Mod`ele Generator SWT. 6. Si vous voulez exporter d’autres polices, cr´eez autant de zones de texte que n´ecessaire ! 7. Publier la page pour cr´eer le fichier police.swt 8. Ouvrir une fenˆetre DOS dans le dossier de publication et tapez makefbd police.swt Un ou plusieurs fichiers .fdb sont alors cr´e´es.

Travaux dirig´es d’ActionScript

152

Eric Schrafstetter

CHAPITRE 9. PHP

9. Placez ces fichiers sur votre serveur (utilisez des chemins relatifs si les polices ne sont pas dans le mˆeme r´epertoires que les fichiers PHP) et appelez la police par la commande suivante : $f=new SWFFont("Wingdings.fdb"); $t=new SWFText(); $t->setFont($f); 10. Voici un petit exemple d’animation de texte : setFont($f); $t->setColor(0xff,0,0); $t->setHeight(600); $t->addString("Flash !"); $m= new SWFMovie(); $m->setDimension(5000,4000); $i=$m->add($t); $i->moveTo(2000,2000); for($k=0;$k<=60;$k++){ $i->scaleTo(cos($k*M_PI/30),sin($k*M_PI/30)); $m->nextframe(); } header(’Content-type: application/x-shockwave-flash’); $m->output(); ?>

9.1.7

Morphing

Dans cet exercice, on dessine deux rectangles de couleurs et de formes diff´e/rentes et on cr´ee l’interpolation entre les deux. La fonction SWFMorph doit avoir 2 param`etres : getShape1() pour la forme d’origine et getShape2() pour la forme finale. setRate(12.000000); $m->setDimension(11000, 8000); $m->setFrames(20); $m->setBackground(0xff, 0xff, 0xff); /* Initialisation des nombres al´ eatoires */ mt_srand((double)microtime()*10000); /* Cr´ eation du morphing */ $s1 = new SWFMorph();

Travaux dirig´es d’ActionScript

153

Eric Schrafstetter

CHAPITRE 9. PHP

/* Forme 1 */ $s0 = $s1->getShape1(); $s0->movePenTo(900, 2000); $s0->setLeftFill(0x00, 0xff, 0x00); $s0->setLine(0, 0x00, 0x00, 0x00, 0x00); /* Largeur al´ eatoire du carr´ e */ $largeur=mt_rand(100,2000); $s0->drawLine($largeur, 0); $s0->drawLine(0, $largeur); $s0->drawLine(-$largeur, 0); $s0->drawLine(0, -$largeur); /* Forme 2 */ $s0 = $s1->getShape2(); $s0->movePenTo(2500, 2000); $s0->setLeftFill(0x00, 0x00, 0xff); $s0->setLine(0, 0x00, 0x00, 0x00, 0x00); $largeur=mt_rand(100,2000); $s0->drawLine($largeur, 0); $s0->drawLine(0, $largeur); $s0->drawLine(-$largeur, 0); $s0->drawLine(0, -$largeur); $i1 = $m->add($s1); for($i=0;$i<1;$i+=0.05){ $m->nextFrame(); $i1->setRatio($i); } header(’Content-type: application/x-shockwave-flash’); $m->output(); ?>

9.1.8

Loadmovie

A partir d’une animation Flash 5, un bouton va permettre de t´el´echarger une animation Flash cr´e´ee en php et un second bouton effectue un effet sur l’animation charg´ee. 1. Tapez le fichier rect.php suivant : setRate(12.000000); $m->setDimension(110, 80);

Travaux dirig´es d’ActionScript

154

Eric Schrafstetter

CHAPITRE 9. PHP

$m->setFrames(1); $m->setBackground(0xff, 0xff, 0xff); $s1 = new SWFShape(); $s1->movePenTo(10, 10); $s1->setRightFill(0x00, 0x66, 0xcc); $s1->drawLine(20, 0); $s1->drawLine(0, 20); $s1->drawLine(-20, 0); $s1->drawLine(0, -20); $s2 = new SWFSprite(); $j1 = $s2->add($s1); $s2->nextFrame(); $i1 = $m->add($s2); $i1->moveTo(40, 40); $i1->setName(’rectangle’); $m->nextFrame(); header(’Content-type: application/x-shockwave-flash’); $m->output(); ?> Remarquez bien la fonction setName qui permet de donner un nom `a l’occurrence. 2. Lancez Flash et enregistrez sous le nom lance.fla (mˆeme dossier que le fichier pr´ec´edent) 3. Cr´eez deux boutons et mettre l’action suivante sur le premier bouton : on (release) { ici.loadMovie ("rect.php", "", "POST"); } 4. Sur le second bouton, associez l’action : on (release) { ici.rectangle._alpha=50; } 5. Cr´eez un clip vide et mettre une occurrence de celui-ci sur la sc`ene principale (au milieu de la sc`ene) avec comme nom ici 6. Compilez et lancez l’animation `a partir du navigateur. Cliquez sur le premier bouton, le rectangle apparaˆıt. 7. Cliquez sur le second bouton, l’effet _alpha=50 est appliqu´e.

Travaux dirig´es d’ActionScript

155

Eric Schrafstetter

CHAPITRE 9. PHP

9.2

Echange de variables

9.2.1

Exemple du poids id´ eal

1. Cr´eez le script calcul.php suivant : 2. Cr´eez une animation Flash poids.fla avec sur la sc`ene principale : – Une action stop(); `a l’image cl´e 1 – Deux zones de textes dynamiques de noms taille et poids. Ecrire `a cˆot´e les textes statiques taille et poids correspondant. – Un bouton rose (pour poids de la femme) avec l’action : on (release) { _root.choix = 2; loadVariablesNum ("calcul.php", 0, "POST"); } – Un bouton bleu (pour poids de l’homme) avec l’action : on (release) { _root.choix = 1; loadVariablesNum ("calcul.php", 0, "POST"); } – Enregistrez le fichier dans le mˆeme r´epertoire que calcul.php et compilez (MAJ+F12). – Lancez votre navigateur et ouvrez le fichier poids.html – Tapez une taille et cliquez sur le bouton rose pour avoir le poids id´eal si c’est une femme ou bleu si c’est un homme. Les variables taille et choix de l’animation Flash sont envoy´ees au script PHP par la m´ethode POST. Le script PHP calcule le poids id´eal en utilisant $choix pour savoir si c’est un homme ou une femme et renvoi la chaˆıne poids=$poids qui est r´ecup´er´ee par Flash dans poids. Rappelons qu’en PHP, lorsqu’une chaˆıne de caract`ere est ´evalu´ee comme une valeur num´erique, le r´esultat et le type de la variable sont d´etermin´es comme suit : – La chaˆıne de caract`eres est de type ”double” si elle contient un des caract`ere ’.’, ’e’ ou ’E’. Sinon, elle est de type entier (”integer”). – La valeur est d´efinie par la premi`ere partie de la chaˆıne. Si la chaˆıne de caract`eres d´ebute par une valeur num´erique cette valeur sera celle utilis´ee. Sinon, la valeur sera ´egale `a 0 (z´ero).

Travaux dirig´es d’ActionScript

156

Eric Schrafstetter

CHAPITRE 9. PHP

– Lorsque la premi`ere expression est une chaˆıne de caract`eres, le type de la variable d´epend de la seconde expression.

9.2.2

Compteur de visiteurs

Voici un moyen tr`es court d’afficher sous Flash le nombre de visiteurs d’un site en utilisant PHP : 1. Cr´eez le fichier compteur.php suivant : Le script ouvre le fichier compteur.txt contenant un nombre, met le contenu dans la variable $compteur, augmente la variable et la remet dans le fichier. Enfin, la variable nbvisites est envoy´ee `a Flash. 2. Cr´eez et enregistrez dans le mˆeme r´epertoire que compteur.php, un fichier compteur.txt contenant le seul caract`ere 0 (z´ero). 3. Lancez Flash et cr´eez une zone de texte dynamique de nom nbvisites sur la sc`ene principale 4. Ajoutez l’action suivante `a l’image 1 de la sc`ene principale : loadVariables ("compteur.php", "", "POST"); 5. Compilez et ouvrez `a partir de votre navigateurLe nombre de visites s’affiche.

Travaux dirig´es d’ActionScript

157

Chapitre 10

C++ 10.1

Introduction

Si vous n’avez pas Visual C++, d´epˆechez-vous de commander le Hors-S´erie n◦ 9 (mai 2001) de PC team contenant la version compl`ete du logiciel Microsoft Visual C++ ’Introductory Edition’ pour 42F ! L’installation ne pose aucun probl`eme, ajoutez ´egalement l’aide (en Anglais). Nous allons cr´eer une petite application qui va piloter une animation Flash et en recevoir des commandes. V´erifiez votre configuration : 1. D´ezippez le fichier commandes.zip dans un dossier quelconque 2. Un dossier tdas est cr´e´e. Ouvrez-le et copiez le fichier ls.swf 3. Collez ce fichier dans c:\mes documents 4. Cliquez 2 fois sur le fichier commandes.dsw qui lance Visual C++ 5. Tapez sur la touche F7 (Compiler)Normalement, il ne doit y avoir aucun message d’erreur ! 6. Faites CTRL+F5 puis cliquez sur OK. Testez les diff´erents boutons qui vont ˆetre maintenant expliqu´es...

10.2

C++ vers Flash

10.2.1

Cr´ eation de l’animation Flash

Pour le premier programme, inutile de se compliquer ! 1. Lancez Flash, dessinez un rectangle et transformez-le en symbole 2. A partir de ce symbole, cr´eez un mouvement quelconque entre les images 1 et 10 3. Enregistrez sous le nom rect.fla, compilez et lancez l’animation. L’animation doit tourner en boucle.

158

Eric Schrafstetter

10.2.2

CHAPITRE 10. C++

Cr´ eation de l’interface C++

Je vais supposer que vous ne connaissez rien ou pas grand chose `a C++ (nous serons 2). 1. Lancez Visual C++ 2. Faites File-New et choisir MFC AppWizard qui permet de faire 99% du travail ’ingrat’ `a notre place... 3. Donnez un nom au projet en haut `a droite, par exemple commandes puis OK 4. Choisir le type Dialog Box (Boˆıte de dialogue), langue Fran¸caise et cliquez sur Next 5. Cochez uniquement 3D Controls et ActiveX Controls puis cliquez sur Next 6. Cochez ’Yes, please’ pour avoir des explications sur le code g´en´er´e (parfaitement inbuvable !)Cliquez sur Finish puis OK Vous devez voir `a gauche une fenˆetre avec 3 onglets : ClassView, ResourceView et FileView. Si ce n’est pas le cas, faire View-Workspace. 1. Cliquez sur l’onglet ResourceView puis sur le + de Dialog 2. Cliquez 2 fois sur IDD_COMMANDES_DIALOG , la future fenˆetre de l’application est sous vos yeux. Faites CTRL+T pour tester la boˆıte de dialogue. 3. Utilisez la barre d’outils Controls pour ins´erez un nouveau bouton (Button). Si la barre n’est pas visible, faites bouton droit sur la barre d’outils du haut puis Controls. 4. Un bouton ayant pour nom Button1 est affich´e. Faire Bouton droit sur le bouton et Properties. Changez le champ Caption par ’Jouer’. 5. De mˆeme, ins´erez un nouveau bouton et mettre le champ Caption `a ’Stop’. Ces boutons serviront `a lire et stopper l’animation Flash

10.2.3 1. 2. 3. 4. 5. 6. 7.

8.

Ins´ erer l’animation

Faites Projet - Add to Project - Components and Controls Allez dans le r´epertoire ’Registered ActiveX Controls’ Choisir dans la liste ShockWave Flash Object puis OK Un nouveau bouton ’ShockWave Flash Object’ apparaˆıt dans la barre d’outils Controls Cliquez sur ce bouton et dessinez un rectangle sur la boˆıte de dialogue Faites Bouton droit sur le rectangle blanc cr´e´e puis Properties. Remarquez que son ID est IDC_SHOCKWAVEFLASH1 Il s’agit maintenant d’associer une variable `a l’objet IDC_SHOCKWAVEFLASH1 Pour cela lancer ClassWizard par View-ClassWizard et choisissez en haut l’onglet Members Variables Cliquez sur IDC_SHOCKWAVEFLASH1 puis sur le bouton Add Variable `a droite. Mettre par exemple m_anim comme nom de variable puis 2 fois OK

Travaux dirig´es d’ActionScript

159

Eric Schrafstetter

10.2.4

CHAPITRE 10. C++

Le programme

Il s’agit d’associer diff´erentes actions aux ´ev´enements (boutons, initialisation...) 1. On voudrait que l’animation rect.swf soit charg´ee dans la variable m_anim d`es le d´ebut. Pour cela, lancez ClassWizard ( CTRL+W), cliquez sur l’onglet ’Message Maps’ et choisir Class Name = CcommandesDlgLa liste des objets est affich´ee. 2. Choisir l’ID CcommandesDlg et le Message WM_INITDIALOG (WM pour Window Message) puis cliquez `a droite sur le bouton ’Edit Code’ 3. Oups ! Je vous avais bien dit que c’´etait inbuvable ! Recherchez plus bas la partie // TODO: Add extra initialization here return TRUE;

// return TRUE

unless you ...

C’est apr`es la ligne // TODO: que nous allons mettre notre code. 4. Mettre le code suivant : // TODO: Add extra initialization here m_anim.SetMovie("C:/Mes Documents/rect.swf"); m_anim.Play(); return TRUE;

// return TRUE

unless you ...

Quelques remarques : Bien sˆ ur vous devez mettre le chemin correspondant `a l’emplacement de votre fichier rect.swfD’autre part, avez-vous vu qu’apr`es m_anim. un menu contextuel s’est affich´e ? Tapez les premi`eres lettres puis utilisez la fl`eche du bas du clavier et entr´ee pour choisir directement la fonction. Enfin, si vous ne vous souvenez plus de la liste des variables, faites bouton droit sur le code puis ’List Members’ et tapez la lettre m. 5. Il est temps de tester notre d´ebut d’application en tapant sur la touche F7Normalement, le message suivant s’affiche : commandes.exe - 0 error(s), 0 warning(s) Si ce n’est pas le cas et si vous d´ebutez en C++... recommencez depuis le d´ebut ! 6. Lancez le programme par CTRL+F5 ou cliquez sur le point d’exclamation rouge. 7. Une boˆıte de dialogue s’affiche vous signalant que vous avez la version `a usage personnel, ce qui explique que je ne peux vous fournir que les codes sources de cet exercice. 8. Voyez-vous votre animation ? ? ? Cliquez sur OK pour fermer.

Travaux dirig´es d’ActionScript

160

Eric Schrafstetter

CHAPITRE 10. C++

Passons maintenant aux codes des boutons Jouer et Stop : 1. Revenez sur la boˆıte de dialogue par Windows - IDD_COMMANDES_DIALOG 2. Double cliquez sur le bouton ’Jouer’ et remplacez OnButton1 par OnJouer qui est plus explicite. 3. Tapez le code suivant : void CCommandesDlg::OnJouer() { // TODO: Add your control notification ... m_anim.Play(); } 4. De la mˆeme fa¸con, double cliquez sur le bouton ’Stop’ et remplacez OnButton2 par OnStop. Ajoutez le code : void CCommandesDlg::OnStop() { // TODO: Add your control notification ... m_anim.Stop(); } 5. Recompilez par F7 et lancez par CTRL+F5 6. Testez les boutons ’Jouer’ et ’Stop’ 7. Remplacez le code du bouton ’Stop’ par : void CCommandesDlg::OnStop() { // TODO: Add your control notification handler code here m_anim.GotoFrame (5); m_anim.Stop(); } Maintenant, l’animation s’arrˆetera toujours au frame n◦ 5. Pour voir toutes les fonctions li´ees `a l’objet Flash, utilisez les menus d´eroulants dans la barre d’outils du haut : – WizardBar C++ class = CShockwaveFlash – WizardBar C++ filter = (All class members) – WizardBar C++ Members = La liste cherch´ee En particulier : m_anim.GetTotalFrames() : Nombre de frames m_anim.CurrentFrame() : Frame courante m_anim.FrameLoaded(long n) : VRAI si frame n charg´ e m_anim.Forward() : Frame suivant Par exemple, sur la boˆıte de dialogue IDD_COMMANDES_DIALOG ajoutez un texte statique Aa et ouvrez ClassWizard ( CTRL+W) - Member Variables pour lui associer la variable m_total. Changez le code du bouton ’Stop’ par :

Travaux dirig´es d’ActionScript

161

Eric Schrafstetter

CHAPITRE 10. C++

void CCommandesDlg::OnStop() { // TODO: Add your control notification handler code here char total[20]; _itoa(m_anim.GetTotalFrames(),total,10); m_total=total; UpdateData(FALSE); m_anim.Stop(); } Lorsque vous appuierez sur le bouton ’Stop’, le nombre total de frames de l’animation s’affichera dans la zone de saisie. La fonction _itoa permet de convertir un entier long en caract`eres (base 10 ici).

10.2.5

SetVariable

Voici comment envoyer des variables de C++ vers Flash avec la commande SetVariable. 1. Ajoutez dans l’animation Flash une zone de texte dynamique ayant pour nom texte 2. Compilez l’animation. 3. Revenez `a C++ et ajoutez un bouton sur la boite de dialogue avec pour nom ’Envoyer’. Double cliquez sur le bouton et donnez le nom OnEnvoyer `a la fonction. 4. Mettre l’action suivante : void CCommandesDlg::OnEnvoyer() { // TODO: Add your control notification handler code here UpdateData(TRUE); m_anim.SetVariable("texte",m_total); } Ainsi, lorsque l’on tapera du texte dans la zone de saisie m_total et que l’on cliquera sur le bouton ’Envoyer’, nous enverrons la variable nomm´ee texte avec le contenu m_total `a l’animation.

10.3

Flash vers C++

Comment Flash peut-il piloter un programme C++ ? Tout simplement par la fonction FSCommand.

10.3.1

Cr´ eation de l’animation Flash

1. Lancez Flash et cr´eez un bouton quelconque

Travaux dirig´es d’ActionScript

162

Eric Schrafstetter

CHAPITRE 10. C++

2. Mettre 2 occurrences de ce bouton sur la sc`ene principale 3. Au premier bouton ajoutez l’action : on (release) { fscommand ("afficher", getVersion()); } 4. Au second bouton mettre l’action : on (release) { fscommand ("change", "J’ai tout compris !"); } 5. Ajoutez l’action stop(); `a la premi`ere image de la sc`ene principale. 6. Enregistrez sous le nom comm.fla et compilez.

10.3.2

Cr´ eation du programme C++

Reprenez la boite de dialogue cr´e´ee pr´ec´edemment. 1. Lancez ClassWizard ( CTRL+W), choisir Class names = CcommandsDlg, Object ID = IDC_SHOCKWAVEFLASH1 et Messages = FSCommand puis Edit Code 2. Tapez le code suivant : void CCommandesDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args) { // TODO: Add your control notification handler code here CString aff,ch; aff = "afficher"; ch="change"; if (command==aff) { MessageBox(args); } if (command==bt) { m_total=args; UpdateData(FALSE); } } Flash envoie les variables command et args au programme. Si command est afficher, une boite de dialogue apparaˆıt avec la version du Flash Player ( getVersion()). Si la commande est change, la variable m_total r´ecup`ere la variable args envoy´ee par Flash.

Travaux dirig´es d’ActionScript

163

Chapitre 11

Liens 11.1 – – – –

http http http http

Forums Flash ://www.flash-france.com ://flashmove.com/board/index.php ://board.flashkit.com/board/forumdisplay.php ?forumid=30 ://www.were-here.com/forums/forumdisplay.php ?forumid=24

11.2

Flash

11.2.1

Sites Internet

– – – – – – – – – – – – – – – – –

http ://www.macromedia.com En fran¸cais : http ://www.flash-france.com Livres : http ://www.amazon.fr http ://www.flashkit.com http ://flash5actionscript.com/ http ://www.virtual-fx.net/ http ://www.flashxpress.net/ D´ebutants : http ://www.yazo.net/sommaire.htm Tutorial : http ://www.flashkit.com/tutorials/Actionscripting/ Tutorial : http ://www.flashguru.co.uk Tutorial : http ://flashhouse.online.fr/cours.php3 .fla : http ://flash.onego.ru/ http ://aideflash5.multimania.com Jeux http ://www.adomania.net/flash/flashplay.htm 3D : http ://www.flash-3d.com/ 3D : http ://www.mode4.net/ Vectoriel hyperr´ealiste : http ://www.vectorkid.com/

164

Eric Schrafstetter

11.2.2

CHAPITRE 11. LIENS

Livres

1. Flash 5. Programmation d’animations de David Tardiveau. 157 FF 2. Flash 5 Magic avec ActionScript (avec CD-Rom) de J. Scott Hamlin, David J. Emberton 250 FF 3. Flash 5 ActionScript : Le guide du programmeur de Nicolas Sancy 245 FF 4. Conception Web avec Flash de Curtis 249 FF 5. Le Grand Livre : Macrom´edia Flash 5 de Michael Gradias 210 FF 6. Actionscript la r´ef´erence de Moock. 300 FF 7. ActionScript de Colin Moock. Broch´e (mai 2001) Notre prix : 310 FF 8. Flash ActionScript : Atelier cr´eatif de Bill Sanders. 220 FF 9. Actionscript - optimisez vos sites flash de Bhangal. 250 FF 10. ActionScript : Programmer sous Flash 5 de Christophe Aubry. 130 FF 11. Flash 5 actionscript pour les jeux 120 FF 12. Solutions ActionScript de Jean Nashe. 190 FF

11.3

PHP

– Documentation : http ://dev.nexen.net/docs/php/chargement.html – Scripts : http ://www.phpinfo.net/ – Scripts : http ://phpscripts.free.fr/

11.4

Ming

– Fonctions : http ://www.dynamic-webpages.de/php/ref.ming.php – Forum : http ://f256.com/forum/index.asp ?db=ming – Java : http ://www.anotherbigidea.com/javaswf/javaswf.html

Travaux dirig´es d’ActionScript

165

Related Documents

Action Script
January 2021 0
Script
January 2021 5
Script
January 2021 6
Script
January 2021 9

More Documents from "abhinav"

Formation Latex 2e
January 2021 1
Microsoft Power Bi
January 2021 1
Action Script
January 2021 0
Cryptographie
January 2021 0
Maple
January 2021 4