Seul moyen d'exploiter une image de grande dimension, carte ou
tableau d'art sur la scène de Director, le zoom interactif
est devenu un grand classique des Cédés sur la peinture.
Le CrapoWeb vous propose de suivre la réalisation de cet
exercice qui ne requiert qu'un peu de Lingo et aussi... un peu d'arithmétique.
Pour explorer la carte, déplacez le petit rectangle jaune :
Afin de bien préparer les acteurs requis par cette animation,
il convient de s'interroger sur son principe : Les déplacements
du petit rectangle jaune sur la petite carte induisent des déplacements
proportionnels de la grande carte. Si l'on nomme "ratio" le rapport
des deux cartes, on peut aisément imaginer que la grande
carte est à chaque déplacement, positionnée
suivant la formule :
nouvellePositionDeLaGrandeCarte = positionInitialeDeLaGrandeCarte
+ déplacement * ratio
A l'usage néanmoins, on risque fort de s'apercevoir que
l'unité de pixel utilisée pour mesurer les déplacements
rend vaine toute tentative de conserver une quelconque précision
décimale au rapport. S'il on veut donc obtenir une relative
précision, IL FAUT DÈS LA CRÉATION DES ACTEURS
veiller à ce que ce rapport (dimension de la grande carte/dimension
de la petite) reste entier.
C'est ce que nous avons fait, en conférant à la carte
miniature des dimensions spécifiques 33 X 32...
...qui l'accordait à la grande carte. Ici un fichier vectoriel
au format Flash 2 de 999 X 960.
Le rapport des deux largeurs 999/33 comme aussi des deux hauteurs
960/32 est un entier et cette condition était indispensable
à la bonne marche de notre projet.
Construction du scénario
Les deux cartes sont importées dans la distribution et placées
sur la scène de Director piste 1 et 3. On donne à
la grande carte une position aisément identifiable; par exemple
on aligne son coin supérieur droit sur le bord droit de la
scène. Le rectangle jaune est un acteur forme au fond transparent
que l'on dispose piste 5. Pour que ce rectangle ne sorte pas des
limites de la carte, on utilise une nouvelle fois l'acteur forme
(contour rouge sur notre dessin mais sans aucun contour et donc
invisible en réalité) piste 4. Le coin supérieur
gauche - point de référence - du rectangle jaune piste
5 sera contenu à l'intérieur du sprite 4 à
l'aide de la propriété constraint.
On immobilise la tête de lecture sur un tableau quelconque
et on contraint les déplacements du rectangle jaune.
on exitFrame
if not the constraint of sprite 5 then set the constraint
of sprite 5 to 4
go the frame
end
Nous souhaitons maintenant déplacer la carte en même
temps que l'utilisateur déplacera le rectangle jaune avec
sa souris. On sélectionne le sprite correspondant sur le
scénario (piste 5) et on clique sur l'icône losange
pour appeler l'éditeur de comportement. Au rectangle jaune
nous associons les lignes Lingo suivantes :
on mouseEnter me
cursor [11,12]
end
--- 11 et 12 étant les numéros de deux acteurs noir/blanc
qui servent ici respectivement de curseur personnalisé et
de masque de curseur.
on mouseLeave
cursor 0
end mouseLeave
--- Quand la souris s'éloigne, on restitue au curseur sa
forme normale en lui affectant la valeur 0
Le script de mouseDown
Voyons maintenant le script de mouseDown, c'est-à-dire le
script qui sera exécuté lors du cliquer-glisser sur
le rectangle : Nous devons obtenir : 1) le déplacement
du rectangle jaune suivant les mouvements de la souris, 2) le déplacement
proportionnel de la grande carte; et ce tout le temps que la souris
est enfoncée.
1) Le premier problème est un classique : nous ne pouvons
pas simplement aligner le point de référence du sprite
à déplacer sur la position de la souris car l'utilisateur
est susceptible de placer son pointeur diversement au dessus le
rectangle. Le sprite doit être déplacé en même
temps que la souris mais garder ses distances (initiales). On mesure
donc en tout premier lieu l'écart entre le sprite et le pointeur
(decalageH et decalageV) au début du cliquer-glisser. C'est
seulement après, tenant compte de cet écart, que l'on
déplace répétitivement le rectangle :
on mouseDown me
set decalageH to (the locH of sprite the spritenum
of me) - the mouseH
set decalageV to (the locV of sprite the spritenum
of me) - the mouseV
repeat while the stilldown
set the loc of
sprite the spritenum of me to point( the mouseH + decalageH, the
mouseV + decalageV )
end repeat
end
2) On doit désormais veiller à obtenir un déplacement
proportionnel de la grande carte. Déplacer celle-ci exige
que l'on ajoute ou que l'on soustraie des pixels à sa position
initiale. Le nombre de pixels à retirer ou ajouter est bien-sûr
fonction du déplacement subi par le rectangle jaune. L'importance
de ce déplacement peut être connue à tout moment
par la formule :
La grande carte doit être déplacée proportionnellement.
Proportionnellement : c'est-à-dire que lorsque le rectangle
jaune parcours la totalité de la largeur de la carte miniature,
la grande carte doit connaître un déplacement exactement
inverse qui lui fait parcourir la surface de visualisation de part
en part. La formule qui détermine les déplacements
de la grande carte (ajout ou retrait de pixels à sa position
initiale) est bien comme nous l'avons écrit :
DeplacementDeLaGrandeCarte = DeplacementDuRectangleJaune * RATIO
...où ratio représente le rapport des dimensions
des deux cartes.
Pour compléter notre script nous avons donc besoin de connaître
plusieurs valeurs : les positions initiales de la grande carte,
du petit rectangle jaune et le rapport des dimensions des deux cartes.
Afin que ces valeurs constantes ne soient calculées qu'une
fois et disponibles tout le temps nous créons un script d'animation
qui les détermine au début de l'animation. On appelle
la commande script du menu fenêtre de Director et l'on saisit
le gestionnaire suivant :
global positionInitialeDelaGrandeCarte, positionInitialeDuPetitRectangle,
ratioH, ratioV
on startMovie
set positionInitialeDelaGrandeCarte to the loc
of sprite 1
set positionInitialeDuPetitRectangle to the
loc of sprite 5
set ratioH to (the width of sprite 1) / the
width of sprite 3
set ratioV to (the height of sprite 1) / the
height of sprite 3
end
Notre animation disposera désormais de variables globales
(visibilité permanente) contenant les infos nécessaires.
Pour accéder à la position horizontale de la carte,
on extraira de la variable liste positionInitialeDelaGrandeCartela première valeur :
exemple getAt( positionInitialeDelaGrandeCarte,
1 ).
Nous retournons dès lors modifier le comportement attaché
au rectangle jaune. Notre script nous le savons, doit à chaque
instant mesurer le déplacement subi par le rectangle jaune
et faire subir à la grande carte un déplacement proportionné.
Parce que ces opérations sont effectuées au sein d'un
boucle repeat on forcera le rafraîchissement permanent de
la scène à l'aide de la commande updateStage.
on mouseDown me
global positionInitialeDelaGrandeCarte, positionInitialeDuPetitRectangle,
ratioH, ratioV
set decalageH to (the locH of sprite the spritenum
of me) - the mouseH
set decalageV to (the locV of sprite the spritenum
of me) - the mouseV
repeat while the stilldown
set the loc of
sprite the spritenum of me to point( the mouseH + decalageh, the
mouseV + decalagev )
set deplacementh to getAt ( positionInitialeDuPetitRectangle,
1) - the locH of sprite the spritenum of me
set deplacementv to getAt ( positionInitialeDuPetitRectangle,
2) - the locV of sprite the spritenum of me
set the loc of sprite 1 to point ( getAt(
positionInitialeDelaGrandeCarte, 1 ) + deplacementH * ratioH,
getAt ( positionInitialeDelaGrandeCarte,
2 ) + deplacementV * ratioV )
updateStage
end repeat
end
Si c'est un bitmap de grande taille que l'on expose ainsi,
un processeur puissant est requis.
Les utilisateurs de Director 7 ou ultérieur étudieront
avec profit le fonctionnement de la fonction
map()