Anuncios Google

EFS y fondos de 16bit [SOLUCIONADO]

Buenas, aquí estoy molestando como siempre xD.

El problema que tengo ahora es debido a los fondos de 16bit. Os expongo lo que me pasa:

// Includes
#include <PA9.h>       // Include for PA_Lib
#include <stdlib.h>
#include "efs_lib.h"
 
void Iniciar_EFS(void);
u8* Obtener_Archivo(char* path);
void Cargar_Bg(u8 pantalla,char* path);
 
// Function: main()
int main(int argc, char ** argv)
{
	PA_Init();    // Initializes PA_Lib
	PA_InitVBL(); // Initializes a standard VBL
 
	PA_InitText(0,0);
 
	Iniciar_EFS();
	PA_Init16bitBg(1,3);
	Cargar_Bg(1,"pantallainicio2");
 
	// Infinite loop to keep the program running
	while (1)
	{
		PA_WaitForVBL();
	}
 
	return 0;
} // End of main()
 
void Iniciar_EFS(void)
{
   if(!EFS_Init(EFS_AND_FAT | EFS_DEFAULT_DEVICE, NULL))
   {
      PA_OutputText(0,1,1,"EFS Error!!");
      while(true)	{PA_WaitForVBL();}
   }
   else
	{
	   PA_OutputText(0,1,1,"EFS ok!!");
	   PA_ClearTextBg(0);
	}   
}
 
//Obtención de datos del archivo
u8* Obtener_Archivo(char* path)
{
   FILE* file;	//Variable que apunta al fichero
   u8* archivo;	//Variable puntero u8
   int size;
   struct stat st;	//Variable stat para el fichero
   file=fopen(path,"rb");	//Abrimos el archivo(forma binaria)
   if(file!=NULL)	//Comprobación: ¿Existe el fichero? Si existe...
   {
      stat(path,&st);	//Metemos el fichero en la estructura stat (volcado de datos)
      size=st.st_size;
      archivo=(u8*)malloc(size);	//El puntero apunta al archivo
      fread(archivo,1,size,file);	//Volcado del archivo
      fclose(file);	//Acabado el volcado, el archivo se cierra
      return(archivo);
   }
	else	//Si no existe...
	{
	   PA_OutputText(0,0,0,"File not found!");
	   while(true)	PA_WaitForVBL();
	   return(0);
	}
}
 
//Cargado del fondo
void Cargar_Bg(u8 pantalla,char* path)
{ 
	u32* info;
	char path_info [EFS_MAXPATHLEN];
	sprintf (path_info, "%s_Bitmap.bin", path);  // Completamos el path del info
	info = Obtener_Archivo (path_info);
	PA_Load16bitBitmap(pantalla,(u32*)info);<textarea name='code' class='c' language='c'>void Iniciar_EFS(void)
{
   if(!EFS_Init(EFS_AND_FAT | EFS_DEFAULT_DEVICE, NULL))
   {
      PA_OutputText(0,1,1,"EFS Error!!");
      while(true)	{PA_WaitForVBL();}
   }
   else
	{
	   PA_OutputText(0,1,1,"EFS ok!!");
	   PA_ClearTextBg(0);
	}   
}
 
//Obtención de datos del archivo
u8* Obtener_Archivo(char* path)
{
   FILE* file;	//Variable que apunta al fichero
   u8* archivo;	//Variable puntero u8
   int size;
   struct stat st;	//Variable stat para el fichero
   file=fopen(path,"rb");	//Abrimos el archivo(forma binaria)
   if(file!=NULL)	//Comprobación: ¿Existe el fichero? Si existe...
   {
      stat(path,&st);	//Metemos el fichero en la estructura stat (volcado de datos)
      size=st.st_size;
      archivo=(u8*)malloc(size);	//El puntero apunta al archivo
      fread(archivo,1,size,file);	//Volcado del archivo
      fclose(file);	//Acabado el volcado, el archivo se cierra
      return(archivo);
   }
	else	//Si no existe...
	{
	   PA_OutputText(0,0,0,"File not found!");
	   while(true)	PA_WaitForVBL();
	   return(0);
	}
}
 
//Cargado del fondo
void Cargar_Bg(u8 pantalla,char* path)
{ 
	u32* info;
	char path_info [EFS_MAXPATHLEN];
	sprintf (path_info, "%s_Bitmap.bin", path);  // Completamos el path del info
	info = Obtener_Archivo (path_info);
	PA_Load16bitBitmap(pantalla,info);
} 

Mi problema es que no consigo cargar el fondo, no me sale bien. Al principio, salía sólo una parte y muy deformada.

He modificado la función Cargar_Bg, adaptándola para un fondo de 16bit (quitar los punteros de tiles, path innecesarios, etc). Al menos me carga, pero no carga bien.

Volviendo a trastear el código, me he fijado que en esta parte de código, en la función Cargar_Bg:

char path_info [EFS_MAXPATHLEN];

Ya estaba todo claro. EFS_MAXPATHLEN, según tengo entendido, es un array de 256 valores. Claro, en un fondo normal, 256 son suficientes. Pero... ¿y para 16bit? Probé a poner un número al azar: 10000. Por lo que parece, he acertado, porque me apareció el fondo reducido de tal manera que cogía 2 veces sin problema.

¿Alguien me podría decir el número de caracteres exactos que necesita el array path_info? Si tengo que calcular yo mismo tanteando, voy a tardar bastante :P. En todo caso, no sé si estoy equivocado y aparte tengo que adaptar algo más.

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 exterminator

OK

gracias por la aclaración, tal y como suponía me he equivocado en mi eculubraciones xD. Ahora bien, si me pudieses concretar qué hago mal y qué debo hacer para que tenerlo todo correcto para cargar el fondo, te beso las teclas p, i, e, s ^^.

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

hola, yo por lo que veo , no

hola, yo por lo que veo , no se si has copiado el codigo varias veces pero se repiten las funciones y tienen diferente codigo.

EDITO: de todas maneras el puntero al archivo es de 8bits supongo que tendrias que reescribir la funcion ObtenerArchivo para 16bits y reservar memoria para u16

Saludos!

Imagen de exterminator

Todo correcto

Una vez más gracias por vuestra ayuda, tanto a Almamu por indicarme qué indicaba el EFS_MAXPATHLEN (información bastante útil), como a best_guitar por indicarme el fallo: los punteros de Obtener_Archivo eran de u8 cuando debían ser de u16. Lo de que el fondo me apareciese duplicado y más pequeño se debía a que la variable info la puse a u32.

Muchas gracias de nuevo, con vosotros esto es mucho más fácil ^^.

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

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.