En el juego de las burbujas ya se va a empezar a usar más de un botón. Manejarlo así con el teclado ya no se hace tan bien, y por eso andaba yo metido en el tema de los joysticks. Ahora estoy haciendo un primer intento para que el emulador ya nos deje configurar los controles.
El problema de cómo hacer esto es interesante, hay muchas soluciones posibles. SDL permite varias maneras de identificar joysticks, y cada una puede tener sus ventajas e inconvenientes:
- Existen "IDs de instancia", que son siempre únicos (incluso para joysticks iguales), pero que pueden cambiar para un mismo joystick según cuándo se haya conectado.
- Existen "IDs únicos globales" (GUID), que identifican cada joystick siempre con el mismo número (incluso en sesiones distintas). Pero tienen el inconveniente de que dependen sólo del tipo de joystick y no pueden distinguir entre 2 joysticks iguales como el pack que yo me compré. Además parece ser que también hay marcas baratas que usan las mismas placas de otros joysticks y aunque para nosotros serán diferentes a SDL le parecerán el mismo.
- Existen los nombres que da cada joystick. Es un buen indicador para el jugador si los nombres son buenos (por ejemplo: "XBox 360 gamepad"). Pero hay muchos mandos barateros que no se molestan y sólo vienen nombres muy genéricos como "USB gamepad".
Mi solución va a ser que para cada tipo de joystick se pueda crear un perfil que asocie esos controles a los del mando de Vircon32. Cada perfil podrá tener nombre puesto por nosotros (que por defecto será el del joystick), pero identificará el joystick usando el GUID. Todo esto se guardará en un archivo de configuración para recordarlo entre sesiones. Después, a cada mando de Vircon (Player 1 a Player 4) se le podrá asociar alguno de estos perfiles para controlarlo.
Por otro lado está el teclado, que también tiene que poderse mapear al mando de Vircon. Y de hecho este caso es especial: es muy normal que si alguien no tiene joysticks, o está en un portátil, quiera usar 2 perfiles en el mismo teclado para jugar a dobles (lo típico: uno juega con las flechas y el otro con WASD).
Estoy en proceso de programar todo esto, y luego quedará ver cómo hacer la interfaz gráfica para ello.