Action Script
Action Script
Action Script
Travaux Dirigés
Version 1.4
17 janvier 2002
Eric Schrafstetter
Table des matières
1 Outils de base 6
1.1 Initialisation de variables . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Position souris . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3 Fenêtres et navigateurs . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.1 Fermer une fenêtre . . . . . . . . . . . . . . . . . . . . . . 7
1.3.2 Plein écran . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Lecteur autonome . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5 Chargement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5.1 Version élémentaire . . . . . . . . . . . . . . . . . . . . . . 8
1.5.2 Version avec % . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5.3 Barre de chargement . . . . . . . . . . . . . . . . . . . . . 9
1.5.4 Chargement d’une bibliothèque . . . . . . . . . . . . . . . 10
1.5.5 Version 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.6 Couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.6.1 Définir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.6.2 Aléatoires . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.6.3 Remplissages transparents . . . . . . . . . . . . . . . . . . 12
1.6.4 Effet de torche . . . . . . . . . . . . . . . . . . . . . . . . 12
1.6.5 Jeux de couleurs . . . . . . . . . . . . . . . . . . . . . . . 13
1.7 Jouer un fichier MIDI . . . . . . . . . . . . . . . . . . . . . . . . 14
1.8 Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.9 Boutons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.9.1 Bouton On/Off/Clignotant . . . . . . . . . . . . . . . . . 18
1.9.2 Bouton transparent . . . . . . . . . . . . . . . . . . . . . 19
1.9.3 Déplacement d’objets . . . . . . . . . . . . . . . . . . . . 20
1.10 Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.10.1 Scroll sur texte . . . . . . . . . . . . . . . . . . . . . . . . 21
2 La vidéo 22
2.1 Vidéo dans une fenêtre séparée . . . . . . . . . . . . . . . . . . . 22
2.1.1 Paramètres généraux pour les vidéos . . . . . . . . . . . . 23
2.1.2 Windows Media Player . . . . . . . . . . . . . . . . . . . 23
2.1.3 QuickTime . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.4 Real Video . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1
Eric Schrafstetter TABLE DES MATIÈRES
3 Maths 33
3.1 Nombres aléatoires . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.1 Mélanges . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.1 Matrices de rotation . . . . . . . . . . . . . . . . . . . . . 33
3.2.2 Boules dans l’espace . . . . . . . . . . . . . . . . . . . . . 34
3.3 Déformation d’un triangle (Partie 1) . . . . . . . . . . . . . . . . 36
3.4 Anaglyphes géométriques 3D . . . . . . . . . . . . . . . . . . . . 41
3.5 Perspectives frontales et obliques . . . . . . . . . . . . . . . . . . 44
3.5.1 Méthode pratique . . . . . . . . . . . . . . . . . . . . . . 44
3.5.2 Les formules... . . . . . . . . . . . . . . . . . . . . . . . . 44
3.5.3 Manipulation d’un cube . . . . . . . . . . . . . . . . . . . 47
4 Physique 52
4.1 Collision élastique de 2 boules . . . . . . . . . . . . . . . . . . . . 52
4.1.1 Rappels . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1.2 La théorie . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1.3 Application . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.2 Vitesse d’un objet avec freinage . . . . . . . . . . . . . . . . . . . 58
4.3 Fil élastique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.4 Tableau blanc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5 Visualisation 63
5.1 Powerpoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.2 Sons, Cookies et Diaporamas . . . . . . . . . . . . . . . . . . . . 63
5.2.1 Partie HTML - javascript . . . . . . . . . . . . . . . . . . 64
5.2.2 Partie Images . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.2.3 Partie Flash . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.3 Visionneuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
2
Travaux dirigés d’ActionScript
Eric Schrafstetter TABLE DES MATIÈRES
6 Outils de conversions 83
6.1 Bitmap vers Vectoriel . . . . . . . . . . . . . . . . . . . . . . . . 83
6.2 Images vers swf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.3 Diaporama en swf . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.3.2 Quelques remarques . . . . . . . . . . . . . . . . . . . . . 85
6.3.3 Les indispensables ! . . . . . . . . . . . . . . . . . . . . . . 86
6.3.4 Exemple d’utilisation . . . . . . . . . . . . . . . . . . . . . 86
6.4 Films vers swf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.5 Microsoft Office . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.5.1 La barre de dessin . . . . . . . . . . . . . . . . . . . . . . 86
6.5.2 Powerpoint vers Flash . . . . . . . . . . . . . . . . . . . . 87
6.5.3 Flash vers PowerPoint . . . . . . . . . . . . . . . . . . . . 89
6.5.4 Powerpoint-Flash ou PDF ? . . . . . . . . . . . . . . . . . 89
7 SmartClips 93
7.1 Variateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
7.2 Fenêtres volantes . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
7.3 Bibliothèque commune . . . . . . . . . . . . . . . . . . . . . . . . 96
7.4 SmartClip Calendrier . . . . . . . . . . . . . . . . . . . . . . . . . 97
8 Jeux 101
8.1 Le morpion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
8.2 Jeu de l’Hexagone . . . . . . . . . . . . . . . . . . . . . . . . . . 104
8.2.1 Les problèmes . . . . . . . . . . . . . . . . . . . . . . . . . 104
8.2.2 Le clip pion . . . . . . . . . . . . . . . . . . . . . . . . . . 106
8.2.3 Le clip plateau . . . . . . . . . . . . . . . . . . . . . . . . 107
8.2.4 Scène principale . . . . . . . . . . . . . . . . . . . . . . . 108
8.3 Le tangram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
8.4 Votre Tetris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
8.4.1 La brique de base . . . . . . . . . . . . . . . . . . . . . . . 111
8.4.2 Les pièces . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
8.4.3 Le plateau . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
8.4.4 La pièce suivante . . . . . . . . . . . . . . . . . . . . . . . 113
8.4.5 Le bouton commande . . . . . . . . . . . . . . . . . . . . 113
8.4.6 Suppression d’une ligne . . . . . . . . . . . . . . . . . . . 116
3
Travaux dirigés d’ActionScript
Eric Schrafstetter TABLE DES MATIÈRES
9 PHP 141
9.1 Ming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
9.1.1 Tester un swf . . . . . . . . . . . . . . . . . . . . . . . . . 142
9.1.2 Notions de base . . . . . . . . . . . . . . . . . . . . . . . . 142
9.1.3 Dessiner . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
9.1.4 Camembert 3D online . . . . . . . . . . . . . . . . . . . . 148
9.1.5 Déplacement . . . . . . . . . . . . . . . . . . . . . . . . . 150
9.1.6 Texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
9.1.7 Morphing . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
9.1.8 Loadmovie . . . . . . . . . . . . . . . . . . . . . . . . . . 154
9.2 Echange de variables . . . . . . . . . . . . . . . . . . . . . . . . . 156
9.2.1 Exemple du poids idéal . . . . . . . . . . . . . . . . . . . 156
9.2.2 Compteur de visiteurs . . . . . . . . . . . . . . . . . . . . 157
4
Travaux dirigés d’ActionScript
Eric Schrafstetter TABLE DES MATIÈRES
10 C++ 158
10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
10.2 C++ vers Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
10.2.1 Création de l’animation Flash . . . . . . . . . . . . . . . . 158
10.2.2 Création de l’interface C++ . . . . . . . . . . . . . . . . . 159
10.2.3 Insérer l’animation . . . . . . . . . . . . . . . . . . . . . . 159
10.2.4 Le programme . . . . . . . . . . . . . . . . . . . . . . . . 160
10.2.5 SetVariable . . . . . . . . . . . . . . . . . . . . . . . . . . 162
10.3 Flash vers C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
10.3.1 Création de l’animation Flash . . . . . . . . . . . . . . . . 162
10.3.2 Création du programme C++ . . . . . . . . . . . . . . . . 163
11 Liens 164
11.1 Forums Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
11.2 Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
11.2.1 Sites Internet . . . . . . . . . . . . . . . . . . . . . . . . . 164
11.2.2 Livres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
11.3 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
11.4 Ming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
5
Travaux dirigés d’ActionScript
Chapitre 1
Outils de base
Introduction à ce document
Ces quelques pages sont, à l’origine, un aide-mémoire personnel de trucs et
astuces découverts sur le net ou par moi-même. La présentation des animations
se fait sous forme de travaux dirigés, c’est-à-dire que vous ne pourrez voir le
résultat que si vous faites les manipulations vous-même ! Téléchargez les .fla
sur le site de ce document et n’hésitez pas à m’encourager ou à me donner des
idées en envoyant un mail à schraf@univ-angers.fr.
Je suppose que le lecteur a d’assez bonnes notions d’ActionScript et de
mathématiques, dans le cas contraire certaines explications vous paraı̂tront cer-
tainement obscures. . . Ce document est une version 1.4 revue, corrigée et aug-
mentée, n’hésitez pas à me communiquer vos remarques et suggestions pour une
version 1.5 !
A titre indicatif, ce document a été créé en LATEXet exporté au format PDF
grâce à dvipdfm.
6
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
<HTML>
<head>
<script>
<!--
function ouvre(chemin){
7
Travaux dirigés d’ActionScript
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);
}
//-->
</script>
</head>
<BODY>
<a href="javascript:ouvre(’essai.html’);">
<B>Lancer l’animation</B>
</a>
</BODY>
</HTML>
Pensez à ajouter un bouton dans votre animation permettant de fermer
l’animation ! (voir paragraphe précédent).
1.5 Chargement
1.5.1 Version élémentaire
Avant de lancer le programme proprement dit, vous voudriez être sûr que
tous les éléments nécessaires ont bien été chargés. Imaginons par exemple que
pour lancer la scène go, l’animation doit avoir chargé les données jusqu’à la
scène fin image 20. On pourra utiliser la méthode suivante :
1. Créez un petit clip qui permettra de faire patienter l’internaute
2. Sur la scène principale, mettre le clip à l’image clé 1
3. A l’image 5, insérez une image clé avec l’action :
ifFrameLoaded ("fin",20) {
gotoAndPlay ("go",1);
}
8
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
onClipEvent (enterFrame) {
chargement = unite+" || " +
Math.floor(_root.getBytesLoaded()/taille*100)+"%";
if (chargement == unite+" || 100%") {
_root.gotoAndPlay(2);
}
}
Lorsque le fichier .swf est chargé, l’animation continue à l’image 2 de la
scène principale. Dans le cas d’une scène spécialement réservée au char-
gement, ne rien mettre après l’image 1 de sorte que l’animation passera
directement à la scène 2.
9
Travaux dirigés d’ActionScript
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(); à la première image de la scène principale.
5. Placez une grosse image (plusieurs Ko) à l’image clé 2 de la scène principale
et une action stop();
6. Lancez l’animation. L’image devrait apparaı̂tre rapidement. Faites alors
Déboguer - 14,4 puis Affichage- Afficher le train de lecture. Vous devriez
maintenant voir la barre grandir.
10
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
1.5.5 Version 2
Au lieu de charger le .swf à l’intérieur d’un clip (voir exemple précédent),
vous pouvez le charger à un certain niveau par la commande
loadMovieNum("nom.swf",numero);.
1. Reprendre l’animation pieces.swf précédente.
2. Ouvrir une nouvelle animation et mettre un stop(); à l’instant 1.
3. Créez un bouton quelconque et placez une occurrence sur la scène princi-
pale, 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 à l’image clé 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;
}
}
11
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
1.6 Couleurs
1.6.1 Définir
Considérons 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éatoires
Voici une méthode pour attribuer une couleur rgb (Red - Green - Blue)
aléatoire à 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);
12
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
Avec Publisher
13
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
16. Recommencez depuis le début avec les différents jeux qui vous intéressent.
17. Enfin, faites Nuancier - I - Charger les couleurs par défaut 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égradés, afficher la fenêtre Remplir par Fenêtre - Pan-
neau - Remplir
20. Créez un dégradé linéraire ou radial puis cliquez sur la petite disquette en
bas à droite.
Avec PowerPoint
14
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
<BODY>
Il est grand temps de changer de navigateur !
</BODY>
</HTML>
15
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
z.write(
"<html><body><embed src=" + args +
" hidden=true autostart=true loop=true></body></html>");
} else {
z.write("<html><body><bgsound src=" +
args + " loop=’infinite’></body></html>");
}
z.close();
}
}
Ainsi, lorsque l’on presse le bouton joue, la fenêtre lecteur est réécrite
grâce à Javascript, en distinguant le type de navigateur. L’action stop
efface la fenêtre lecteur et le son s’arrête. Attention, si vous compilez à
nouveau votre animation Flash, le programme ci-dessus sera écrasé ! Enfin,
une dernière remarque, si vous voulez convertir un fichier MIDI en MP3,
vous pouvez utilisez Wingroove (shareware).
1.8 Cookies
Nous allons créer une animation qui demande un nom puis l’enregistre dans
un cookie lorsque l’on clique sur un bouton.
1. Créez une animation vide et enregistrez-la sous le nom cookie.fla
2. Créez une zone de texte de saisie et nommez-là nom.
3. Placez l’action suivante à l’image 1 :
getURL ("javascript:getCookie();");
4. Créez un bouton quelconque et placez-le à côté de la zone de texte. Donnez
l’action suivante au bouton :
on (release) {
getURL("javascript:setCookie();");
}
Les fonctions getCookie() et setCookie() étant définies dans la page
HTML (voir ci-dessous).
5. Publiez votre animation et éditez le fichier source. Placez les fonctions
ci-dessous dans la tête du document HTML.
<html>
<head>
<title>Les cookies avec Flash</title>
</head>
<SCRIPT LANGUAGE=JavaScript>
<!--
function setCookie(){
16
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
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’]
}
}
//-->
</SCRIPT>
<body>
17
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
<object id="animation"
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://active.macromedia.com/flash2/..."
width="100%"
height="100%">
<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/...">
</embed>
</object>
</body>
</html>
1.9 Boutons
1.9.1 Bouton On/Off/Clignotant
1. Créez un clip avec 3 images clé nommées 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érez une image clé vide à l’instant 10 (ou moins pour un clignotement
plus rapide)
5. Insérez une nouvelle couche nommée Action et placez à l’image 1 et 2
l’action stop();
6. Insérez une image clé en 10 avec l’action
gotoAndPlay(3)
18
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
Sur la scène 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");
4. Placer une occurrence du clip sur la scène principale et lui affecter l’action :
onClipEvent (load) {
startDrag (this, true);
}
Ainsi, lorsque l’animation démarre, le clip devient glissable et suit les
mouvements de la souris. La variable press permet de savoir si le bouton
est pressé (1) ou non (0).
5. Sur la scène principale, dessinez une zone de texte dynamique et affectez-
lui le nom de variable x
6. Créez un nouveau clip vide nommé controles. Placez une occurrence sur
la scène principale avec l’action :
onClipEvent (enterFrame) {
if (_root.press==1) {
_root.x++;
19
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
}
}
20
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 1. OUTILS DE BASE
1.10 Information
1.10.1 Scroll sur texte
Voici un premier moyen de créer un scroll sur un texte :
1. Créez un bouton bouton avec une petite flèche dirigée vers le haut comme
apparence
2. Créez 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érez une occurrence de bouton (qui servira à faire défiler le texte vers
le haut)
4. Insérez une seconde occurrence de bouton en utilisant l’outil de transfor-
mation pour faire pivoter l’image de 180◦ et avoir la flèche dirigée vers le
bas.
5. Créez une couche action sur la scène principale et mettre en 1 une image
clé 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 écrivez votre texte d’aide dans la variable TexteAide avec le symbole
# lorsque vous voulez retourner à la ligne. La première fonction convertit
le texte en tableau et la seconde fonction joint tous les éléments avec le
séparateur chr(13) qui est le code du retour chariot.
6. Associez au bouton à la flèche vers le haut l’action :
on (press) {
if (TexteEcran.scroll > 1) {
TexteEcran.scroll--;
}
}
7. Pour le bouton à la flèche vers le bas :
on (press) {
if (TexteEcran.scroll < TexteEcran.maxscroll) {
TexteEcran.scroll++;
}
}
21
Travaux dirigés d’ActionScript
Chapitre 2
La vidéo
22
Eric Schrafstetter CHAPITRE 2. LA VIDÉO
Commande Description
ALIGN Aligne la console (RIGHT, LEFT, TOP, BOTTOM)
BORDER Largeur de la bordure (en pixels)
WIDTH Largeur de la vidéo (en pixels)
HEIGHT Hauteur de la vidéo (en pixels)
SRC Adresse de la vidéo
LOOP Nombre de fois où la vidéo est jouée (-1 = infini)
AUTOSTART, AUTOLOAD,CONTROLS
2.1.3 QuickTime
Commandes propres à QuickTime (true par défaut) :
23
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 2. LA VIDÉO
24
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 2. LA VIDÉO
25
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 2. LA VIDÉO
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és
sont gratuits (sauf Poser ! !)) :
1. Téléchargez l’excellent logiciel de visualisation www.irfanview.com.
2. Téléchargez et installez ras2vec (voir paragraphe sur le passage du bitmap
au vectoriel)
3. Installez AVIDecomposer
4. Créez une animation avec Poser
5. Choisir un affichage Silhouette CTRL+1, mettre fond du décors en blanc et
personnage en noir
6. Exportez au format .avi par Animation - Make Movie (Désolez, je n’ai
qu’une version d’évaluation en Anglais) avec Quality = Current Display
Settings. Faites OK puis choisir Trames non compressées.
7. Lancez AVIDecomposer puis File Name - Browse et choisir le fichier AVI
créé. Décomposez la vidéo.
8. Lancez IrfanView et File-Batch Conversion (ou tapez la lettre B)
9. Sélectionnez 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émarrer la conver-
sion des jpg en bmp noirs et blancs
12. Ouvrez une fenêtre DOS dans le répertoire des fichiers BMP et tapez la
commande :
ras2vec -d -m *.bmp
Vous avez maintenant des fichiers .emf
13. Lancez Flash et importez la première image image1.emf, Flash vous pro-
pose d’importer les autres. Répondre oui.
14. Eventuellement séparez les dessins par CTRL+B et optimisez les lignes par
CTRL+MAJ+ALT+C
26
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 2. LA VIDÉO
La technique Les fichiers SMIL sont des fichiers textes. De simples éditeurs
de textes sont suffisants pour faire du SMIL. En tant qu’extension de XML, elle
utilise les mêmes règles syntaxiques. Une page SMIL est composée de 2 éléments
principaux :
1. Une entête qui définira toutes les régions nécessaires a l’affichage des
éléments.
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éo).
L’adresse sur le site officielle real.com m’échappe 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éléchargé à l’anti-virus ! Ce freeware permet également 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
27
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 2. LA VIDÉO
28
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 2. LA VIDÉO
2.7 Streaming
2.7.1 Avec Real Player
Le streaming vidéo permet de commencer à voir une vidéo dès le début de
son chargement, ce qui évite les temps d’attente. En effet, au lieu de charger
l’ensemble de la vidéo pour qu’elle puisse être regardée, le streaming permet de
voir les premières images dès le départ, en même temps que le film est chargé.
Pendant que vous regardez le début de cette vidéo 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ù 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 ://mon-
site.com/monfichier.ram)
A HREF="lance.ram">Voir la vidéo...</A>
29
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 2. LA VIDÉO
7. Ou encore en tant que vidéo intégrée sur la page web avec le code :
<object classid="clsid:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA"
data="monfichier.ram" width="200" height="200" NOJAVA="true">
<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" >
</embed>
</object>
2.8 Questions/Réponses
2.8.1 Son QuickTime
Flash sait importer des vidéos .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 à me connaitre non ?) :
1. Téléchargez sur www.radgametools.com le freeware RAD Video Tools
30
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 2. LA VIDÉO
31
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 2. LA VIDÉO
32
Travaux dirigés d’ActionScript
Chapitre 3
Maths
3.2 3D
3.2.1 Matrices de rotation
La rotation d’un angle φ autour de l’axe z (voir figure 3.1) peut être décrite
par la matrice Rφ suivante :
33
Eric Schrafstetter CHAPITRE 3. MATHS
cos φ 0 − sin φ
Rφ = 0 1 0
− sin φ 0 cos φ
et la matrice Rθ d’un angle θ autour de l’axe y (voir figure 3.1) :
cos θ − sin θ 0
Rθ = − sin θ cos θ 0
0 0 1
Plus généralement, la transformation M (a, b, c) → Rφ Rθ (M ) s’écrit :
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);
}
}
34
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
35
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
m OA2 + OC 2
= −1
n OA × CB
OC
α= p
OA((γ + 1)CB − 1)
36
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
Z
R
φ
R
θ
Y
O
A
m
n
h
β
C B
γ=2
A A’
m _xscale
n α = 77,46
C B C’ B’
m=n m = 2n
37
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
n = CB cos β
m = AC − n
OA
AC =
cos β
donc
m OA
= −1
n CB cos2 β
D’autre part
h OC
sin β = =√
CB OA2 + OC 2
et
cos2 β = 1 − sin2 β
Il suffit de remplacer cos2 β par son écriture suivant les termes OC, CB
et OA.
2. En substituant OA à αOA, et CB à αCB dans la première équation on
obtient :
α2 OA2 + OC 2
−1=γ
α2 OA × CB
On isole ensuite le α.
√
CB 3
3. On a OA = 2 et OC = h = CB 2 , d’où :
2
3CB 2
α2 CB
4 + 4
α2 CB 2
−1=γ
2
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ù : ¯ ¯
1 ¯¯ xB − xA xC − xA ¯¯
S= ¯
2 yB − yA yC − yA ¯
On a bien le résultat annoncé.
– La surface d’un rectangle est la base par la hauteur sur 2.
38
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
– On compare les pentes des droites (AB) et (AC), c’est-à-dire les nombres
(yB −yA ) (yC −yA )
(xB −xA ) et (xC −xA ) .
– L’ordonnée
√
du barycentre G est égal au
√
tiers de la hauteur, soit yG =
3AC 3AC
Le centre ayant pour ordonnée , la différence donne bien
√ 6 4
3AC
12 .
Une fois que l’on a transformé le triangle équilatéral dans un rapport m/n, on
place par rotation le grand côté (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 à la pratique !
Application fondamentale :
1. Créez un clip nommé equi avec le dessin d’un triangle équilatéral dans le
sens 4.
2. Utilisez la fenêtre info pour lui donner
√
les dimensions L = 100 et H = 86, 6
(qui correspond à la hauteur 1002 3 )
3. Mettre le barycentre du triangle exactement sur la croix (coordonnées
centre X = 0 et Y = −14, 4)Voir figure 3.
L=100 et H=86,6
clips tri3
Départ clip equi tri2
4. Créez un clip nommé tri3 et mettre une occurrence du clip equi sur son
image 1 avec pour nom type.
5. Créez un clip nommé tri2 et mettre une occurrence du clip tri3 sur son
image 1 avec pour nom base.
6. Sur la scène 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 à un clip puis un
_xscale, vous verrez que ce dernier n’est pas appliqué horizontalement
mais suivant l’angle de la rotation !
7. Créez un bouton bt représentant un petit disque (L = H = 6 par exemple)
8. Créez un clip nommé ptA avec une occurrence du bouton bt au centre du
clip (X = Y = 0)Ajoutez l’action suivante au bouton :
39
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
on (press) {
startDrag ("", true);
}
on (release) {
stopDrag();
}
9. Mettre une occurrence du clip ptA sur la scène principale avec pour nom
A
10. De la même façon, créez deux autres clips ptB et ptC avec leurs occurrences
respectives B et C sur la scène principale.
11. Créez un clip vide et placez-en une occurrence sur la scène 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);;
}
}
40
Travaux dirigés d’ActionScript
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éplacez les points A, B et C. Si le triangle ne touche
pas exactement les trois points mobiles, assurez-vous du bon positionne-
ment des centres des clips (voir figure 3).
41
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
OG
OD
O
D
G oeil
Dans la pratique, l’écartement des yeux est GD ' 6, 3cm et la distance yeux-
écran vaut environ GOG ' 70cm. Par exemple, si vous voulez que votre point
apparaı̂sse à 25cm hors de l’écran, la distance entre les points bleu et rouge
devra être de OG OD ' 1, 66cm.
42
Travaux dirigés d’ActionScript
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();
43
Travaux dirigés d’ActionScript
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";
}
44
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
−−→ −→ → −−→0
le vecteur V A0 en fonction des vecteurs V A et −
n = V V où −
→
n est normale
(perpendiculaire) au plan T.
2. Cas particulier de la projection sur le plan Oxy. Déterminez les coor-
−−→
données du vecteur V A0 lorsque V (x0 , y0 , z0 ) avec z0 < 0, − →
n = (0, 0, −z0 )
(c’est-à-dire que l’oeil est à la distance | z0 | de l’écran) et A(xA , yA , zA )
avec zA > 0.
3. Intérieur d’un cube :
(a) Tracez sur l’écran 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’écran de l’ordinateur est carré et de côté L. Trouvez
les formules donnant les coordonnées d’un point (x, y, z) du cube sur
l’écran.
(c) Par quel facteur doit-on multiplier ces coordonnées pour que la face
arrière du cube prenne tout l’écran ? (Cas particulier : L = 400 et
R = 100)
Corrigé
1. Remarquons que le plan T est l’ensemble des points M vérifiant :
−−0−→ →
V M .−n =0
−−−→
C’est-à-dire les points tels que le vecteur V 0 M soit orthogonal à →
−
n . Par
la relation de Chasles, ceux sont donc également les points M vérifiant :
−−→ −−→ →
(V 0 V + V M ).−
n =0
soit :
−−→ →
V M .−
n = n2
où 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éel λ doit vérifier :
−→ →
λV A.−
n = n2
d’où
−−→0 n2 −→
V A = −→ V A
V A.→
−
n
−−→
2. Dans le cas particulier, les coordonnées du vecteur V A0 dans le plan Oxy
sont donc :
½ z0
−−→0 x0 + (xA − x0 ) z0 −z
VA z0
A
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 .
45
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
C D
V
B A
A-B C-D GH
F E
E-F G-H
C-G D-H
Vue de droite
B-F A-E
Vue du dessus
V
A
A’
V
V’
46
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
47
Travaux dirigés d’ActionScript
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;
}
48
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
Les coordonnées des points à l’écran sont mis dans le tableau ecran.
5. Créez un bouton représentant une flèche vers le haut et lui mettre l’action :
on (release) {
rotx(-1);
affiche();
}
6. Créez un bouton représentant une flèche vers le bas et lui mettre l’action :
on (release) {
rotx(1);
affiche();
}
7. Créez un bouton représentant une flèche vers la gauche et lui mettre l’ac-
tion :
on (release) {
roty(1);
affiche();
}
8. Créez un bouton représentant une flèche vers la droite et lui mettre l’ac-
tion :
on (release) {
roty(-1);
affiche();
}
9. Créez un second bouton représentant une flèche vers le haut et lui mettre
l’action :
on (release) {
_root.L-=5;
if (_root.L<5){
_root.L=5;
}
affiche();
}
49
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
50
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 3. MATHS
plan T
B A
T
C D
V
G H
F E
R
Vue de droite C-G D-H
R T
B-F A-E
R
Vue du dessus
V
51
Travaux dirigés d’ActionScript
Chapitre 4
Physique
4.1.1 Rappels
1. Le vecteur quantité de mouvement → −p d’un point de masse m et de vitesse
−
→ −
→ −
→
v est par définition p = m v .
2. L’énergie cinétique d’un point de masse m et de vitesse →
−
v est, toujours
par définition :
1
Ec = mv 2
2
où v est la norme du vecteur −
→
v.
3. On considère deux points matériels A1 et A2 de masses m1 et m2 . Une loi
de la physique énonce que la quantité de mouvement totale d’un système
de 2 masses ponctuelles en collision se conserve quelque soit le référentiel :
−
→ −−→
p1 + −
→
p2 = Cte
4.1.2 La théorie
52
Eric Schrafstetter CHAPITRE 4. PHYSIQUE
1. Montrez que dans le cas d’une collision directe, c’est à dire lorsque les
vecteurs vitesses avant et après le choc sont colinéaires (parallèles), alors
les vitesses v10 et v20 après le choc sont données par :
2m2 v2 + (m1 − m2 )v1
v10 =
m1 + m2
et
2m1 v1 − (m1 − m2 )v2
v20 =
m1 + m2
Réponse
Réponse
0e 0
La composante v1x est la somme des projetés de v1y et v1x sur l’axe ho-
rizontal. L’angle entre v1y et l’axe horizontal est ϕ + π2 et de ϕ pour v1x
0
.
D’où :
0e 0
v1x = v1x cos ϕ − v1y sin ϕ
puisque cos(ϕ + π2 ) = − sin ϕ. De même, on projecte les 2 vecteurs sur
l’axe vertical et on en fait la somme :
0e 0
v1y = v1x sin ϕ + v1y cos ϕ
53
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 4. PHYSIQUE
v
1x
v A ,m2
1 2
v
2y
v v
1y 2
K
v2x
A1,m1
v1x v’
2
v1
θ v’
v’ 2 v2y
2x
1x v1y
A2,m2
θ v
1 v2 2x
ϕ
v’
1
A1,m1
54
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 4. PHYSIQUE
4.1.3 Application
1. Lancez Flash et CTRL+M pour donner les dimensions 500 × 400 à la scène
et cadence 50.
2. Dessinez une boule (avec son centre sur la croix centrale). Convertissez-là
en bouton nommé boule
3. Créez un clip b1 et mettre une occurrence du bouton boule sur la croix
(les 2 croix sont alors superposées)
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ène
principale
6. De même, créez 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ène
principale
9. Ajoutez une couche pour les actions
10. A l’image 1 de la scène 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;
55
Travaux dirigés d’ActionScript
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
Il n’y a rien à dire sur le script sinon que v1x est v1x , v1px est v1x et v1xe
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;
56
Travaux dirigés d’ActionScript
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)) {
57
Travaux dirigés d’ActionScript
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ésente pas la distance de A1 à A2 mais le carré
de cette distance. Ceci évite d’utiliser la fonction racine carrée.
– Le calcul de la vitesse est obtenu en effectuant le quotient de la distance
entre la position précédente et courante de la boule sur le temps mis
pour parcourir cette distance. On met ce temps à 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é), 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ôté de l’écran, la composante normale (perpen-
diculaire) au bord change de signe. Si vous voulez ajouter des objets
(tables, raquettes...) sur la scène, faites les tests de collisions avec les
coordonnées des clips ( table._y...)
12. A l’image 3 de la couche action, ajoutez :
gotoAndPlay (2);
13. Enfin, étendre par F5 la couche contenant les objets jusqu’à l’image 3.
Chalenge concernant le fichier .fla associé à cet exercice : M’envoyer un .swf
avec les ballons qui tournent !
58
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 4. PHYSIQUE
Vous lancez un objet à l’aide de la souris, celui-ci rebondit sur les bords de
l’écran puis s’arrête après freinage.
Donnez à votre animation les dimensions 400 × 400
1. Créez un bouton rectangulaire
2. Créez un clip rect et placez le bouton rectangulaire dessus. Etendre sur
les image 1 à 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;
59
Travaux dirigés d’ActionScript
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éplacez le rectangle, la variable pause est à true
et le clip rect tourne entre les images 2 et 3, permettant d’obtenir sa vitesse de
départ. Une fois le bouton relâché, pause passe à false et les nouvelles positions
nouv sont calculées jusqu’à une vitesse inférieure à 0.5 où l’objet s’arrête.
60
Travaux dirigés d’ActionScript
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ène 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;
}
1. Créez un bouton transparent avec un petit carré sur l’image clé cliqué.
2. Créez un clip nommé 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ène principale, placez une occurrence du clip crayon et lui donner
le nom mc.
5. Créez maintenant un clip ligne comme dans la rubrique fil élastique (angle
de 45◦ vers le bas à droite, L = 100, H = 100, haut-gauche en (0, 0)) et
en placer une occurrence sur la scène principale avec pour nom trait.
6. Etendre par F5 l’image clé 1 jusqu’en 3
7. Ajoutez pour les actions et placez à l’image clé 1 l’action :
61
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 4. PHYSIQUE
_root.souris=0;
startDrag (_root.mc, true);
8. A l’image clé 2 de la couche d’action, placez :
if (souris == 1) {
if (x1 == 0) {
x1 = mc._x;
y1 = mc._y;
} else {
x0 = mc._x;
y0 = mc._y;
if ((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;
}
}
}
62
Travaux dirigés d’ActionScript
Chapitre 5
Visualisation
5.1 Powerpoint
Pour insérer un objet flash en format SWF dans PowerPoint, suivez ces
différentes étapes :
1. Se placer dans une diapositive où l’on veut insérer le fichier *.SWF
2. Cliquez sur le menu : ”Affichage” et ensuite sur le menu ”Barre d’outils”.
3. Sélectionnez ”Boı̂te à Outils Contrôles” si cette boı̂te n’est pas déjà sélectionnée.
4. Cliquez sur ”Autres contrôles” (bouton avec le marteau et la clé)
5. Sélectionner ”Shockwave Flash Object”
6. Dessinez un contrôle dans la diapositive de la taille souhaitée pour intégrer
l’objet Flash
7. Faites un clic droit sur l’objet et sélectionner ”Propriétés”
8. Pour la propriété ”Movie” tapez le chemin d’accès du fichier *.SWF (exemple :
C:\Mes documents\Nom.swf) ou son URL
9. S’assurez que la propriété ”Playing” est paramétrée sur ’True’
10. Se mettre en mode d’affichage DIAPORAMA
63
Eric Schrafstetter CHAPITRE 5. VISUALISATION
<html>
<head>
<title>Diaporama sonore</title>
</head>
<frameset rows="0,*">
<frame name="haut" scrolling="no" src="haut.htm">
<frame name="bas" scrolling="auto" marginwidth="0"
marginheight="0" src="ppt.htm">
<noframes>
<body ><p>Cette page utilise des cadres.</p>
</body>
</noframes>
</frameset>
</html>
Le fichier haut.htm contiendra l’initialisation du cookie et sera invisible
(hauteur = 0). Le fichier principal sera ppt.htm
<html>
<body>
<script>
<!--
var expdate = new Date();
expdate.setTime(expdate.getTime() + (24*60*1000*1));
document.cookie="n=0";
//-->
</script>
</body>
</html>
Ceci permet de placer un cookie ayant pour valeur n=0 sur la machine client.
La page ppt.htm contient le code :
<html>
<head>
<title>Diaporama sonore</title>
<script><!--
function home(){
64
Travaux dirigés d’ActionScript
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>
</head>
<body>
<script language="JavaScript"><!--
n=eval(document.cookie.substring(2, 10));
var expdate = new Date();
expdate.setTime(expdate.getTime()+(24*60*1000*1));
n++;
document.cookie="n="+n;
//--></script>
<script language="JavaScript">
<!--
document.write(’<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"’);
document.write(’WIDTH=200 HEIGHT=5>’);
document.write(’<PARAM NAME=movie VALUE="image’+n+’.swf">’);
document.write(’<EMBED src="image’+n+’.swf"’);
document.write(’WIDTH="200" HEIGHT="5" ’);
document.write(’TYPE="application/x-shockwave-flash"></EMBED>’);
document.write(’</OBJECT>’);
65
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
//-->
</script>
<td>
<input type="button" name="prec" value="<" onclick="javascript:precedent();">
<input type="button" name="prec" value=">" onclick="javascript:suivant();">
</td></tr>
<tr><td colspan="3">
<script language="JavaScript">
<!--
document.write("<img src=’image"+n+".jpg’>");
//-->
</script>
</td></tr>
</table></div>
<script language="JavaScript">
<!--
document.write(n);
//-->
</script>
</form>
</body></html>
– Le script de la partie <head> est composé de 3 fonctions permettant
d’avancer, de reculer et de retourner à la première diapo. Le numéro de
l’image courante étant dans la variable n placée dans un cookie.
– Le premier script de la partie <body>
récupère la variable n, l’augmente de 1 et remplace le cookie existant.
– Le second script place l’animation Flash nommée image1.swf (son associé
à l’image 1) ou image2.swf ...
– Le troisième script place l’image elle-même
– Le dernier script ajoute le numéro de l’image courante
– Les actions onclick permettent de gérer les boutons Home, suivant et
précédent
– La fonction location.href=location recharge la page
66
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
67
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
5.3 Visionneuse
Nous allons créer une visionneuse d’images avec un effet de transition gauche
→ droite ou droite → gauche (Voir le .swf joint).
68
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
Fig. 5.4 – L’image de gauche est sous le rectangle bleu servant de masque
69
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
gotoAndPlay ("avance");
}
On mémorise dans la variable vieux l’ancien numéro et courant augmente
de 1. Si courant dépasse le nombre total de photos, on boucle en remettant
courant à 1. L’effet de transition s’effectuera à l’étiquette avance
12. De même, ajoutez l’action suivante au bouton de gauche :
on (press) {
vieux = courant;
courant--;
if (courant<1) {
courant = nbtotal;
}
gotoAndPlay ("recule");
}
70
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
71
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
72
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
3. Ouvrez la bibliothèque par CTRL+L et bouton droit sur le clip choix puis
Définir les paramètres du clip
4. Ajoutez le paramètre nom et mettre 1 comme valeur par défaut.
5. Revenir sur la scène principale de l’animation et placez sur la couche
boutons à l’image clé 2 trois occurrences du clip choix. Faites bouton
droit - Panneaux - Paramètres du clip sur chacun des clips et mettre la
valeur de nom à 1,2 puis 3.
6. Nommez choix1 le clip de paramètre 1, choix2 le clip de paramètre 2 et
choix3 le dernier.
7. Sur la couche actions image clé 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 à la diapo nq+1. Puis on colorie les
boutons suivant les réponses précédemment choisies (test i==rep[nq]). Si
le test est en phase de correction (test corrige == 1), alors on met en
blanc la bonne réponse.
8. Donnez le nom choix à l’image clé 2 (Fenêtre - Panneaux - Image)
Image clé 3
73
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
5.5 Camembert
Nous voulons représenter, sous forme de camembert, les données suivantes :
Valeurs Catégories
20 crayons bleus
5 crayons verts
50 crayons roses
37 crayons turquoises
10 crayons violets
74
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
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âce à la commande this.loadVariables.
– La commande split permet de convertir les chaı̂nes de caractères en ta-
bleau en utilisant le séparateur ,. Utilisez la fonction trace (aVal[i]);
après 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éciser la base utilisée.
4. Créez un clip pie ayant sur sa première image un quartier de 3, 6◦ (Voir
figure 5.6)Bien placer la pointe sur la croix +
5. Créez une image clé en 2 et donnez-lui le nom dessin. Effacer l’occurrence
du clip controle sur cette image.
6. Placez une occurrence de pie à l’image dessin et lui donner le nom
quartier
75
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
7. Créez 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 à l’image dessin de la scène princi-
pale et lui donner le nom label.
9. Créez un clip symbole avec en image un le dessin d’un petit carré coloré.
Utilisez le panneau info pour placer le centre du carré sur la croix (Ainsi,
les carrés et les noms des labels seront bien alignés)
10. Placez n’importe où une occurrence du clip symbole à l’image dessinde
la scène principale et lui donner le nom carre et les dimensions L = 10
et H = 10
11. Placez sur le calque 1 à l’image dessin l’action :
nElements = aCoul.length;
aPourc = new Array(nElements);
Prof = 1;
// Calcule le total
for (i=0; i<nElements; i++) {
nTotal += aVal[i];
}
// Calcule les pourcentages
for (i=0; i<nElements; i++) {
aPourc[i] = math.round((aVal[i]/nTotal)*100);
trace (aPourc[i]);
nPourc += aPourc[i];
if (i<nElements-1) {
Reste += aPourc[i];
}
}
// On ajuste si erreur d’arrondi
if (nPourc != 100) {
aPourc[nElements-1] = 100-Reste;
}
Somme = 0;
for (i=0; i<nElements; i++) {
// On duplique et colore le petit carr
carre.duplicateMovieClip("carre"+i, Prof++);
// Positions des carres
_root["carre"+i]._x = 130;
_root["carre"+i]._y = i*20+50;
tempColor = new Color(eval("carre"+i));
tempColor.setRGB(aCoul[i]);
// On ajoute la catgorie
label.duplicateMovieClip("label"+i, Prof++);
// Positions des labels
76
Travaux dirigés d’ActionScript
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<aPourc[i]; j++) {
quartier.duplicateMovieClip("quartier"+i*nElements+j, Prof++);
// Position du centre du camembert
_root["quartier"+i*nElements+j]._x = 50;
_root["quartier"+i*nElements+j]._y = 80;
// Rotation de la portion
_root["quartier"+i*nElements+j]._rotation = Somme-3.6;
Somme -= 3.6;
// La couleur de la portion est dans le tableau aCoul
tempColor = new Color(eval("quartier"+i*nElements+j));
tempColor.setRGB(aCoul[i]);
}
}
stop();
77
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
78
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
79
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
80
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
81
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 5. VISUALISATION
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 égale à 18+2=20.
1. Créez un nouveau clip ayant pour nom objet
2. Importez la première image par Fichier - Importer. Faites de même avec les
autres images en vous plaçant aux images clées 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érie ! Veillez à ce que les images 19 et 20
soient celles du dessus et du dessous.
3. Ajoutez l’action stop(); à la première image du clip objet
4. Revenez sur la scène principale et insérez une nouvelle couche SOUS celle
contenant la main (sinon la souris sera cachée 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ène 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ême, au second bouton ajoutez l’action :
on (release) {
_root.objet.gotoAndStop(_root.nbimages-1);
}
82
Travaux dirigés d’ActionScript
Chapitre 6
Outils de conversions
83
Eric Schrafstetter CHAPITRE 6. OUTILS DE CONVERSIONS
TD - ActionScript
nom.bmp
ras2vec -d -m nom.bmp
ras2vec -m nom.bmp
84
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 6. OUTILS DE CONVERSIONS
6.3.1 Introduction
1. Permet de sélectionner toutes les images d’un répertoire en une fois
2. Possibilité de réarranger les images, de les supprimer...
3. Deux sorties possibles :
– Diaporama autonome avec boutons suivant et précédent
– Format LoadMovie utilisable directement dans une autre animation
Flash
4. Choix de la taille de l’animation, de sa fréquence 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 avan-
tage par rapport à une manipulation sous Flash
ATTENTION ! Ce programme plantera si vous utilisez des JPG à com-
pression progressive. Il fonctionne parfaitement avec des JPG à compression
standard en 16 millions de couleurs.
85
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 6. OUTILS DE CONVERSIONS
86
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 6. OUTILS DE CONVERSIONS
La barre de dessin des logiciels Word, Excel ou PowerPoint peut vous être
d’une grande utilité si vous ne possédez pas de logiciel de dessin vectoriel
(Comme Freehand ou CorelDraw)Voici un exemple très simple d’animation 3D
1. Lancez Word et affichez la barre de dessin
2. Dessinez un cube en commençant par un rectangle puis effet 3D
3. Copiez l’image et allez sous Flash. Faites Edition - Collage Spécial puis
choisir Image (métafichier)Le cube apparaı̂t (en vectoriel) à l’écran. Insérez
une image clée vide en 2.
4. Revenir sous Word et afficher la barre de paramètres 3D. Faites tourner
légèrement votre cube et retournez à l’étape précédente !
Cette manipulation fonctionne également pour les graphiques générés par
Excel, les formules mathématiques de l’éditeur d’équations et bien sûr les cliparts
qui peuvent directement être importés sous Flash.
87
Travaux dirigés d’ActionScript
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éé avec toutes les images.
13. Lancez Flash et allez dans Modification - Animation ( CTRL+M)Si votre
écran est par exemple en 800×600 mettre ces valeurs en largeur et hauteur
(Choisir Unités de la règle = Pixels).
14. Mettre une couleur de fond à votre animation
15. Très important ! Faites CTRL+2 ou Affichage - Zoom - Afficher une image
pour bien cadrer votre animation au milieu de l’écran.
16. Placez-vous à l’image 1 de votre animation et Fichier-Importer
17. Recherchez la première diapositive au format .wmf et importez. Flash vous
propose d’importer les autres, répondre oui.
18. Normalement vos diapos PPT doivent être parfaitement centrées dans
l’animation Flash
19. Remarquez aussi que tout est en vectoriel, les organigrammes, les ClipArts,
que les textes peuvent être changés en cliquant 2 fois dessus et que les
éléments des graphiques peuvent également être recoloriés en cliquant 2
fois dessus.
20. Insérez maintenant un nouveau calque sous le calque contenant les diapos
(voir figure 6.3).
21. Créez un clip vide et mettre une occurrence de celui-ci sur la première
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;
}
88
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 6. OUTILS DE CONVERSIONS
L’idée du script est simple : si l’on tape sur la barre d’espace ou flèche
de droite ou bas ou page suivante, on avancera dans le diaporama par
l’action gotoAndStop. Idem avec les flèches gauche, haut et page précédent
pour revenir à la diapo précédente. J’ai rajouté une action sur la touche
Home qui revient sur la première diapo. Si vous ne voyez pas à quoi sert
la variable libre, supprimez-là ! Simplement, cela évite que le diaporama
défile à toute vitesse si vous vous endormez en visionnant votre diaporama !
La variable libre passe à false si la touche est pressée et bloque le
défilement. Elle revient à true lorsque la touche est relâchée ( keyUp).
22. Utilisez la touche F5 pour étendre l’image clé 1 du second calque jusqu’à
la dernière diapo.
23. Enfin, sur la première image clé du second calque, ajoutez l’action :
fscommand ("fullscreen", "true");
stop();
De sorte que l’animation prendra tout l’écran comme un vrai diaporama
PowerPoint.
24. Compilez, lancez et naviguez avec les flèches du clavier et la barre d’espace.
25. Pour les plus forts qui se demandent comment on peut ajouter un peu
d’animation à tout cela, voilà une idée :
(a) Sélectionnez un ou plusieurs éléments à animer (texte, ClipArt...)
(b) Faites F8 pour le transformer en symbole, par exemple clip_txt
(c) Puis bouton droit - Modifier en place et à 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(); à la fin de cette anima-
tion pour éviter de boucler.
26. Pour des fonds en dégradé, je vous déconseille fortement de l’importer
de PowerPoint (essayez pour comprendre !)Ajoutez plutôt sous Flash un
troisième calque avec un grand rectangle couvrant toute la surface et uti-
lisez le pot de peinture.
89
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 6. OUTILS DE CONVERSIONS
3. Recherche de texte
4. Boutons de navigation précédent-suivant.
Je signale ici qu’il est possible de créer des fichiers PDF gratuitement de diffé/-
rentes façons :
1. HTMLDoc qui convertit du HTML en PDF de façon remarquable (mon
préféré)
2. Installer une imprimante PostScript virtuelle et GhostView (voir explica-
tion 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 à nos moutons ! Le tandem PowerPoint - Flash peut parfois être une
alternative au PDF. Outre évidemment la possibilité d’ajouter des animations,
Flash permet de définir l’impression de pages spécifiques. Voici un exemple :
1. Lancez PowerPoint et Fichier-Mise en Page. Choisir Diapositives dimen-
sionnées pour format A4.
2. Créez 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étafichier windows (wmf)
4. Les différents fichiers wmf sont créés. Lancez Flash et Modification-Animation,
choisir Unités en centimètres et taille = 21 × 29, 7 cm
5. Faites CTRL+2 pour centrer l’image sur la scène.
6. Importez la première diapo et cliquez sur oui pour insérer toute la série.
7. Cliquez sur une image à imprimer et choisissez Fenêtre - Panneaux - Image
( CTRL+F)Mettre Etiquette = #p
8. Faites la même chose avec d’autres diapos (pas toutes pour voir l’intérêt
de la manipulation).
9. Créez un nouveau clip nommé commandes. Dans ce clip, placez un bouton
représentant une flèche vers la gauche, un autre bouton avec une flèche
vers la droite, un dernier représentant une imprimante et ajoutez un fond
représentant une fenêtre (voir figure 9).
10. Au bouton avec la flèche vers la gauche ajoutez l’action :
on (release) {
_root.gotoAndStop(_root._currentframe-1);
}
90
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 6. OUTILS DE CONVERSIONS
91
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 6. OUTILS DE CONVERSIONS
Barre de navigation
92
Travaux dirigés d’ActionScript
Chapitre 7
SmartClips
7.1 Variateur
Nous cherchons à construire un variateur ressemblant à la figure 7.1.
-50
label
10 0
50
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éez un clip compteur contenant une occurrence
du clip curseurLorsque l’utilisateur pressera le bouton caché dans le clip
curseur, le clip compteur bouclera entre les images 2 et 3, permettant de
récupérer la hauteur actuelle du triangle.
6. Créez un clip compteur avec 3 couches : une pour les actions, une où vous
mettrez une occurrence du clip curseur (avec son centre en (0,0)) en lui
donnant le nom base et une où 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’à
l’image 3 du clip compteur.
9. A la première image clé du clip, mettre l’action stop();
10. Mettre l’action suivante à l’image 2 du même clip :
temp=min+(100-base._y)*(max-min)/100;
label=Math.round (100*temp)/100;
11. Mettre l’action gotoAndPlay (2); à l’image 3.
12. Ouvrez la bibliothèque puis faites Bouton droit - Définir les paramètres
du clip sur compteur.
Nom Valeur Type :
nom c1 Default
min -1 Default
max 1 Default
13. Retournez sur la scène principale et mettre une occurrence de compteurFaire
Bouton droit - Panneaux - Paramètres du clip et saisir :
Nom Valeur Type :
nom x Default
min -4 Default
max 1 Default
14. Lancez l’animation et déplacez le curseur, la valeur change entre min et
max.
94
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 7. SMARTCLIPS
Titre
Le contenu de la fenêtre
sera ici !
OK
95
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 7. SMARTCLIPS
stopDrag ();
}
8. Ouvrez la bibliothèque et faites Bouton droit sur Message puis Définir les
paramètres du clip. Cliquez sur le signe + trois fois de sorte que :
Nom Valeur Type :
nom fenetre Default
titre Bienvenue Default
contenu Tapez votre texte ici Default
9. Revenez à la scène principale et placez une occurrence du clip (SmartClip
maintenant !) messageUn petit cercle apparaı̂t (encore une fois, parce que
l’image clé 1 du clip est vide)Sur l’occurrence, faites Bouton droit - Pan-
neaux - Paramètres du clip. Mettre :
Nom Valeur
nom fen1
titre Mon titre
contenu Je tape mon texte ici
10. Créez un bouton quelconque et placez-en une occurrence sur la scène prin-
cipale avec l’action :
on (release) {
_root.fen1.gotoAndPlay("on");
}
96
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 7. SMARTCLIPS
8. Lancez l’animation et cliquez sur le bouton radio homme puis sur le bou-
ton, la variable choix doit être égale à true. Cliquez maintenant sur le
bouton radio femme puis le bouton, choix passe à false.
9. Inversement, l’action :
on (release) {
choix=_root.homme.setState(true);
}
permet de sélectionner le bouton homme.
97
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 7. SMARTCLIPS
98
Travaux dirigés d’ActionScript
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ètre mois du SmartClip au bon
format.
– La fonction attachMovie permet de dupliquer un élément de la bi-
bliothèque comportant une liaison. Il faut également préciser le niveau
de chargement en troisième paramètre.
– La première 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éro du jour (récupéré par la fonction getDate). Bien sûr, 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ès bien des dates du type
Date(2001,7,45) ou Date(2001,7,-5) ! Cela évite 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 à 7
– Pour corser, on décide de mettre un effet alpha sur les dates qui ne sont
pas dans le mois (fin du mois précédent et début du mois suivant). Pour
cela, la variable aff est à faux au début (nous ne sommes pas dans le
mois), on attend d’entrer dans le mois (test jour == 1), la variable aff
passe alors à vrai et les dates sont affichées normalement. Le mois sera
terminé quand la date repassera à 1 mais que jour sera différent de 1.
5. Ouvrez à nouveau la bibliothèque et bouton droit sur calend puis ’Définir
les paramètres du clip’. Utilisez le bouton + pour définir les paramètres
suivants :
Nom Valeur
cote 20
annee 2001
mois 7
99
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 7. SMARTCLIPS
Pour terminer, si vous désirez briller dans une soirée (ou vous faire jeter !),
lisez donc ma page consacrée à 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.
100
Travaux dirigés d’ActionScript
Chapitre 8
Jeux
8.1 Le morpion
Règles du jeu
Le jeu se compose d’un plateau à 9 cases. Chaque case peut être allumée
(visible) ou éteinte (invisible)La position de départ est choisie au hasard, par
exemple :
◦ ◦ ◦
◦
◦
◦ ◦ ◦
◦ ◦
◦ ◦ ◦
Les manipulations
– Cliquer sur un coin inverse les 4 cases contiguës à ce coin. Inverser si-
gnifiant que si une case est allumée, elle s’éteint et inversement.
– Cliquer sur le milieu d’un côté inverse les 3 cases de ce côté.
– Cliquer sur la case centrale inverse les 5 cases suivant une croix +.
Création du jeu
1. Créez un bouton bt avec le dessin d’une boule sur Haut, Dessus, Abaissé
et Cliqué
2. Créez un clip b et placez une occurrence du bouton bt à l’image 1Associez
à 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ère ligne va permettre de
savoir quelle case a été choisie. Pour cela, on récupère le nom de l’occur-
rence (this._name) qui est de la forme bi avec i entre 1 et 9Ensuite, la
fonction .charAt(1) permet d’atteindre le second caractère (le premier a
pour position 0), soit "1" ou "2" etc. Le numéro (entre 1 et 9) s’obtient
par Number.
La seconde ligne utilise la fonction ou exclusif (XOR) notée ^ en ActionS-
cript. La table de vérité de cette fonction logique est :
a b a∧b
0 0 0
0 1 1
1 0 1
1 1 0
102
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
b1 ◦ b2 ◦ b3 ◦
b4 ◦ b5 ◦ b6 ◦
b7 ◦ b8 ◦ b9 ◦
En utilisant les règles décrites plus tôt, cliquer sur la case 1 revient à
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éactualiser l’affichage à chaque coup
du joueur.
103
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
104
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
105
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
Math.floor(2*Math.random())
Si vous voulez utiliser des probabilités non uniformes (par exemple, la
boule sera rouge dans 60% des cas), utilisez plutôt la formule :
1*(Math.random()<0.6)
Le test Math.random()<0.6 renvoie Vrai dans 60% des cas qui, multiplié
par 1, donne 0 ou 1.
4. Comment mémoriser les cases ? On utilise un tableau nommé lignes.
Remarquez que l’hexagone a 2nb-1 lignes et que la longueur des lignes
augmente de nb à 2nb-1 puis rediminue jusqu’à nb. Montrez que la lon-
gueur de la ligne i ( i entre 0 et 2nb-2) est nb+i si i<nb et 3nb-2-i sinon.
On obtient finalement l’initialisation suivante :
lignes = new Array();
for (i=0; i<2*nb-1; i++) {
longueur = (i<nb) ? nb+i : 3*nb-2-i;
lignes[i] = new Array();
for (j=0; j<longueur; j++) {
lignes[i][j] = Math.floor(2*Math.random());
}
}
Il faut bien voir que les cases les plus à gauche (formant un <) corres-
pondent à lignes[i][0] pour i de 0 à 2nb-2
5. Comment calculer les valeurs des cases ? La valeur dépend de 7 cases.
Remarquez que même si lignes[-1][-1] n’a pas de sens, Flash ne plante
pas et peut être utilisé dans les calculs. Le test est inversé entre les cases
du haut de l’hexagone et celles du bas. La ligne centrale ( i=nb-1 est à
traiter à part). On obtient facilement le code :
change = (i<nb) ? 1 : -1;
n = lignes[i][j-1]+lignes[i][j]+lignes[i][j+1]+
lignes[i-1][j]+lignes[i+1][j];
if (i == nb-1) {
n += lignes[i-1][j-1]+lignes[i+1][j-1];
} else
n += lignes[i-1][j-change]+lignes[i+1][j+change];
}
106
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
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);
}
}
107
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
trouve = 0;
prof = 1;
for (i=0; i<2*nb-1; i++) {
longueur = (i<nb) ? nb+i : 3*nb-2-i;
for (j=0; j<longueur; j++) {
duplicateMovieClip (pion, "pion"+i+"_"+j, prof);
prof++;
this["pion"+i+"_"+j]._x = 150+j*d-(longueur-nb)*d/2;
this["pion"+i+"_"+j]._y = 50+i*d*Math.sqrt(3)/2;
this["pion"+i+"_"+j].i = i;
this["pion"+i+"_"+j].j = j;
change = (i<nb) ? 1 : -1;
n = lignes[i][j-1]+lignes[i][j]+lignes[i][j+1]
+lignes[i-1][j]+lignes[i+1][j];
if (i == nb-1) {
n += lignes[i-1][j-1]+lignes[i+1][j-1];
} else {
n += lignes[i-1][j-change]+lignes[i+1][j+change];
}
this["pion"+i+"_"+j].valeur = n;
}
}
stop ();
Quelques commentaires sur le script :
– La variable total contient le nombre total de boules rouges à trouver
– La variable trouve contient le nombre de boules effectivement trouvées
par le joueur √
– La hauteur entre 2 lignes de l’hexagone est h = d 23 où d est le diamètre
de la boule.
– On ajoute 3 propriétés aux clips pioni_j, à savoir leurs coordonnées i, j
ainsi que la valeur valeur
– La variable n contient le nombre de boules rouges autour du clip courant
pioni_j. Cette valeur sera mise dans valeur.
Placez sur la scène principale une occurrence du clip pion.
108
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
3. Mettre une zone de texte de saisie avec pour nom nb, l’utilisateur pourra
ainsi préciser le niveau de jeu.
4. A l’image 2 de la scène principale, mettre une occurrence du clip plateau
avec pour nom plateau.
5. Toujours à l’image 2, mettre une action stop()
6. A l’image clé 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ère image par
l’action :
on (release) {
gotoAndPlay (1);
}
8.3 Le tangram
Il s’agit de recréer le jeu classique du tangram .
109
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
on (keyPress "<space>") {
this[_root.cible]._rotation += 45;
}
on (keyPress "<backspace>") {
this[_root.cible]._rotation -= 45;
}
on (keyPress "<right>") {
this[_root.cible]._x ++;
}
on (keyPress "<left>") {
this[_root.cible]._x --;
}
on (keyPress "<up>") {
this[_root.cible]._y --;
110
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
}
on (keyPress "<down>") {
this[_root.cible]._y ++;
}
Explication Lorsque l’on clique sur une pièce, la variable cible récupère
son nom (”instance8” par exemple). Si maintenant nous appuyons sur la
touche <espace> ( <space> ), l’objet cible va tourner de 45◦ à droite. Idem
avec la touche . Les flèches du clavier permettent de déplacer la pièce dans
les 4 directions.
11. Mettre sur la scène principale 5 occurrences du clip c_triangle et 1 oc-
currence du clip c_losange .
12. Les 2 petits triangles s’obtiennent par réduction de 50% des √
grands tri-
2
angles et le triangle moyen par une réduction de 70,7% (= 2 )
13. A la première image clée de la scène principale, ajoutez l’action :
cible="";
stop ();
Ainsi, la variable cible étant vide, les touches <space> , <up> .. seront
inopérantes.
14. Attention, la touche <backspace> (rappel arrière) ne fonctionnera pas en
mode ”Tester l’animation”. Il faut publier par F12 .
111
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
L’apparence même des différentes pièces sera sauvegardée dans des variables
I, T , L, D, J, S1 et S2. L’ensemble des pièces sera enregistré dans un tableau
pole.
8.4.3 Le plateau
Nous allons bien sûr nous utiliser le clip précédent pour créer le plateau.
Sachant que celui-ci a pour dimension 10x20 cases, le programme est le suivant :
112
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
a1 a2 a3
a4 a5 a6
a7 a8 a9
Exemple
0 1 1
0 0 1
0 0 1
Nous utiliserons alors une fonction aff_suivant pour afficher la pièce sui-
vante, cette fonction sera mise dans la partie initialisation du programme prin-
cipal :
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èce suivante (0 = vide, 1 =
brique). Les fonctions gotoAndStop permettent d’afficher le carré noir (image
1) ou le carré rouge (image 2).
113
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
Dans le cas où on peut tourner, on utilise un tableau auxiliaire rot pour
mémoriser la position de la nouvelle pièce puis on vérifie comme avec les touches
gauche et droite que l’on peut placer cette pièce. Si c’est le cas, item devient rot
et on affiche la pièce. Voir compléments à la fin du document pour la formule
contenant Math.floor et %.
on (keyPress "<Down>") {
DOWN = 1;
}
on (keyPress "<Left>") {
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;
114
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
}
}
}
supp_piece();
Y--;
aff_piece();
}
on (keyPress "<Right>") {
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 "<Up>") {
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;
}
115
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
}
}
supp_piece();
for (i=1; i<10; i++) {
item[i] = rot[i];
}
aff_piece();
}
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);
116
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
}
}
Les lignes au dessus de celle supprimée doivent être décalées 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 à rien, la pièce doit tout de même tomber seule. Com-
ment temporiser sa vitesse ? L’astuce consiste à mémoriser à une certaine image
un instant de départ et à effectuer une boucle avec l’image clé suivante jusqu’à
ce qu’un intervalle de temps se soit écoulé. L’image 2 de notre animation conte-
nant le programme proprement dit, nous ferons cette boucle entre les images 3
et 4 :
Image 2
Now = getTimer();
Image 4
if (Now<time+TO) {
gotoAndPlay (3);
} else {
gotoAndPlay (2);
}
117
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
TO = (15-LEVEL)*80;
k = Math.floor(7*Math.random());
On mémorise la forme de la pièce 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éments
Tests logiques
On suppose que X1, X2. . . valent 0 ou 1. Les tests suivants sont équivalents :
X1 6= 0 ou X2 6= 0 ou ... ⇔ X1 + X2 + ... 6= 0
X1 6= 0 et X2 =6 0 et ... ⇔ X1 × X2 × ... 6= 0
Tableau indexé
118
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
119
Travaux dirigés d’ActionScript
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
120
Travaux dirigés d’ActionScript
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);
}
}
121
Travaux dirigés d’ActionScript
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);
122
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
}
Image 3
Now=getTimer();
Image 4
if (Now<time+TO) {
gotoAndPlay (3);
} else {
gotoAndPlay (2);
}
Image 5
gotoAndPlay (2);
Image 6
FIN
123
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
124
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
aff=palind.txt,inc.txt,addition.txt&fin=1&
Il est important de voir que nous ajoutons à la fin, une variable fin dont
la valeur est mise à 1. Ceci permettra à Flash de savoir que le chargement des
données est terminé et de passer à la suite.
125
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
Remarquez bien que les lignes du programme sont séparées par des retours
chariot pour des commodités de lecture. Il faudra que Flash repère ces retours à
la ligne lorsqu’il enregistrera le contenu du programme dans une variable prgm.
De plus les instructions sont séparées par des virgules.
Le ruban initial est mis dans la variable ruban, l’état initial dans etat et
toujours la variable de fin de chargement.
8.5.6 Chargements
Voici l’idée principale concernant le chargement de la liste des programmes
ou des programmes eux-mêmes :
1. Mettre un bouton sur la scène principale avec pour action :
on (release) {
fin = 0;
loadVariablesNum ("liste.txt", 0);
gotoAndPlay ("charge");
}
On met la variable fin à 0, précisant ainsi que le chargement n’est pas
fini. On commence ensuite à charger les variables au niveau de la scène
principale (niveau 0) et on saute vers l’image de nom "charge".
2. A l’image clé nommée "charge", mettre l’action :
if (Number(fin)>0) {
gotoAndPlay ("suite");
}
On regarde si la valeur de la variable fin est passée à 1. Si c’est le cas, on
passe à la suite de l’animation.
3. A l’image clé suivante, mettre l’action :
gotoAndPlay (_currentframe-1);
qui permet de retourner à l’image "charge".
Ainsi, lorsque nous arrivons à l’image clé "suite", nous sommes sûrs que
toutes les variables ont été chargées.
8.5.7 Conversions
Si vous ne connaissez pas les fonctions join et split, vous allez pouvoir ob-
server leur puissance respective ! Commençons par afficher la liste des différents
programmes disponibles à l’écran.
1. A l’image clé "suite" de la scène principale, mettre une zone de texte
dynamique sur plusieurs lignes avec pour nom liste.
2. Après le chargement des variables, la variable aff contient tous les pro-
grammes sous la forme :
126
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
aff=palind.txt,inc.txt,addition.txt
Nous voulons que les noms soient affichés par ligne dans la zone liste. Il
suffit d’ajouter l’action suivante à l’image clé "suite" :
affprg = aff.split(",");
liste = affprg.join("\r");
stop ();
La première ligne va permettre de créer 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ères séparée par le caractère "\r" (ou chr(13)) qui est le
code du retour chariot.
Chargement du programme :
L’idée est la même, un bouton invisible est placé 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 été choisie (regardez le code source du
.fla). On peut alors charger les nouvelles variables comme précédement.
1. La variable aff contient le programme à 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éboguer - 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 à la fin de chaque ligne, un retour chariot ( \r) et un saut de
ligne ( \n) !
4. Voici maintenant la manipulation fondamentale de ce tutorial, à savoir,
effectuer un Edition - Remplacer sur une chaı̂ne de caractères. Comme
premier exemple, supprimons tous les caractères "\r" de la variable aff
et mettons le résultat dans la variable liste
liste = aff.split("\r").join("");
La commande aff.split("\r") décompose la chaı̂ne de caractères aff
en un tableau en se servant du séparateur "\r". A l’inverse, la fonction
join remet ce tableau en une unique chaı̂ne avec ici un séparateur égal à
un vide.
5. Récupérons maintenant le programme dans un tableau prgm dont chaque
composante sera une instruction. Par exemple, pour le programme inc.txt,
la variable prgm sera égale à :
127
Travaux dirigés d’ActionScript
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ée est de commencer par remplacer les sauts de lignes par des vir-
gules et les _ par des espaces. Ensuite, on crée un tableau en utilisant un
split(",").
prgm = liste.split("\n").join(",");
prgm = prgm.split("_").join(" ").split(",");
Il faut lire la première ligne comme cela : Remplacer tous les \n de la variable
liste par des virgules.
Le ruban qui va être créé par la machine sera mis dans un tableau de taille
variable. Il est initialisé grâce à la variable ruban. D’après le guide de référence
d’ActionScript, la commande ruban.split("") DEVRAIT renvoyer un tableau
contenant les différents caractères de ruban. Hélas, il s’agit d’un Bug ! Nous
sommes donc obligés, en attentant Flash 6, d’utiliser une boucle :
ruban = ruban.split("_").join(" ");
trub = new Array();
for (i=0; i<ruban.length; i++) {
trub[i] = ruban.charAt(i);
}
8.5.8 La machine
La programmation de la machine est très simple ! Pour une position donnée,
on recherche l’état courant dans la liste des états proposés dans le programme
prgm. On regarde ensuite si la case visitée est la même que celle du programme.
Si oui, une action est effectuée, sinon, on continue à explorer prgm. La variable
indice permet de faire tourner le ruban à l’affichage et longueur correspond
on nombre de lignes de codes du programme.
on (release) {
128
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
avance();
}
où avance() est la fonction définie par :
encore = 1;
i = 0;
while (i<longueur && encore) {
if (etat == prgm[5*i] && case2 == prgm[5*i+1]) {
etat = prgm[5*i+2];
trub[indice+2] = prgm[5*i+3];
if (prgm[5*i+4] == ">") {
indice++;
} else {
indice--;
}
encore = 0;
affiche();
}
i++;
}
Les éléments prgm[5*i] contiennent les états à tester, prgm[5*i+1] les va-
leurs des cases correspondantes, prgm[5*i+2] le nouvel état à mettre, prgm[5*i+3]
la nouvelle valeur à écrire et prgm[5*i+4] la direction où aller.
La fonction affiche() actualise les cases affichées à l’écran. Elle est définie
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ées et si la valeur du tableau trub correspondant au
ruban n’est pas définie, on remplace la valeur null par un blanc.
129
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
} else {
encours = true;
auto.play();
}
}
Explications
1. Si la machine était déjà en cours de marche (variable encours est à vrai)
alors on arrête par encours=false et le clip auto (voir plus bas) s’arrête
sur l’image clé 1
2. Si encours était à 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é et rien sur sa scène principale.
2. Image 1 : Action stop(), ce sera la position de repos lorsque la machine
est arrêtée
3. Image 2 :
_root.avance();
temps=getTimer();
On exécute la fonction avance() identique à celle du bouton SUIVANT
et on note le temps actuel.
4. Image 3 :
if (getTimer()>temps+1000) {
gotoAndPlay (2);
}
Si 1 seconde s’est écoulée, on retourne à l’image 2
5. Image 4 : Action gotoAndPlay (3);
Il faut bien sûr que la variable encours soit initialisée à false au premier
lancement.
130
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
Construction
1. Créez un nouveau symbole graphique nommé boule
2. Créez un bouton bouton ayant le symbole boule sur Haut, Dessus, Abaissé
et Cliqué.
3. Créez un clip nommé 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);
}
131
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
8.6.2 L’ennemi
L’ennemi peut être considéré comme un clip (voir figure 8.7) qui apparaı̂t
aléatoirement à l’écran, ayant une couche Action comportant son état de danger
et une couche pour sa trajectoire.
132
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
_root.danger=1;
5. Et à 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éez 2 couches sur la scène principale, une pour les actions et l’autre
pour les objets.
2. Placez une occurrence du clip mcenn à l’image 1 de la couche objet et lui
donner le nom ennemiTapez F5 au temps 2 pour étendre l’image fixe.
3. A l’image 1 de la couche action de la scène principale, placez l’action :
h = Math.floor(10*Math.random ());
if (h == 0) {
_root.ennemi.play();
};
4. insérez une image clé à 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 à
des moments aléatoires (Placez une zone de texte dynamique nommée
danger sur la scène principale pour observer les instants où l’ennemi peut
provoquer un danger)
Lien Ennemi-Joueur
133
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
134
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
joueur presse la barre d’espace, un missile est envoyé. S’il déplace la souris,
l’angle de tir change. Les 2 mouvements peuvent être faits simultanément.
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);
}
}
135
Travaux dirigés d’ActionScript
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;
}
136
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
<?php
$link = mysql_connect() or die("Impossible de se connecter");
$bdd = "topten";
mysql_select_db($bdd);
$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"]."&";
};
mysql_close();
?>
La requête signifiant que l’on sélectionne les 2 champs (*) et que l’on classe
les enregistrements par ordre décroissant (DESC) du score.
4. Créez une animation Flash score.fla et enregistrée là dans le même
dossier que le script avec une action stop(); à l’image clé 1
5. Insérez 10 zones de textes dynamiques nommées nom1,nom2..sur la scène
6. Insérez en face 10 autres zones de textes dynamiques nommées score1,
score2...
7. Créez un bouton quelconque et en mettre une occurrence sur la scène
principale avec l’action :
on (release) {
loadVariablesNum ("scores.php", 0, "POST");
}
137
Travaux dirigés d’ActionScript
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écupère les meilleurs scores, les classes par ordre décroissant du
score et regarde si le score du joueur est supérieur au plus petit score10Si
c’est le cas, on met à jour la base de données en remplaçant nom10 et
score10 par les nouveaux. On reclasse le tableau et on envoie le résultat
à Flash. Dans le cas où le score n’est pas assez élevé, on renvoie perdu=1.
8.8 Sécurité
8.8.1 Jouer Online
Voici une méthode (non fiable à 100% mais nécessitant une manipulation non
triviale pour la contourner !) afin d’éviter qu’un joueur télécharge votre fichier
.swf et s’en serve sans être connecté à votre site.
138
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
139
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 8. JEUX
TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/shockwave/download/...">
</EMBED>
</OBJECT>
<a href=# onClick="whichObj(’jeux’).GotoFrame(3);">
Allez directement à l’image 3 !
</a>
</BODY>
</HTML>
Vous pouvez améliorer ( ?) ce script pour aller directement au numéro d’un
frame entré dans une zone de saisie...
140
Travaux dirigés d’ActionScript
Chapitre 9
PHP
9.1 Ming
Cette librairie de création à la volée de fichiers SWF est disponible pour
PHP sur le site http ://www.opaque.net/mingLe manuel de référence de PHP
4.0 (http ://snaps.php.net/manual/) contient un chapitre de description des
fonctions de la librairie ming. Si vous avez installé easyphp, ouvrez votre page
d’accueil et cliquez sur le bouton ’test ming’. Téléchargez également les utili-
taires 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 à votre bouton droit un
menu contextuel Fen^ etre DOS qui vous permettra d’ouvrir une fenêtre
DOS dans un dossier sélectionné. Pour ce faire, ouvrez la base de registre
(Démarrer - Exécuter - regedit) puis allez à la clé :
HKEY_CLASSES_ROOT\Folder\shell
Créez une clé nommée Fen^
etre DOS, une sous-clé 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être DOS dans le dossier où est le fichier à convertir. Faire
bouton-droit et propriétés de la fenêtre DOS, choisir l’onglet Divers et
cochez Souris - Edition rapide.
141
Eric Schrafstetter CHAPITRE 9. PHP
header(’Content-type: application/x-shockwave-flash’);
header(’http-equiv="pragma" content="no-cache"’);
header(’http-equiv="Expires" content="0"’);
La première ligne est toujours nécessaire comme vous le constaterez dans les
prochains programmes. La seconde ligne évite que le navigateur mette le fichier
en mémoire cache (remarquez que Affichage - Source n’est plus disponible) et la
dernière donne une durée de vie nulle à la page. Désormais, la manipulation est
de fermer la fenêtre d’affichage, de changer votre script et de relancer la page !
Une autre solution consiste à utiliser un lien hypertexte du type :
<A HREF="anim.swf?1">Charger l’animation !</A>
la commande ?1 forçant le navigateur a télécharger l’animation sur le site
d’origine.
/* -------------------------*/
/* Le programme de création */
/* -------------------------*/
142
Travaux dirigés d’ActionScript
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 :
<?
$m = new SWFMovie();
$m->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();
143
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 9. PHP
?>
2. Cercle de rayon R
Le plus simple est de représenter un cercle comme une suite de lignes
droites (voir l’exemple du camembert 3D online plus loin)Nous allons voir
une méthode plus rapide dans le principe mais certainement moins ma-
niable d’un point de vue intellectuel ! Il s’agit d’utiliser 8 courbes de Bézier.
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ézier d’ordre N
est donnée par :
N
X
z(t) = 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ézier d’ordre 2 a pour équation paramétrique :
(
(1 − t)2 √R2 + 2t(1 − t)x1 + Rt2
z(t) =
(1 − t)2 √R2 + 2t(1 − t)y1
√ √ Ã √ !
³π ´ 2 π 2 π 2 1
cos (1 − t) ' Pc (t) = + t+ 1− −√ t2 (9.1)
4 2 8 8 2
¡π ¢
De même pour l’approximation de t → sin 4 (1 − t) :
√ √ Ã √ !
³π ´ 2 π 2 π 2 1
sin (1 − t) ' Ps (t) = − t+ −√ t2 (9.2)
4 2 8 8 2
144
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 9. PHP
et √ √
−π 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
y1 = 1+R√2 . Un petit calcul montre que ξ = √2(1+ R√
2)
et que la distance
R√
de z1 à z2 est 1+ 2
.
z0 ξ
45°
ξ
z1
45°
0
z2
<?
$m = new SWFMovie();
$m->setRate(12.0);
$m->setDimension(1500, 1500);
$m->setFrames(1);
$m->setBackground(0xff, 0xff, 0xff);
$m->add(new SWFAction("stop();"));
header(’Content-type: application/x-shockwave-flash’);
$m->output();
?>
145
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 9. PHP
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();
?>
146
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 9. PHP
header(’Content-type: application/x-shockwave-flash’);
$m->output();
?>
5. De façon plus générale, 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ées :
2 cos(α) + α sin(α)
x1 = R
2
2 sin(α) − α cos(α)
y1 = R
2
Voici un exemple de script traçant des arcs de cercles d’angles α pour α
entre 0 et π4
<?
$m = new SWFMovie();
$m->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,
147
Travaux dirigés d’ActionScript
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();
?>
Voici un petit script facilement attachable à une base de données qui permet
de réaliser à la volée un camembert 3DContrairement à la section précédente
où nous utilisions des courbes de Bézier, nous choisissons ici de tracer l’ellipse
à partir de petits segments de droites. Voici quelques explications sur le pro-
gramme :
1. Le graphique se compose de 2 parties, les différentes parts et le socle. Le
socle n’étant visible que pour les angles entre 0 et π.
2. La fonction secteur permet de dessiner un secteur entre les angles $depart
et $angle à la position $x,$y avec la couleur $coul
3. Le test ci-dessous permet d’arrêter le socle à π :
if($angle+$depart>M_PI){
148
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 9. PHP
$nb=(M_PI-$depart)*180/M_PI;
}
<?
$m = new SWFMovie();
$m->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)));
149
Travaux dirigés d’ActionScript
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éplacement
1. Déplacement d’un symbole sur la scène principale :
<?
$m = new SWFMovie();
$m->setRate(12.000000);
$m->setDimension(11000, 8000);
150
Travaux dirigés d’ActionScript
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();
151
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 9. PHP
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éer une telle
police :
1. Placez l’utilitaire makefdb (voir intro) dans un répertoire accessible.
2. Lancez Flash et créez un fichier police.fla
3. Créez une zone de texte et tapez quelques lettres, par exemple abc.
4. Choisissez une police, par exemple Wingdings
5. Dans les paramètres de publication, décochez les formats SWF et HTML
et cochez Modèle Generator SWT.
6. Si vous voulez exporter d’autres polices, créez autant de zones de texte
que nécessaire !
7. Publier la page pour créer le fichier police.swt
8. Ouvrir une fenêtre DOS dans le dossier de publication et tapez
makefbd police.swt
Un ou plusieurs fichiers .fdb sont alors créés.
152
Travaux dirigés d’ActionScript
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ême répertoires que les fichiers PHP) et
appelez la police par la commande suivante :
$f=new SWFFont("Wingdings.fdb");
$t=new SWFText();
$t->setFont($f);
<?
$f=new SWFFont("Wingdings.fdb");
$t=new SWFText();
$t->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é/-
rentes et on crée l’interpolation entre les deux. La fonction SWFMorph doit avoir
2 paramètres : getShape1() pour la forme d’origine et getShape2() pour la
forme finale.
<?
$m = new SWFMovie();
$m->setRate(12.000000);
$m->setDimension(11000, 8000);
$m->setFrames(20);
$m->setBackground(0xff, 0xff, 0xff);
/* Initialisation des nombres aléatoires */
mt_srand((double)microtime()*10000);
/* Création du morphing */
$s1 = new SWFMorph();
153
Travaux dirigés d’ActionScript
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);
/* 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élécharger
une animation Flash créée en php et un second bouton effectue un effet sur
l’animation chargée.
1. Tapez le fichier rect.php suivant :
<?
$m = new SWFMovie();
$m->setRate(12.000000);
$m->setDimension(110, 80);
154
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 9. PHP
$m->setFrames(1);
$m->setBackground(0xff, 0xff, 0xff);
$i1 = $m->add($s2);
$i1->moveTo(40, 40);
$i1->setName(’rectangle’);
$m->nextFrame();
header(’Content-type: application/x-shockwave-flash’);
$m->output();
?>
5. Créez un clip vide et mettre une occurrence de celui-ci sur la scène prin-
cipale (au milieu de la scène) avec comme nom ici
6. Compilez et lancez l’animation à partir du navigateur. Cliquez sur le pre-
mier bouton, le rectangle apparaı̂t.
7. Cliquez sur le second bouton, l’effet _alpha=50 est appliqué.
155
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 9. PHP
156
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 9. PHP
157
Travaux dirigés d’ActionScript
Chapitre 10
C++
10.1 Introduction
Si vous n’avez pas Visual C++, dépêchez-vous de commander le Hors-Série
n◦ 9 (mai 2001) de PC team contenant la version complète du logiciel Micro-
soft Visual C++ ’Introductory Edition’ pour 42F ! L’installation ne pose aucun
problème, ajoutez également l’aide (en Anglais). Nous allons créer une petite
application qui va piloter une animation Flash et en recevoir des commandes.
Vérifiez votre configuration :
1. Dézippez le fichier commandes.zip dans un dossier quelconque
2. Un dossier tdas est créé. 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érents boutons qui vont
être maintenant expliqués...
158
Eric Schrafstetter CHAPITRE 10. C++
159
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 10. C++
10.2.4 Le programme
Il s’agit d’associer différentes actions aux événements (boutons, initialisa-
tion...)
1. On voudrait que l’animation rect.swf soit chargée dans la variable m_anim
dès le début. Pour cela, lancez ClassWizard ( CTRL+W), cliquez sur l’on-
glet ’Message Maps’ et choisir Class Name = CcommandesDlgLa liste des
objets est affichée.
2. Choisir l’ID CcommandesDlg et le Message WM_INITDIALOG (WM pour
Window Message) puis cliquez à droite sur le bouton ’Edit Code’
3. Oups ! Je vous avais bien dit que c’était inbuvable ! Recherchez plus bas
la partie
// TODO: Add extra initialization here
m_anim.SetMovie("C:/Mes Documents/rect.swf");
m_anim.Play();
160
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 10. C++
m_anim.GotoFrame (5);
m_anim.Stop();
}
Maintenant, l’animation s’arrêtera toujours au frame n◦ 5.
Pour voir toutes les fonctions liées à l’objet Flash, utilisez les menus déroulants
dans la barre d’outils du haut :
161
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 10. C++
void CCommandesDlg::OnStop()
{
_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ères (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 à C++ et ajoutez un bouton sur la boite de dialogue avec pour
nom ’Envoyer’. Double cliquez sur le bouton et donnez le nom OnEnvoyer
à 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ée
texte avec le contenu m_total à l’animation.
162
Travaux dirigés d’ActionScript
Eric Schrafstetter CHAPITRE 10. C++
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écupère
la variable args envoyée par Flash.
163
Travaux dirigés d’ActionScript
Chapitre 11
Liens
11.2 Flash
11.2.1 Sites Internet
– http ://www.macromedia.com
– En français : 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ébutants : 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éaliste : http ://www.vectorkid.com/
164
Eric Schrafstetter CHAPITRE 11. LIENS
11.2.2 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, Da-
vid 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édia Flash 5 de Michael Gradias 210 FF
6. Actionscript la référence de Moock. 300 FF
7. ActionScript de Colin Moock. Broché (mai 2001) Notre prix : 310 FF
8. Flash ActionScript : Atelier créatif 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
165
Travaux dirigés d’ActionScript