[SOLUCIONADO]Imprimir mapa en sdl desde extension .tmx

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

[SOLUCIONADO]Imprimir mapa en sdl desde extension .tmx

Notapor drog » Jue Jul 26, 2012 6:48 pm

Hola les cuento, estoy tratando de imprimir un mapa desde un archivo tmx, buscando por internet vi que su engine pilas usa mapas tmx, pero a mi me interesa hacerlo desde c++ con sdl.

Tengo el siguiente codigo

int tilesize= tileset->GetTileWidth();
int img_W = tileset->GetImage()->GetWidth();
int img_H = tileset->GetImage()->GetHeight();

int tileW = img_W / tilesize;
int tileH = img_H / tilesize;
int tileMargin = tileset->GetMargin();
int tileSpace = tileset->GetSpacing();
int num_layers =map->GetNumLayers();

for (int i = 0; i <num_layers ; ++i) {
const Tmx::Layer *layer = map->GetLayer(i);
int map_ancho=layer->GetWidth();
int map_alto=layer->GetHeight();
for (int x = 0; x < map_ancho; ++x) {
for (int y = 0; y < map_alto ; ++y) {
const Tmx::Tileset *tileset = map->FindTileset(layer->GetTileId(x, y));
int TileId = layer->GetTileId(x, y);
if(TileId==0){
TileId++;
continue;
}

tileRect.x = (TileId % tileW) *tilesize;
tileRect.y = (TileId / tileH) *tilesize;
tileRect.w= tilesize;
tileRect.h= tilesize;

mapRect.x= x* tilesize;
mapRect.y= y* tilesize;

SDL_BlitSurface( Image, &tileRect, screen, &mapRect );
SDL_UpdateRect(screen,0,0,0,0);
}
}
}


El cual esta basado en las especificaciones de https://github.com/bjorn/tiled/wiki/TMX-Map-Format para obtener los datos.
y el algoritmo para obtener los tiles de la imagen lo base en varios ejemplo en la web, pero no he logrado imprimir el mapa perfectamente, y la verdad aun no logro apreciar cual es mi error.
Última edición por drog el Sab Jul 28, 2012 10:01 pm, editado 1 vez en total
drog
 
Mensajes: 3
Registrado: Jue Jul 26, 2012 6:41 pm

Re: Imprimir mapa en sdl desde extension .tmx

Notapor drog » Jue Jul 26, 2012 8:46 pm

Me respondo a mi mismo xD

el error era en esta linea : tileRect.y = (TileId / tileH) *tilesize;
donde debia ser : tileRect.y = (TileId / tileW) *tilesize;

PERO aun me queda un problema por si alguien me puede ayudar, como dibujar un mapa con tiles con espacio y margen.
Y tambien como ver el tema de las colisiones.

Bueno aca les dejo el codigo porsi las moscas


#include <TmxParser/Tmx.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

const short SCREEN_WIDTH = 555;
const short SCREEN_HEIGHT = 555;
const short DEPTH = 16;

int main() {


SDL_Surface* screen = NULL; /*pantalla*/
SDL_Init( SDL_INIT_VIDEO );
bool gameover = false;
SDL_Event event;
/*SDL_SWSURFACE Crea superficie de video en memoria de sistema*/
screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, DEPTH, SDL_SWSURFACE );


Tmx::Map *map = new Tmx::Map();
map->ParseFile("./example/untitled.tmx");

if (map->HasError()) {
printf("error code: %d\n", map->GetErrorCode());
printf("error text: %s\n", map->GetErrorText().c_str());
return map->GetErrorCode();
}


SDL_Rect tileRect;
SDL_Rect mapRect;

const Tmx::Tileset *tileset;
for (int i = 0; i < map->GetNumTilesets(); ++i) {
tileset = map->GetTileset(i);

if (tileset->GetTiles().size() > 0) {
// Get a tile from the tileset.
const Tmx::Tile *tile = *(tileset->GetTiles().begin());
}
}

SDL_Surface *Image = IMG_Load(tileset->GetImage()->GetSource().c_str());
int tilesize= tileset->GetTileWidth();
int img_W = tileset->GetImage()->GetWidth();
int img_H = tileset->GetImage()->GetHeight();
int tileW = img_W / tilesize;
int tileH = img_H / tilesize;
int tileMargin = tileset->GetMargin();
int tileSpace = tileset->GetSpacing();
int num_layers =map->GetNumLayers();

for (int i = 0; i <num_layers ; ++i) {
const Tmx::Layer *layer = map->GetLayer(i);
int map_ancho=layer->GetWidth();
int map_alto=layer->GetHeight();
for (int x = 0; x < map_ancho; x++) {
for (int y = 0; y < map_alto ; y++) {
int TileId = layer->GetTileId(x, y);
if(TileId==0){
TileId--;
continue;
}

tileRect.x = (TileId % tileW) *tilesize;
tileRect.y = (TileId / tileW) *tilesize;
tileRect.w= tilesize;
tileRect.h= tilesize;

mapRect.x= x* tilesize;
mapRect.y= y* tilesize;

SDL_BlitSurface( Image, &tileRect, screen, &mapRect );
SDL_UpdateRect(screen,0,0,0,0);
}

}
}

while(!gameover){
/* Verifica eventos */
if (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
gameover = true;
break;
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_ESCAPE:
case SDLK_q:
gameover = true;
break;
}
break;
}
}

}

return 0;
}

compilar en linux: g++ -o main TmxParser_Test.cpp -ltinyxml -lz -ltmxparser -lSDL -lSDL_image


Esta bastante desordenado y varias cosas se pueden optimizar pero lo hize para pruebas xD.
drog
 
Mensajes: 3
Registrado: Jue Jul 26, 2012 6:41 pm

Re: Imprimir mapa en sdl desde extension .tmx

Notapor drog » Sab Jul 28, 2012 10:01 pm

He solucionado parcialmente el tema de las colisiones con la idea de esta pagina http://aventurapygame.blogspot.com.es/2011/10/colisiones-del-personaje-con-el-mapa.html
drog
 
Mensajes: 3
Registrado: Jue Jul 26, 2012 6:41 pm


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado