Patience ! Allez ! 8O Ko le ShockWave à télécharger,
C'est promis, on ne vous le fera plus ! C'est qu'il pèse
lourd le bitmap de notre praxinoscope 48 pixels * 5200 pixels !
Ce poids est d'autant plus regrettable que dans cette version
ShockWave il manque singulièrement de réactivité
! pourtant, il fallait bien vous le montrer pour vous donner
envie de le refaire avec nous...
Préparation de l'image (Adobe Premiere et le format
FilmStrip)
Adobe Première est le premier logiciel mis en uvre
ici car c'est lui qui va nous permettre de générer
cette grande image ou bande de film. Dans un nouveau projet
au réglages indifférents on importe un élément
que l'on place sur le montage. On n'oublie pas alors d'étirer
la bande mauve de définition de la zone de travail
à l'aplomb des images à extraire. Soyons modestes
ici car à trop en vouloir on risque de générer
une bande de film d'une longueur ingérable. Une durée
de 3 ou 4 seconde semble un bon compromis.
Dans le menu Fichier de Premiere, on appelle Exportation
puis Vidéo. Le dialogue de paramètrage apparaît
alors avec en haut son menu pop-up. L'article général
nous permet de choisir le format d'export Filmstrip :
L'article réglage vidéo du même pop-up,
nous permet de réduire les dimensions d'export (minimum
32x32 pixels). Il semble évident que nous ne pouvons
demander à Director d'animer une bande d'image trop
lourde. Nous choisissons une petite taille- 48 x 36 pixels
- et surtout mais toujours dans le but d'alléger
le fichier généré, nous autorisons
le logiciel à ne garder qu'une image sur 3 en définissant
une cadence finale de 10 images par secondes (notre source
NTSC contient 30 ips; avec une élément PAL/SÉCAM
à 25 ips, on choisira plutôt 12,5 ips). On
peut dès lors procéder à l'enregistrement
du document.
Filmstrip c'est ce format qui permet d'amener une séquence
d'images vidéo dans Photoshop. La séquence
se présente comme une bande de film sur laquelle
on peut intervenir à loisir , dessiner (Rotoscoping)
ou de manière plus générale mettre
ne uvre tous les outils de Photoshop calques compris !
Plus fort, Photoshop nous facilite une intervention image
après image : les touches MAJ et pageUp/pageDown
permettent de faire défiler régulièrement
la bande et de replacer ainsi le pointeur exactement au
même endroit sur chaque image. Seuls impératifs :
si l'on veut pouvoir réimporter la séquence
dans première après retouche dans Photoshop,
il ne faut pas l'avoir redimensionnée ni recadrée.
Nous avons importé la séquence dans Photoshop
pour la convertir en 256 couleurs (Menu Image/modes/couleurs
indexées). La puissance des machines actuelles fait
souvent oublier cette simple étape. Pourtant en 256
couleur notre images pèsera exactement 3 fois moins
lourd qu'en RVB et demandera moins de travail à Director !
Création de l'animation Director
On importe l'image dans le logiciel auteur et on la place
sur un piste du scénario. Un script associé
au frame ou tableau permet d'immobiliser la lecture en faisant
boucler l'animation.
on exitFrame
g o the frame
end
C'est maintenant à l'image sur la scène (sprite)
qu'il faut associer un comportement permettant de la faire
glisser. Nous souhaitons qu'il soit possible de la lancer
plus ou moins vite mais nous souhaitons aussi qu'un mouvement
naturel l'anime et qu'après un certain temps elle
ralentisse puis s'arrête complètement. Nous
devons rédiger un script qui simule l'inertie d'un
mouvement naturel !!!
On sélectionne le sprite entier dans le scénario
et dans D7, l'on demande l'ouverture de l'inspecteur de
comportement par un cllic sur l'icône losange en haut
à gauche du scénario. Le bouton "+" nous permet
d'attacher un nouveau comportement au sprite. Après
que Director nous a demandé son nom, nous cliquons
dans la fenêtre de l'inspecteur de comportement sur
l'icône d'une page en haut à droite pour accéder
à l'éditeur de script.
NOTE : Le script que nous allons rédiger utilise
pleinement le nouvelle notation et l'orientation objet des
behaviours de D7, les utilisateurs de la version 5 toutefois
pourront facilement adapter ce code à leur environnement.
Un comportement véritable ou behavior c'est un script
que l'on peut associer identiquement à plusieurs
sprites afin qu'ils se comportent chacun de la même
façon. Écrire un behaviour ou comportement
c'est donc rédiger un code valable pour un ou pour
plusieurs sprites, pour tout sprite. Pas question donc de
coder "en dur" les constantes numéro de piste, position,
etc... car on s'interdirait alors d'attacher ce comportement
à un autre sprite. Et si nous souhaitions animer
un deuxième bitmap sur la scène ? Il
faudrait alors rédiger un autre script.
De fait, les amateurs de POO ne seront pas déroutés
si nous commençons notre code par une déclaration
des propriétés globales de chaque objet sprite.
Les sprite subsistant et leurs propriétés
avec eux, les propriétés nous épargnent
d'avoir à utiliser des variables globales.
on beginSprite me
pNumero = the spriteNum of me
end
Notez bien que l'on s'interdit tout usage de valeur absolue.
Notre comportement pourra être attaché à
toute sprite à venir. pNumero représente sous
une notation courte le numéro de la piste sur laquelle
le sprite se trouve. Lors de l'instanciation automatique
de l'objet sprite, on enregistre ce numéro dans une
propriété nommée pNumero.
Passons aux chose importantes. Afin d'obtenir un lancer
"naturel" du bitmap nous devons tenir compte de la vitesse
avec laquelle l'utilisateur glisse pour lancer. Pour connaître
cette vitesse nous nous proposons de mesure la distance
parcourue par la souris dans un cycle, c'est-à-dire
entre l'appui sur la souris où prise en main du bitmap
et l'événement prepareFrame qui, DANS DIRECTOR
7, le suit immédiatement. Donc, nous notons la position
de la souris au début du lancer (propriété
pLieuDuDebutDuCliquerGlisse). Classique : on note la distance
du pointeur de souris au point de référence
du sprite (pDecalageV) car s'il faut déplacer le
sprite en même temps que la souris, il ne faut pas
le mettre exactement à la position de la souris.
L'utilisateur ne pose pas forcément sa souris au
milieu du bitmap !
La propriété pMoiCliqué n'est qu'un
flag, un indicateur permettant de savoir à tout instant
si l'utilisateur fait glisser le bitmap, auquel cas on doit
l'accompagner, où s'il a lâché la souris
auquel cas on doit s'enquérir de la vitesse à
donner au bitmap. Cette propriété sera discriminante
pour le gestionnaire d'animation on prepareFrame (voir plus
bas).
on mouseUp me
pMoiCliqué = false
end
on mouseUpOutSide me
pMoiCliqué = false
end
L'événement prepareFrame, rappelons le est
sous D7 envoyé aux sprites, c'est donc lui que nous
interceptons ici - dans notre script de comportement - pour
animer la bande de film. Toujours sous D7, prepareFrame
est émis dès après le mouseDown.
Deux cas peuvent se présenter : L'utilisateur enfonce
le bouton de la souris ou il le relâche (La propriété
"pMoiCliqué" est true ou false)
Maintenant, s'il maintient le bouton enfoncé ce
peut-être pour lancer le film ou bien pour l'arrêter.
Dans ces deux cas, nous devons en permanence déplacer
le bitmap proportionnellement mais surtout noter la vitesse
du mouvement qu'il impose à la souris afin de pouvoir
réagir lors qu'il relâchera le bouton. La vitesse
de son déplacement c'est, nous l'avons dit , le nombre
de pixels parcourus dans un cycle, entre le mouseDown et
le prepareFrame suivant puis entre deux prepareFrame. Nous
écrirons pour gérer ce premier cas :
if pMoiCliqué then
pPositionV = the mouseV - pDecalageV
pVitesse = the mouseV - pLieuDuDebutDuCliquerGlisse
En réinitialisant la position de la souris enfoncée
afin de refaire un calcul de vitesse au prochain cycle (au
prochain prepareFrame ). L'utilisateur peut ainsi faire
varier la vitesse de son glisser. C'est la dernière
impulsion qui nous donnera finalement la vitesse du lancer.
pLieuDuDebutDuCliquerGlisse = the
mouseV
...
Deuxième cas, l'utilisateur a relâché
la souris. pour épargner Director, on ne doit se
soucier de déplacer le sprite que si la vitesse finalement
enregistrée (la distance parcourue par la souris
entre deux prepareFrame ) n'est pas nulle. On écrira:
else if abs(pVitesse) > 0 then
pPositionV = sprite(pNumero).locV + pVitesse
Que faut-il penser de ce script finalement :
on prepareFrame me
pPositionV = sprite(pNumero).locV
if pMoiCliqué then
pPositionV = the mouseV - pDecalageV
pVitesse = the mouseV - pLieuDuDebutDuCliquerGlisse
pLieuDuDebutDuCliquerGlisse
= the mouseV
else if abs(pVitesse) > 0 then
pPositionV = sprite(pNumero).locV + pVitesse
end if
sprite(pNumero).locV = pPositionV
end
La dernière instruction repositionne le sprite à
chaque cycle, à une distance équivalente à
celle déjà parcourue lors de l'impulsion initiale.
l'utilisateur aura alors la joie de voir qu'il peut lancer
plus ou moins fort le sprite mais bien-sûr... il ne
pourra le lancer qu'une fois puisqu'un fois sur sa lancée,
rien ne l'arrête plus !
On doit ici restreindre les mouvement du sprite de deux
façons, d'abord on doit veiller à ce qu'il
ne sorte pas de la scène. Il sort de la scène
par le bas par exemple, dès lors que sa position
(sprite().locV) est supérieure à la moitié
de sa hauteur.
Si lors de son déplacement, il vient à sortir
des limites de la scène il convient de l'y repositionner
immobile. Un test de ce genre exige que l'on se connaisse
la hauteur de la scène (hauteurDeLaScene) :
Puis, après nous être assurés qu'il
ne sortira pas de la scène, on doit s'occuper de
ralentir progressivement le sprite afin que son mouvement
ne dure pas éternellement.
if abs(pVitesse) > 0 then
case true of
(pVitesse > 0):
pVitesse = pVitesse - 1
(pVitesse < 0):
pVitesse = pVitesse + 1
end case
Réécrivons maintenant le gestionnaire prepareFrame
sans le tronquer.
on prepareFrame me
pPositionV = sprite(pNumero).locV
if pMoiCliqué then
pPositionV = the mouseV -
pDecalageV
pVitesse = the mouseV - pLieuDuDebutDuCliquerGlisse
pLieuDuDebutDuCliquerGlisse
= the mouseV
else if abs(pVitesse) > 0 then
pPositionV = sprite(pNumero).locV + pVitesse
case true of ---
décélération
(pVitesse > 0):
pVitesse
= pVitesse - 1
(pVitesse < 0):
pVitesse = pVitesse
+ 1
end case
end if
case true of
(pPositionV > (sprite(pNumero).height )/2 ) :
pPositionV = (sprite(pNumero).height)/2
--
bloqué contre le bord haut de la scène
(pPositionV < hauteurDeLaScene - (sprite(pNumero).height)/2)
:
pPositionV = hauteurDeLaScene - (sprite(pNumero).height)/2
-- bloqué
contre le bord bas de la scène
otherwise : nothing
end case
sprite(pNumero).locV = pPositionV --
déplacement "réel" du sprite
end
Depuis Director 7, Lingo accepte deux syntaxes ou notation.
C'est la nouvelle notation qui est utilisée ici.
Héritée du basic Mac et d'HyperTalk, l'ancienne
notation devrait peu à peu devenir obsolète.