PDA

Ver la versión completa : Que os parece esta forma de crear capas en Abalon?



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&#225; en que Mapa es el que contiene el ANCHOxALTO y claro para trabajar con las capas tambi&#233;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&#243;n "temporal" ha sido a&#241;adir nCeldas, que contiene el numero total de ellas (ALTOxANCHO), aqui ten&#233;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&#225; lo m&#225;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&#225;s esto de c&#243;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&#243;n es que no se si sacar de cMapas el tama&#241;o del mapa y tenerlo en cCapas; aunque eso podr&#237;a darme a la larga problemas, por que siempre tendr&#237;a que andar preguntando a cCapas cuando quiera saber informaci&#243;n sobre una posicion del mapa en concreto...

Intento programar con un c&#243;digo lo m&#225;s clarito posible, espero que lo entend&#225;is y si de camino os da ideas, mejor. Aunque claro no se si como yo estoy planteando este engine ser&#225; la mejor forma de hacerlo :brindis:

Un Saludo y disculpad el tocho post, es que cuando tengo una duda... [Ahhh]

una-i
22/05/2007, 21:11
Antes de nada.... Pásate al C++ para programar como programas el c++ es más adecuado (no empezar una guerra religiosa aquí please..) es solo una opinión.

Respecto a tu problema yo dejaría el tamaño en el mapa, la mejor opción es que las capas tengan un puntero al mapa al que pertenecen, porque de todas maneras es posible que lo necesites para por ejemplo mover objetos de una capa a otra...

No te he visto conectado por eso te respondo aquí...

D_Skywalk
22/05/2007, 21:43
Muchísimas gracias compañero por la respuesta, entiendo que es una pregunta complicada, eso se ve fácil viendo que el tema tiene 70 vistas y 1 respuesta. Solo espero que no sea culpa de que me hubiera explicado mal ;)

Como te he comentado, uso C++ por que cuando empecé a trabajar con el engine para GP32 (hace unos cuantos milenios xD), directamete no funcionaba C++ y solo ví un par de pruebas/ejemplos de algún devkit que me pasó rili... pero nada tangible que me pudiera asegurar que funcionarían cosas como herencias, plantillas, etc...

Asi que lo descarté y lo que he hecho ha sido intentar unir lo mejor de ambos mundos, seguir la estructura de C++ y aprovechar las ventajas de C. La idea es que funcione en ambas plataformas (GP32 y GP2x) y por ahora el engine cumple :)

Bueno, vamos a lo que nos ocupa, las capas xD
Si, la verdad que una opción era tener un enlace de la capa al mapa que lo contenía; aunque no se por que eso me hacía pensar que no me lo estaba planteando bien, si necesitaba esa información :?
La verdad que uno cuando se bloquea, no sabes hacia donde tirar y siempre viene bien un consejo de otro compañero que también lo sufra ^^

Un Saludo, gracias y voy a darle ver que sale ;D

Gocho
01/06/2007, 13:40
Y digo yo, en Orientado a Objeto lo heredarian o similar, pero como estamos en C... &#191;Porque no duplicarlo? Asi puedes tener capas m&#225;s peque&#241;as que otras, o m&#225;s grandes que el mapa.

El ejemplo m&#225;s l&#243;gico es el de una capa de "cielo" que tiene las nubes moviendose. Evidentemente esa capa debe ser m&#225;s grande que el mapa para poder moverse a trav&#233;s de &#233;l.

Por otro lado si solo hay un techo en todo el mapeado. &#191;Para que tener una capa enorme con un solo techo? Lo suyo es tener una peque&#241;a pero que empiece en otra posici&#243;n distinta de la 0,0

Mi soluci&#243;n es duplicar la informaci&#243;n del tama&#241;o tanto en el mapa como en las capas.

Topochan
01/06/2007, 20:47
Otra solución seria simular herencia en C, que es más complicado y bueno es simplemente que se mantenga el puntero con la dirección de momería de la estructura padre cuando creamos un nuevo mapa que herede.

Saludos