我正在努力获取在Tiled(http://mapeditor.org)中创建的地图,以便在使用tmx-parser解析地图后进行渲染(http://code.google.com/p/tmx-parser/ )。我已经将瓷砖渲染到正确的位置,但我似乎无法从瓷砖组渲染正确的瓷砖。我正在使用tiles中的isometric_grass_and_water示例来测试它。
这是我的渲染代码。
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);
}
}
}
}
有谁可以指出我做错了什么?
答案 0 :(得分:1)
如果其他人需要改变工作代码,我在这里发现了一些蛮力: PS:Num_Of_Cols与(TilesetWidth / TileWidth)相同
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);
}
}
}
}