繁体   English   中英

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

[英]sf::Vector2i as key in std::map shows as (1, 1) if the Y value is 1 even if the X value is 0

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

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

调试器映像

如您所见,键值如下所示:[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] .first将为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的内容?

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

您比较两点的曼哈顿距离,这是错误的。 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(再次,更快)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM