PDA

Ver la versión completa : ¿Como manejar tiles?



Eskema
23/10/2005, 23:48
Muy buenas, tengo una duda con los dichosos tiles, hasta ahora yo definia varios surfaces, 1 por cada imagen, con lo cual todo perfecto, pero despues de ver la funcion de puck para usar 1 solo surface he intentado aprovecharla para poder mostrar un mapa de tiles, pero nada de nada.
¿Alguno se ha peleado ya con los tiles? me gustaria poder dejar un codigo mas limpio y facil de ver. Aqui os dejo la funcion q uso ahora mismo,

void RenderizaMapa( tObjeto *obj, SDL_Surface *salida)
{
for(i=0; i<15; i++){ //el mapa mide 15 tiles alto
for(j=0; j<20; j++){ //20 tiles de ancho, son de 32x32 los tiles
t=mapa[(i*20+j)];
x=j*32;
y=i*32;
obj->x=x;
obj->y=y;
SDL_Rect dest;
if (obj)
{
dest.x = obj->x+obj->offsetx;
dest.y = obj->y+obj->offsety;


SDL_BlitSurface(obj[t].imagen, NULL, salida, &dest);
}
}
}
}

Esto es lo q uso para mostrar el mapa en pantalla y va perfecto, pero claro, cargo cada imagen con el img_load, defino un surface para cada tile,etc.

chipan
23/10/2005, 23:55
buf, Yo en fenix manejo mapas de tiles, pero en SDL no te se decir XD!.

Eskema
24/10/2005, 00:00
SDL_Surface *tiles[2];
char mapa[300]; //el tamaño del mapa en bytes del mappy
tiles[0] = IMG_Load(TILE1);
tiles[1] = IMG_Load(TILE2);

y esto es todo amigos :)

Wave
24/10/2005, 00:14
Lo que tienes que hacer es meter todos los tiles en una sola imagen y luego acceder a ellos mediante el indice que uses en tus mapas.

1 2 3 4 5
6 7 8 9 a
b c d e f

Algo asi en el fichero.

Eskema
24/10/2005, 01:11
¿Eso usando el mappy es posible wave? lo q hago es cargar el fichero .map del mappy luego voy leyendo el archivo y asociando cada tile a su imagen, voy a probar eso q dices.

D_Skywalk
24/10/2005, 17:53
Eskema, ese cargador de MAPs que caracteristicas tiene? te permite tiles animados? :)

La forma que yo lo he hecho es como te ha comentado Wave, un array donde cada valor es la posicion de la baldosa.

Un ejemplo un poco eskematiko xD



0 1 2 3 4
SDL_Surface *BALDOSAS [Agua] [Tierra] [Fuego] [Lava] [Roca]

u8 MAPA {
0, 0, 0, 0,
0, 1, 1, 4,
0, 4, 1, 1
}

Espero que al menos se entienda la idea xD

Un Saludo

Eskema
25/10/2005, 01:31
Los mapas yo los hago con el mappy, www.tilemap.co.uk q es para hacerlos de forma visual, pq eso de hacer el array como comentais esta muy bien, pero para un juego con grandes mapas.......
El mappy permite tiles animados y mas cosas, pero para usar su formato hay una libreria en c++, asi q tienes 2 opciones, o bien portas esa libreria a c (cosa q yo te agradeceria) o bien haces como yo y pierdes las propiedades avanzadas del mappy, tiles animados, capas, transparencias y te quedas solo con el .map basico.

Puck2099
25/10/2005, 02:27
A ver, voy a intentar explicarte como lo hago yo, lo cual no quiere decir que sea la mejor manera de hacerlo, pero es con la que más cómodo me siento :)

Supongamos que tenemos un mapa de tiles, que está compuesto de, por ejemplo, 10 tiles. Siguiendo tu ejemplo, cada tile mide 32x32 píxels.

El mapa de tiles lo hemos hecho de forma que sea una "tira" con todos los tiles puestos uno al lado del otro, es decir, una imagen de 320x32 píxeles:



------------------------------------------------------
| Tile1 | Tile2 | Tile3 | ......... | Tile10 |
------------------------------------------------------


Este mapa de tiles lo cargamos en una SDL_Surface que llamaremos Imagen.

Pues bien, estos tiles los numeraremos de 0 a 9, siguiendo las posiciones del mapa (Tile1 = 0, Tile2 = 1...).

Tenemos un mapa de 15x20 tiles, tal y como indicas, que supongo será una matriz de tipo Char de 15x20.


char mapa[20][15]

Pues bien, no tienes más que hacer un bucle de la forma:



for (i=0; i<15; i++) {
for (j=0; j<20; j++) {
DrawIMG (Imagen, j*32, i*32, 32, 32, mapa[j][i]*32, 0);
}
}


Con la función DrawIMG:



void DrawIMG (SDL_Surface * img, int x, int y, int w, int h, int x2, int y2) {
SDL_Rect dest;
dest.x = x;
dest.y = y;
SDL_Rect src;
src.x = x2;
src.y = y2;
src.w = w;
src.h = h;
SDL_BlitSurface (img, &src, screen, &dest);
}


Si necesitas que te explique como funciona el bucle, la DrawIMG o algo, dímerlo sin problemas :)

Eskema
25/10/2005, 03:22
Yo lo preguntaba mas q nada por si alguien usaba el mappy para ver como lo hacia, lo de usar una tira como bien dices puck esta chupao ;) Mi unica preocupacion era ver si alguien tenia una forma de cargar mapas de tiles hechos con el mappy, pq yo lo hago a mano.

saucjedi
25/10/2005, 04:17
Yo lo preguntaba mas q nada por si alguien usaba el mappy para ver como lo hacia, lo de usar una tira como bien dices puck esta chupao ;) Mi unica preocupacion era ver si alguien tenia una forma de cargar mapas de tiles hechos con el mappy, pq yo lo hago a mano.

Habra que echar un ojo a esa libreria... De todos modos, ya me comentas que carcateristicas en concreto quieres aprovechar (supongo que no seran todas... o si?) y si acaso lo vamos comentando en el foro para disfrute y provecho de otros que tengan las mismas dudas.

Wild[Kyo]
25/10/2005, 04:29
Yo lo preguntaba mas q nada por si alguien usaba el mappy para ver como lo hacia, lo de usar una tira como bien dices puck esta chupao ;) Mi unica preocupacion era ver si alguien tenia una forma de cargar mapas de tiles hechos con el mappy, pq yo lo hago a mano.

Wenas Eskema, pues yo uso el mappy y el .map para cargar el mapa y hacer scroll. El problema es que se supone que lo hago todo bien y,como te comenté ayer, me compila pero al ejecutar me sale lo de parachute (y las imagenes estan donde deben estar, ya que cargarlas las carga).

Si quieres te paso como lo hago yo aunque he visto que algunas funciones que has puesto son bastante parecidas a las mias.

Un saludo
WiLD

Wild[Kyo]
25/10/2005, 04:31
Por cierto si alguien consigue o tiene unos metodos o alguna funcion para cargar los mapas del mappy y hacer scroll me haria un favor muy grande pasandomelo para echarle un vistazo...

Un saludo
WiLD

AOJ
25/10/2005, 05:11
']Por cierto si alguien consigue o tiene unos metodos o alguna funcion para cargar los mapas del mappy y hacer scroll me haria un favor muy grande pasandomelo para echarle un vistazo...

Un saludo
WiLD

Eso se lo explicas a la profe de PROM, que tiene delito que suspendas la práctica y luego hagas estas cosillas! :p

Wild[Kyo]
25/10/2005, 05:24
Eso se lo explicas a la profe de PROM, que tiene delito que suspendas la práctica y luego hagas estas cosillas! :p

XDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDD
JAJAJAjajaJAJAjA xD Ostia como me he partido con tu comentario. XD

No te he comentado que al final me gusto tanto IPRO que saque un 10 (tambien es que era la tercera...) asi que me molo lo de programar. Y PROM...***** he tenido clase hace unas 3 horas y aun estoy flipando... ^^UU

Wave
25/10/2005, 05:27
Y PROM son las siglas de?

Wild[Kyo]
25/10/2005, 05:37
Es una asignatura de la UPC de Informatica de Gestión.

Programación Metódica, una asignatura de esas que no sabes muy bien para que existen ya que nunca vas a usar nada de lo que te explican (excepto, quizás, a usar recursividad...)

Un saludo
W.

PD1: Tú no sabrás nada del tema del hilo Wave? :(

PD2: Wave, ¿no tienes una página con tu GPGame de GP32? Es para la sección de links...

AOJ
25/10/2005, 05:53
']XDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDD
JAJAJAjajaJAJAjA xD Ostia como me he partido con tu comentario. XD

No te he comentado que al final me gusto tanto IPRO que saque un 10 (tambien es que era la tercera...) asi que me molo lo de programar. Y PROM...***** he tenido clase hace unas 3 horas y aun estoy flipando... ^^UU

Es normal lo de quedarse flipado con PROM, realmente estuve muy contento de aprobarla, pero no tanto como con EDA (estructuras de datos y algoritmos)L ;).

Wave ... pues creo que me dijo que las habia hecho ... verdad GUAVESITO?

Vale, dejemos aquí el offtopic que sinó rompemos el tema inicial. Simplemente he encontrado el momento oportuno para soltarte el comentario :p :quepalmo:

Saludos!

PD: Caguen la leche, mañana tengo exámen! Qué **** hago aquí posteando? >_<

Puck2099
25/10/2005, 06:31
Yo lo preguntaba mas q nada por si alguien usaba el mappy para ver como lo hacia, lo de usar una tira como bien dices puck esta chupao ;) Mi unica preocupacion era ver si alguien tenia una forma de cargar mapas de tiles hechos con el mappy, pq yo lo hago a mano.

Tío, especifica lo del mappy desde el principio, please, así nos ahorramos el perder tiempo explicando algo que ya sabes :)

Eskema
25/10/2005, 06:44
Razon tienes puck, mea culpa :( estaba yo tan liado el domingo con la funcion y hablando con el trafuga q me olvide poner el post q usaba el mappy :(

D_Skywalk
25/10/2005, 17:09
Eskema le hechare un ojo a la lib de mappy seguro que a mas gente le vendra bien :)

¿Hay mappy para linux?

Un Saludo ^^_

Puck2099
25/10/2005, 17:14
¿Hay mappy para linux?

Sí, a raiz de las dudas de Eskema estuve buscando y encontré una versión en SDL con binarios para Linux :)

D_Skywalk
25/10/2005, 18:15
Esta? http://membres.lycos.fr/edorul/SDLMappye.htm

Acabo de compilarla para Debian/ubuntu si alguien la necesita que avise y la adjunto :)

Un Saludo, ahora vendria bien pasar ese SDL_Mappy a C ^^_
Pd: Adjuntado :_D

Eskema
25/10/2005, 18:26
Exactamente, skywalk, esa misma libreria, y desde luego si se pudiera pues mejorar el soporte para 8bits pq dice q los mapas a 8bits van muy lentos. Pero bueno si se porta a c, podemos usar los mapas hechos con mappy y aprovecharnos de los tiles animados, varias capas para hacer scrolles multiples y mas cositas q trae el mappy.

Wild[Kyo]
25/10/2005, 21:15
Pues si creais una libreria estaría genial, Eskema ya sabe como me tengo que pelear con los mapas del Mappy...que por más vueltas que le doy no me salen... :'(

D_Skywalk
26/10/2005, 17:16
Lo unico que me moskea es eso de que haya que compilar con threads... me da muy mal roio y ademas que segun chui eso no tiraba en el port de GP32 :?

Un Saludo

Puck2099
26/10/2005, 17:33
Lo unico que me moskea es eso de que haya que compilar con threads... me da muy mal roio y ademas que segun chui eso no tiraba en el port de GP32 :?

Un Saludo

Sí, yo también creo que dijo que no funcionaban los hilos...

Eskema
24/11/2005, 02:56
Estaba probando de cambiar la forma en q cargo los mapas con el mappy y no lo consigo, a ver si algun alma caritativa me dice pq no se ven todos los tiles (solo se ve 1)

Primero pasamos el mapa a .h

int mapa_ancho = 20;
int mapa_alto = 15;
int resident_map[15][20] {array mapa}


y luego intento dibujar el mapa pero no consigo q lo dibuje bien
tiles es un struct donde guardo la imagen, y otros datos tipo colision,etc.


void RenderizaMapa(Tiles *obj, SDL_Surface *salida)
{
for(i=0; i<mapa_alto; i++){
for(j=0; j<mapa_ancho; j++){
if(resident_map[i][j]==1) {obj[0].imagen;}
if(resident_map[i][j]==2) {obj[1].imagen;}
tile=resident_map[i][j];

x=j*TILESIZE;
y=i*TILESIZE;
obj->x=x;
obj->y=y;


SDL_Rect dest;
if (obj)
{
dest.x = obj->x;
dest.y = obj->y;


SDL_BlitSurface(obj[tile%2].imagen, NULL, salida, &dest);
}
}
}
}

Estoy mas perdio.............. :(

oankali
24/11/2005, 16:21
Estoy mas perdio.............. :(

Pues yo también!!
No entiendo muy bien lo que estás haciendo.
Si pudieras indicar como está definida la estructura Tiles, sería más fácil.

De todas formas, ¿Tiles.imagen es una función? Es que por lo visto intentas ejecutar el código que se encuentra en la dirección indicada por imagen ({obj[0].imagen;}).

Luego con if (obj), estás controlando que obj no esté a NULL, lo que significa que podría estarlo en cuyo caso las instrucciones obj->x=x; obj->y=y; daran error.

Eskema
24/11/2005, 16:58
Marchando una de struct tiles

typedef struct Tiles
{
int x, y;
int ancho, alto;
int colision;
int offsetx, offsety;
SDL_Surface * imagen;
SDL_Surface * tmp;
int xColision, yColision, altoColision,anchoColision;
}Tiles;

Esta es la estructura q uso para ir almacenando los tiles, luego declaro un Tiles tTiles[2]; pq tengo 2 tiles solamente (ya se q tengo espacio perdido por el 0)
luego cargo los tiles en el main,
CargarTile(&tTiles[0], &tTiles[0], &tile1, 2102);
CargarTile(&tTiles[1], &tTiles[1], &tile8, 1830);
&tile1 apunta al fichero .h donde esta la imagen convertida a un array unsigned char.

donde cargar tile es una funcion tal q asi

void CargarTile(Tiles *imagen, Tiles *tmp,unsigned char *, int);


Ahora llega el quid de la cuestion oankali, cuando hago el:
if(resident_map[i][j]==1) {obj[0].imagen;}
lo q trato es de asignar los 1 del array mapa al tile[0].imagen, de manera q sepa q los 1 son el tile[0], el 2 es el tile[1],etc.

Y con esto lo unico q consigo es q solo dibuje 1 tile sin importarle el otro en vez de elegir el tile correspondiente con [tile%2]

oankali
24/11/2005, 17:53
Sigo sin entender muy bien ya que me parece que mezclas la inicialización de tu mapa de tiles con la 'rederización'.

A ver si te sirve esto:



int mapa_ancho = 20;
int mapa_alto = 15;
int resident_map[15][20] {array mapa};
Tiles miMapa[15][20];




void InitMapa(Tiles *map, int *mappyMap)
{
Tiles *mapTile;
int tile;

for(i=0; i<mapa_alto; i++)
for(j=0; j<mapa_ancho; j++)
{
// De mappy a C
tile = mappyMap[i * mapa_ancho + j] - 1;

// Recuperamos la direccion del tile en el mapa
mapTile = &map[i * mapa_ancho + j];

// Inicializamos los miembros del tile
mapTile->imagen = tTiles[tile].imagen;
mapTile->x = i * TILESIZE;
mapTile->y = j * TILESIZE;
}
}

void RenderizaMapa(Tiles *map, SDL_Surface *salida)
{
SDL_Rect dest;
Tiles *mapTile;

for(i=0; i<mapa_alto; i++){
for(j=0; j<mapa_ancho; j++){
mapTile = &map[i * mapa_ancho + j];

dest.x = mapTile->x;
dest.y = mapTile->y;

SDL_BlitSurface(mapTile->imagen, NULL, salida, &dest);
}
}
}



// Solo una vez
InitMapa(miMapa, resident_map);

// A cada frame
RenderizarMapa(miMapa, salida);


Puede que haya algun error en el cálculo i * mapa_ancho + j y que haya que invertir ancho por alto o i por j.
Por cierto, cambia el nombre de tu estructura Tiles por Tile, ya que presta a confusión ya que en ella solo hay un tile a la vez.

Eskema
24/11/2005, 18:04
Muchisimas gracias por la molestia oankali, probare ese metodo. Acabo de descubrir el fallo en mi metodo, tan solo cambiando el numero del tile ya funciona y se dibuja el mapa correctamente.
El mapa actual tiene 2 tiles y el mappy lo exporta como {1,1,2,1,2,2,1} asi el resto. Yo iniciaba el tile[0] y el tile[1], tan solo cambiandolo por tile[1] y tile[2] ya funciona correctamente.

De todas maneras voy a probar tu metodo separando la iniciacion del mapa y el dibujado del mapa :)