Sign in to follow this  
Kpaiva

2d tile rendering using tmx-parser and SDL

Recommended Posts

Kpaiva    100
I'm working on getting a map created in Tiled ([url="http://mapeditor.org/"]http://mapeditor.org[/url]) to render after parsing the map with tmx-parser ([url="http://code.google.com/p/tmx-parser/"]http://code.google.com/p/tmx-parser/[/url]). I've got the tiles to render in the correct positions, but i can't seem to get it to render the correct tiles from the tileset. I'm using the isometric_grass_and_water example from tiled to test it.

Can anyone tell me what i'm doing wrong?

[CODE]
void Map::RenderMapIsometric(SDL_Surface *SurfaceDest)
{
for (int i = 0; i < map->GetNumLayers(); ++i)
{
// Get a layer.
this->layer = map->GetLayer(i);
for (int x = 0; x < layer->GetWidth(); ++x)
{
for (int y = 0; y < layer->GetHeight(); ++y)
{
int CurTile = layer->GetTileGid(x, y);
if(CurTile == 0)
{
continue;
}
int tileset_col = (CurTile % (TilesetWidth / this->tileset->GetTileWidth()));
int tileset_row = (CurTile / (TilesetWidth / this->tileset->GetTileWidth()));
std::cout << CurTile << std::endl;
SDL_Rect rect_CurTile;
rect_CurTile.x = (this->tileset->GetMargin() + (this->tileset->GetTileWidth() + this->tileset->GetSpacing()) * tileset_col);
rect_CurTile.y = (this->tileset->GetMargin() + (this->tileset->GetTileHeight() + this->tileset->GetSpacing()) * tileset_row);
rect_CurTile.w = this->tileset->GetTileWidth();
rect_CurTile.h = this->tileset->GetTileHeight();
int DrawX = (x * this->tileset->GetTileWidth() / 2) + (y * this->tileset->GetTileWidth() / 2);
int DrawY = (y * this->tileset->GetTileHeight() / 2) - (x * this->tileset->GetTileHeight() / 2);
apply_surfaceClip(DrawX, DrawY, surf_Tileset, SurfaceDest, &rect_CurTile);
}
}
}
}
[/CODE]

Share this post


Link to post
Share on other sites
Kpaiva    100
I found the answer after some brute force here is the changed working code if anyone else needs it:
PS: Num_Of_Cols is the same thing as (TilesetWidth / TileWidth)

[CODE]
void Map::RenderMapIsometric(SDL_Surface *SurfaceDest)
{
for (int i = 0; i < map->GetNumLayers(); ++i)
{
// Get a layer.
this->layer = map->GetLayer(i);

for (int x = 0; x < layer->GetWidth(); ++x)
{
for (int y = 0; y < layer->GetHeight(); ++y)
{
int CurTile = layer->GetTileGid(x, y);
if(CurTile == 0)
{
continue;
}
//CurTile = tileset->GetFirstGid() + CurTile;
CurTile--;

int tileset_col = (CurTile % Num_Of_Cols);
int tileset_row = (CurTile / Num_Of_Cols);
SDL_Rect rect_CurTile;
rect_CurTile.x = (this->tileset->GetMargin() + (this->tileset->GetTileWidth() + this->tileset->GetSpacing()) * tileset_col);
rect_CurTile.y = (this->tileset->GetMargin() + (this->tileset->GetTileHeight() + this->tileset->GetSpacing()) * tileset_row);
rect_CurTile.w = this->tileset->GetTileWidth();
rect_CurTile.h = this->tileset->GetTileHeight();
int DrawX = (x * this->tileset->GetTileWidth() / 2) + (y * this->tileset->GetTileWidth() / 2);
int DrawY = (y * this->tileset->GetTileHeight() / 2) - (x * this->tileset->GetTileHeight() / 2);
apply_surfaceClip(DrawX, DrawY, surf_Tileset, SurfaceDest, &rect_CurTile);
}
}
}
}
[/CODE]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this