problema gestión de botones

Hola:

Estoy intentando hacer funcionar un pequeño ejemplo que pinta una serie de sprites en pantalla, luego al presionar uno de ellos nos lleva a una pantalla de espera en la que hasta que no pulsemos start, no se sigue adelante. Todo funciona correctamente, excepto el paso en el que se debe apretar el "start" que ni la máquina física, ni el DESMUME hacen nada, como si no se hubiese pulsado nada, es curioso ya que sólo me pasa con las teclas, porque el touchpad funciona muy bien. ¿Algún consejo?, os pongo aquí el trozo de código.

#include <PA9.h>

// PAGfxConverter Include
#include "gfx/all_gfx.h"
#include "gfx/all_gfx.c"

int main(void){

bool start = false;
bool tocado = false;
int valor;

PA_Init(); //PAlib inits
PA_InitVBL();

PA_InitText(0,1);
PA_OutputSimpleText(0,0,1,"Elige un tipo de juego...");

PA_LoadSpritePal(0, // Pantalla
0, // Numero de paleta
(void*)singleplayer_Pal); // Nombre de paleta

PA_CreateSprite(0, // Pantalla
0, // Numero de sprite
(void*)singleplayer_Sprite, // Nombre de sprite
OBJ_SIZE_32X32, // Tamaño de sprite
1, // Modo de 256 colores
0, // Numero de paleta
80, 70); // Posicion X e Y en la pantalla

PA_LoadSpritePal(0, // Pantalla
1, // Numero de paleta
(void*)multiplayer_Pal); // Nombre de paleta

PA_CreateSprite(0, // Pantalla
1, // Numero de sprite
(void*)multiplayer_Sprite, // Nombre de sprite
OBJ_SIZE_32X32, // Tamaño de sprite
1, // Modo de 256 colores
1, // Numero de paleta
130, 70); // Posicion X e Y en la pantalla

while(1) // Infinite loops
{
PA_WaitForVBL();

while (! tocado){

if (PA_SpriteTouched(0)==true){
PA_InitText(0,1);
PA_OutputSimpleText(0,0,1,"individual");
valor = 0;
tocado = true;
}else if (PA_SpriteTouched(1)==true){
PA_InitText(0,1);
PA_OutputSimpleText(0,0,1,"colectivo");
valor = 1;
tocado =true;
}/*else if (PA_SpriteTouched(2)==true){
PA_InitText(0,1);
PA_OutputSimpleText(0,0,1,"euskera");
valor = 2;
tocado = true;
}*/
}
PA_ClearBg(0,1);
PA_ResetSpriteSysScreen(0);

PA_InitText(1, 2);
PA_OutputSimpleText(1, 1, 2, "Bienvenido a TrivI/O! pulsa START para continuar...");

while (!start)
{
if (Pad.Newpress.Start)
{
start = true;
PA_ClearBg(1,1);
}
}


}

return 0;
}
}

Gracias, un saludo a todos.
De mi experiencia programando con las PALIB te sugiero una solución. Cuando hay problemas en detectar el input, lo más probable es que no se esté actualizando correctamente el "estado" de los botones. Que función realiza el update del estado? La función PA_WaitForVBL(). Debes llamar a ésta función en cada iteración del bucle que consulte el estado del input.
He probado a poner la funcion PA_WaitForVBL(), así que el código queda así:

...

while (!start)
{
PA_WaitForVBL();
if (Pad.Newpress.Start)
{
start = true;
PA_ClearBg(1,1);
}
}

En el emulador IDeas me funciona, pero en el DESMUME y en la máquina física no. ¿Por qué puede pasar ésto?

Gracias, un saludo.
2 respuestas