Palib duda (otra)

Cada vez que dibujo un sprite de cualquier tamaño sale esto

Imagen

por que es problema de las palib
el source es este

#include <PA9.h>
#include "gfx/all_gfx.h"
#include "gfx/all_gfx.c"
#define suelo (160)

s8 face = 0;
s8 accion = 0;
s32 x = 5;
s32 y =160;

int main(int argc, char ** argv)
{
PA_Init();
PA_InitVBL();
PA_LoadSpritePal(0,0,(void*)cuadrado_Pal);




while (1)

         
   PA_CreateSprite(0, 0,(void*)cuadrado_Sprite,OBJ_SIZE_8X8,1,0,x,y);





if (!Pad.Held.B){x+=Pad.Held.Right-Pad.Held.Left;}
if (Pad.Held.B){x+=(Pad.Held.Right-Pad.Held.Left)*2;}
PA_SetSpriteXY(0,0,x,y);


   

PA_WaitForVBL();
}
return 0;}



y otra cosas como puedo hacer un salto?
Casi al final tienes esto:

if (!Pad.Held.B){x+=Pad.Held.Right-Pad.Held.Left;}
if (Pad.Held.B){x+=(Pad.Held.Right-Pad.Held.Left)*2;}
PA_SetSpriteXY(0,0,x,y);

Prueba a kitarle la ! de la primera linea del principio
entonces el codigo no serviria para nada por que no podria correr
El problema está aquí:

while (1)
{
         
   PA_CreateSprite(0, 0,(void*)cuadrado_Sprite,OBJ_SIZE_8X8,1,0,x,y);


Con esto estás haciendo que en cada vuelta del bucle principal del programa (o en cada fotograma) se cree un nuevo sprite igual que el anterior. Si la DS es capaz de mostrar 128 sprites por pantalla... 128/60... en algo más de dos segundos tienes la memoria de la DS reservada a esa pantalla a tope.
Puedes solucionarlo creando el sprite fuera del bucle ;).

Edito: en el mismo texto que aparece en la pantalla te lo dice bien claro...

Texto de la pantalla de la DS escribió:Lo siento, parece que no hay espacio suficiente para poner todos tus sprites !! Carga menos sprites, o usa PA CloneSprite o PA CreateGfx y PA CreateSpriteFromGfx para optimizar el espacio usado. También puedes usar sprites de 16 colores...


Salu2!
Muchisimas gracias

#include <PA9.h>
#include "gfx/all_gfx.h"
#include "gfx/all_gfx.c"

s8 face = 0;
s8 accion = 0;


int main(int argc, char ** argv)
{
PA_Init();
PA_InitVBL();
PA_LoadSpritePal(0,0,(void*)img1_Pal);
PA_InitText(0,1);

PA_CreateSprite(0, 0,(void*)img1_Sprite,OBJ_SIZE_64X64,1,0,56,65);

while (1)


PA_StartSpriteAnim(0,0,0, 5,5);


if ((accion == 0) && (face==0)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,0);};

if ((accion == 0) && (face==1)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,1);};

if (Pad.Released.Left){accion=0;face=0;};
if (Pad.Released.Right){accion=0;face=1;};



PA_WaitForVBL();
}
return 0;}



El problema aqui es que no se anima (resuelveme esto y ya podre publicar una beta muy verde)
pabloochan escribió:Muchisimas gracias

#include <PA9.h>
#include "gfx/all_gfx.h"
#include "gfx/all_gfx.c"

s8 face = 0;
s8 accion = 0;


int main(int argc, char ** argv)
{
PA_Init();
PA_InitVBL();
PA_LoadSpritePal(0,0,(void*)img1_Pal);
PA_InitText(0,1);

PA_CreateSprite(0, 0,(void*)img1_Sprite,OBJ_SIZE_64X64,1,0,56,65);

while (1)


PA_StartSpriteAnim(0,0,0, 5,5);


if ((accion == 0) && (face==0)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,0);};

if ((accion == 0) && (face==1)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,1);};

if (Pad.Released.Left){accion=0;face=0;};
if (Pad.Released.Right){accion=0;face=1;};



PA_WaitForVBL();
}
return 0;}



El problema aqui es que no se anima (resuelveme esto y ya podre publicar una beta muy verde)


Pues el fallo es similar al anterior, la función que anima el sprite se ejecuta en cada fotograma, por lo tanto la animación empieza de nuevo en cada fotograma, lo que hace que el sprite se quede siempre igual.
Tienes varias opciones: ponerlo fuera del bucle, pero solo se animaría una vez, al iniciar el programa; ponerle un if delante para que se ejecute solo al pulsar un boton o al tocar la pantalla tactil (con un newpress) o al pulsar el sprite (SpriteTouched()).

Espero que te sirva de ayuda, salu2!
#include <PA9.h>
#include "gfx/all_gfx.h"
#include "gfx/all_gfx.c"

s8 face = 0;
s8 accion = 0;


int main(int argc, char ** argv)
{
PA_Init();
PA_InitVBL();
PA_LoadSpritePal(0,0,(void*)img1_Pal);
PA_InitText(0,1);

PA_CreateSprite(0, 0,(void*)img1_Sprite,OBJ_SIZE_64X64,1,0,56,65);

while (1)





if ((accion == 0) && (face==0)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,0);};

if ((accion == 0) && (face==1)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,1);};

if (Pad.Released.Left){accion=0;face=0;};
if (Pad.Released.Right){accion=0;face=1;};



PA_WaitForVBL();
}
return 0;}




si lo dejo asi no deberia  ir
pabloochan escribió:
#include <PA9.h>
#include "gfx/all_gfx.h"
#include "gfx/all_gfx.c"

s8 face = 0;
s8 accion = 0;


int main(int argc, char ** argv)
{
PA_Init();
PA_InitVBL();
PA_LoadSpritePal(0,0,(void*)img1_Pal);
PA_InitText(0,1);

PA_CreateSprite(0, 0,(void*)img1_Sprite,OBJ_SIZE_64X64,1,0,56,65);

while (1)





if ((accion == 0) && (face==0)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,0);};

if ((accion == 0) && (face==1)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,1);};

if (Pad.Released.Left){accion=0;face=0;};
if (Pad.Released.Right){accion=0;face=1;};



PA_WaitForVBL();
}
return 0;}




si lo dejo asi no deberia  ir


Si es una pregunta, yo creo que sí que iría
joer, con la letraja del code no lo veia bien. No irá por esto:

if ((accion == 0) && (face==0)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,0);} --> ; <--

if ((accion == 0) && (face==1)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,1);} --> ; <--

if (Pad.Released.Left){accion=0;face=0;} --> ; <--
if (Pad.Released.Right){accion=0;face=1;} --> ; <--


después de las llaves no tienes que poner los ;

ahora creo q si está
los quite y sigue sin animarse ahora el code esta asi

#include <PA9.h>
#include "gfx/all_gfx.h"
#include "gfx/all_gfx.c"

s8 face = 0;
s8 accion = 0;
s32 x = 5;
s32 y =100;

int main(int argc, char ** argv)
{
PA_Init();
PA_InitVBL();
PA_LoadSpritePal(0,0,(void*)img1_Pal);
PA_InitText(0,1);
PA_CreateSprite(0, 0,(void*)img1_Sprite,OBJ_SIZE_64X64,1,0,x,y);
PA_StartSpriteAnim(0,0,0, 5,5);
while (1)







if ((accion == 0) && (face==0)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,0);};

if ((accion == 0) && (face==1)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,1);};

if (Pad.Released.Left){accion=0;face=0;}
if (Pad.Released.Right){accion=0;face=1;}
if (Pad.Newpress.Left){accion=0;face=0;}
if (Pad.Newpress.Right){accion=0;face=1;}


if (!Pad.Held.B){x+=Pad.Held.Right-Pad.Held.Left;}
if (Pad.Held.B){x+=(Pad.Held.Right-Pad.Held.Left)*2;}
PA_SetSpriteXY(0,0,x,y);


PA_WaitForVBL();
}
return 0;}





if ((accion == 0) && (face==0)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,0);}; <<-

if ((accion == 0) && (face==1)){PA_StartSpriteAnim(0,0,0, 5,5);PA_SetSpriteHflip(0,0,1);}; <<-

siguen estando...

PA_SetSpriteHflip(0,0,1); esta funcion para q es?
lo copie mal,no tiene el punto y coma pero, sigue sin ir , ea funcion sirve para rotar el sprite
pabloochan escribió:lo copie mal,no tiene el punto y coma pero, sigue sin ir , ea funcion sirve para rotar el sprite

Para rotar de manera horizontal =D
prueba a ejecutar antes la función de rotar el sprite y luego la de animarlo
Haber, en in if NUNCA pongas que si una variable es igual a lo que sea... para algo está el switch y el case(y el default). Expongo su uso:

s8 variable = 3; //creamos la variable

switch(variable) //hacemos el comando switch y metemos entre paréntesis la variable que metemos en la condicional
{
case 1 //si el valor es 1...
PA_OutputSimpleText(1,0,0,"La variable es 1");
break;

case 2: //si el valor es 2...
PA_OutputSimpleText(1,0,0,"La variable es 2");
break;

case 3: //si el valor es 3...
PA_OutputSimpleText(1,0,0,"La variable es 3");
break;

default: //si no es ninguna de las anteriores...
PA_OutputSimpleText(1,0,0,"Ninguna es correcta.");
break;
}

Aclaro que el break es para que rompa la cadena, es decir, que si el valor de "variable" es 1, y en el case 1 no hay break, hace el case 1 y acto seguido continúa hacia el case 2... En resumen, únicamente hace una función si le ponemos el break, sin break es como si no hubieran case, es decir, que el case 2, por ejemplo, es como si se uniera al case 1... Si te haces un lío sorry =D
ya peros si lo que hay es que usar dos variables a la vez?
Pues dentro de un case pones otro switch y ya está ._.
pero el switch gasta más recursos que el if, no??
alexpowerup escribió:Haber, en in if NUNCA pongas que si una variable es igual a lo que sea... para algo está el switch y el case(y el default).


Bueno... tanto como nunca... no estoy de acuerdo. Depende del uso que le vayas a dar y de lo que le parezca más cómodo a cada uno. Por ejemplo para hacer un menú a mi me parece mucho más comodo utilizar un switch que unos cuantos ifs, pero quizá en otras ocasiones no venga igual de bien, como por ejemplo en ésta, que tiene que anidar un switch dentro del principal y para eso pues veo mejor usar ifs, pero lo dicho, según la comodidad que le vea cada uno. En cuanto a si consume más o menos, la verdad es que no lo sé.

Salu2!
al final conseguiste que fuese el programa, pabloochan ??
la verdad es que no y aparte ahora no puedo programar porqu estoy en el campo que no hay internet asi que asta dentro de un tiempo parare.Gracias
Entonces tienes una conexión extrasensorial con Internet, ¿no?
no pero cuando estoy en casa de un amigo(como ahora) pues me conecto un momentillo
23 respuestas