// Estructura para el manejo de un Joystick struct CDIV_JOY { int left, // Control izquierda right, // Control derecha up, // Control arriba down; // Control abajo int num_buttons; // Número de botones int button[32]; // Estado del botón int num_sticks; //Número de palancas Analógicas/digitales struct CDIV_JOY_STICK stick[32];//Palancas Analógicas/Digitales }; // Estructura para palancas Analógicas/Digitales struct CDIV_JOY_STICK { int analogue; // Si es una palanca Analógica int num_axis; // Número de ejes Analógicos/Digitales struct CDIV_JOY_AXIS axis[32]; // Ejes Analógicos/Digitales }; // Estructura de eje para joysticks Analógicos/Digitales struct CDIV_JOY_AXIS { int pos; // Posición del Eje Analógico int d1, d2; // Posición del Eje Digital };
Antes de utilizar esta estructura deberá comprobar si hay joysticks disponibles mediante num_joysticks.
Esta estructura global sirve para controlar varios joysticks (palanca de juegos), hasta un total de 10; contiene una serie de campos lógicos relacionados con la programación de este dispositivo que son el estado de los botones (si se encuentran pulsados o no) y el estado de las cuatro direcciones de control principales.
Para acceder a estos campos se debe preceder el nombre del campo por la palabra joystick y el símbolo . (punto), por ejemplo, para acceder al campo left (que indica si se está pulsando el control izquierda) se debe utilizar joystick[0].left.
left - Este campo estará a 1 cuando el joystick esté orientado hacia izquierda, y 0 en caso contrario. right - Este campo estará a 1 cuando el joystick esté orientado hacia derecha, y 0 en caso contrario. up - Este campo estará a 1 cuando el joystick esté orientado hacia arriba, y 0 en caso contrario. down - Este campo estará a 1 cuando el joystick esté orientado hacia abajo, y 0 en caso contrario.
Por ejemplo, para realizar en un programa una acción cuando se mueva el joystick hacia la derecha (joystick[0].right) se debe incluir en el código una sentencia como la siguiente:
if (joystick[0].right){ // Acción a realizar (sentencias)
}
Para las posiciones en diagonal se deben comprobar los dos campos que conforman esa diagonal; por ejemplo, para realizar una acción cuando el joysticks esté en la diagonal superior derecha se utilizará la siguiente sentencia:
if (joystick[0].up AND joystick[0].right){ // Acción a realizar (sentencias)
}
button[] - Indican el estado de los botones del joystick, estando a 1 cuando el botón respectivo esté pulsado, y a 0 cuando no lo esté. por ejemplo:
if ((joystick[0].num_buttons > 1) AND joystick[0].button[0]){ // Acción a realizar (sentencias)
}
Algunos joystick sólo tienen 2 botones; en este caso, serán los botones número 0 y 1. Debe controlar en todo momento el número de botones que dispone el joystick utilizado ya que si al comprobar los botones si se sale de rango el programa aborta la ejecución del mismo irremediablemente.
stick[] - Son las palancas que tiene el joystick. Antes de utilizar esta estructura deberá comprobar si hay sticks disponibles mediante joystick[x].num_sticks donde x será el joystick que estamos utilizando.
Esta estructura contiene la variables:
- analogue : Nos informa si es una palanca analógica (1 si lo es y 0 si no). Aunque la palanca sea analógica se puede utilizar como una digital ya que simultáneamente se actualizarán los campos digitales y no al contrario.
- num_axis : Número de ejes que tiene la palanca.
// Estrutura para palanca Analógicas/Digitales struct CDIV_JOY_STICK { int analogue; // Si es una palanca Analógica int num_axis; // Número de ejes Analógicos/Digitales CDIV_JOY_AXIS axis[32]; // Ejes Analógicos/Digitales };
axis[] - Son los ejes de las palancas "stick" que tiene el joystick. Antes de utilizar esta estructura deberá comprobar si hay axis disponibles mediante joystick[x].stick[y].num_axis donde x será el joystick que estamos utilizando e y el número de stick que estamos accediendo.
Esta estructura contiene la variables:
- pos : Posición del eje Analógico.
- d1, d2 : Posición del eje digital.
// Estructura de eje para joysticks Analógicos/Digitales struct CDIV_JOY_AXIS { int pos; // Posición del Eje Analógico int d1, d2; // Posición del Eje Digital };
Ejemplo de manejo del stick[] de dirección el cual se actualiza, con las variables: left, right, up, down. Aquí lo vamos a manejar de forma directa usando el stick[0]:
if (!joystick[0].stick[0].analogue) { /* Ahora tenemos que comprobar individualmente cada posible movimiento * y actualizar las coordenadas del punto de mira. */ // Desplazamiento a la izquierda if (joystick[0].stick[0].axis[0].d1) if (x > 0) x--; // Desplazamiento a la derecha if (joystick[0].stick[0].axis[0].d2) if (x < 319) x++; // Desplazamiento arriba if (joystick[0].stick[0].axis[1].d1) if (y > 0) y--; // Desplazamiento abajo if (joystick[0].stick[0].axis[1].d2) if (y < 199) y++; } else { x += joystick[0].stick[0].axis[0].pos/40; y += joystick[0].stick[0].axis[1].pos/40; /* comprobando si los valores fueron positivos o negativos, * para saber la dirección del joystick. */ if (joystick[0].stick[0].axis[0].pos/40 < 0) write(0,0,0,0, "Izquierda"); if (joystick[0].stick[0].axis[0].pos/40 > 0) write(0,0,10,0, "Derecha"); if (joystick[0].stick[0].axis[1].pos/40 < 0) write(0,0,20,0, "Arriba"); if (joystick[0].stick[0].axis[1].pos/40 > 0) write(0,0,30,0, "Abajo") /* ¡ADVERTENCIA! Un joystick analógico se puede mover más de 1 píxel * a la vez y los controles que hicimos con la parte digital no * funciona porque los pasos de el punto de mira podría * saltar fuera de los límites. * Para evitar esto, comprobamos si el punto de mira se ha ido * fuera de la pantalla. Si es así, lo devolvemos al borde. */ if (x > 319) x = 319; if (x < 0) x = 0; if (y < 0) y = 0; if (y > 199) y = 199; }
Ver: Datos globales - num_joysticks