C++ 如果Y值为1,则即使X值为0,std::map中的sf::Vector2i作为键也显示为(1,1)
我试图在我的程序中使用sf::Vector2i作为平铺贴图的键。正如我在标题中所写的,无论X值是什么,它都将在地图中只显示X和Y的Y值 下面是调试器的图像,它显示了我的意思: 如您所见,键值如下:[0][0],[1][1],[2][2],[3][3]等,而实际值是我期望的值(0,0-0,1-0,2-0,3等) 地图的声明:C++ 如果Y值为1,则即使X值为0,std::map中的sf::Vector2i作为键也显示为(1,1),c++,sfml,C++,Sfml,我试图在我的程序中使用sf::Vector2i作为平铺贴图的键。正如我在标题中所写的,无论X值是什么,它都将在地图中只显示X和Y的Y值 下面是调试器的图像,它显示了我的意思: 如您所见,键值如下:[0][0],[1][1],[2][2],[3][3]等,而实际值是我期望的值(0,0-0,1-0,2-0,3等) 地图的声明: std::map tileMap; 键(sf::Vector2i)是平铺位置,值对中的sf::Vector2f是实际位置(因此平铺映射[0,1]。首先是0,32,因为平铺
std::map tileMap;
键(sf::Vector2i)是平铺位置,值对中的sf::Vector2f是实际位置(因此平铺映射[0,1]。首先是0,32,因为平铺之间的间距为32)
以下是填充地图的循环:
intxpos{0},yPos{0};
对于(inti{0};i
地图比较器:
结构向量比较器
{
布尔运算符()(sf::Vector2i lhs,sf::Vector2i rhs)常量
{
返回lhs.x+lhs.ytileMap[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);
}
};
结构向量比较器
{
布尔运算符()(sf::Vector2i lhs,sf::Vector2i rhs)常量
{
返回lhs.x作为一个次要建议,我将使用std::vector而不是std::list(在几乎所有情况下都会更快,除非您真的需要有指向始终有效的元素的指针)。我还将使用std::unordered_map而不是std::map(再一次,更快)。看起来我的比较器关闭了!你的解决方案解决了这个问题。我会记住你关于矢量和无序地图的建议,谢谢!我会尽快接受你的答案:)编辑:另外,关于我上次的编辑,即使它工作,它仍然显示好像它是错误的,但它真的不是。即使调试器说它不是正确的,该键也是正确的!