[Ejemplo explicado]Usar el IR con el wiimote[Semi-tutorial]

siguiendo con el curso que empezo Rigle ;)

hoy os voy a poner un ejemplo de como acceder al ir y mover un cursor por la pantalla

vamos a usar la libreria GRRLIB.h y la wpad.h
libreria GRRLIB
font5.h de la libreria GRRLIB
un cursor.h creado con el conversor de png a .h de la libreria GRRLIB XD

os pego el código aquí comentadito con todo el detalle que se me ha ocurrido podía hacer falta, si hay dudas ya sabéis, podéis preguntar, pero no esperéis respuestas muy desarrolladas que yo también estoy empezando [sonrisa]

//includes varios
#include <stdlib.h>
#include <ogcsys.h>

//include para el wiimote
#include <wiiuse/wpad.h>

//include del grrlib
#include "GRRLIB.h"

//algunos graficos y fonts
#include "../gfx/cursor.h"
#include "../fonts/font5.h"


//inicializamos el buffer del grrlib
extern u16 *GRRLIB_buffer;

//int main(int argc, char **argv) {
int main() {
   
   //asignacion e inicio de variables
   u32 tipo;
   int ypos =0;
   int xpos =0;
   float angulo =0;

   //asignacion de los diferentes datos del mando a wiimote
   WPADData *wiimote;

   //asignamos memoria para el buffer
   GRRLIB_buffer=(u16 *)malloc(640*480*2);
   
   //inicializamos el video y el grrlib_video
   VIDEO_Init();
   GRRLIB_InitVideo ();
   
   //inicializamos los mandos y selecionamos el formato de los datos del mando 0
   WPAD_Init();
   WPAD_SetDataFormat(0, WPAD_FMT_BTNS_ACC_IR);

   //inicializamos el grrlib
   GRRLIB_Start();
   
   //rellenamos toda la pantalla de color azul en el buffer
   //la borramos xD
   GRRLIB_FillScreen(0x00f0);      
   
   //pasamos el buffer a la pantalla
   GRRLIB_Render();
   
   //esperamos el sincronismo
   VIDEO_WaitVSync();
   
   
   while(1) { //bucle principal
      GRRLIB_FillScreen(0x00f0);   //borramos el buffer    

            
      WPAD_ScanPads(); //miramos los valores de los wiimotes
            
      if(WPAD_Probe(0, &tipo) == WPAD_ERR_NONE) { // si el wiimote 0 no tiene errores seguimos
         wiimote = WPAD_Data(0); //asignamos los datos del wiimote 0
                  
         if(wiimote->ir.valid) //comprobamos que el puntero es valido
         {
         ypos = wiimote->ir.y; //asignamos la posicion y
         xpos = wiimote->ir.x; //asignamos la posicion x
         angulo = wiimote->ir.angle / 180 * 3.1415; //calculamos el angulo / 180 * PI
         
         // pintamos en la posicionx, posicion y del ancho del cursor, del alto del cursor, el cursor , el angulo de inclinacion y el alpha
         GRRLIB_DrawImg( xpos, ypos, cursor_width, cursor_high,cursor_img, angulo,1 );
         }
         else { //si el puntero no es valido muestra apunta a la pantalla xD
         GRRLIB_Print (230,300,font5_char_width,font5_char_high,"apunta a la pantalla",font5);
         
         }
                  
         //salir del programa si se pulsa el boton Home
         if(wiimote->btns_h & WPAD_BUTTON_HOME)
            {
            GRRLIB_FillScreen(0x0000);   //borramos el buffer ahora en negro ;)

            //imprime el mensaje al buffer
            GRRLIB_Print (280,200,font5_char_width,font5_char_high,"saliendo",font5);
            
            //saca el buffer por pantalla
            GRRLIB_Render ();
            
            //sale al HBC
            exit(0);
            }
         
      }
      else { //si el wiimote tiene errores puede ser que no este sincronizado, muestra mensaje
         GRRLIB_Print (65,300,font5_char_width,font5_char_high,"puede que el mando este apagado o no esta sincronizado",font5);
         }
      GRRLIB_Render (); //sacca el buffer a pantalla
      VIDEO_WaitVSync(); //espera al sincronismo de refresco
   }
   
   
   return 0; //si llegara hasta aqui saldria devolviendo 0, cosa que dudo xD
}


lo dicho no vale pegar y copiar en otros programas, al menos estudiarlo y modificarlo a vuestro gusto, pero no me seáis tan garrulos de copiar y pegar y no dar créditos del creador original ¬_¬

lo dicho los creditos de mi ejemplo
a los creadores de las librerias GRRLIB, wiiuse, libogc
a los creadores del devkitpro
a wanin , marcan y demás personajillos que no conozco y deberían de estar aquí [+risas]

un saludo
PD:
El codigo anterior es en su totalidad de mi puño y letra, habiendo estudiado los ejemplos que venian con el devkitpro. [bad]
si no sois capaces de compilarlo, lo decis por aqui y vemos que ocurre y si no proximamente os adjunto todos los files necesarios, pero si realmente estais intentando aprender deverias tener los minimos recursos para conseguir lo que hace falta [ginyo]

Edito para añadiros un fichero adjunto en el cual esta, la fuente5 ligeramente modificada para que salga en blanco sobre cualquier fondo y el cursor que he usado yo.
no seais muy criticos con el cursor, jajaja, al rotarlo se nota mucho el pixelado, pero vamos como dije es un ejemplo... no vale copiar y pegar
la fuente si, ya que no es mia, pertenece a las fuentes del GRRLIB.c pero lo modifique a blanca en vez de negra y el fondo se pinta transparente ....
La original es Negra con fondo blanco....

Wiimote.rar (5.23 KB)

font5.h y cursor.h
Muy buena iniciativa esta que habeis tenido de ir poniendo codigos con distintas funciones (imprimir texto, mover el wiimote, ...), sirve mucho para gente que esta empezando. En mi opinion lo mejor sin duda es aprender a base de sources y ver y estudiar muchos ejemplos.

Saludos.
Hace falta hacer esto
//asignacion de los diferentes datos del mando a wiimote
WPADData *wiimote;
y despues esto otra vez?
wiimote = WPAD_Data(0); //asignamos los datos del wiimote 0



Que quiere decir exactamente que el puntero es valido?
if(wiimote->ir.valid) //comprobamos que el puntero es valido
pho escribió:Hace falta hacer esto
//asignacion de los diferentes datos del mando a wiimote
WPADData *wiimote;
y despues esto otra vez?
wiimote = WPAD_Data(0); //asignamos los datos del wiimote 0



Que quiere decir exactamente que el puntero es valido?
if(wiimote->ir.valid) //comprobamos que el puntero es valido


La primera
//asignacion de los diferentes datos del mando a wiimote
WPADData *wiimote;
es para decirle algo asi como el formato de lo datos que tendra la variable wiimote

en la segunda
wiimote = WPAD_Data(0); //asignamos los datos del wiimote 0

ya le asignamos los valores de los datos que devuelve el pad 0
para luego leerlos de uno en uno ....

Que quiere decir exactamente que el puntero es valido?

que esta dentro de la pantalla y lo podemos dibujar, si no es valido tenemos que pasar o hace otra cosa, yo en el ejemplo muestro un mensaje que dice que apuntes a la pantalla :)

Un saludo
que es el IR?
no entendi mucho el codigo..... cual es la parte en la que se mueve el cursor con los sensores?
es estable el mando?
son todas mis dudas
pinopop escribió:que es el IR?

IR viene del ingles InfraRed pero las iniciales coinciden con Español InfraRojos


pinopop escribió:cual es la parte en la que se mueve el cursor con los sensores?

ypos = wiimote->ir.y; //asignamos la posicion y
xpos = wiimote->ir.x; //asignamos la posicion x
angulo = wiimote->ir.angle / 180 * 3.1415; //calculamos el angulo / 180 * PI

aqui lo que hacemos es asignarle a las variables que usamos para pintar el cursor, las posiciones a las que apunta el wiimote.
por lo que al pintar el cursor de nuevo este se encuentra donde esta apuntado el mando.

pinopop escribió:es estable el mando?

la estabilidad depende de tu pulso [carcajad] si se te mueve mucho el cursor temblará [+risas] [+risas]

Un saludo
Spirax
Hola,

Perdón por la pregunta de novato, intento compilarlo y me da esto:

:/projects/wii/pruebair/source/GRRLIB.c:23:20: warning: sdcard.h: No such file or directory

He estado mirando en wiibrew y googleando pero no se como conseguir la sdcard.h
El ejemplo HellowHold me funciona perfectamente.
He bajado GRRLIB y que copiado el contenido en el proyecto del devkitPro donde intento compilar tu ejemplo.

Gracias !
wiidmode escribió:Hola,

Perdón por la pregunta de novato, intento compilarlo y me da esto:

:/projects/wii/pruebair/source/GRRLIB.c:23:20: warning: sdcard.h: No such file or directory

He estado mirando en wiibrew y googleando pero no se como conseguir la sdcard.h
El ejemplo HellowHold me funciona perfectamente.
He bajado GRRLIB y que copiado el contenido en el proyecto del devkitPro donde intento compilar tu ejemplo.

Gracias !


Esa es la libreria de acceso a la sd que utiliza el grrlib, El las primeras lineas de tu GRRLIB.c veras el include con es libreria, la usa para una funcion oculta para hacer una captura de la pantalla y guardarlo en la tarjeta que esta al final del .c , puedes hacer dos cosas.

1.- en el adjunto esta la sdcard.h y el libsdcard.a que tengo yo.
copialos a c:\devkitpro\libogc\include y c:\devkitpro\libogc\lib\wii respectivamente

pero ten en cuenta que esta librería que adjunto es de mi devkitpro de windows, si usas linux no se si vale, que alguien lo confirme, please

2.- podrias comentar las lineas del GRRLIB.c ya que no vas a usar la captura de momento....
añade // delante del include de la sdcard.h
// #include <sdcard.h>


añade /* antes del void y */ al final para comentar la función entera
/**********************************************************************************
*
* The "hidden" ScreenShoter Routine is here ;)
*
***********************************************************************************/

/*
void GRRLIB_ScrShot(char* file){
    SDCARD_Init();
    sd_file *handle;
    handle = SDCARD_OpenFile(file, "w");
    SDCARD_WriteFile(handle, (u16*)GRRLIB_buffer, 640*480*2);
    SDCARD_CloseFile(handle);
}
*/     




*************

En el Makefile que yo uso para compilar lo enlazo a estas librerias ...
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS   :=   -lwiiuse -lbte -logc -lm



PD. ahora me has echo pensar, esta librería no viene con el libogc ¿de donde la saque yo y cuando?
gracias por este tuto!

ya podré seguir aprendiendo XD

EDIT:
PD. ahora me has echo pensar, esta librería no viene con el libogc ¿de donde la saque yo y cuando?



En el devkit 1.47 con el ppc r15 sí viene [sonrisa]
spirax escribió:
wiidmode escribió:Hola,

Perdón por la pregunta de novato, intento compilarlo y me da esto:

:/projects/wii/pruebair/source/GRRLIB.c:23:20: warning: sdcard.h: No such file or directory

He estado mirando en wiibrew y googleando pero no se como conseguir la sdcard.h
El ejemplo HellowHold me funciona perfectamente.
He bajado GRRLIB y que copiado el contenido en el proyecto del devkitPro donde intento compilar tu ejemplo.

Gracias !


Esa es la libreria de acceso a la sd que utiliza el grrlib, El las primeras lineas de tu GRRLIB.c veras el include con es libreria, la usa para una funcion oculta para hacer una captura de la pantalla y guardarlo en la tarjeta que esta al final del .c , puedes hacer dos cosas.

1.- en el adjunto esta la sdcard.h y el libsdcard.a que tengo yo.
copialos a c:\devkitpro\libogc\include y c:\devkitpro\libogc\lib\wii respectivamente
libsdcard.rar

pero ten en cuenta que esta librería que adjunto es de mi devkitpro de windows, si usas linux no se si vale, que alguien lo confirme, please

2.- podrias comentar las lineas del GRRLIB.c ya que no vas a usar la captura de momento....
añade // delante del include de la sdcard.h
// #include <sdcard.h>


añade /* antes del void y */ al final para comentar la función entera
/**********************************************************************************
*
* The "hidden" ScreenShoter Routine is here ;)
*
***********************************************************************************/

/*
void GRRLIB_ScrShot(char* file){
    SDCARD_Init();
    sd_file *handle;
    handle = SDCARD_OpenFile(file, "w");
    SDCARD_WriteFile(handle, (u16*)GRRLIB_buffer, 640*480*2);
    SDCARD_CloseFile(handle);
}
*/     




*************

En el Makefile que yo uso para compilar lo enlazo a estas librerias ...
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS   :=   -lwiiuse -lbte -logc -lm



PD. ahora me has echo pensar, esta librería no viene con el libogc ¿de donde la saque yo y cuando?


Gracias ... tema solucionado ... pero ahora aparece esto:

c:/projects/wii/pruebair/source/PruebaIR.c:12:31: error: ../gfx/cursor.h: No such file or directory
c:/projects/wii/pruebair/source/PruebaIR.c:13:32: error: ../fonts/font5.h: No such file or directory
c:/projects/wii/pruebair/source/PruebaIR.c: In function 'main':
c:/projects/wii/pruebair/source/PruebaIR.c:72: error: 'cursor_width' undeclared (first use in this function)

¿ Me faltan más librerías ?

Muchas gracias.
te faltan esos archivos...
...los tienes que convertir tú.

de eso se encargará él (de explicarnos como xD)
a la vez que conteste en el otro post las puse en el primer post, pero se me olvido comentarlo.

necesitas el cursor.h y el font5.h

wiidmode escribió:c:/projects/wii/pruebair/source/PruebaIR.c:12:31: error: ../gfx/cursor.h: No such file or directory


el cursor.h va en un directorio llamado gfx al mismo nivel que source
osea en tu directorio pruebair tienes que tener tambien el directorio gfx y dentro el cursor.h


wiidmode escribió:c:/projects/wii/pruebair/source/PruebaIR.c:13:32: error: ../fonts/font5.h: No such file or directory


el font5.h va en un directorio llamado fonts al mismo nivel que source
osea en tu directorio pruebair tienes que tener tambien el directorio fonts y dentro el font5.h

wiidmode escribió:c:/projects/wii/pruebair/source/PruebaIR.c: In function 'main':
c:/projects/wii/pruebair/source/PruebaIR.c:72: error: 'cursor_width' undeclared (first use in this function)


al no tener los ficheros anteriores con los headers, no reconoce una de las variables declaradas en ellos.
en este caso no encuentra la variable 'cursor_width' que es el ancho del cursor que esta puesto dentro de cursor.h
supongo que tendrias mas errores de estos, ya que tambien faltarian por declarar las varialbles de la fuente

wiidmode escribió:Muchas gracias.


de nada

Un saludo
Spirax

***************

Edito para añadir:

Rigle escribió:te faltan esos archivos...
...los tienes que convertir tú.


exactamente de eso se trataba, pero visto que es un ejemplo los he incluido para que probeis con los ficheros ya creados.

Rigle escribió:de eso se encargará él (de explicarnos como xD)


vale, pero no es tan difícil, [sonrisa]
si os bajáis el GRRLIB-v1.6 veréis que incluye varios directorios.
converter
examples
fonts
GRRLIB
GRRLIB_template

pues bien dentro del directorio converter, hay otros dos uno para usar en un servidor web con php y otro win32 donde esta el que ese puede usar en windows

si tienes linux y no tienes un web server [bad] puedes usar el converter online aqui
http://grrlib.santo.fr/tools/gfx_converter.php
Nota: si usas windows tambien puedes usar el online converter [sonrisa]

lo unico que hay que hacer si tienes windows es arrastar la imagen.png sobre el GfxConverter.exe y te creara un fichero en el mismo directorio con nombre.h

dentro de este, tendra definidas las variables,
const int nombre_high=
const int nombre_width=
const u16 nombre_img[]


que se usaran en el proyecto para saber la altura (_high) ancho (_width) y datos de la imagen (_img)

dos cosas
1.- la imagen tiene que ser RGB 24bits (USE ONLY RGB 24 bits PNG)
2.- procurar que la imagen no tenga con espacios en el nombre, no se si se abra tenido en cuenta, pero puede dar errores después al definir las variables si el nombre tiene espacios.

un saludo
Spirax
Gracias por todas las aclaraciones, realmente estoy muy pez en esto ...

Ahora el error que me da es este:

c:/projects/wii/pruebair/source/PruebaIR.c: In function 'main':
c:/projects/wii/pruebair/source/PruebaIR.c:75: error: too few arguments to function 'GRRLIB_Print'
c:/projects/wii/pruebair/source/PruebaIR.c:85: error: too few arguments to function 'GRRLIB_Print'
c:/projects/wii/pruebair/source/PruebaIR.c:96: error: too few arguments to function 'GRRLIB_Print'
make[1]: *** [PruebaIR.o] Error 1
"make": *** [build] Error 2

¿que raro no? No he tocado los parámetros de la función GRRLIB_Print del ejemplo ...
eso es que hay demasiadas "especificaciones" para eso...
...sobrará o faltará algo... (dentro de esa función)
wiidmode escribió:c:/projects/wii/pruebair/source/PruebaIR.c: In function 'main':
c:/projects/wii/pruebair/source/PruebaIR.c:75: error: too few arguments to function 'GRRLIB_Print'
c:/projects/wii/pruebair/source/PruebaIR.c:85: error: too few arguments to function 'GRRLIB_Print'
c:/projects/wii/pruebair/source/PruebaIR.c:96: error: too few arguments to function 'GRRLIB_Print'
make[1]: *** [PruebaIR.o] Error 1
"make": *** [build] Error 2

¿que raro no? No he tocado los parámetros de la función GRRLIB_Print del ejemplo ...


eso es porque estas usando una GRRLIB diferente y han debido de modificar la función o algo.....
yo lo hice con la v2.0 ;)

venga vaaaa ;)
os lo pongo completo

a ver si asi lo compilais ....

Wiimote.rar (21.05 KB)

source completo, con GRRLIB 2.0 y los otros ".h"


edito:
vale el proximo tutorial...
algunas funciones de la GRRLIB, jejeje
como sospechaba, esa funcion cambio de la v1.6. a la v2
en la v1.6 se usa
GRRLIB_Print(int x, int y, int xsize, int ysize,char* text,const u16 tdata[], int fg, int bg)

y en la nueva, no se le pasan los parametros fg (foreground color del texto) y bg (color del fondo)
los coge de la fuente.
GRRLIB_Print(int x, int y, int xsize, int ysize,char* text,const u16 tdata[])

en el archivo anterior va la GRRLIB.c y GRRLIB.h de la v2.0
Un saludo
Spirax
> "make"
linking ... pruebair.elf
output ... pruebair.dol

> Process Exit Code: 0
> Time Taken: 00:01

COMPILADO !!!!!!!!!!!! ;) Mi último problema era la versión del GRRLIB.c, había bajado la 1.6 y no la 2.0

Gracias!

Por cierto, que diferencia hay entre el .dol y el .elf ?
quisiera añadir k al pasar el cursor ensima de una imagen (boton) y al presionar A sobre la imagen se valla al homebrew channel ¿como lo hago?
muchas grax
Hmm... he visto que las funciones actuales te devuelven directamente las coordenadas, y no tienes que ir andando haciendo caralladas (semisuma de coordenadas y todo eso). Esa función... te devuelve las coordenadas en bruto o también suaviza el movimiento de alguna forma?

pinopop: para salir al menú del homebrew channel, la función a la que hay que llamar es exit(0) (creo)
pinopop escribió:quisiera añadir k al pasar el cursor ensima de una imagen (boton) y al presionar A sobre la imagen se valla al homebrew channel ¿como lo hago?
muchas grax


mal empezamos [snif]
no preguntas como se usa una función, ¿sino que quieres que te demos el código?
tienes que investigar un poquito ya que lo que estas preguntando es básico de programación y esto no es un curso de c [bad]
te voy a dar las guías básicas que tienes que seguir para hacerlo por ti mismo,
luego una vez que te pongas si no te funciona nos puedes poner tu código y preguntar que haces mal, pero pon un poquito de tu parte ;)

en mi ejemplo se vuelve al HBC al pulsar HOME
//salir del programa si se pulsa el boton Home
if(wiimote->btns_h & WPAD_BUTTON_HOME)

como pista solo te diré que si quieres salir con el A lo que tienes que comprobar es WPAD_BUTTON_A

si lo que quieres es salir al HBC al pulsar un botón en pantalla te cuento algo.
un botón en pantalla no lo pulsas NUNCA, lo que pulsas es un botón del mando y lo que haces es que cuando el cursor esta en una posición de pantalla especifica y pulsas el botón del mando haces algo y en este caso quieres salir.

lo que se hace es lo siguiente
tu sabes (por que lo has dibujado) donde se encuentra el botón y las coordenadas donde lo has pintado en la pantalla. hasta aquí correcto ¿no?
sabes el alto y el ancho del botón que has pintado ¿verdad?

pues lo que haces en tu programa es comprobar las coordenadas del puntero y cuando estas se encuentren en el espacio donde esta dibujado tu botón, entonces y solo entonces compruebas si se pulsa la tecla del mando que quieres usar y si se pulsa entonces sales.
si la pulsas en otro momento no sale por que solo lo compruebas cuando el cursor coincide con las coordenadas del botón....

por ejemplo si tu boton es de 10 de alto por 10 de ancho y esta dibujado en la posicion 70 , 50 de la pantalla harias algo asi

si la posicion "x" del wiimote es mayor que 70 y menor que (70 + ancho)
y ademas si posicion "y" del wiimote es mayor de 50 y menor que (50 +alto)
entonces comprueba si pulso la tecla
y si la pulso entonces sal

venga inténtalo y nos cuentas....

no quiero ser malo, solo quiero que aprendáis vosotros mismos a usar las funciones y no que os lo den todo echo.... [bad]
lo dicho si te atascas pon el codigo que usas y seguro que no solo yo si no que cualquiera te corrige si hay algo mal..... ;)


[quote="Moki_X"]
Hmm... he visto que las funciones actuales te devuelven directamente las coordenadas, y no tienes que ir andando haciendo caralladas (semisuma de coordenadas y todo eso). Esa función... te devuelve las coordenadas en bruto o también suaviza el movimiento de alguna forma?
[quote]

no se a que te refieres exactamente
la función te devuelve la posición real a la que apunta el wiimote.
no tienes que hacer cálculos de ningún tipo, salvo con el angulo y no en este caso lo hago para pasarselo a la GRRLIB
si lo que quieres es mover algo desde la posicion anterior a la actual lo tienes que mover tú
la funcion solo te dice donde esta actualmente el wiimote, por eso no entiendo a que te refieres con suavizar el movimiento.
sorry


un saludo
Spirax
Hola!!..
Primero que todo muchisimas gracias por hacer esto, ya voy a empezando..
Pero antes de empezar a ponerlo en prueba, quiero hacer un pequeño ejemplo para practicar a ver si ya soy un poco mejor en esto..
Y me surge una duda..
Como le digo al programa, que cuando se ponga sobre una posicion y espichen el boton a , se cambie de texto.. Asi?:
If(wiimote ->ir.y=pos-eje-y & wiimote ->ir.x=pos-eje-x)
{
if(wiimote->btns_h & WPAD_BUTTON_A)
{
GRRLIB_Print (230,300,font5_char_width,font5_char_high,"Hola, este es mi texto",font5);
}
}

//Fin


MUchas gracias de antemano..
Si lo logro, lo posteo aca por si a alguien mas le sirve xD..
spirax escribió:no se a que te refieres exactamente
la función te devuelve la posición real a la que apunta el wiimote.
no tienes que hacer cálculos de ningún tipo, salvo con el angulo y no en este caso lo hago para pasarselo a la GRRLIB
si lo que quieres es mover algo desde la posicion anterior a la actual lo tienes que mover tú
la funcion solo te dice donde esta actualmente el wiimote, por eso no entiendo a que te refieres con suavizar el movimiento.
sorry


un saludo
Spirax


Cuando salió la GRRLIB que daba soporte al wiimote, no existía la función que te devolvía las coordenadas x e y. Lo único que había era una función que te devolvía las coordenadas X e Y de cada punto de la barra sensora. Por eso tenías que hacer una semisuma de coordenadas. Pero veo que esto ya no es así.

A suavizar el movimiento del wiimote, me refiero a que tu cuando apuntas, no eres un robot y te tiembla la mano. Ese temblor se verá reflejado en la pantalla. ¿Hay alguna manera de "suavizar" ese temblor?
aver tengo este codigo
(wiimote->btns_h & WPAD_BUTTON_A ) && ( wiimote > xpos 200 & < 386 && wiimote > ypos 200 & < 267 )

y me da error en lo siguiente
c:/devkitPro/proyectos/Wiimote/source/template.c:83: error: expected identifier before '(' token

cual es mi error

PD no tengo muchos conocimientos de C apenas estoy empezando
Moki_X, por supuesto que hay formas de hacer eso, creo que no viene integrado en libogc pero es cuestion de echarle algo de imaginacion y un poco dematematicas. Puedes montarte una funcion que haga de interfaz entre la funcion de libogc que te devuelve la X e Y del puntero y tu programa. Esta funcion se encargaria de llamar a la funcion de libogc, aplicar un filtro segun la posicion actual y la de unos frames atras, haciendo (por ejemplo) que si la distancia entre el punto anterior y el actual es inferior a cierto radio r el cursor que te devuelve no coincida con la posicion actual del wiimote sino que sea una interpolacion de las posiciones entre los frames anteriores y el actual.
pinopop escribió:aver tengo este codigo
(wiimote->btns_h & WPAD_BUTTON_A ) && ( wiimote > xpos 200 & < 386 && wiimote > ypos 200 & < 267 )

y me da error en lo siguiente
c:/devkitPro/proyectos/Wiimote/source/template.c:83: error: expected identifier before '(' token

cual es mi error

PD no tengo muchos conocimientos de C apenas estoy empezando


el trozo completo de codigo es este?

if ((wiimote->btns_h & WPAD_BUTTON_A ) && ( wiimote > xpos 200 & < 386 && wiimote > ypos 200 & < 267 ) ) {

me refiero a si has puesto lo que esta en negrita, sino por eso esta mal =P
mira este es el codigo completo
if ((wiimote->btns_h & WPAD_BUTTON_A ) && ( wiimote > xpos 200 & < 386 && wiimote > ypos 200 & < 267 ) ){
GRRLIB_FillScreen(0x0000);
GRRLIB_Print (280,200,font5_char_width,font5_char_high,"saliendo....",font5);
GRRLIB_Render ();
exit(0);
}

lo que trato de hacer es k al pasar el puntero sobre una imagen, (ya la dibuje anteriormente) se produsca el codigo anterior, la imagen la dibije en x 200 e y 200 y la imagen tiene 186 x 67
en k me falla?

Ademas si alguien me puede explicar las funciones de la grrlib y como se aplica se lo agradeceria
grasias por la ayuda
pinopop escribió:mira este es el codigo completo
if ((wiimote->btns_h & WPAD_BUTTON_A ) && ( wiimote > xpos 200 & < 386 && wiimote > ypos 200 & < 267 ) ){
GRRLIB_FillScreen(0x0000);
GRRLIB_Print (280,200,font5_char_width,font5_char_high,"saliendo....",font5);
GRRLIB_Render ();
exit(0);
}

lo que trato de hacer es k al pasar el puntero sobre una imagen, (ya la dibuje anteriormente) se produsca el codigo anterior, la imagen la dibije en x 200 e y 200 y la imagen tiene 186 x 67
en k me falla?

Ademas si alguien me puede explicar las funciones de la grrlib y como se aplica se lo agradeceria
grasias por la ayuda


Creoq ue se cual es el fallo:

(wiimote > xpos 200 & < 386 && wiimote > ypos 200 & < 267)

Que se supone que pone ahi? xDD
Seria mas bien asi: (((wiimote->xpos > 200)&&(wiimote->xpos < 386))&&((wiimote->ypos >200)&&(wiimote->ypos < 267)))
La verdad es que te faltaba mas de un parentesis xD. Ademas las comparaciones solo tienen dos "argumentos" lo de antes y lo de despues. Vamos, que no puedes poner xpos < 200 & > 150 porque eso no es C, eso es mas bien castellano. En realidad tampoco estabas usando bien '&', pero eso es mas largo de explicar, mirate los operadores logicos en C.
ok grax !!!! perdon es k no se mucho de C apenas comence hace un mes pero hace unos dias con la libogc

Edito: me sale esto
c:/devkitPro/proyectos/Wiimote/source/template.c:83: error: 'WPADData' has no member named 'xpos'
c:/devkitPro/proyectos/Wiimote/source/template.c:83: error: 'WPADData' has no member named 'xpos'
c:/devkitPro/proyectos/Wiimote/source/template.c:83: error: 'WPADData' has no member named 'ypos'
c:/devkitPro/proyectos/Wiimote/source/template.c:83: error: 'WPADData' has no member named 'ypos'
c:/devkitPro/proyectos/Wiimote/source/template.c:83: error: expected ')' before '{' token
c:/devkitPro/proyectos/Wiimote/source/template.c:96: error: expected expression before '}' token
make[1]: *** [template.o] Error 1
"make": *** [build] Error 2
jajaja no se pide perdon por no saber hombre jeje. Todos hemos tenido que aprender alguna vez ;), aqui estamos para ayudar
pinopop escribió:mira este es el codigo completo
if ((wiimote->btns_h & WPAD_BUTTON_A ) && ( wiimote > xpos 200 & < 386 && wiimote > ypos 200 & < 267 ) ){
GRRLIB_FillScreen(0x0000);
GRRLIB_Print (280,200,font5_char_width,font5_char_high,"saliendo....",font5);
GRRLIB_Render ();
exit(0);
}

lo que trato de hacer es k al pasar el puntero sobre una imagen, (ya la dibuje anteriormente) se produsca el codigo anterior, la imagen la dibije en x 200 e y 200 y la imagen tiene 186 x 67
en k me falla?

Ademas si alguien me puede explicar las funciones de la grrlib y como se aplica se lo agradeceria
grasias por la ayuda


os dejo abandonaos unos dias por que se me jodio el pc y que me encuentro? XD
vas casi bien, pero te falla el codigo de comprobacion en c
wiimote es la lectura del mando completa por lo que la estas usando mal y xpos es la lectura que ya hemos echo nosotros por lo que la podemos usar directamente para comparar.

por lo cual lo que tenemos que comprobar es que xpos > 200 y a la vez xpos < 386
y con y pasa lo mismo

a ver te explico.
para comprobar las coordenadas seria asi
if(((xpos > 200) & (xpos < 386)) && ((ypos > 200) & (ypos < 267))) {

}


entre los corchetes iria el codigo que quieres ejecutar al validarse el resultado y estar dentro de las coordenadas....

una vez que esta dentro de las coordenadas lo que haces es que compruebe si se pulsa el boton A

if (wiimote->btns_h & WPAD_BUTTON_A ){

}


si te preguntas el porque en dos veces...
ejemplo practico
pintamos un boton con 4 rayas blancas :cool:

cuando el cursor este dentro de las coordenadas del boton cambiamos las rayas a amarillo y le damos una sacudida al mando [sonrisa]
comprobamos si pulsamos el boton A y si lo esta escribimos que lo hemos pulsao en tu caso si lo que querias era salir cambia la linea del Printf por exit(0)

aqui os pongo el codigo completo del template,
solo cambia la inclusion de un nuevo header el zlib.h, para usar la funcion usleep(numero) que es como una pausa(en nanosegundos)
la inclusion de una variable nueva llamada vibracion,
ya que la vibracion del mando hay que activarla y desactivarla, por lo que se activa una vez al entrar el boton y se mantiene desactivada hasta que se sale del boton y se vuelve a entrar.
y las funciones para pintar la linea GRRLIB_Line (x,y,x2,y2,color)

//includes varios
#include <stdlib.h>
#include <ogcsys.h>

#include <zlib.h>

//include para el wiimote
#include <wiiuse/wpad.h>

//include del grrlib
#include "GRRLIB.h"

//algunos graficos y fonts
#include "../gfx/cursor.h"
#include "../fonts/font5.h"


//inicializamos el buffer del grrlib
extern u16 *GRRLIB_buffer;

//int main(int argc, char **argv) {
int main() {
   
   //asignacion e inicio de variables
   u32 tipo;
   int ypos =0;
   int xpos =0;
   float angulo =0;
   int vibracion=0;

   //asignacion de los diferentes datos del mando a wiimote
   WPADData *wiimote;

   //asignamos memoria para el buffer
   GRRLIB_buffer=(u16 *)malloc(640*480*2);
   
   //inicializamos el video y el grrlib_video
   VIDEO_Init();
   GRRLIB_InitVideo ();
   
   //inicializamos los mandos y selecionamos el formato de los datos del mando 0
   WPAD_Init();
   WPAD_SetDataFormat(0, WPAD_FMT_BTNS_ACC_IR);

   //inicializamos el grrlib
   GRRLIB_Start();
   
   //rellenamos toda la pantalla de color azul en el buffer
   //la borramos xD
   GRRLIB_FillScreen(0x00f0);      
   
   //pasamos el buffer a la pantalla
   GRRLIB_Render();
   
   //esperamos el sincronismo
   VIDEO_WaitVSync();
   
   
   while(1) { //bucle principal
      
      GRRLIB_FillScreen(0x00f0);   //borramos el buffer    
      GRRLIB_Line (200 , 200, 386,200, 0xffff); //pintamos la linea superior del boton en blanco
      GRRLIB_Line (200 , 267, 386,267, 0xffff); //pintamos la linea inferior del boton en blanco
      GRRLIB_Line (200 , 200, 200,267, 0xffff); //pintamos la linea izquierda del boton en blanco
      GRRLIB_Line (386 , 200, 386,267, 0xffff); //pintamos la linea derecha del boton en blanco
   
      WPAD_ScanPads(); //miramos los valores de los wiimotes
            
      if(WPAD_Probe(0, &tipo) == WPAD_ERR_NONE) { // si el wiimote 0 no tiene errores seguimos
         wiimote = WPAD_Data(0); //asignamos los datos del wiimote 0
                  
         if(wiimote->ir.valid) //comprobamos que el puntero es valido
         {
         ypos = wiimote->ir.y; //asignamos la posicion y
         xpos = wiimote->ir.x; //asignamos la posicion x
         angulo = wiimote->ir.angle / 180 * 3.1415; //calculamos el angulo / 180 * PI

         if(((xpos > 200) & (xpos < 386)) && ((ypos > 200) & (ypos < 267))) {
            GRRLIB_Line (200 , 200, 386,200, 0xff0f);
            GRRLIB_Line (200 , 267, 386,267, 0xff0f);
            GRRLIB_Line (200 , 200, 200,267, 0xff0f);
            GRRLIB_Line (386 , 200, 386,267, 0xff0f);
            if (vibracion==0){
            WPAD_Rumble(0,1);
            usleep(60000);
            vibracion=1;
            WPAD_Rumble(0,0);
            }
            
               if (wiimote->btns_h & WPAD_BUTTON_A ){
               GRRLIB_Print (220,220,font5_char_width,font5_char_high,"apretando boton",font5);
               }

            }else vibracion=0;
            
         

         // pintamos en la posicionx, posicion y del ancho del cursor, del alto del cursor, el cursor , el angulo de inclinacion y el alpha
         GRRLIB_DrawImg( xpos, ypos, cursor_width, cursor_high,cursor_img, angulo,1 );
         
            
         
         
         }
         else { //si el puntero no es valido muestra apunta a la pantalla xD
         GRRLIB_Print (230,300,font5_char_width,font5_char_high,"apunta a la pantalla",font5);
         
         }
                  
         
                  
         //salir del programa si se pulsa el boton Home
         if(wiimote->btns_h & WPAD_BUTTON_HOME)
            {
            GRRLIB_FillScreen(0x0000);   //borramos el buffer ahora en negro ;)

            //imprime el mensaje al buffer
            GRRLIB_Print (280,200,font5_char_width,font5_char_high,"saliendo",font5);
            
            //saca el buffer por pantalla
            GRRLIB_Render ();
            
            //sale al HBC
            exit(0);
            }
         
      }
      else { //si el wiimote tiene errores puede ser que no este sincronizado, muestra mensaje
         GRRLIB_Print (65,300,font5_char_width,font5_char_high,"puede que el mando este apagado o no esta sincronizado",font5);
         }
      GRRLIB_Render (); //sacca el buffer a pantalla
      VIDEO_WaitVSync(); //espera al sincronismo de refresco
   }
   
   
   return 0; //si llegara hasta aqui saldria devolviendo 0, cosa que dudo xD
}


Un saludo
Spirax
grax era lo k me faltaba!! XD
ojala y se sigan haciendo cursos para programar tal como se hizo con el nds XD
y seria mejor un hilo de programacion en wii ¿no? (ya se k hay uno, pero esta mas abandonado k nada).
30 respuestas