使用tmx解析器和SDL的二维瓦片渲染



我正在Tiled中创建一个地图(http://mapeditor.org)使用tmx解析器解析映射后进行渲染(http://code.google.com/p/tmx-parser/)。我已经在正确的位置渲染了瓷砖,但我似乎无法从瓷砖集中渲染正确的瓷砖。我使用tiled中的isometric_gras_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); 
            }
        }
    }
}

有人能指出我做错了什么吗?

经过一番努力,我找到了答案——如果其他人需要的话,这里是更改后的工作代码: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); 
        }
    }
}
}

相关内容

  • 没有找到相关文章

最新更新