Version Française English Version [ Xtras pour Macromedia Director ]  

Last Updates Last Updates
 
Xtras Xtras
o
o
o
o
o
3D-UDI
BinFileIO
Joystick
SetMouseLoc
PointInside...
 
Shockwave Demo Shockwave
 o
o
o
o
Jeu de la Vie
Arbre
The Legend of Zelda
Zelda Breakout
 
3D Lingo Lingo 3D
 o
o
o
o
Model Highlighter
Text On Screen
Text To Texture
Animated Texture
 
3D Lingo Lingo
 o


Save an image to disk
3D Lingo Divers
 o


Fichiers en vrac
3D Lingo Pogopixels - Widgets, Flash et logiciels web
 

Laurent Cozic,

Mis-à-jour le Thursday, 18 May, 2006


Xtra: 3D User Data Inspector

Xtra: BinFileIO -- Lecture et écriture de fichiers binaires

Xtra: Joystick -- Contrôle d'un joystick ou d'une manette de jeu

Xtra: SetMouseLoc -- Pour positionner le curseur de la souris

Xtra: PointInsidePolygon -- Vérifie qu'un point donné se trouve à l'intérieur d'un polygone donné

Vous trouverez sur cette page quelques Xtras gratuits pour Macromedia Director. Ils ont été conçus et testés sous Windows et devraient donc être entièrement compatibles avec ce système.

18/05/06 - Ces Xtras sont désormais "open source"

Comme je n'ai plus vraiment le temps d'améliorer ou de débugger ces Xtras j'ai décidé de les rendre open source sous la license GNU. Si vous souhaitez y jeter un oeil, les améliorations les plus demandées sont : la gestion de deux joysticks en simultané et la gestion du "point de vue" pour l'Xtra Joystick; ainsi que quelques corrections de bugs sur l'Xtra binFileIO (en particulier il semble qu'il y ait un bug aléatoire lors de la fermeture des fichiers). Les codes source auront peut-être besoin de quelques commentaires supplémentaires même si globalement ça devrait être compréhensible. Sinon n'hésitez pas à me contacter pour plus d'info. Chaque code source comprend également un fichier Director pour tester l'Xtra.


ShockwaveXtra 3D User Data Inspector

3D User Data Inspector est un Dcr-Xtra "cross-plateform" permettant de connaître les différentes valeurs de la propriété #userData pour tous les modèles, caméras et lumières d'un acteur 3D donné. Il construit une table facile à inspecter et met l'affichage à jour en temps réel. Le principal intérêt d'UDI étant de faciliter le débuggage de scènes utilisant beaucoup la propriété #userData (dans le cas d'un moteur de jeu par exemple).

Pour l'installer, copiez le fichier .dcr à la racine du répertoire Xtras de Director. UDI sera alors accessible via le menu Xtras de l'environnement développeur.

Télécharger 3D User Data Inspector (20Ko)


Xtra BinFileIO

BinFileIO permet de lire / écrire dans des fichiers binaires depuis Lingo. Il supporte la plupart des types de données (types "char", "short" et "long" signés et non-signés ainsi que les nombres à virgule flottante "float" et "double"), il peut également lire ou écrire d'un bloc des listes Lingo d'entiers ou de réels ou des chaînes de caractères.

Télécharger BinFileIO (120Ko)

Télécharger le code source de BinFileIO

Fonctions disponibles:

Nom Description Entrées Sortie
openFile Ouvre le fichier spécifié. <string> nom du fichier
<integer> mode:
1: ouverture en lecture seule
2: lecture / écriture
3: lecture / écriture. Si le fichier existe, son contenu sera écrasé avant d'être ouvert.
<symbol> résultat de l'opération:
#ok
#errorOpeningFile
closeFile Ferme le fichier. (pas d'entrée) <symbol> résultat de l'opération:
#ok
#errorClosingFile
readNumeric Lit une donnée de type numérique. <symbol> Type de donnée à lire:
#unsignedChar, #signedChar, #unsignedShort, #signedShort, #unsignedLong, #signedLong, #float, #double (1)
<integer ou float>valeur lue
ou, en cas d'erreur:
<symbol>code d'erreur:
#endOfFile,
#fileNotOpened
writeNumeric Ecrit une donnée de type numérique <symbol> Type de donnée à écrire:
#unsignedChar, #signedChar, #unsignedShort, #signedShort, #unsignedLong, #signedLong, #float, #double (1)
<integer> Donnée à écrire.
<symbol> résultat de l'opération:
#ok
#fileNotOpened
readChars Lit une chaîne de caractères. <integer> Taille de la chaîne à lire. <string> Chaîne lue
ou, en cas d'erreur:
<symbol> code d'erreur:
#endOfFile
#fileNotOpened
writeChars Ecrit une chaîne de caractères. <string> Chaîne à écrire.
<integer> Taille de la chaîne à écrire.
<symbol> Résultat de l'opération:
#ok
#fileNotOpened
readArray Lit un tableau d'entiers ou de réels et retourne une liste Lingo. <symbol> Type de donnée à lire:
#unsignedChar, #signedChar, #unsignedShort, #signedShort, #unsignedLong, #signedLong, #float, #double (1)
<integer> Nombre de données à lire.
<list> Liste contenant les données lues.
ou, en cas d'erreur:
<symbol> code d'erreur:
#endOfFile
#fileNotOpened
writeArray Ecrit une liste d'entiers ou réels. <symbol> Type de donnée à écrire:
#unsignedChar, #signedChar, #unsignedShort, #signedShort, #unsignedLong, #signedLong, #float, #double (1)
<list> Liste d'entiers ou de réels.
<integer> Taille de la liste.
<symbol> Résultat de l'opération:
#ok
#cantWriteToFile
#fileNotOpened
setPosition Déplace le curseur de lecture / écriture à la position spécifiée. <integer> Nouvelle position. <symbol> Résultat de l'opération:
#ok
#fileNotOpened
getPosition Retourne la position courante du curseur de lecture / écriture. (pas d'entrée) <integer> Position courante.
size Retourne la taille du fichier. (pas d'entrée) <integer> Taille du fichier.
eof Vérifie si le curseur de lecture / écritue se trouve à la fin du fichier. (pas d'entrée) <boolean>

(1)
Unsigned Char (1 octet) : pour des valeurs qui vont de 0 à 255
Signed Char (1 octet) : de -128 à 127
Unsigned Short (2 octet) : de 0 à 65535
Signed Short (2 octets) : de -35537 à 35568
Unsigned Long (4 octets) : de 0 à 4294967295
Signed Long (4 octets) : de -2147483648 à 2147483647
Float (4 octets) : de 1.5 x 10^-45 à 3.4 x 10^38
Double (8 octets) : de 5.0 x 10^-324 à 1.7 x 10^308

Exemple d'utilisation:

try = f.openFile(iFileName, 2) -- essaye d'ouvrir le fichier en mode lecture / écriture
if try = #ok then -- si l'ouverture réussie
   f.writeNumeric(#unsignedLong, 350) -- écrit un entier dans le fichier
   s = "une chaîne"
   f.writeChars(s, length(s)) -- écrit une chaîne dans le fichier
   uneListe = [1,2,3,4,5,6,7]
   f.writeArray(#unsignedLong, uneListe, uneListe.count) -- écrit une liste d'entiers dans le fichier
   f.setPosition(0) -- retourne au début du fichier pour les opérations de lecture
   put f.readNumeric(#unsignedLong) -- lit un entier
   -- Affiche "350"
   s = f.readChars(9) -- lit neuf caractères dans le fichier
   put s
   -- Affiche "une chaîn"
   f.setPosition(f.getPosition + 1) -- déplace le curseur d'un octet (saute le "e" de "une chaîne")
   put f.readArray(#unsignedLong, 7) -- lit une liste 7 entiers
   -- Affiche "[1,2,3,4,5,6,7]"
   try = f.closeFile() -- ferme le fichier
   if try <> #ok then
      Alert("Erreur à la fermeture du fichier.")
   end if
else
   Alert("Erreur lors de l'ouverture du fichier.")
end if


Xtra Joystick

Cet Xtra permet d'avoir accès à quelques fonctions simples pour contrôler un périphérique de jeu tel qu'un joystick ou une manette.

Télécharger l'Xtra Joystick (57Ko)

Télécharger le code source de l'Xtra Joystick (57Ko)

Fonctions disponibles:

Nom Description Entrées Sortie
useJoy Utilise le joystick spécifié pour la lecture des paramètres. <integer> Indice du joystick (de 1 à numberOfJoy) <boolean> Retourne TRUE si le joystick demandé est bien connecté au PC.
button Teste l'état d'un bouton. <integer> Indice du bouton (de 1 à buttouCount) <boolean> Etat du bouton (TRUE s'il est enfoncé, FALSE sinon)
xPos Teste la position X de l'axe analogique. (pas d'entrée) <integer> Position X (1ier axe)
yPos Teste la position Y de l'axe analogique. (pas d'entrée) <integer> Position Y (1ier axe)
zPos Teste la position Z de l'axe analogique. (pas d'entrée) <integer> Position Z (1ier axe)
rPos Teste la position X du 2ième axe analogique. (pas d'entrée) <integer> Position X (2ieme axe)
uPos Teste la position Y du 2ième axe analogique. (pas d'entrée) <integer> Position Y (2ieme axe)
vPos Teste la position Z du 2ième axe analogique. (pas d'entrée) <integer> Position Z (2ieme axe)
numberOfJoy Retourne le nombre de joysticks connectés au PC. (pas d'entrée) <integer> Nombre de joysticks.
buttonCount Retoune le nombre de boutons disponibles sur le joystick. (pas d'entrée) <integer> Nombre de boutons.
axeCount Retourne le nombre d'axes analogiques disponibles sur le joystick. (pas d'entrée) <integer> Nombre d'axes.


Xtra SetMouseLoc

Cet Xtra permet de positionner le curseur de la souris.

Télécharger l'Xtra SetMouseLoc (30 Ko)

Télécharger le code source de l'Xtra SetMouseLoc

Fonctions disponibles:

Nom Description Entrées Sortie
setMouseLoc Positionne le curseur relativement au "stage". <integer> Position X
<integer> Position Y
(Pas de sortie)
setMouseAbsoluteLoc Positionne le curseur relativement à l'écran. <integer> Position X
<integer> Position Y
(Pas de sortie)

Exemple d'utilisation:

-- NB: Les deux fonctions sont globales, il n'y a donc pas besoin de créer une nouvelle instance de SetMouseLoc
setMouseLoc(0,0) -- Positionne le curseur en haut à gauche du stage
setMouseLoc(the stageRight, the stageBottom) -- ... en bas à droite du stage
setMouseAbsoluteLoc(0,0) -- ... en haut à gauche de l'écran
setMouseAbsoluteLoc((the desktopRectList[1]).right, (the desktopRectList[1]).bottom) -- ... en bas à droite de l'écran


Xtra pointInsidePolygon

Cet Xtra vérifie si le point donné se trouve à l'intérieur du n-polygone donné. Il peut être utilisé, par exemple, pour détecter si un personnage se trouve dans une surface plane (de sorte que l'utilisation de modelUnderRay() puisse être évitée dans certains cas).

Télécharger l'Xtra PointInsidePolygon (45 Ko)

Télécharger le code source de l'Xtra PointInsidePolygon

Name Description Input Output
pointInsidePolygon Vérifie si le point donné se trouve à l'intérieur du polygone donné. <float ou integer> Coordonnée X du point
<float ou integer>
Coordonnée Y du point
<list>
Polygone [[x1,y1], [x2,y2], [x3,y3], etc.]
<Boolean> Résultat. TRUE si le point se trouve à l'intérieur du polygone.
pointInsidePolygonEC Même chose mais avec vérification des d'erreurs. <float ou integer> Coordonnée X du point
<float ou integer>
Coordonnée Y du point
<list>
Polygone [[x1,y1], [x2,y2], [x3,y3], etc.]
<Boolean> Résultat. TRUE si le point se trouve à l'intérieur du polygone;
ou <Symbol> Code d'erreur en cas d'erreur.

Attention: pour des raisons de performance, pointInsidePolygon() ne fait pas de vérification de type sur les paramètres - donc si l'un des paramètres n'est pas numérique, Director plantera avec une erreur fatale. En général, il n'y a pas de raison que ça arrive mais, pour plus de sécurité, il vaut mieux utiliser pointInsidePolygonEC() et la remplacer par pointInsidePolygon() plus tard, une fois que l'on est certain que la fonction reçoit les paramètres attendus.

Exemple:

-- Créé le polygone à partir d'un modèle #plan
planeModel.addModifier(#meshDeform)
v = planeModel.meshDeform.mesh[1].vertexList
polygon = [[v[2].x, v[2].y], [v[1].x, v[1].y], [v[3].x, v[3].y], [v[4].x, v[4].y]]
-- Ajoute la position absolue du modèle aux coordonnées du polygone pour obtenir sa position dans le monde
repeat with p in pPolygon
   p[1] = p[1] + planeModel.worldPosition.x
   p[2] = p[2] + planeModel.worldPosition.y
end repeat
-- Vérifie que le personnage est dans le polygone
characterPos = [characterModel.worldPosition.x, characterModel.worldPosition.y]
if pointInsidePolygon(characterPos[1], characterPos[2], polygon) then
   put "Le personnage est à l'intérieur du plan"
else
   put "Le personnage est à l'extérieur du plan"
end if


23/05/2003 - counter