为2d游戏分配tilemap'tiles'和数值

时间:2013-12-26 22:05:29

标签: c++ 2d tile

我正在使用一个系统,根据tileset读取我的tilemap的x和y,并显示相对图像。这是有效的,但是我发现用手工制作地图是非常困难的,因此决定使用一个名为“Tiled”的程序,但这样做是读取图像,在我的情况下每隔32px并将其设置为数字,让我试试为了解释,想象下面的每个数字是一个32x32px的正方形,这个数字表示Tiled如何将图像存储为数字,直到达到图像的宽度(例如图像为160px或5个图块宽),然后打开一条新线继续计算..

[1] [2] [3] [4] [5]

[6] [7] [8] [9]

这会抛出我的脚本,因为不使用x和y。我已经尝试过搜索和尽可能多的东西来调整我的代码以读取新格式但完全失败,下面是我当前加载地图的功能。

void LoadMap(const char*filename)
{
std::ifstream openfile(filename);
std::vector<sf::Vector2i> tempMap;
map.clear();

if(openfile.is_open())
{
    std::string tileLocation;
    openfile >> tileLocation;
    tileTexture.loadFromFile(tileLocation);
    tiles.setTexture(tileTexture);
    while(!openfile.eof())
    {
        std::string str, value;
        std::getline(openfile, str);
        std::stringstream stream(str);

        while(std::getline(stream, value, ' '))
        {
            if(value.length() > 0)
            {
                std::string xx = value.substr(0, value.find(','));
                std::string yy = value.substr(value.find(',') + 1);

                int x, y, i, j;

                for(i = 0; i < xx.length(); i++)
                {
                    if(!isdigit(xx[i]))
                        break;
                }

                for(j = 0; j < yy.length(); j++)
                {
                    if(!isdigit(yy[j]))
                        break;
                }

                x = (i == xx.length()) ? atoi(xx.c_str()) : -1;
                y = (j == yy.length()) ? atoi(yy.c_str()) : -1;

                tempMap.push_back(sf::Vector2i(x, y));
            }
        }

        if(tempMap.size() > 0)
        {
            map.push_back(tempMap);
            tempMap.clear();
        }
    }
}
}

我需要的是脚本为每个32x32平方分配一个数字然后开始一个新行并继续直到它到达tilemap.png的末尾

我很抱歉,如果这是一个愚蠢的请求,我对c ++很新,所以如果您需要任何其他信息,那么任何关于让我的代码读取新格式的指针都将非常感激。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你有这种对应关系,你想将N转换为{x,y}和/或反之亦然。

X = 1    2    3    4    5
  [ 1] [ 2] [ 3] [ 4] [ 5] y = 0
  [ 6] [ 7] [ 8] [ 9] [10] y = 1
  [ N]

所以,以下可能有所帮助

void NToXY(unsigned int N, unsigned int& x, unsigned int& y)
{
    x = (N - 1) % 5 + 1;
    y = (N - 1) / 5 + 1;
}

void XYToN(unsigned int x, unsigned int y, unsigned int& N)
{
    N = (y - 1) * 5 + x;
}

答案 1 :(得分:0)

这篇文章涵盖了拼贴如何理解地图数据的逻辑。 Parsing and Rendering Tiled TMX Format Maps in Your Own Game Engine

讨论如何将(x,y)坐标转换为&#39; gid&#39; Tiled使用的。

它的要点是他们使用1d数组来存储游戏内地图的所有图块数据(并且还使用1d数组来索引图块的纹理贴图)。这里的想法是,在紧凑的1d数字数组中,您可能能够利用缓存加载导致的性能提升。

这里有另一个问题,更详细地介绍了这项技术:Map a 2D array onto a 1D array C

似乎Jarod42的答案具有您进行数学/转换所需的功能。这对于临时转换系统非常有用。我建议重写你的引擎以更直接地利用GID属性,因为它会为你节省一些痛苦。您可以将转换函数作为辅助函数保留,以供日后使用。