31. Añadiendo soporte de joystick

Casi cualquier biblioteca de juegos nos permitirá usar un joystick, o un gamepad, o un volante. En general, todos ellos se manejan básicamente igual: podremos saber si se ha inclinado en una dirección u otra (tendremos varios "ejes"), así como si se ha pulsado algún botón.

En el caso de SDL, que es la librería que usa nuestro juego "por debajo", existe una función "GetAxis", que nos dice cómo de inclinado está un eje, desde 0 (sin inclinar) hasta 32767 (totalmente inclinado en un sentido) o -32768 (totalmente inclinado en sentido contrario). Si se tratara de un joystick digital, en vez de analógico, no obtendríamos valores intermedios.

En nuestro juego, no necesitamos saber si está muy inclinado o poco inclinado, sino que nos basta saber si se ha pedido mover el personaje hacia un lado u otro, así que podemos ampliar la clase Hardware para crear funciones "JoystickDerecha" y similares, que podrían ser algo así: (no te preocupes si no entiendes por completo esta función, o el resto de la clase Hardware, que están más allá del propósito del curso en este punto)

public static bool JoystickDerecha()
{
    // Si no hay joystick, no hay más que hacer
    if (! existeJoystick)
        return false;
 
    // Leo valores (-32768 a 32767)
    int posX = Sdl.SDL_JoystickGetAxis(joystick, 0);
    if (posX > 16000)
        return true;
 
    // Si el valor del joystick no es suficiente, 
    // supongo que no se ha movido
    return false;
}
 

La función "ComprobarTeclas" del juego, aplicando estas nuevas funciones, sería algo como:

if ((Hardware.TeclaPulsada(Hardware.TECLA_DER) 
    || Hardware.JoystickDerecha())
    && EsPosibleMover(personaje.x + personaje.incrX, personaje.y, 
            personaje.x + personaje.ancho + personaje.incrX, 
            personaje.y + personaje.alto))
        personaje.x += personaje.incrX;

De forma parecida, podríamos crear una función "JoystickPulsado" en la clase Hardware, que permitiera comprobar si se ha pulsado un cierto botón

int posX = Sdl.SDL_JoystickGetAxis(joystick, 0);

Puedes descargar el juego completo, incluyendo fuentes, proyecto, imágenes y ejecutable, para probar los cambios por ti mismo.

Ejercicio propuesto: Mejora esta versión del juego, para que se pueda usar el joystick también para entrar al juego y para salir de las pantallas de créditos, etc.