Creo que casi todos nos hemos fasciando con la jugabilidad que nos ofrece el mando de la wii. Por un lado porque nos da la oportunidad de jugar con la sensibilidad del mando y por otro porque podemos hacer gala de nuestra punteria mediante el puntero laser (IR) que nos brinda.
Este tutorial esta dirigido a todo aquel que quiere implementar el mando wii en sus juegos.
¿Que necesitamos?
- Un dispositibo de bluetooth.
- El mando de la wii (Wiimote)
- La libreria bluez (GNU/linux)
- CWiid package
Los Primeros pasos
Para empezar intentaremos entender como funciona el mando de la wii.
Una vez que nos conectamos al wiimote, iremos recibiendo paquetes de datos compuestos por 2 bytes. Cada bit de los byte recibidos señala el estado de los componentes del mando. Por ejemplo, imaginemos que hemos pulsado el boton "2" del mando... Recibiremos un paquete que contiene una tira de 16 bits. Como podemos observar en la tabla de valores de abajo, el boton "2" se corresponde con el valor decimal 2; el paquete que recibiremos sera:
(a1) 30 00 02
*NOTA: a1 quiere decir que es un dato de salida, 30 se refiere al canal que utiliza, y el resto de los bytes son los datos que nos interesa.
- Código: Seleccionar todo
Button Number (dec) Value (hex)
Two 1 0x0001
One 2 0x0002
B 3 0x0004
A 4 0x0008
...
Tabla de referencia aqui
De todas maneras siempre hay gente que nos hace la vida más facil. Todo esto que parece muy complicado se hace mucho más facil de entender con la libreria de c cwiid. Como lo podremos observar en el siguente ejemplo.
El ejemplo
El codigo que veremos en las siguentes lineas lo desarrolle para un juego en c que estoy realizando. En si lo que hacesmo es crear un hilo para el control del mando y cambiaremos el valor de una variable que hemos pasado mendiante un puntero. Aqui os dejo el codigo y sus respectivos comentarios :
- Código: Seleccionar todo
// Cabezeras necesarias por el programa
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <unistd.h> // Header file for sleeping.
#include <math.h> // Header file for sin/cos functions.
#include <stdio.h> // Header file for printf debugging.
#include <string.h>
#include "wiimote_thread.h"
#include "wiimote.h"
#include "wiimote_api.h"
// Hilo que interactuara con el mando de la wii (wiimote)
pthread_attr_t tattr;
pthread_t tid;
void *arg;
int ret;
// Estructura de datos de la libreria cwilib
wiimote_t wiimote;
wiimote_report_t rep
ort ;
// Declaracion de la funcion hilo que controla el wiimote
void *WiiControl(void *arg);
// Conectar a la wii
void Wii_conectar (float *x,float *y,float *z)
{
// Mediante la funcion wiimote_connect nos conectaremos al mando de la wii y conseguiremos un puntero a la estructura de los datos
// Sera necesario pasarle la direccion del mando
if (wiimote_connect(&wiimote, " 00:1A:E9:35:FA:12") < 0) {
fprintf(stderr, "imposible conectarse al wiimote: %s\n", wiimote_get_error());
exit(1);
}
// Creamos el hilo que controlara la entra y salida del wiimote.
// Le pasamo el puntero de y para poder modificar su valor mediane el mando.
ret = pthread_create(&tid, NULL,(void*) WiiControl,y);
// El mando de la wii al sincronizarse con el ordenador se enciende las luzes.
// De esta forma aseguramos que la luces se apagaran, que lo unico que hacen es gastar pilas :)
wiimote.led.one = 0;
}
// EL hilo
void *WiiControl (void *arg)
{
// recivimos el parametro enviado y hacemos un casting para conseguir tipo de dato que queremos (float).
float *p=(float *)arg;
// Intentamos abrir el wiimote
// Mientras este abierto realizar el siguente bucle
while (wiimote_is_open(&wiimote)) {
/*
La funcion wiimote_update sirve para sincronizar el objeto wii_mote
con el real. Es conveniente llamarlo lo maximo posible, para que el retardo
sea minima.
*/
if (wiimote_update(&wiimote) < 0) {
wiimote_disconnect(&wiimote);
}
// Cuando el boton arriba ha sido pulsado movemos nuestro objeto 5 pixeles para arriba
if ( wiimote.keys.up)
{
*p=*p-5;
}
// Cuando el boton abajo ha sido pulsado movemos nuestro objeto 5 pixeles para abajo
if ( wiimote.keys.down)
{
*p=*p+5;
}
// Entra cuando el boton home es pulsado en el wiimote
if (wiimote.keys.home)
wiimote_disconnect(&wiimote);
}
// Comparamos bit a bit (&) con los datos que recibimos en el objeto wiimote
// En el se encuentra los estados de cada boton en el mando
// En este caso si pulsamo en botton 1, activaremos el vibrador
if (wiimote.keys.bits & WIIMOTE_KEY_1) {
wiimote.rumble = 1;
}
// Si el boton 1 no ha sido pulsado desabilitamos el vibrador en el siguente update
else {
wiimote.rumble = 0;
}
// Hay muchas mas opciones pero por ahora creo que sera suficiente.
}
Para poder usar en nuestro programa tendremos que llamar a la funcion principal y pasarle los parametro que queramos modificar mendiante el mando de la wii :
- Código: Seleccionar todo
Wii_conectar(NULL,py,NULL);
En este caso le paso un puntero de y (float) desde mi programa principal, el cual quiero que se modifique con el mando de la wii.
Lo podremos llamar desde nuestro juego, pasarle el valor que quieres que cambie, el codigo hara el resto.
Conclusion
Mi primer tutorial para esta comunidad ! Espero que os sea de ayuda y que se alla entendido. En general dicen que soy malo explicando, espero que esta vez no sea asi :S
Mas información en wiili.org