D_Skywalk
22/05/2007, 09:34
Llevo un par de días pensando como mejorar un poco el motor de mapeado del Abalon. La cuestión es que quiero trabajar con diferentes capas, para por ejemplo quitar una al entrar en casas (Ej: techo), etc...
El uso de mapas es simple, creas una estructura de mapa, que sería esto:
typedef struct cMapa {
char nombre[25];
Uint8 maxCapa; // # maximas capas del mapa (reservadas)
Uint8 usedCapas; //capas cargadas..
Uint16 ancho;
Uint16 alto;
cCapas * Capas; //datos de cada capa del mapa
sObjeto Objetos[OBJETOS_MAX];
Uint16 m_NumObjetosAPintar;
} cMapa;
Y le pasamos el cargador con el fichero de configuración del nivel. Este es el code del cargador de mapas:
/*! \fn bool cMapa_Load(cMapa *miMapa, char * mpNombre)
\brief Carga la configuracion del mapa dado e inicializa la estructura dada.
\param miSprite puntero al sprite donde se guardara la informacion cargada.
\param spNombre fichero de configuracion a cargar.
\todo si hay error quizas las capas se quedan reservadas y muertas...
*/
bool cMapa_Load(cMapa *miMapa, char * mpNombre){
int n;
char fichero[150];
sprintf(fichero, "%s/mapas/%s", CFG_DATAPATH, mpNombre );
if(!cfgOpen(fichero, MS_STYLE)){
fprintf(stderr, "Error: No encuentro el fichero: %s...\n", fichero);
return FALSE;
}
cMapa_Inicia(miMapa); //inicia el mapa con valores correctos...
cMapa_Loadcfg(miMapa); //carga la configuracion inicial (alto, largo, etc..)
for(n = 0; n <= (miMapa->maxCapa - 1);n++){
if(!cCapas_Load(&miMapa->Capas[n], strcat("Capa ",itoa(n))))
{
cfgClose();
fprintf(stderr, "Error: Leyendo el fichero de configuracion: %s para cargar la capa %i...\n", fichero, n);
return FALSE;
}
miMapa->usedCapas ++;
}
cfgClose();
}
El problema claro está en que Mapa es el que contiene el ANCHOxALTO y claro para trabajar con las capas también necesito saber que dimensiones tiene el mapa, como yo antes solo usaba mapa como capa principal, no tenia ese problema pero ahora me encuentro que tengo que meter un dato que al menos me permita saber cuantas celdas totales tiene la capa, por que sino es "imposible" inicializarla.
Mi solución "temporal" ha sido añadir nCeldas, que contiene el numero total de ellas (ALTOxANCHO), aqui tenéis la estructura:
typedef struct cCapas {
char nombre[25];
char f_dat[15]; // fichero con los datos de la capa / mapeado
cCeldas * Celdas; //el array de celdas (x*y)
Uint32 nCeldas;
char f_cfg[15]; //archivo cfg con la configuracion del array de tiles
cSprite Graficos; //el array con los graficos de los tiles
} cCapas;
Para inicializar nCeldas de cCapa, lo hago cuando cargo el mapa, que no si será lo más correcto:
bool cMapa_Loadcfg(cMapa *miMapa){
....
miMapa->Capas = malloc (sizeof(cCapas) * miMapa->maxCapa); //iniciamos el numero de capas requerido
if(miMapa->Capas == NULL)
return FALSE;
for(n = 0;n <= (miMapa->maxCapa - 1);n++)
cCapas_Inicia(&miMapa->Capas[n], (miMapa->ancho * miMapa->alto));
....
}
Y para no llenar mucho más esto de código voy a poner la parte de las celdas del cargador de capas:
bool cCapas_Load(cCapas *misCapas, char * seccion){
....
//iniciamos las celdas
misCapas->Celdas = (cCeldas*) malloc (sizeof(cCeldas) * misCapas->nCeldas);
//recorremos para dejarlos todos con valores correctos.
for(i=0; i < misCapas->nCeldas; i++)
cCeldas_Inicia(&misCapas->Celdas[i]);
if(!cCeldas_Load(&misCapas->Celdas[0], fp))
return FALSE;
....
}
Bueno, espero que se entienda todo, la cuestión es que no se si sacar de cMapas el tamaño del mapa y tenerlo en cCapas; aunque eso podría darme a la larga problemas, por que siempre tendría que andar preguntando a cCapas cuando quiera saber información sobre una posicion del mapa en concreto...
Intento programar con un código lo más clarito posible, espero que lo entendáis y si de camino os da ideas, mejor. Aunque claro no se si como yo estoy planteando este engine será la mejor forma de hacerlo :brindis:
Un Saludo y disculpad el tocho post, es que cuando tengo una duda... [Ahhh]
El uso de mapas es simple, creas una estructura de mapa, que sería esto:
typedef struct cMapa {
char nombre[25];
Uint8 maxCapa; // # maximas capas del mapa (reservadas)
Uint8 usedCapas; //capas cargadas..
Uint16 ancho;
Uint16 alto;
cCapas * Capas; //datos de cada capa del mapa
sObjeto Objetos[OBJETOS_MAX];
Uint16 m_NumObjetosAPintar;
} cMapa;
Y le pasamos el cargador con el fichero de configuración del nivel. Este es el code del cargador de mapas:
/*! \fn bool cMapa_Load(cMapa *miMapa, char * mpNombre)
\brief Carga la configuracion del mapa dado e inicializa la estructura dada.
\param miSprite puntero al sprite donde se guardara la informacion cargada.
\param spNombre fichero de configuracion a cargar.
\todo si hay error quizas las capas se quedan reservadas y muertas...
*/
bool cMapa_Load(cMapa *miMapa, char * mpNombre){
int n;
char fichero[150];
sprintf(fichero, "%s/mapas/%s", CFG_DATAPATH, mpNombre );
if(!cfgOpen(fichero, MS_STYLE)){
fprintf(stderr, "Error: No encuentro el fichero: %s...\n", fichero);
return FALSE;
}
cMapa_Inicia(miMapa); //inicia el mapa con valores correctos...
cMapa_Loadcfg(miMapa); //carga la configuracion inicial (alto, largo, etc..)
for(n = 0; n <= (miMapa->maxCapa - 1);n++){
if(!cCapas_Load(&miMapa->Capas[n], strcat("Capa ",itoa(n))))
{
cfgClose();
fprintf(stderr, "Error: Leyendo el fichero de configuracion: %s para cargar la capa %i...\n", fichero, n);
return FALSE;
}
miMapa->usedCapas ++;
}
cfgClose();
}
El problema claro está en que Mapa es el que contiene el ANCHOxALTO y claro para trabajar con las capas también necesito saber que dimensiones tiene el mapa, como yo antes solo usaba mapa como capa principal, no tenia ese problema pero ahora me encuentro que tengo que meter un dato que al menos me permita saber cuantas celdas totales tiene la capa, por que sino es "imposible" inicializarla.
Mi solución "temporal" ha sido añadir nCeldas, que contiene el numero total de ellas (ALTOxANCHO), aqui tenéis la estructura:
typedef struct cCapas {
char nombre[25];
char f_dat[15]; // fichero con los datos de la capa / mapeado
cCeldas * Celdas; //el array de celdas (x*y)
Uint32 nCeldas;
char f_cfg[15]; //archivo cfg con la configuracion del array de tiles
cSprite Graficos; //el array con los graficos de los tiles
} cCapas;
Para inicializar nCeldas de cCapa, lo hago cuando cargo el mapa, que no si será lo más correcto:
bool cMapa_Loadcfg(cMapa *miMapa){
....
miMapa->Capas = malloc (sizeof(cCapas) * miMapa->maxCapa); //iniciamos el numero de capas requerido
if(miMapa->Capas == NULL)
return FALSE;
for(n = 0;n <= (miMapa->maxCapa - 1);n++)
cCapas_Inicia(&miMapa->Capas[n], (miMapa->ancho * miMapa->alto));
....
}
Y para no llenar mucho más esto de código voy a poner la parte de las celdas del cargador de capas:
bool cCapas_Load(cCapas *misCapas, char * seccion){
....
//iniciamos las celdas
misCapas->Celdas = (cCeldas*) malloc (sizeof(cCeldas) * misCapas->nCeldas);
//recorremos para dejarlos todos con valores correctos.
for(i=0; i < misCapas->nCeldas; i++)
cCeldas_Inicia(&misCapas->Celdas[i]);
if(!cCeldas_Load(&misCapas->Celdas[0], fp))
return FALSE;
....
}
Bueno, espero que se entienda todo, la cuestión es que no se si sacar de cMapas el tamaño del mapa y tenerlo en cCapas; aunque eso podría darme a la larga problemas, por que siempre tendría que andar preguntando a cCapas cuando quiera saber información sobre una posicion del mapa en concreto...
Intento programar con un código lo más clarito posible, espero que lo entendáis y si de camino os da ideas, mejor. Aunque claro no se si como yo estoy planteando este engine será la mejor forma de hacerlo :brindis:
Un Saludo y disculpad el tocho post, es que cuando tengo una duda... [Ahhh]