Anuncios Google

Iniciándome en EFS... y ya con problemas [SOLUCIONADO ^^]

Buenas,

Aprovechando que best_guitar colgó en otro hilo un tuto de EFS (sí, soy un aprovechado xD), le he estado dando un vistacillo. He escrito poco a poco el código a la par que leía qué hacía cada línea, etc. Lo iba pillando, y cuando por fin tengo algo completo (un cargado de paleta y de sprite), le doy a compilar, y me sale esto:

main.c
c:/Documentos/Proyectos/pruebaEFS/source/main.c: In function 'main':
c:/Documentos/Proyectos/pruebaEFS/source/main.c:19: error: expected expression before 'int'
c:/Documentos/Proyectos/pruebaEFS/source/main.c:19: error: too few arguments to function 'Cargar_Paleta'
c:/Documentos/Proyectos/pruebaEFS/source/main.c:20: error: expected expression before 'u8'
c:/Documentos/Proyectos/pruebaEFS/source/main.c:20: error: too few arguments to function 'Cargar_Sprite'
make[1]: *** [main.o] Error 1
make: *** [build] Error 2

No entiendo cómo me dice que indique expresión después de int, cuando se supone que ya está indicada... Además, también dice que son menos argumentos de los necesarios, he mirado 125707297 veces y está tal y como el tuto...

Os dejo el código fuente, a ver si vosotros veis algo que yo no veo (que no sean fantasmas xD). Os dejo un comentario indicando las líneas que dan el error.

// 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_Paleta(int pantalla,int numpal,char* path);
void Cargar_Sprite(u8 pantalla, u8 numsprite, char* path, u8 tamx, u8 tamy, u8 color, u8 numpal, s16 x, s16 y);
 
// 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();
	Cargar_Paleta( int pantalla, int numpal, char* path);  //Línea 19 la que da error
	Cargar_Sprite( u8 pantalla, u8 numsprite, char* path, u8 tamx, u8 tamy, u8 color, u8 numpal, s16 x, s16 y);  //Línea 20, la que da error
 
 
	// 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!!");
}
 
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(1,0,0,"File not found!");   
	   PA_OutputText(0,0,0,"Filo not found!");
	   while(true)	PA_WaitForVBL();
	   return(0);
	}
}
 
void Cargar_Paleta(int pantalla,int numpal,char* path)
{
   u8* paleta;
   char path_completo[EFS_MAXPATHLEN];
   sprintf(path_completo,"%s_Pal.bin",path);	//Completamos el path
   paleta=Obtener_Archivo(path_completo);	//Obtenemos el puntero
   PA_LoadSpritePal(pantalla,numpal,paleta);	//Cargamos la paleta con el puntero
}
 
void Cargar_Sprite(u8 pantalla,u8 numsprite,char* path,u8 tamx,u8 tamy,u8 color,u8 numpal,s16 x, s16 y)
{
   u8* sprite;
   char path_completo[EFS_MAXPATHLEN];
   sprintf(path_completo,"%s_Sprite.bin",path);	//Completamos el path
   sprite=Obtener_Archivo(path_completo);	//Obtenemos el puntero
   PA_CreateSprite(pantalla,numsprite,sprite,tamx,tamy,color,numpal,x,y);
}

Agradezco toda ayuda que podáis darme, porque cuánto más avanzo en este mundillo más me gusta... pero con estos obstáculos...

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.


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 best_guitar

bueno, claro, estas pasando

bueno, claro, estas pasando el prototipo de la funcion, cuando debes pasar la llamada, me explico:

dentro de main debes llamar con parametros de la funcion, como

#define PANT_INF 0

#define PALETA1 1

Cargar_Paleta (PANT_INF,PALETA1,"paleta_basica");

 

en vez de:

 

Cargar_Paleta(int pantalla , int numpal, char* path); como estas haciendo

 

Con Cargar_Sprite te pasa lo mismo, seguro que te has descuidado al hacerlo asi. Yo llevo tres horas con una funcion de movimiento y me estoy volviendo loco, al final, cuando lo mire detenidamente, sera el fallo mas tonto que he tenido en meses...

 

Saludos!! ya diras algo...

Imagen de exterminator

Creo que entiendo, pero...

ya hice lo que me indicaste, el error es aún mayor, supongo que aún quedará algo por hacer.

El actual error:

main.c
c:/Documentos/Proyectos/pruebaEFS/source/main.c:17: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:17: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:17: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:17: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:18: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c: In function 'main':
c:/Documentos/Proyectos/pruebaEFS/source/main.c:28: error: expected ')' before ';' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:28: warning: passing argument 1 of 'Cargar_Paleta' makes pointer from integer without a cast
c:/Documentos/Proyectos/pruebaEFS/source/main.c:29: error: expected ')' before ';' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c: At top level:
c:/Documentos/Proyectos/pruebaEFS/source/main.c:76: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:76: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:76: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:76: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c: In function 'Cargar_Paleta':
c:/Documentos/Proyectos/pruebaEFS/source/main.c:82: error: expected ')' before ';' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:82: error: too few arguments to function 'PA_LoadSpritePal'
c:/Documentos/Proyectos/pruebaEFS/source/main.c: At top level:
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before ',' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:85: error: expected declaration specifiers or '...' before numeric constant
c:/Documentos/Proyectos/pruebaEFS/source/main.c: In function 'Cargar_Sprite':
c:/Documentos/Proyectos/pruebaEFS/source/main.c:89: error: 'path' undeclared (first use in this function)
c:/Documentos/Proyectos/pruebaEFS/source/main.c:89: error: (Each undeclared identifier is reported only once
c:/Documentos/Proyectos/pruebaEFS/source/main.c:89: error: for each function it appears in.)
c:/Documentos/Proyectos/pruebaEFS/source/main.c:91: error: expected ')' before ';' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:91: error: too few arguments to function 'PA_CreateSprite'
make[1]: *** [main.o] Error 1
make: *** [build] Error 2

 

Ahora el source está así:

// Includes
#include <PA9.h>       // Include for PA_Lib
#include <stdlib.h>
#include "efs_lib.h"
 
#define PANTALLA 1;
#define NUMPAL 0;
#define NUMSPRITE 0;
#define TAMX 64;
#define TAMY 64;
#define COLOR 1;
#define X 50;
#define Y 50;
 
void Iniciar_EFS(void);
u8* Obtener_Archivo(char* path);
void Cargar_Paleta(PANTALLA,NUMPAL,char* path);
void Cargar_Sprite(PANTALLA,NUMSPRITE,char* path,TAMX,TAMY,COLOR,NUMPAL,X,Y);
 
// 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();
	Cargar_Paleta(PANTALLA,NUMPAL,char* path);
	Cargar_Sprite(PANTALLA,NUMSPRITE,char* path,TAMX,TAMY,COLOR,NUMPAL,X,Y);
 
 
	// 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!!");
}
 
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(1,0,0,"File not found!");   
	   PA_OutputText(0,0,0,"Filo not found!");
	   while(true)	PA_WaitForVBL();
	   return(0);
	}
}
 
void Cargar_Paleta(PANTALLA,NUMPAL,char* path)
{
   u8* paleta;
   char path_completo[EFS_MAXPATHLEN];
   sprintf(path_completo,"%s_Pal.bin",path);	//Completamos el path
   paleta=Obtener_Archivo(path_completo);	//Obtenemos el puntero
   PA_LoadSpritePal(PANTALLA,NUMPAL,paleta);	//Cargamos la paleta con el puntero
}
 
void Cargar_Sprite(PANTALLA,NUMSPRITE,char* path,TAMX,TAMY,COLOR,NUMPAL,X,Y)
{
   u8* sprite;
   char path_completo[EFS_MAXPATHLEN];
   sprintf(path_completo,"%s_Sprite.bin",path);	//Completamos el path
   sprite=Obtener_Archivo(path_completo);	//Obtenemos el puntero
   PA_CreateSprite(PANTALLA,NUMSPRITE,sprite,TAMX,TAMY,COLOR,NUMPAL,X,Y);
}

Salu2, y gracias por ayudarme.


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, te recuerdo que en c,

al programar una función, se debe hacer lo siguiente:

primero prototipo o definicion de la funcion, asi:

void Cargar_Paleta(int pantalla, int numPaleta, char* path); 

esta definicion no es necesaria si la funcion se implementa antes de la funcion principal main, en ella se describe que parámetros contendrá la función y el tipo de dato que devolverá. En este caso no devolverá ningun valor (por que es void), y como parámetros deberas pasar primero un int que sera el numero de pantalla, luego otro int que será el numero de paleta, y por ultimo un puntero a caracter o cadena de texto con el nombre de la paleta a cargar.

 

segundo: ahora la funcion en si debe ser implementada(esto si es obligatorio), para ello debes de nuevo escribir tal y como se definió anteriormente pero debes crear el algoritmo de trabajo entre llaves.

void Cargar_Paleta(int pantalla, int numPaleta, char* path){

u8* paleta;
char path_completo[EFS_MAXPATHLEN];
sprintf(path_completo,"%s_Pal.bin",path); //Completamos el path
paleta=Obtener_Archivo(path_completo); //Obtenemos el puntero
PA_LoadSpritePal(pantalla,numPaleta,paleta); //Cargamos la paleta con el puntero

 

tercero: como ultimo paso, cuando lo necesites debes llamar a la función para que se realize lo que quieres que se haga, por ejemplo dentro de la función main, o sea, cargar la paleta, entonces:

Cargar_Paleta(0,0,"paleta_personaje");//se carga primero la paleta para la pantalla inferior(0), el segundo parametro es el numero de paleta(0), y el tercer parametro la paleta que queremos cargar en este caso paleta_personaje.

 

en fin, pienso que todos esos errores te vienen por que no estaba bien este metodo de trabajo y uso de C en general, por que veo que has puesto lo mismo en la definicion, en la implementacion, y en la llamada dentro de main. Debes tener presente que hay que diferenciar y dominar estos tres (definicion, implementacion y llamada), por que cada uno tiene su cometido. La definicion le dice al compilador que existe una funcion que tiene un nombre (en este caso Cargar_Paleta o Cargar_Sprite, o Iniciar_EFS), unos parametros que pasar y un tipo de retorno. La implementacion es el algoritmo que soluciona el problema (como puedes ver en el cacho de programa anterior, paso 2). Y la llamada, le dices por programa los parametros directamente para que se realice la funcion con dichos parametros.

Vamos que yo dejaria el programa como lo tenias en el primer mensaje, y simplemente cambiaria las llamadas a funcion dentro del main, tal y como se debe hacer.

No se si te he ayudado o te he hecho mas lio, en esta mini explicación debes recordar y diferenciar esas reglas, por que es basico en C.

Bueno si tienes alguna duda o no te he explicado lo que necesitabas por que no te he entendido me lo dices.

 

Saludos!

Imagen de exterminator

Muchísimas gracias

Vamos avanzando, pero sigue habiendo problemas. Creo que te he entendido perfectamente, sólo indicar el valor que se le da a los argumentos en la llamada. Pero el compilador sigue insistiendo que pongo menos argumentos de los necesarios por las funciones:

main.c
c:/Documentos/Proyectos/pruebaEFS/source/main.c: In function 'main':
c:/Documentos/Proyectos/pruebaEFS/source/main.c:28: error: expected ')' before ';' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:28: error: too few arguments to function 'Cargar_Paleta'
c:/Documentos/Proyectos/pruebaEFS/source/main.c:29: error: expected ')' before ';' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:29: error: too few arguments to function 'Cargar_Sprite'
make[1]: *** [main.o] Error 1
make: *** [build] Error 2

Te pongo solamente la llamada, que es la que da problemas:

Cargar_Paleta(PANTALLA,NUMPAL,char* path);
Cargar_Sprite(PANTALLA,NUMSPRITE,char* path,TAMX,TAMY,COLOR,NUMPAL,X,Y);

Por si acaso, la definición y la implementación las tengo así:

void Cargar_Paleta(int pantalla,int numPaleta,char* path)
void Cargar_Sprite(int pantalla,int numsprite,char* path,u8 tamx,u8 tamy,u8 color,u8 numpal,s16 x,s16 y)

Muchísimas gracias por tu ayuda, empiezo a ver la luz al final del túnel...

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, sigues poniendo en la

hola, sigues poniendo en la llamada un parametro incorrectamente. Cuando al compilador en la llamada le dices que un parametro tiene el valor char* loquesea, no es lo que esta esperando sino realmente una cadena de texto. El compilador en la llamada solo espera constantes o variables, punteros, etc... pero no acepta tipos de datos (char, int, float, double, char*,etc..., porque ya estan en la definicion e implementacion). Por lo tanto en las dos funciones de llamada.

Cargar_Paleta(PANTALLA,NUMPAL,char* path);
Cargar_Sprite(PANTALLA,NUMSPRITE,char* path,TAMX,TAMY,COLOR,NUMPAL,X,Y);

char* path no se acepta y el compilador da error. Él está esperando la cadena de texto o nombre del archivo, por lo tanto esto es...

 

Cargar_Paleta(PANTALLA,NUMPAL,"nombrePaleta");
Cargar_Sprite(PANTALLA,NUMSPRITE,"nombreSprite",TAMX,TAMY,COLOR,NUMPAL,X,Y);


Prueba con este cambio, ese fallo ya no te lo dará.

Saludos!

Imagen de exterminator

Con "nombrepaleta" y "nombresprite"

supongo que te refieres al nombre del archivo a cargar. La duda es: ¿El nombre va con la terminación o sin ella? Es decir, ¿pongo "sprite" o "sprite.Sprite_Pal"?

Aprovecho para una duda que tengo ahora mismo con EFS, espero que no te importe. El tutorial enseña la preparación de las EFS, la de los punteros y variables necesarias, y la carga desde EFS. Ahora bien, supongamos que después de cargar un fondo, por ejemplo, en un determinado momento me da por borrarlo. Pongo PA_DeleteBg o PA_ResetBgSystem. Hasta ahí OK. Ahora bien, ¿El fondo se borra REALMENTE de RAM? Imagino que cuando cargo el fondo, se almacena en VRAM para cargarlo. Al borrarlo, se borrará también de VRAM ¿no? Sé que es una pregunta estúpida, pero no quisiera ir llenando la memoria hasta llenarla.

Salu2. Ahora pruebo tu indicación.

EDITO: Sigue habiendo problemas, exactamente el mismo error, que si menos argumentos de los necesarios, etc.

Ahora la llamada la tengo como dijiste. Probé también con sus terminaciones, pero igual. ¿Qué puedo estar haciendo mal?

Cargar_Paleta(PANTALLA,NUMPAL,"battle");
Cargar_Sprite(PANTALLA,NUMSPRITE,"Bbutton",TAMX,TAMY,COLOR,NUMPAL,X,Y);

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, exacto, debes poner el

hola,

exacto, debes poner el nombre del archivo, pero, sin extension, porque si te fijas en las funciones de la EFS ya lo hace por ti, tú sólo el nombre correctamente escrito.

En cuanto a tu segunda pregunta, debo decirte que no he utilizado todavia (hasta que no acabe zenit) la carga de fondos, sprites por EFS, por tanto, no soy tal vez el que te solucione el problema. Sin embargo te puedo orientar un poco. Fijate, que la funciones de EFS(tan gracilmente y eficientemente programadas) te devuelven un puntero que apuntan a la memoria reservada para el objeto que has creado. Entonces cuando ya tienes el objeto creado y asignado el puntero puedes liberarlo con free(puntero). Entonces la memoria queda liberada y puedes cargar en ese espacio otra musica, fondo, sprite, etc... Por lo tanto no se borra, CREO, con una funcion de PAlib, como mencionabas antes.

Sobre lo último, pega el codigo y los errores devueltos por el compilador y lo miro.

Saludos!

Imagen de exterminator

Source completo

éste es el código completo:

// Includes
#include <PA9.h>       // Include for PA_Lib
#include <stdlib.h>
#include "efs_lib.h"
 
#define PANTALLA 1;
#define NUMPAL 0;
#define NUMSPRITE 0;
#define TAMX 32;
#define TAMY 32;
#define COLOR 1;
#define X 50;
#define Y 50;
 
void Iniciar_EFS(void);
u8* Obtener_Archivo(char* path);
void Cargar_Paleta(int pantalla,int numPaleta,char* path);
void Cargar_Sprite(int pantalla,int numsprite,char* path,u8 tamx,u8 tamy,u8 color,u8 numpal,s16 x,s16 y);
 
// Function: main()
int main(int argc, char ** argv)
{
	PA_Init();    // Initializes PA_Lib
	PA_InitVBL(); // Initializes a standard VBL
	PA_InitText(1,0);
	PA_InitText(0,0);
 
	Iniciar_EFS();
	Cargar_Paleta(PANTALLA,NUMPAL,"battle");
	Cargar_Sprite(PANTALLA,NUMSPRITE,"Bbutton",TAMX,TAMY,COLOR,NUMPAL,X,Y);
 
 
	// 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!!");
}
 
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(1,0,0,"File not found!");   
	   PA_OutputText(0,0,0,"File not found!");
	   while(true)	PA_WaitForVBL();
	   return(0);
	}
}
 
void Cargar_Paleta(int pantalla,int numPaleta,char* path)
{
   u8* paleta;
	char path_completo[EFS_MAXPATHLEN];
	sprintf(path_completo,"%s_Pal.bin",path); //Completamos el path
	paleta=Obtener_Archivo(path_completo); //Obtenemos el puntero
	PA_LoadSpritePal(pantalla,numPaleta,paleta); //Cargamos la paleta con el puntero
 
}  
 
void Cargar_Sprite(int pantalla,int numsprite,char* path,u8 tamx,u8 tamy,u8 color,u8 numpal,s16 x,s16 y)
{
   u8* sprite;
   char path_completo[EFS_MAXPATHLEN];
   sprintf(path_completo,"%s_Sprite.bin",path);	//Completamos el path
   sprite=Obtener_Archivo(path_completo);	//Obtenemos el puntero
   PA_CreateSprite(pantalla,numsprite,sprite,tamx,tamy,color,numpal,x,y);
}

Como puedes ver, los cambios son mínimos, pero el error es el mismo:

main.c
c:/Documentos/Proyectos/pruebaEFS/source/main.c: In function 'main':
c:/Documentos/Proyectos/pruebaEFS/source/main.c:29: error: expected ')' before ';' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:29: error: too few arguments to function 'Cargar_Paleta'
c:/Documentos/Proyectos/pruebaEFS/source/main.c:30: error: expected ')' before ';' token
c:/Documentos/Proyectos/pruebaEFS/source/main.c:30: error: too few arguments to function 'Cargar_Sprite'
make[1]: *** [main.o] Error 1
make: *** [build] Error 2

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

vale, ya está, el error te

vale, ya está, el error te los da por que estas poniendo ; detras de las directivas define. Los defines no llevan ; al final de la directivas (leyes del C). Por lo tanto, debes hacer:

#define LOQUESEA 0

#define ESCRIBEGAMEOVER PA_OutputSimpleText(0,10,10,"GAMEOVER")

En vez de:

#define LOQUESEA 0;  //fijate el ; final es erroneo

#define ESCRIBEGAMEOVER PA_OutputSimpleText(0,10,10,"GAMEOVER");  //fijate el ; final es erroneo

 

De toda manera veo en tu programa que abusas un poco de los define y realmente se usa para hacer mas legible el programa y para macros que se repiten muchas veces.

 

Bueno, pues al final me he tenido que pelear con la EFS sin querer todavia, pero si te he ayudado hemos aprendido todos. En fin, he pensado, ya voy a probarlo a ver si va y no me mostraba el sprite por pantalla. Cuando pueda haré un poquito de manual, más detallado,  pero de momento tengo otras preferencias.

1- copias el sprite que quieras y lo pegas en la carpeta gfx.

2- conviertes el sprite/s con la aplicacion PAGfx como has hecho siempre.

3- copias el _Pal.bin y el _Sprite.bin y los copias en efsroot.

4- borras los archivos no originales del directorio gfx.

5- PA_CreateSprite(pantalla,numsprite,sprite,OBJ_SIZE_64X64,color,numpal,x,y); //dentro de Cargar_Sprite modifica esta linea con el tamaño del sprite como lo haces siempre. Imagino que la funcion que utilizó Henty era una antigua y a mi no me funciona.

 

Espero que con esto esté solucionado el problema.

Saludos!

 

Imagen de exterminator

Más problemas

ahora el source me va perfectamente, el problema viene en el resultado. Yo incluyo los archivos .bin en el efsroot, sin embargo, a la hora de cargar el sprite, no me aparece nada en pantalla. ¿Por qué puede ser?

Salu2

EDITO: Ay que me lol, el problema era el tamaño del sprite, que no se ponen independientemente (tamx,tamy) sino en un OBJ_SIZE_. Tienes razón, me da que el método del tutorial es algo antiguo...

Salu2 y muchas gracias, con esto ya está todo ^^


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.