【问题标题】:Assign tilemap 'tiles' and numerical value for 2d game为 2d 游戏分配 tilemap 'tiles' 和数值
【发布时间】:2013-12-26 22:05:29
【问题描述】:

我目前使用的系统会根据瓦片集读取瓦片地图的 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++ 非常陌生,因此任何关于使我的代码读取新格式的指针将不胜感激,如果您需要任何其他信息,请告诉我。

【问题讨论】:

    标签: c++ 2d tile


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

      这是一篇介绍 tiled 如何理解地图数据背后的逻辑的文章。 Parsing and Rendering Tiled TMX Format Maps in Your Own Game Engine

      它讨论了如何将 (x,y) 坐标转换为 Tiled 使用的“gid”。

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

      这是另一个更详细地介绍此技术的问题:Map a 2D array onto a 1D array C

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-26
        • 2016-06-22
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多