Wiimote en nuestro juegos

Solicite, consulte o publique recursos de referencia para desarrolladores.

Wiimote en nuestro juegos

Notapor tamax » Lun Nov 05, 2007 10:53 pm

Introducciòn

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
tamax
 
Mensajes: 8
Registrado: Dom Nov 04, 2007 7:55 pm

Notapor rcaf » Mar Nov 06, 2007 3:33 am

Excelente! :D

Lastima que no tenga aun la consola Wii :(

Saludos!
Roberto Albornoz Figueroa
Mi Blog
Wiki
Avatar de Usuario
rcaf
 
Mensajes: 71
Registrado: Jue Ago 10, 2006 4:35 am
Ubicación: Concepción, Octava Región. Chile

Notapor tamax » Mar Nov 06, 2007 7:22 am

Yo tampoco tengo la wii :P
Solo tengo el mando jajaja, aki lo compre por 40 €
tamax
 
Mensajes: 8
Registrado: Dom Nov 04, 2007 7:55 pm

Notapor lacabra25 » Sab Abr 12, 2008 9:14 pm

Yo me he perdido un poco, soy un tannto nuevo programando, los perifericos solo los he podido controlar con funciones (como las de SDL o con macros como getchar) aun nunca de forma "directa" por su direccion ni nada de eso ¿el bluetooth es al que accedes en c o por el bluetooth accedes directo al mando? ¿tienes eso en pdf un poco mas extenso y mas de nivel principiante? ¿se podria hacer lo mismo que con el mando de la wii con otros mandos o cosas como el mando de la game cube o con un mando de tele viejo que ya no lo uso para la tele?

El manual parece interesante, la pena es que parece estar algo lejano al nivel principiante. :oops:
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

wiimotionplus

Notapor darkpaez » Mié Jul 29, 2009 7:10 pm

Hace poco que ha salido el motionplus y los chicos de cwiid ya lo tienen implementado. Bueno a lo que iba, estoy tratando de ser capaz de usar los tres nuevos valores que proporciona el nuevo juguete, si alguien lo sabe o le interesa el tema que se ponga en contacto conmigo.

PD: Por ahora el nunchuck y motionplus no funciona a la vez supongo que tatarán de solucionarlo
darkpaez
 
Mensajes: 2
Registrado: Mar Feb 05, 2008 12:55 pm

Notapor shackra » Sab Sep 05, 2009 11:47 pm

seria bueno tener una version del paquete del control del Wii para Pygame =)
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Notapor shackra » Sab Sep 05, 2009 11:56 pm

seria bueno tener una version del paquete del control del Wii para Pygame =)
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Notapor endaramiz » Lun Sep 07, 2009 10:30 am

shackra escribió:seria bueno tener una version del paquete del control del Wii para Pygame =)
Intenta contactar con los desarrolladores para comentárselo.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Re: Wiimote en nuestro juegos

Notapor sing88 » Dom Ago 29, 2010 10:31 pm

sniffffffffffff tampoco tengo nintendo Wiiii sniffffffffffff
sing88
 
Mensajes: 3
Registrado: Vie Ago 27, 2010 12:12 am

Re: Wiimote en nuestro juegos

Notapor Juanxo » Dom Ago 29, 2010 10:53 pm

aunque sea offtopic, no te hace falta la wii, solo los mandos y un adaptador USB y puedes hacer juegos con el mando de la wii para el ordenador
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)


Volver a Artículos, traducciones y documentación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron