|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Laurent Cozic, Mis-à-jour le Thursday, 18 May, 2006 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.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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
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. |
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
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 - |