sf :: Vector2i作为std :: map中的键,即使Y值为1,即使X值为0,也显示为(1,1)

时间:2019-06-08 11:53:46

标签: c++ sfml

我正在尝试使用sf :: Vector2i作为程序中图块映射的键。正如我在标题中所写,无论X值是多少,它都会在地图中仅显示X和Y的Y值。

这是调试器的图像,显​​示了我的意思:

debugger image

如您所见,键值如下所示:[0] [0],[1] [1],[2] [2],[3] [3]等,而实际值是我希望(0,0-0,1-0,2-0,3等)。

地图声明:

std::map<sf::Vector2i, std::pair<sf::Vector2f, std::list<unsigned int>>, VectorComparator> tileMap;

键(sf :: Vector2i)是图块位置,值对中的sf :: Vector2f是实际位置(所以tileMap [0,1]。当图块间隔开时,第一个将是0.32。乘32)

以下是填充地图的循环:

int xPos {0}, yPos {0};
for (int i {0}; i < width / WorldInfo::tileSize; ++i)
{
    for (int z {0}; z < height / WorldInfo::tileSize; ++z)
    {
        tileMap[sf::Vector2i(i, z)].first = sf::Vector2f(xPos, yPos);
        tileMap[sf::Vector2i(i, z)].second = std::list<unsigned int>();

        yPos += WorldInfo::tileSize;
    }

    yPos = 0;
    xPos += WorldInfo::tileSize;
}

地图比较器:

struct VectorComparator
{
    bool operator() (sf::Vector2i lhs, sf::Vector2i rhs) const
    {
        return lhs.x + lhs.y < rhs.x + rhs.y;
    }
};

知道这里发生了什么吗?对于我来说,为什么在键没有反映出值的情况下为什么值是正确的呢?

编辑:

如果我像这样手动添加图块:

tileMap[sf::Vector2i(0, 5)].first = sf::Vector2f(50, 50);

如果该条目首先被添加,则其键也将为[0] [0]。如果我一个接一个地添加,它将是[1] [1],依此类推。似乎键值不在乎sf :: Vector2i的内容?

1 个答案:

答案 0 :(得分:2)

您的比较运算符是错误的。

您比较曼哈顿两点的距离,这是错误的。 0,1点和1,0点具有相同的距离(0 + 1 == 1 + 0),因此tileMap中将仅存在一个(后一个)。

尝试一下:

struct VectorComparator
{
    bool operator() (sf::Vector2i lhs, sf::Vector2i rhs) const
    {
        return lhs.x < rhs.x || (lhs.x == rhs.x && lhs.y < rhs.y);
    }
};

编辑: 作为次要建议,我将使用std :: vector而不是std :: list(在几乎所有情况下都更快,除非您确实需要始终有指向有效元素的指针)。我还将使用std :: unordered_map而不是std :: map(再次,更快)。