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/