Ayuda! Me lío con los malditos bucles.

Hola. El otro día empecé a programar cosas por mi cuenta siguiendo los tutoriales de Plata. El caso es que me ha parecido todo bastante fácil, ya que este curso dimos C en informática. Y también dimos los bucles, cómo no, while, for, do... pero es que con la DS me lío con los bucles.

Por ejemplo, ayer estuve probando un programa. Lo que quiero que haga es que en la táctil te muestre un mensaje: "Toca la pantalla táctil", y que al tocarla el mensaje cambie a "Bien hecho!" y aparezca un sprite que tengo hecho de una mano así: [oki].

Y lo tengo hecho, y funciona, pero enseguida se peta y deja de mostrar el mensaje y el sprite y ya no va, mostrando únicamente el cursor.

El caso es que como al tocar la táctil el mensaje "Toca la pantalla táctil" no desaparecía, le mandé que antes de mostrar el nuevo "Bien hecho!" borrara todo el texto de la pantalla. Luego intenté hacer lo mismo con el Sprite [oki] pero me lo elimina una vez y ya al volver a pulsar no funciona.

Dejo aquí el código a ver si veis el fallo:

// Includes
#include <PA9.h>       // Include for PA_Lib
#include "gfx/all_gfx.h"
#include "gfx/all_gfx.c"

// Function: main()
int main(int argc, char ** argv)
{
   PA_Init();    // Initializes PA_Lib
   PA_InitVBL(); // Initializes a standard VBL
      
   //Iniciamos los fondos
   PA_EasyBgLoad(1,2,bg0); //Fondo de la pantalla superior

   
   //Iniciamos Textos
   PA_InitText(1,1);
   PA_InitText(0,0);
   
   PA_SetTextTileCol(1,3);
   PA_OutputSimpleText(1,20,1,"By Pruch");
         
   //Iniciamos la paleta
   PA_LoadSpritePal(0,0,(void*)paleta_Pal);
   
   //Creamos el sprite del cursor
   PA_CreateSprite(0,0,(void*)fairy_Sprite,OBJ_SIZE_32X32,1,0,50,50);
   
   //Lo animamos
   PA_StartSpriteAnim(0,0,0,1,8);
   
   
   // Infinite loop to keep the program running
   while (1)
   {
   
   PA_SetSpriteXY(0,0,Stylus.X-16,Stylus.Y-16);


      if (Stylus.Held)   
      {
         PA_ClearTextBg(0);
         PA_CreateSprite(0,1,(void*)ok_Sprite,OBJ_SIZE_64X64,1,0,50,50);
         PA_OutputSimpleText(0,5,1,"Bien hecho!");
      }                        
      else
      {
         PA_ClearTextBg(0);
         PA_OutputSimpleText(0, 5, 1, "Toca la pantalla");
         
      }         

      PA_WaitForVBL();
   }
   
   return 0;
} // End of main()

ej10.rar (57.11 KB)

programa en .nds
en esto no puedo ayudarte :-? lo siento
Vale, creo que acabo de darme cuenta yo solo xD

A ver si estoy en lo cierto,

while (1)
{

PA_SetSpriteXY(0,0,Stylus.X-16,Stylus.Y-16);


if (Stylus.Held)
{
PA_ClearTextBg(0);
PA_CreateSprite(0,1,(void*)ok_Sprite,OBJ_SIZE_64X64,1,0,50,50);
PA_OutputSimpleText(0,5,1,"Bien hecho!");
}
else
{
PA_ClearTextBg(0);
PA_OutputSimpleText(0, 5, 1, "Toca la pantalla");

}

PA_WaitForVBL();
}


Aquí el fallo está en que mientras presiono la pantalla, se van creando Sprites "ok.png" 60 veces por segundo, y si la presiono el tiempo suficiente, se peta la RAM y ya no caben más sprites en ella. Entonces tendría que crear el sprite fuera del bucle y en el momento del if (Stylus.Held) tendría que mostrarlo simplemente.

Ahora la pregunta es: ¿Cómo hago para que una vez creado el sprite al principio (antes del bucle) también esté oculto, y al entrar en el bucle y la condición verdadera, que lo muestre? Habrá algún comando para ello, ¿no?

Saludos y gracias!
   {
   
   PA_SetSpriteXY(0,0,Stylus.X-16,Stylus.Y-16);


      if (Stylus.Newpress)   
      {
         PA_CreateSprite(0,1,(void*)ok_Sprite,OBJ_SIZE_64X64,1,0,50,50);
         PA_OutputSimpleText(0,5,1,"Bien hecho!     ");
      }                       
      else if(Stylus.Released)
      {
         PA_DeleteSprite(0,1); //No se si se llama asi la funcion
         PA_OutputSimpleText(0, 5, 1, "Toca la pantalla");
      }         

      PA_WaitForVBL();
   }


Debería funcionar.
Oh, muchas gracias! Sí que funciona! :D

Lo que pasa es que no lo entiendo muy bien. Entonces el fallo estaba en "Stylus.Held" ? Tenía que poner "Stylus.Newpress" ?

Es que digo que no lo entiendo porque si lo haces así entonces mientras estás tocando la pantalla está creando Sprites constantemente, y sin embargo, con el newpress no se peta. ¿Por qué?


De todas formas, muchas gracias de nuevo :D
Si crea el sprite dentro de Stylus.Held, lo crea continuamente. Si lo hace en Stylus.Newpress solo lo crea en el momento de pulsar, además, justo cuando lo sueltas (Stylus.Released) lo borra.
Vale, no sabía esa diferencia entre Held y Newpress. Por cierto, ¿sabes dónde puedo encontrar una lista con todas esas funciones? Te lo agradecería mucho.

Ahora estoy rallándome con otra cosa. Si dejo el código como me has dicho, funciona, sí, pero el mensaje de "toca la pantalla" no aparece hasta que pulsas una vez y dejas de pulsar. Lo he invertido para que la condición falsa esté al principio y muestre el mensaje de primeras y ahora sí que funciona. El caso es que ahora me "estropea" los sprites y no sé por qué. Es decir, funciona todo correctamente, pero los sprites se ven mezclados y parpadeantes. :S

while (1)
{

PA_SetSpriteXY(0,0,Stylus.X-16,Stylus.Y-16);

if(Stylus.Held==0) // He tenido que usar el Held porque con el released no me lo muestra al principio hasta que no toco y suelto
{
PA_DeleteSprite(0,1);
PA_OutputSimpleText(0,5,1,"Toca la pantalla");
}

else if (Stylus.Newpress)
{
PA_CreateSprite(0,1,(void*)ok_Sprite,OBJ_SIZE_64X64,1,0,50,50);
PA_OutputSimpleText(0,5,1,"Bien hecho! ");
}


PA_WaitForVBL();
}



EDITO:

Vale, ya está corregido. Se trataba de poner el PA_OutputSimpleText(0,5,1,"Toca la pantalla"); fuera del bucle. Al final queda así y va perfecto:

// Includes
#include <PA9.h>       // Include for PA_Lib
#include "gfx/all_gfx.h"
#include "gfx/all_gfx.c"

// Function: main()
int main(int argc, char ** argv)
{
   PA_Init();    // Initializes PA_Lib
   PA_InitVBL(); // Initializes a standard VBL
      
   //Iniciamos los fondos
   PA_EasyBgLoad(1,2,bg0); //Fondo de la pantalla superior

   
   //Iniciamos Textos
   PA_InitText(1,1);
   PA_InitText(0,0);
   
   PA_SetTextTileCol(1,3);
   PA_OutputSimpleText(1,20,1,"By Pruch");
         
   //Iniciamos la paleta
   PA_LoadSpritePal(0,0,(void*)paleta_Pal);
   
   //Creamos el sprite del cursor
   PA_CreateSprite(0,0,(void*)fairy_Sprite,OBJ_SIZE_32X32,1,0,50,50);

   //Lo animamos
   PA_StartSpriteAnim(0,0,0,1,8);
   PA_OutputSimpleText(0,5,1,"Toca la pantalla");
   
   // Infinite loop to keep the program running
   while (1)
   {
   
   PA_SetSpriteXY(0,0,Stylus.X-16,Stylus.Y-16);
   
   
      if (Stylus.Newpress)
      {
         PA_CreateSprite(0,1,(void*)ok_Sprite,OBJ_SIZE_64X64,1,0,50,50);
         PA_OutputSimpleText(0,5,1,"Bien hecho!     ");
         
      }
         
      else if (Stylus.Released)   
      {
         PA_DeleteSprite(0,1);
         PA_OutputSimpleText(0,5,1,"Toca la pantalla");
      }                       
           

      PA_WaitForVBL();
   }
   
   return 0;
} // End of main()


Así queda el programa:


Gracias por la ayuda :D
(mensaje borrado)
naruto1994 está baneado por "Spam"
PRUC|-| escribió:Vale, no sabía esa diferencia entre Held y Newpress. Por cierto, ¿sabes dónde puedo encontrar una lista con todas esas funciones? Te lo agradecería mucho.


Si te refieres lo de Held, Newpress y Released, pues solo existen esas 3 [sonrisa] al menos respecto a pulsaciones. Puedes usarlas tanto con el Stylus como con cualquier botón de la DS (Pad.Held.A, Pad.Released.Up, etc) y para el Stylus también tienes Stylus.X y Stylus.Y para ver las coordenadas. Supongo que habrá más, yo ahora mismo solo recuerdo esas XD.

Salu2!
PRUC|-| escribió:Gracias por la ayuda :D

De nada.

Documentación de las última versión de PAlib.
http://palib.info/Doc/PAlibDoc%20Eng/modules.html
Alber_h escribió:
PRUC|-| escribió:Vale, no sabía esa diferencia entre Held y Newpress. Por cierto, ¿sabes dónde puedo encontrar una lista con todas esas funciones? Te lo agradecería mucho.


Si te refieres lo de Held, Newpress y Released, pues solo existen esas 3 [sonrisa] al menos respecto a pulsaciones. Puedes usarlas tanto con el Stylus como con cualquier botón de la DS (Pad.Held.A, Pad.Released.Up, etc) y para el Stylus también tienes Stylus.X y Stylus.Y para ver las coordenadas. Supongo que habrá más, yo ahora mismo solo recuerdo esas XD.

Salu2!


Gracias! Esto cada vez me gusta más xD

A ver si pasa selectividad de una vez y me puedo poner todo el día a programar sin remordimientos por no estar estudiando jajaja.
Saludos!
Ala PRUC|-|, ese ha sido tu mensaje número 500! XD

Mañana que tengo más tiempo libre te contesto al mensaje privado ;) esta noche me toca sesión de anime con mi novia xD.

Salu2!
Alber_h escribió:Ala PRUC|-|, ese ha sido tu mensaje número 500! XD

Mañana que tengo más tiempo libre te contesto al mensaje privado ;) esta noche me toca sesión de anime con mi novia xD.

Salu2!


Jajaja, a ti tampoco te falta mucho para los 500 xD

Qué viejos somos... [+risas] [qmparto]

Que vaya bien, hasta mañana :)
12 respuestas