Usar mapas creados en TileStudio

Post a reply


BBCode is OFF
Smilies are OFF

Topic review
   

Expand view Topic review: Usar mapas creados en TileStudio

Post by Chacal » Fri Jan 05, 2007 6:09 pm

Me da que la cosa se complica con esto, sino hubiera respondido alguen...
aunque ahora que me doy cuenta esto debio de ir a consultas... :S

Post by Chacal » Mon Jan 01, 2007 9:39 pm

Aja, voy entendiendo la idea esta, me estas diciendo entonces, que el tamaño de lso tiles (el cual yo lo relacionaba ahora con el tamaño de los bloques que dividiran al mapa) puede ser cualquiera pero fijo, que no importa el tamaño de este sino del tamaño del bloque, que segun este sera dividido el mapa. La razon por lo que yo relacionaba estos dos tamaños es que en este tile studio, los bloques en lso que se divide el mapa para determinar por dodne se puedee pasar y por donde no, es el tamaño de los tiles, que es siempre fijo en el programa, entonces cada bloque un tile.

He estado mirando aun mas detenidamente el codigo, y veo que las matrices que hay hacen los siguiente, hay dos:
La primera determina que tile va a ir en cada bloque (ya que aqui esta relacionado), cada numero posible en el array va asociado a un tile, el numero posible de estos pues el numero de tiles que uno haya hecho, lo que no se ahora es cual numero pertenece a que tile.

La segunda determina los "muros" en el mapa, pero no de la manera en la que creo que lo estabamos hablando, nosotros hablamos de hacer que un bloque del mapa no pueda ser ocupado a modo de muro mediante 0 y 1 para decir si se puede pasar o no. Aqui es distinto, segun deduzco y teniendo en cuenta las opciones que contiene TileStudio para hacer "muros", esto funciona de la manera siguiente: En una matriz no tenemos unos y ceros, sino que tenemos ceros y mas numeros, en los que 0 es "se puede pasar por cualquiera de los extremos del bloque" y los demas determinan que "No se puede pasar por el borde superior del bloque, el derecho, el izquierdo, ni por el derecho ni el izquierdo, ni por el izquierdo ni el derecho..." y asi sucesivas combinaciones, situando la parte de muro en lso bordes del bloque y no en todo el bloque. A continuacion te dejo el codigo, aver si tu puedes aclararme un poco mejor comoo va esto:

Code: Select all

#ifndef _Level 1Gfx_c #define _Level 1Gfx_c #ifndef _GFX_BITMAP_DATA #define _GFX_BITMAP_DATA /* structure with bitmap data */ typedef struct GFX_BITMAP_DATA { int BitmapIdentifier; int BitmapWidth; int BitmapHeight; int TileWidth; int TileHeight; int TileCountX; int TileCountY; int TransparentX; int TransparentY; int Sequences; int ** SequenceData; int * SequenceLength; int * SequencePosition; int * SequenceCounter; } GFX_BITMAP_DATA; #endif #ifndef _GFX_EMPTY #define _GFX_EMPTY static int Empty[] = {0}; #endif #define GfxTiles2Map1MapWidth (20) #define GfxTiles2Map1MapHeight (15) //--Esta define que tile va a ir en cada bloque-- signed short Tiles2Map1MapData[15][20] = {{ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3}, { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5}, { 4, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 5}, { 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5}, { 4, 0, 4, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 5, 0, 5}, { 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5}, { 4, 0, 0, 0, 0, 0, 4, 0, 1, 2, 2, 3, 0, 5, 0, 0, 0, 0, 0, 5}, { 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 0, 5}, { 4, 0, 0, 0, 0, 0, 4, 0, 6, 7, 7, 8, 0, 5, 0, 0, 0, 0, 0, 5}, { 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5}, { 4, 0, 4, 0, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 0, 5, 0, 5}, { 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5}, { 4, 0, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 0, 5}, { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5}, { 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8}}; //--Esta dice por dodne se puede pasar y por donde no. unsigned short Tiles2Map1BoundMapData[15][20] = {{3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9}, {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8}, {2,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,0,8}, {2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8}, {2,0,2,0,3,1,1,1,1,1,1,1,1,1,1,9,0,8,0,8}, {2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8}, {2,0,0,0,0,0,2,0,3,1,1,9,0,8,0,0,0,0,0,8}, {2,0,0,0,0,0,2,0,0,0,0,8,0,8,0,0,0,0,0,8}, {2,0,0,0,0,0,2,0,6,4,4,12,0,8,0,0,0,0,0,8}, {2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8}, {2,0,2,0,6,4,4,4,4,4,4,4,4,4,4,12,0,8,0,8}, {2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8}, {2,0,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,12,0,8}, {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8}, {6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,12}}; /* tile sequences */ int Tiles2SeqLength[] = { -1 }; int Tiles2SeqPosition[0 + 1]; int Tiles2SeqCounter[0 + 1]; int * Tiles2Sequences[] = { Empty }; /* bitmap data */ const struct GFX_BITMAP_DATA GfxTiles2Bitmap = { 1 - 0 - 1, 128, 16, 16, 16, 8, 1, 52, 0, 0, &Tiles2Sequences[0], &Tiles2SeqLength[0], &Tiles2SeqPosition[0], &Tiles2SeqCounter[0] }; #endif
Un Saludo!

Post by addax » Mon Jan 01, 2007 7:54 pm

Feliz año igualmente :-)

El tamaño de los "tiles" puede ir especificado en un archivo de mapas o dentro del propio código, ya sea variable o una constante. Para empezar, y para un juego tipo comecocos, te recomiendo que uses un tamaño fijo, por ejemplo el que dices de 16x16. En realidad eso sólo importa a la hora de "pintar" la pantalla, no de hacer los cálculos previos que te comentaba en el mensaje anterior. O sea, a nivel de programa importa poco si un tile ocupa 16x16 y se empieza a pintar en el píxel (64, 120) de la pantalla, lo que importa es si es pisable, si tiene una bola o si está ocupado por un fantasma.

El código del TileStudio no tengo ni idea de cómo es (pásalo por aquí si puedes), pero lo suyo sería que incluyeras las matrices directamente en tu código. Eso sería lo más rápido, pero tienes otras opciones:
- Crear, como dices, funciones que lean los datos tal como los devuelve el TileStudio.
- Convertir eso en tu propio formato (por ejemplo binario que es lo que menos ocupa) y "leer" los archivos de mapas desde tu programa.
- Incorporar esa información al interior del código de tu programa (es decir, que no se guarde en archivos independientes sino en matrices internas).

Otra cosa que te recomiendo es que crees los mapas con muros alrededor de todos los bordes exteriores. Si muro es 1 y zona pisable es 0, sería algo así:

Code: Select all

1-1-1-1-1-1-1-1-1-1-1-1-1-1 1-0-0-0-0-0-0-0-0-0-0-0-0-1 1-0-0-0-0-0-0-0-0-0-0-0-0-1 1-0-0-0-0-0-0-0-0-0-0-0-0-1 1-0-0-0-0-0-0-0-0-0-0-0-0-1 1-0-0-0-0-0-0-0-0-0-0-0-0-1 1-0-0-0-0-0-0-0-0-0-0-0-0-1 1-0-0-0-0-0-0-0-0-0-0-0-0-1 1-0-0-0-0-0-0-0-0-0-0-0-0-1 1-0-0-0-0-0-0-0-0-0-0-0-0-1 1-1-1-1-1-1-1-1-1-1-1-1-1-1
Como ves, ahí se podría pasar por toda la zona de juego pero en todos los extremos habría un borde, así no tienes que preocuparte por el índice x de la casilla a la que tendría que pasar el comecocos cuando, por ejemplo, va a la izquierda desde una casilla con x=0. De este modo, siempre que va a la izquierda tienes que revisar el estado de casilla (x-1,y) y como nunca ocupará la (0, 4) por ejemplo, no se producirán cálculos del tipo casilla (-1, 4)... No sé si me explico, la verdad que estoy un poco espeso... :roll: :wink:

Post by Chacal » Sun Dec 31, 2006 9:03 pm

aja, si, eso es lo que veo que ya hace este tilestudio, crea un array con unos umeros en el que cada uno es un tile para dibujar el mapa, y otro array con ceros y unos dodne dice dodne se puede pasar y dodne no (es lo que estoy viendo en el codigo generado al hacer el mapa en el programa) entonces, lo que donde yo me quedo en blanco, es como uso yo este codigo en el codigo que yo ya he hecho en mi programa, no veo como agarrarlo por ahora, si crear unas funciones para que interpreten esos arrays o yo que se... otra cosa que me llama la atencion a la hora de dividir un mapa en bloques en un array, es que se deberia de especificar cuanto ocupa cada bloque del array en la pantalla no?, que seria el tamaño del "tile" y aqui en el codigo no veo nada (es posible que me equivoque), y claro aparte del tamaño del tile, tiene que tener relacion con el espacio de la pantalla (por ahora pretendo que el mapa se vea en toda la pantalla, sin "scroll" (se le llama asi no), por eso como el juego que programo usa una resolucion de 320 x 240 pense que deberia ser el mapa de bloques 20 x 15 siendo el tamaño del tile 16x16 :S

Gracias por tu explicación addax, y feliz año!
Un Saludo!

Post by addax » Sun Dec 31, 2006 8:35 pm

Así a bote pronto te diría que no uses métodos gráficos para reconocer la parte del mapa que puede "pisar" el comecocos. En este caso lo más simple que se me ocurre es dividir cada mapa por casillas, así que imagina que tienes un mapa de 16 casillas de ancho por 16 casillas de alto. Pues creas una matriz bidimensional que guarda true si es "pisable" o false si hay un muro. En estilo PHP sería: $casilla[8][1]=false, siendo la casilla de las coordenadas x=8, y=1. En ese caso, si el comecocos está en la casilla (8,2) y se dirige hacia arriba, antes que nada hay que saber si en su x,y-1 se puede pisar o no. En el ejemplo, $casilla[x][y-1] es false, ya que x=8 y y-1 es igual a 1, así que hay no puede ir el personaje. En ese caso lo que puedes hacer es que no avance, o cambiarle el sentido para que rebote contra el muro, o lo que veas.

La idea sería calcular todo por código antes de ponerte a "pintar" nada en pantalla.

Espero que no haya quedado muy confuso ;-)

Usar mapas creados en TileStudio

Post by Chacal » Sun Dec 31, 2006 6:20 pm

Hola a todos, soy nuevo en este foro asi que me presentare.
Soy Adrián, tengo 16 años asi que no vivi demasiada la epoca "8-bit", ni en ordenadores ni consolas de la que aqui trata tanta gente, pero si que tengo muy buenos recuerdos de jugar con las consolas 16-bit tales como megadrive y supernintendo, ah tambien jugue a la "nes" que creo que si era de 8 :D

Vereis es que estoy empezando a programar, bueno en verdad ya tengo algo, un poco de esperiencia en php, pero ahora estoy con C, por que me interesa enormemente la programacion de videojuegos, entonces estoy haciendo un pequeño juego del tipo comecocos, no es un perfecto remake ni nada por que como he dicho estoy empezando, pero llega un punto en el que ya tengo hecho el control del comecocos, el cambio de sprites segun la direccion a la que se dirija, y un par de cosas mas, pero necesito de un mapa.

El casoes que encontre TileStudio, una herramienta de creaciond e tiles y mapas muy potente y que a la vez la encontre facil, entocnes hice un mapa en el para probarlo. Pero ahora como puedo usar el mapa que creo con este programa, por que lo que hace es que le doy a generar codigo (seleccionando antes que lo queria para utilizar con la biblioteca allegro que es la que utilizo) y me da el codigo con unos arrays definiendo el mapa, algo de las imagenes y me crea un "tileset" en bmp de los tiles que he creado. Ahora yo para usarlo en mi juego ¿Como deberia de hacerlo mas o menos? Ya que en esta parte si me quedo un poco en blanco.

Antes se me ocurrio de hacer los mapas manualmente, usando una imagen bmp de fondo que contendria el mapa, y otra imagen que solo tendria repasados los bordes de las paredes del mapa en un color que usaria mi programa para tener de referencia a dodne puede ir el comecocos (para que no traspase las paredes), entocnes tendria que programar unas funciones que irian leyendo de la imagen esta de referencia segun la posicion del comecocos hacia donde podria ir, pero lo vi muy complejo, tener que comprobar por la posicion de cada punto del borde de la imagen del comecocos en la imagen de referencia, si el comecocos puede pasar por ahi o no, asi que si ese trabajo me lo puede ahorrar el tilestudio pues mejor que mejor.

Esperando vuestros sabios consejos, un saludo!!

Top