05 Rutinas de Joystick



int install_joystick(int type);
Inicializa el joystick y calibra el valor de la posici�n central. Debe llamar esto antes que cualquier otra funci�n de joystick, y deber�a asegurarse que el joystick est� centrado en ese momento. Devuelve cero si no hubo problemas. El par�metro type debe ser uno de estos valores:

JOY_TYPE_AUTODETECT
Intenta autodetectar el joystick instalado. En realidad no es posible distinguir entre todos las posibles configuraciones, por lo que esta rutina s�lo puede elegir el controlador de joystick est�ndar, Sidewinder o Gamepad Pro, pero usar� informaci�n del fichero de configuraci�n si �ste existe (el fichero puede ser creado usando la utilidad setup o llamando la funci�n save_joystick_data()), por lo que siempre puede usar JOY_TYPE_AUTODETECT en su c�digo y elegir el tipo de hardware exacto desde el programa setup.

JOY_TYPE_NONE
Controlador vac�o para m�quinas sin joystick.

JOY_TYPE_STANDARD
Un joystick normal de dos botones.

JOY_TYPE_2PADS
Modo de joystick dual (dos joysticks, cada uno con dos botones).

JOY_TYPE_4BUTTON
Activa los botones extra de un joystick de 4 botones.

JOY_TYPE_6BUTTON
Activa los botones extra de un joystick de 6 botones.

JOY_TYPE_8BUTTON
Activa los botones extra de un joystick de 8 botones.

JOY_TYPE_FSPRO
Joystick CH Flightstick Pro o compatible, que tiene cuatro botones, un mando de gases anal�gico, y un sombrero de 4 direcciones.

JOY_TYPE_WINGEX
Un Logitech Wingman Extreme, que deber�a funcionar con cualquier joystick compatible Thrustmaster Mk.I. Tiene soporte para cuatro botones y un sombrero. Esto tambi�n funciona con el Wingman Warrior, si conectas el conector de 15 pins (�desconecta el conector de 9 pins!) y si ajustas el peque�o interruptor de adelante a la posici�n "H" (sin embargo, no podr�s usar el mando de gases o el 'spinner').

JOY_TYPE_SIDEWINDER
El pad digital Microsoft Sidewinder (soporta hasta cuatro aparatos, cada uno con diez botones y un control digital de direcci�n).

JOY_TYPE_GAMEPAD_PRO
El Gravis GamePad Pro (soporta dos mandos, cada uno con diez botones y un control digital de direcci�n).

JOY_TYPE_SNESPAD_LPT1
JOY_TYPE_SNESPAD_LPT2
JOY_TYPE_SNESPAD_LPT3
Pads SNES conectados a los puertos LPT1, LPT2, y LPT3 respectivamente.

JOY_TYPE_WINGWARRIOR
El joystick Wingman Warrior.

Tan pronto como haya instalado el m�dulo de joystick, podr� leer el estado de los botones y la informaci�n de direcci�n digital (on/off), que puede ser suficiente para ciertos juegos. Sin embargo si quiere entrada anal�gica total, necesita usar las funciones calibrate_joystick() para medir el rango exacto de entrada: lea m�s abajo.

void remove_joystick();
Quita el controlador de joystick. Normalmente no hace falta llamar esto, porque allegro_exit() lo har� por usted.

int poll_joystick();
A diferencia del rat�n o el teclado, el joystick no es controlado por interrupciones, por lo que debe llamar esta funci�n una y otra vez para actualizar los valores globales de posici�n.

extern int num_joysticks;
Variables globales que indican el n�mero de joysticks activos. Los controlador actuales soportan un m�ximo de cuatro dispositivos.

extern JOYSTICK_INFO joy[n];
Array global de informaci�n de estado del joystick, que es actualizado por la funci�n poll_joystick(). S�lo el primer elemento num_joysticks tendr� informaci�n �til. La estructura JOYSTICK_INFO est� definida as�:

   typedef struct JOYSTICK_INFO
   {
      int flags;                       - biestable de estado de este joystick
      int num_sticks;                  - �cu�ntos joysticks activos?
      int num_buttons;                 - �cu�ntos botones?
      JOYSTICK_STICK_INFO stick[n];    - informaci�n de estado del stick
      JOYSTICK_BUTTON_INFO button[n];  - informaci�n de estado de los
                                         botones
   } JOYSTICK_INFO;

El estado de los botones es almacenado en la estructura:

   typedef struct JOYSTICK_BUTTON_INFO
   {
      int b;                           - biestable booleano on/off
      char *name;                      - descripci�n de este bot�n
   } JOYSTICK_BUTTON_INFO;

Puede ense�ar los nombres de los botones como parte de una pantalla de configuraci�n en la que el usuario elige qu� funci�n desempe�ar� cada bot�n en su juego, pero en situaciones simples puede asumir con seguridad que los dos primeros elementos del array button ser�n siempre los controles principales de disparo.

Cada joystick proveer� una o m�s entradas stick, de varios tipos. Estas pueden ser controles digitales que tienen siempre un valor espec�fico (ej. un gamepad, el sombrero del Flightstick Pro o Wingman Extreme, o un joystick normal que todav�a no ha sido calibrado), o pueden ser entradas anal�gicas con un rango suave de movimiento. Las palancas pueden tener un n�mero diferente de ejes, por ejemplo un controlador direccional normal tiene dos, pero el mando de gases del Flightstick Pro s�lo tiene un eje, y es posible que el sistema pueda ser expandido en el futuro para soportar controladores 3d. La entrada de la palanca est� descrita por la estructura:

   typedef struct JOYSTICK_STICK_INFO
   {
      int flags;                       - biestable de estado
      int num_axis;                    - �cu�ntos ejes tenemos?
      JOYSTICK_AXIS_INFO axis[n];      - informaci�n de estado del eje
      char *name;                      - descripci�n de este stick
   } JOYSTICK_STICK_INFO;

Un s�lo joystick puede proveer diferentes entradas de joystick, pero puede asumir con seguridad que el primer elemento del array stick ser� el controlador principal de direcci�n.

La informaci�n sobre los ejes del mando est� almacenada en la subestructura:

   typedef struct JOYSTICK_AXIS_INFO
   {
      int pos;                         - posici�n anal�gica del eje
      int d1, d2;                      - posici�n digital del eje
      char *name;                      - descripci�n de este eje
   } JOYSTICK_AXIS_INFO;

Esto se da tanto entrada digital en el campo pos (que va de -128 a 128 o de 0 a 255, dependiendo del tipo de control) como valores digitales en los campos d1 y d2. Por ejemplo, cuando describe la posici�n del eje X, el campo pos contendr� la posici�n horizontal de joystick, d1 ser� activado si mueves a la izquierda, y d2 ser� activado si mueves a la derecha. Allegro rellenar� todos estos valores sin importar el tipo de joystick que est� conectado, emulando el campo pos para joysticks digitales poni�ndolo a las posiciones m�nima, central y m�xima, y emulando los valores d1 y d2 con joysticks anal�gicos comparando la posici�n actual con el punto central.

El campo de biestables puede tener cualquier combinaci�n de los siguientes biestables de bit:

JOYFLAG_DIGITAL
Este control tiene entrada digital.

JOYFLAG_ANALOGUE
Este control tiene entrada anal�gica.

JOYFLAG_CALIB_DIGITAL
Este control ser� capaz de proveer entrada digital una vez sea calibrado, pero ahora no lo hace.

JOYFLAG_CALIB_ANALOGUE
Este control ser� capaz de proveer entrada anal�gica una vez sea calibrado, pero ahora no lo hace.

JOYFLAG_CALIBRATE
Indica que este control debe ser calibrado. Muchos dispositivos requieren m�ltiples pasos de calibraci�n, por lo que puede llamar la funci�n calibrate_joystick() desde un bucle hasta que esta biestable desaparezca.

JOYFLAG_SIGNED
Indica que la posici�n anal�gica est� en formato con signo, que va de -128 a 128. Este es el caso de todos los controles direccionales 2d.

JOYFLAG_UNSIGNED
Indica que la posici�n anal�gica est� en formato sin signo, que va de 0 a 255. Este es el caso de todos los mandos de gases 1d.

Nota para la gente que escribe diferente: en caso que no quiera escribir "analogue", hay varios #defines en allegro.h que le permitir�n escribir "analog" sin problemas.

char *calibrate_joystick_name(int n);
Devuelve una descripci�n textual del siguiente tipo de calibraci�n que ser� hecha en el joystick especificado, o NULL si no hace falta m�s calibraci�n.

int calibrate_joystick(int n);
La mayor�a de los joysticks deben ser calibrados antes de poder ser usados de forma anal�gica. Esta funci�n realiza la siguiente operaci�n en la serie de calibraci�n para el stick especificado, asumiendo que el joystick ha sido posicionado de la forma descrita por la llamada previa a calibrate_joystick_name(), devolviendo cero con �xito. Por ejemplo, una rutina simple para calibrar los joysticks puede ser as�:

      int i;

for (i=0; i<;num_joysticks; i++) { while (joy[i].flags & JOYFLAG_CALIBRATE) { char *msg = calibrate_joystick_name(i); printf("%s, y pulsa una tecla\n", msg); readkey(); if (calibrate_joystick(i) != 0) { printf("�oops!\n"); exit(1); } } }

int save_joystick_data(char *filename);
Despu�s de todos los dolores de cabeza al calibrar el joystick, no querr� que el pobre usuario tenga que repetir el proceso cada vez que ejecuta su programa. Llame esta funci�n para salvar los datos de calibraci�n del joystick en un fichero de configuraci�n especificado, que puede ser le�do por load_joystick_data(). Pase NULL como filename para escribir los datos en el fichero de configuraci�n seleccionado actualmente. Devuelve cero si no hubo problemas.

int load_joystick_data(char *filename);
Recupera los datos de calibrado previamente almacenados por save_joystick_data() o la utilidad setup. Esto ajusta todos los aspectos del c�digo de joystick: ni si quiera debe llamar initialise_joystick() si est� usando esta funci�n. Pasa NULL como filename para leer los datos del fichero de configuraci�n seleccionado actualmente. Devuelve cero si no hubo problemas: si falla, el estado del joystick queda indefinido y debe reinicializarlo desde el comienzo.




Volver al Indice