Anuncios Google

Error extrañísimo de gráficos [SOLUCIONADO]

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.


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 copete23

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:

 

void seguro(void)
{
   if(asegurarse==true)
   {
if(sprite5creado==false){
      PA_CreateSprite(0,5,(void*)Bbutton_Sprite,OBJ_SIZE_32X32,1,0,53,145);
      PA_StartSpriteAnim(0,5,0,3,6);
sprite5creado=true;
}
      while(asegurarse==true)
      {
         if(Pad.Newpress.R)
         {
            asegurarse=false;
            martillo=false;
            pensando=true;
PA_StopSpriteAnim(0,5);
           PA_DeleteSprite(0,5);
 
         }
         else if(Pad.Newpress.B)
         {
            asegurarse=false;
            PA_DeleteSprite(0,3);
PA_StopSpriteAnim(0,5);
           PA_DeleteSprite(0,5);
         }
 
         PA_WaitForVBL();
      }
 
 
   }
 
   /*AL SALIR DE ESTE BUCLE (DA IGUAL QUE PULSE B O R),
	EMPIEZAN LOS PROBLEMAS GRÁFICOS DEL SPRITE*/
 
}

 

a ver si asi te funciona :)

 

saludos!

 

 

Imagen de exterminator

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

Imagen de exterminator

Ups

Pues yo te entendí que parase el sprite que bugueaba, no el 5, sorry.

Salu2

Imagen de exterminator

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.

Imagen de best_guitar

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...

Imagen de exterminator

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 ;).

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.