Buenas a todos,
busco ayuda aquí porque de verdad que ya empiezo a estar desesperado. Resulta que empiezo con un par de sprites en pantalla animados desde el principio. NO los vuelvo a tocar desde entonces, pero lo cierto es que llega un momento en que uno de ellos se me empieza a poner loco sin motivo aparente. E insisto, no he vuelto a tocarlo, animarlo, ni moverlo por pantalla.
Éste es el código completo. Las funciones están por orden alfabético (manías mías :P), así que os vais a marear un poco siguiendo el código.
// Includes #include <PA9.h> // Include for PA_Lib //Include de los gráficos #include "gfx/all_gfx.c" #include "gfx/all_gfx.h" /*VARIABLES GLOBALES*/ //Variables de Luigi s32 luigi_x=(245-63)<<8; s32 luigi_y=(176-63)<<8; //Variables de Mario s32 mario_x=10<<8; s32 mario_y=(176-63)<<8; //Otras variables s8 acciones; //Acción seleccionada bool asegurarse; //Booleano para asegurarse de que se quiere realizar algo u16 comenzando; //Temporizador del inicio del juego bool martillo; //Booleano para cuando se usa el movimiento martillo s32 nubes_x=0<<8; //Movimiento de las nubes bool pensando; //Booleano para tomar la decisión bool turno_mario=true; //Turno de Mario bool turno_luigi; //Turno de Luigi /*FUNCIONES DEL JUEGO*/ void juego_nubes(void); void luigi(void); void luigi_decision(void); void mario(void); void seguro(void); void turno_comprobacion(void); void usar_martillo(void); // Function: main() int main(int argc, char ** argv) { PA_Init(); // Initializes PA_Lib PA_InitVBL(); // Initializes a standard VBL PA_InitText(1,0); PA_EasyBgLoad(0,3,battlebg); PA_EasyBgLoad(1,3,skybg); PA_EasyBgLoad(1,2,logo); PA_LoadSpritePal(0,0,(void*)battle_Pal); PA_CreateSprite(0,1,(void*)luigi_Sprite,OBJ_SIZE_64X64,1,0,luigi_x>>8,luigi_y>>8); //Éste es el sprite del problema PA_CreateSprite(0,0,(void*)mario_Sprite,OBJ_SIZE_64X64,1,0,mario_x>>8,mario_y>>8); PA_StartSpriteAnimEx(0,1,0,3,7,ANIM_UPDOWN,-1); //Animo el sprite PA_StartSpriteAnimEx(0,0,0,3,7,ANIM_UPDOWN,-1); /*No quitar mientras no haya música*/ for(comenzando==0; comenzando<=119; comenzando++) { PA_WaitForVBL(); } // Infinite loop to keep the program running while (1) { juego_nubes(); turno_comprobacion(); PA_WaitForVBL(); } return 0; } // End of main() /*MOVIMIENTO DE LAS NUBES*/ void juego_nubes(void) { nubes_x-=8; PA_EasyBgScrollX(1,3,nubes_x>>8); } /*TURNO DE LUIGI*/ void luigi(void) { PA_StartSpriteAnimEx(0,1,4,7,7,ANIM_UPDOWN,-1); //Última vez que animo el sprite PA_CreateSprite(0,3,(void*)commands_Sprite,OBJ_SIZE_32X32,1,0,197,81); pensando=true; while(turno_luigi==true) { luigi_decision(); seguro(); //usar_martillo(); PA_WaitForVBL(); } } /*LUIGI PIENSA QUÉ HACER...*/ void luigi_decision(void) { while(pensando==true) { if(Pad.Newpress.Right) acciones++; if(Pad.Newpress.Left) acciones--; if(acciones>3) acciones=0; else if(acciones<0) acciones=3; PA_SetSpriteAnim(0,3,acciones); if(Pad.Newpress.B && acciones==1) { pensando=false; asegurarse=true; martillo=true; acciones=0; } PA_WaitForVBL(); } } /*TURNO DE MARIO*/ void mario(void) { turno_mario=false; turno_luigi=true; } /*¿ESTÁS SEGURO DE QUE QUIERES HACER ESO?*/ void seguro(void) { if(asegurarse==true) { PA_CreateSprite(0,5,(void*)Bbutton_Sprite,OBJ_SIZE_32X32,1,0,53,145); PA_StartSpriteAnim(0,5,0,3,6); while(asegurarse==true) { if(Pad.Newpress.R) { asegurarse=false; martillo=false; pensando=true; } else if(Pad.Newpress.B) { asegurarse=false; PA_DeleteSprite(0,3); } PA_WaitForVBL(); } PA_DeleteSprite(0,5); } /*AL SALIR DE ESTE BUCLE (DA IGUAL QUE PULSE B O R), EMPIEZAN LOS PROBLEMAS GRÁFICOS DEL SPRITE*/ } /*COMPROBACIÓN DE QUIÉN ES EL TURNO*/ void turno_comprobacion(void) { if(turno_mario==true) { mario(); } else if(turno_luigi==true) { luigi(); } } /*USANDO EL MARTILLO*/ void usar_martillo(void) { while(martillo==true) { PA_WaitForVBL(); } }
Os indico con comentarios dónde suceden los problemas. He intentado volver a iniciar la animación en varios sitios, pero el problema sigue.
He aquí una captura del fallo:
Y lo más raro de todo, es que el otro sprite (mario) sigue perfectamente animado.
A ver si vosotros podeis ver qué es lo que pasa, porque yo no me explico este fallo :(.
Salu2, y gracias por adelantado.
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
Cuidadin con los deletes, si
Cuidadin con los deletes, si borras un sprite cuando ya se ha borrado se producen esos errores, tambien cuando borras el sprite y no detienes la animacion (bug palib), y es justo lo que estas haciendo con el sprite 5, mientras asegurarse== true, creas y borras el sprite continuamente, y pero en el momento en que es==false borras dos veces y no se detiene la animacion.
mejor intentaló asi:
a ver si asi te funciona :)
saludos!
Mi blog: http://creandomisvideojuegos.blogspot.com
Justo
Era eso, que borraba el sprite 5 sin detener la animación. Con pararla antes de borrarla, deja de hacer eso.
Gracias a todos ;)
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
Si eso era lo que te decia
Si eso era lo que te decia al principio XD
Ups
Pues yo te entendí que parase el sprite que bugueaba, no el 5, sorry.
Salu2
He estado toqueteando el código
de ese bucle y la conclusión que he sacado es que el problema lo da el sprite nº 5, puesto que si no lo elimino va todo correctamente, pero aún no sé cual puede ser la razón. ¿Es necesario ir creando sprites con los números de prioridad sucesivos?
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
la verdad es que así no veo
la verdad es que así no veo el error. Has probado de comentar todo el while principal? no se si podria ser causa de los whiles anidados...
Visita mi blog. Zenit + 5 will win
Eso pensaba...
pero el error desaparece cuando no elimino el sprite 5. Y no sé cuál puede ser la causa...
Has probado parar la
Has probado parar la animacion?:
PA_StopSpriteAnim(pantalla,sprite);
Ponlo despues del bucle que te da problemas ;).
Mi creacciónes particulares:
http://www.scenebeta.com/noticia/la-serpiente
http://www.scenebeta.com/node/22535