Anuncios Google

problema gestión de botones NDS

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.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Anabol

Acuérdate poner siempre en

Acuérdate poner siempre en todo while PA_WaitForVBL();

Salu2TS!

He probado a poner la funcion

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.

Imagen de Anabol

Aver que nos aclaremos.

El PA_WaitForVBL es el contador y tiene que ir al final del while.

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

Bueno he probado de las dos

Bueno he probado de las dos maneras, poniendo el wait arriba, abajo...incluso en ambos sitios y nada. Sólo me funciona en el Ideas...ahora es cuando me empiezo a desesperar oficialmente por  miedo a que sea a alguna configuración de librerias...no sé, es un suponer.

Imagen de Anabol

He estado revisando el código y tienes mal las condiciones.

Creo que tienes mal las condiciones, pero puede ser fallo mío.

 

Yo lo haría así:

#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_InitText(1,2);
 
    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){
 
while (tocado==false){ //Inicio while tocado
 
if (PA_SpriteTouched(0) && start==true){ //Inicio if 0
                PA_InitText(0,1);
                PA_OutputSimpleText(0,0,1,"individual");
                valor = 0;
                tocado = true;
} //Cerro if 0
 
else if (PA_SpriteTouched(1) && start==true){ //Abro if 1
                PA_InitText(0,1);
                PA_OutputSimpleText(0,0,1,"colectivo");
                valor = 1;
                tocado =true;
} //Cierro if 1
 
PA_WaitForVBL(); //Contador del while tocado
 
} //Cierro while tocado
 
PA_ClearBg(0,1);
 
PA_ResetSpriteSysScreen(0);
 
 
PA_OutputSimpleText(1, 1, 2, "Bienvenido a TrivI/O! pulsa START para continuar...");
 
    while (start==false){ //Inicio while start
 
        if (Pad.Newpress.Start){ //Inicio if 2
            start = true;
            PA_ClearBg(1,1);
        } //Cierto if 2
PA_WaitForVBL();
    } //Cierro while start
 
PA_WaitForVBL();
    } //Cierro while principal
 
    return 0;
} //Cierro función main

Ese código sería así pero no tiene mucho sentido...

 

El código que planteas

El código que planteas también es correcto, lo único en los if's que comprueba si se ha pulsado el sprite la condición debería ser:



if (PA_SpriteTouched(0) && start==false){ //Inicio if 0

(El start a false porque si no, no entraría en la condición por mucho que pulsasemos, ya que start esta inicializado como false).

 

A parte de ésto, he vuelto a probar recompilando de nuevo el código de la manera que tu propones pero sigue pasando lo mismo, funciona perfectamente en Ideas pero ya en Desmume y en la máquina física nada de nada.Triste

 

 



Imagen de Anabol

Pues ya estoy perdido.

No se que podría ser. Es que que funcione en uno y no en otro es cosa rarra...

Cuando tenga un rato intentaré compilarlo en mi PC con unos sprites del mismo tamaño.

Salu2TS!

Ok, la verdad que sigo

Ok, la verdad que sigo dándole vueltas y no hay manera. De cualquier manera, gracias por la atención.

 

Un saludo.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.