06 Rutinas de Joystick


int install_joystick(int type);
Inicializa el joystick y calibra el valor de la posición central. El parámetro typo debería ser, normalmente, JOY_TYPE_AUTODETECT, o mirar la documentación específica de la plataforma para tener una lista de los drivers disponibles. Debe llamar a esta rutina antes de usar cualquier otra función del joystick, y se debería asegurar que el joystick está en la posición central en ese momento. Devuelve cero si no ha habido problemas. Tan pronto como haya instalado el módulo de joystick, ya será capaz de leer el estado de los botones y la información digital(on/off) de la dirección, que puede ser suficiente para algunos juegos. Si quiere obtener una entrada totalmente analógica necesitará usar las funciones de calibrate_joystick() para medir el rango exacto de las entradas: lea más abajo.

Relacionado con: calibrate_joystick_name, poll_joystick, Variables de configuración estándar, JOY_TYPE_*/DOS, remove_joystick, load_joystick_data, calibrate_joystick.
void remove_joystick();
Quita el controlador de joystick. Normalmente no necesita llamar a esta rutina, porque allegro_exit() lo hará por usted.
Relacionado con: install_joystick, allegro_exit.
int poll_joystick();
El joystick no funciona por interrupciones, así que necesitará llamar a esta función una y otra vez para actualizar los valores globales de posición. Devuelve cero con éxito o un número negativo si hubo problemas (normalmente porque no había driver de joystick instalado).
Relacionado con: install_joystick, joy, num_joysticks.
extern int num_joysticks;
Variables globales que indican el número de joysticks activos. Los controlador actuales soportan un máximo de cuatro dispositivos.
Relacionado con: install_joystick, joy.
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;                       - 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;                           - estado del botón 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;                       - variable 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 solo 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 le 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 mueve a la izquierda, y d2 será activado si mueve 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.

La variable flags de la estructura joystick puede ser cualquier combinación de los siguientes bits:

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 este bit 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/joystick.h que le permitirán escribir "analog" sin problemas.

Relacionado con: calibrate_joystick_name, install_joystick, poll_joystick, num_joysticks, calibrate_joystick.
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.
Relacionado con: install_joystick, calibrate_joystick, joy, num_joysticks.
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 podría 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);
            }
         }
      }
Relacionado con: install_joystick, calibrate_joystick_name, joy, num_joysticks.
int save_joystick_data(const 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.
Relacionado con: load_joystick_data, set_config_file.
int load_joystick_data(const 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 reiniciarlo desde el comienzo.
Relacionado con: install_joystick, save_joystick_data, set_config_file.
int initialise_joystick();
Deprecado. Use install_joystick() en su lugar.
Relacionado con: install_joystick.

Volver al Indice