Utiliser l'Xobjet Fill (D6)
Une animation permettant à l'utilisateur de colorier
un dessin n'a pas besoin de mettre en uvre de nombreuses
commandes Lingo. Le scénario en revanche doit contenir
autant d'acteurs 1 bit que de surfaces différentes
à colorier. L'obligation de superposer ces "morceaux"
ou sprites en utilisant l'encre copier vient ensuite compliquer
la tâche du développeur qui doit intercepter
avec précision les clics sur chaque sprite pour utiliser
à bon escient la commande "set the foreColor of sprite..."
L'Xobjet Fill permet de s'affranchir de ces difficultés
en rendant possible de colorier directement sur l'écran
une zone délimitée. Disponible sur Mac et
PC, Fill Xobjet est freeWare. Suivez le Crapo...
Pour nos essai, on commence par disposer sur la scène
un acteur noir et blanc qui sera notre dessin à colorier.
Nous devons également veiller à ce que notre
moniteur soit réglé en 256 couleurs ( on saisit
: set the colorDepth to 8).
On ouvre alors le fichier de l'Xchose par la commande openXlib
saisie dans la fenêtre message de Director. Si le
fichier ne se trouve pas au même niveau que l'animation,
il convient d'en indiquer le chemin.
openXlib "Macintosh HD:desktop folder:Fill xobj"
Director n'indique pas si l'ouverture de l'Xobjet a réussie.
pour le savoir et connaître le nom véritable
de l'Xobjet, Il nous faut interroger Director un nouvelle
fois :
showxlib
-- XLibraries:
-- Xtra: FileXtra
-- Xtra: UiHelper
-- Xtra: JavaConvert
-- Xtra: CompileJava
-- Xtra: QuicktimeSupport
-- Xtra: NetLingo
-- Xtra: Mui
-- Xtra: fileio
-- "*Standard.xlib"
-- XObject: SerialPort Id:200
-- XObject: XCMDGlue Id:2020
-- "fill xobj" -- XObject: Fill Id:9970
Le contenu de cette liste peut varier mais sa structure
est toujours la même : D'abord les Xtras (sous le
titre XLibrairies) puis viennent les Xobjets et autres (sous
le titre Standard.xlib). Pour info, XCMDGlue est un xobjet
intégré à Director qui permet d'utiliser
les fragments de code ( XCMDs, XFCNs) destinés initialement
à Hypercard, (sur PC, on rencontrera DLLGlue
qui joue ce même rôle d'intermédiaire
à l'usage des librairies liées dynamiques
DLL). On a ici avec SerialPort deux ressources XCODs intégrées
à Director et non pas des XObjets externes.
Pour apparaître dans cette liste, les xtras Lingo
doivent être placés dans le dossier Xtras au
lancement de l'application ou bien encore être ouvertes
ponctuellement par la commande openXlib.
Les Xobjets doivent être appelés par openXlib.
Les XCMDs et XFCNs doivent être ouvertes par openXlib.
L'xobjet intégré XCMDGlue se chargeant de
gérer dans Director l'utilisation des ces commandes
externes destinées initialement à enrichir
l'application Hypercard.
Notre objet est disponible. Pour connaître les méthodes
utilisables nous lui passons "mDescribe" :
put fill(mdescribe)
-- Factory: Fill ID:9970
-- Fill XObject 1.2.1 -- June 6th, 1994
-- Updated January 26th, 1995 --
-- Performs paint fills onto the stage. --
-- Optimized to run under System 7 (or greater) and in 8-bit
color only. --
-- Written by Scott Kildall -- -- © 1994 by Red Eye
Software -- All rights reserved --
-- AOL: Kildall -- AppleLink: S.KILDALL -- Compuserve: 72703,451
-- Internet: 72703.451@compuserve.com
-- Licensed for The MediaBook CD for Director 2
-- Published by gray matter design
--IIIII mNew, left, top, right, bottom
-- creates an instance of the XObject in memory and will
use the specified rectangle for the area affected by the
fill
X mDispose -- releases the instance
IIII mRGBtoIndex, red color, green color, blue color --
given the red, green and blue channel color, this returns
the indexed palette color that most closely matches the
RGB color
II mIndextoRed, indexed color -- given the indexed color,
this returns the corresponding red channel color
II mIndextoGreen, indexed color -- given the indexed color,
this returns the corresponding green channel color
II mIndextoBlue, indexed color -- given the indexed color,
this returns the corresponding blue channel color
XIII mSetFillColor, red color, green color, blue color --
specifies an RGB fill color to be used
XI mSetIndexedFillColor, indexed color -- specifies an indexed
fill color to be used
XIII mSetProtectedColor -- specifies an RGB color to be
excluded from being filled
XI mSetIndexedProtectedColor -- specifies an indexed to
be excluded from being filled
III mGetIndexedColor, horizontal location, vertical location
-- returns the indexed palette color at the specified point
III mGetRedColor, horizontal location, vertical location
-- returns the red channel color at the specified point
III mGetGreenColor, horizontal location, vertical location
-- returns the green channel color at the specified point
III mGetBlueColor, horizontal location, vertical location
-- returns the blue channel color at the specified point
XII mFill, horizontal location, vertical location -- performs
a standard paint bucket fill to the offscreen map at the
specified point
I mSave-- Saves the stage into an offscreen map.
I mRestore -- Restores the offscreen map onto the stage
--
-- Indexed palette colors are in the range of 0-255 --
-- RGB Colors are divided into 3 channels: red, green and
blue with each channel have a value in the range 0-255 --
-- Only one color may be protected at a time.
Les premières lignes portent mention de l'auteur.
Les lignes suivantes présentent une à une
et de façon conventionnelle, les méthodes
utilisables. Chacune de ces lignes est rédigée
de la même manière :
Le groupe de lettres initiales (capitales souvent) fournit
de indications sur le type que la fonction retourne (premier
caractère) et le type d'arguments qu'elle requiert
(tous les autres).
X indique que la fonction ne retourne aucune valeur
I désigne un entier
S une chaîne de caractères entre guillemets
plus rarement on rencontre dans ces listes :
L pour une liste d'entiers
P pour une image
O pour une instance d'Xobjet
V pour un nombre d'argument variable ou un type original
Nous devons commencer par créer une instance de
l'objet en utilisant la méthode globale mNew. C'est
lors de l'instanciation qu'il nous faut indiquer les coordonnées
rectangulaires de la portion de la scène à
colorier. Par commodité nous reprenons le rectangle
du sprite lui même. Nous allons stocker l'instance
dans la variable CRAPO.
set crapo to fill(mnew, 55, 52, 141, 202)
Notre objet CRAPO connaît désormais son champs
d'action. Il est possible dès lors, n'importe où
à l'intérieur du rectangle défini,
de simuler l'application d'un outil pot de peinture. Cet
outil (présent dans Photoshop comme dans le module
de dessin de Director) permet de colorier toute une surface
de pixels contigus. Avant de simuler l'application du pot
de peinture en un point spécifique du rectangle,
nous devons interdire à la "peinture" de couvrir
les pixels noirs. La méthode mSetIndexedProtectedColor
autorise à définir une couleur de la palette
système comme limite à l'application du pot.
Si nous ne procédons pas ainsi, c'est le blanc que
l'objet contournera par défaut.
crapo(mSetIndexedProtectedColor, 255)
Nous pouvons maintenant choisir une couleur de remplissage.
La palette de Director (accessible par le menu Fenêtre)
nous aide dans notre choix puisqu'elle donne les équivalence
numérique de chaque couleur indexée.
crapo(mSetIndexedFillColor, 35)
Simulons maintenant un clic sur un pixel précis
à l'aide d'un pot de peinture . On sait que nous
devons nous limiter à la zone de travail initiale.
Pour identifier un point, nous avons placé la souris
au dessus du personnage, et avons demandé dans la
fenêtre message les coordonnées the mouseH,
the mouseV (put the mouseH). On passe à l'objet CRAPO
la méthode mFill avec ces deux coordonnées :
crapo(mfill, 82,172)
On recommence en un autre point, avec une autre couleur :
crapo(mSetIndexedFillColor, 9)
crapo(mfill, 118,127)
Parce que ces changements de couleurs ne concernent en
rien les sprites de Director, on les annule facilement :
updatestage
Si nous voulons conserver les changements effectués
pour afficher ultérieurement le coloriage par exemple,
nous devons passer à CRAPO la méthode mSave.
crapo(mSetIndexedFillColor, 9)
crapo(mfill, 118,127)
crapo(msave)
Dès lors, CRAPO mémorise le coloriage et
saura le restituer après effacement (méthode
mRestore).
updatestage
crapo(mRestore)
Après utilisation, on n'oubliera pas de libérer
la mémoire de notre objet en lui passant la méthode
mDispose :
crapo(mdispose)
Puis on fermera le fichier Xlib.
CloseXlib "Macintosh HD:desktop folder:Fill xobj"
L'Xobjet Fill (Mac ou PC) est téléchargeable
sur le site RedEye Software : http://www.duodenum.com/redeye/
|