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.
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.
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!
Visita mi blog. Zenit + 5 will win
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.