Ah ! the quad of sprite... La propriété the
quad of sprite fut tout de suite repérée par
les aficionados comme LA grande nouveauté de D7.
j'en connais qui lui font faire de la
3D ! Quad c'est une liste de quatre points, coordonnées
horizontale et verticale des coins d'un bitmap. Ces coins
peuvent désormais être déplacés
indépendamment l'un de l'autre. Regardons ça...
Pour réaliser d'abord cette mini animation aux curseurs
déformants on a commencé par placer sur la
scène notre logo (piste 1), sous lui un acteur forme
QuickDraw étiré horizontalement sur 100x1
pixels (la glissière), enfin un bitmap curseur. on
a attaché à ce dernier le comportement suivant
afin de le transformer en curseur (un classique)
property pDecalageH, pN,
pDebutH
on beginSprite
me
pN = the currentSpriteNum
pDebutH = sprite(pN - 1).locH
+ 50
-- 50 c'est la largeur de la glissière
divisée par deux,
-- c'est le milieu, la position initiale du curseur
sprite(pN).constraint
= pN -1
-- Rappel : la glissière
est au dessous donc piste pN - 1
end
Le gestionnaire beginSprite on le voit, initialise seulement
les valeurs des propriétés.
on mouseDown
pDecalageH = the mouseH
- sprite(pN).locH
-- classique : on mesure
d'abord l'écart du bitmap à la souris
-- pour éviter un saut lorsqu'il la suit (2 lignes
en dessous)
repeat while the stilldown
sprite(pN).locH
= the mouseH
- pDecalageH
updateStage
-- dans une boucle,
on doit forcer Director à rafraîchir l'écran
x = (sprite(pN).locH
- pDebutH)/2.5
-- tout est là
: la position du curseur (relativement à sa position
initiale pDebutH)
-- est divisée par 2,5 parce que
-- avec 100 px de jeu,
on obtient 40 étapes
-- de -20 a + 20
sendSprite(1,
#transformationDe, x)
-- on envoie enfin
l'info au logo piste 1
end repeat
end
Chaque déplacement de notre curseur envoie donc
le message "transformationDe" au logo piste 1. Afin que
ce bitmap sache quoi faire d'une telle instruction, nous
lui associons le comportement suivant :
on beginSprite
me
pNum = the spriteNum
of me
pCoinHautGauche = sprite(pNum).quad[1]
pCoinHautDroite = sprite(pNum).quad[2]
pCoinBasDroite = sprite(pNum).quad[3]
pCoinBasGauche = sprite(pNum).quad[4]
end
Les quatre propriétés pCoinHautGauche , Droit,
etc. n'ont d'autre fonction que de nous faciliter la tâche.
Elles ne servent à rien d'autre qu'à décomposer
la liste quad en unités plus manipulables. On notera
au passage l'ordonnancement inhabituel des points dans la
liste quad. Ainsi l'expression "getAt(the quad of sprite
n, 3) - en nouvelle notation "sprite().quad[3]"
- retourne les coordonnées du point inférieur
droit.
Il faut finalement ajouter au comportement le gestionnaire
qui permettra à notre bitmap de se transformer en
fonction de la valeur transmise par le curseur horizontal.
on transformationDe me,
valeur
a = point
( getAt(pCoinHautGauche,
1), (getAt(pCoinHautGauche,
2) - valeur) )
d = point
(getAt(pCoinBasGauche , 1),
(getAt(pCoinBasGauche, 2)
+ valeur))
b = point
( getAt(pCoinHautDroite,
1), (getAt(pCoinHautDroite, 2) + valeur) )
c = point
( getAt(pCoinBasDroite, 1),
(getAt(pCoinBasDroite, 2)
- valeur) )
sprite(pNum).quad
= [a, b, c, d]
end
Évidemment ça donne envie de faire de la
3D mais là, il faudra peut-être étudier
les équations de la VRML ... En attendant voilà
comment réaliser l'animation plus haut qui a du épuiser
les ressources mémoire de votre navigateur.
Ici, on a simplement placé le logo de qui vous savez
plusieurs fois sur la scène et on lui a chaque fois
attaché un comportement analogue au suivant (ici
pour un mouvement vers la gauche).
property pA, pB, pC
, pD, pN
on beginSprite
me
pN = the spriteNum
of me
leCentre = sprite(pN).loc
sprite(pN).quad
= [leCentre, leCentre, leCentre, leCentre]
--- le logo commence
sa carrière minuscule au centre
pA = sprite(pN).quad[1]
pB = sprite(pN).quad[2]
pC = sprite(pN).quad[3]
pD = sprite(pN).quad[4]
-- les propriétés
A, B, C.. ne sont que
-- des moyens commodes de nommer chaque coin
end
on prepareFrame
me
if getAt(pB, 1) <
0 then
--
si le logo est sorti de la zone visible,
-- c'est à dire si la coordonnée
horizontale
-- de son coin supérieur
gauche est > 0 alors
-- on le ramène tout entier
au centre de la scène
leCentre = point(160,
120)
sprite(pN).quad
= [leCentre, leCentre, leCentre, leCentre]
-- on met
à jour les propriétés pA, pB, ...
c'est-à-dire chaque coin
pA = sprite(pN).quad[1]
pB = sprite(pN).quad[2]
pC = sprite(pN).quad[3]
pD = sprite(pN).quad[4]
else
pA = pA - point(4,4)
pB = pB - point(2,2)
pC = pC - point(2,-2)
pD = pD - point(4,-4)
-- c'est ici que
l'on donne le mouvement
-- les valeurs sont un peu plus importantes
pour
-- les coins extérieurs (gauches
ici) afin de créer
-- l'effet de perspective
sprite(pN).quad
= [pA, pB, pC, pD]
end if
end