2016-07-30 64 views
-1

目前我遇到了我的代码问题。我尝试了一切。 image is here 我希望有人能帮助我:)。顺便说一句我是新来的C++C++ SFML从地图返回所有精灵

+0

Give [this](http://stackoverflow.com/questions/110157/how-to-retrieve-all-keys-or-values-from-a-stdmap)一看 – pie3636

+0

你能告诉我什么是错的在我的代码? –

+0

您正在遍历sprites.comp_value,它是地图中精灵的比较函数,在此上下文中没有意义。我建议尝试:'for(auto sprite:sprites)'这将遍历键。然后您可以使用'sprite.second'访问这些值。这假设你正在使用STL地图容器。 – pie3636

回答

0
#include <SFML\Graphics.hpp> 

std::map<std::string, sf::Sprite> sprites; 

void addSprite(std::string sprite_name, sf::Texture sprite_texture) { 

    sf::Sprite sprite; 

    sprite.setTexture(sprite_texture); 

    sprites[sprite_name] = sprite; 

} 

sf::Sprite getSprite(std::string sprite_name) { 

    return sprites[sprite_name]; 
} 

std::vector<sf::Sprite> getSprites() { 

    std::vector<sf::Sprite> sprites_c2; 

    for each (sf::Sprite sprite in sprites.value_comp) { 

     sprites_c2.emplace_back(sprite); 

    } 

    return sprites_c2; 
} 
+0

您可能想在下次编辑原始帖子;这部分是为了试图回答你的问题的人。 – pie3636

0

for each是无效的C++;首先是C++ 11,正确的表达是 for (<type> <variable> : <collection>)

在这里,你也试图通过sprites.value_comp访问元素的集合,这是一个功能,没有意义在这里。

假设spritesstd::set容器,你可以迭代它是这样的:如果你使用的是std::map代替

for (auto sprite : sprites) { 
    // sprite is the value you're looking for 
} 

,使用相同的循环,但sprite不会包含您的sf::Sprite但它的关键,您将需要使用sprite.second来访问精灵。

请注意,auto关键字可让编译器确定变量的类型。

如果你的编译器不支持C++ 11,你需要做这样的事情,而不是:

std::set<sf::Sprite>::iterator it; 
for (it = sprites.begin(); it != sprites.end(); ++it) 
{ 
    // Access each sprite using *it (the star is necessary here) 
} 

随着std::map

// Replace "keyType" with the type of the keys, such as int or std::string 
std::map<keyType, sf::Sprite>::iterator it; for (it = sprites.begin(); it != sprites.end(); ++it) 
{ 
    // Access each sprite using it->second 
} 

如果你只是想转换您的std::set转化为std::vector,但是,有更简单的方法可以做到这一点:

std::vector <sf::Sprite> sprites_c2; 
std::copy(sprites.begin(), sprites.end(), std::back_inserter(sprites_c2)); 

对于std::map没有任何单行版本,因此您将不得不按照上面所述重复循环。

+0

非常感谢。 –

+0

请注意,有一种更简单的方法,假设你只是试图将'std :: set'转换为'std :: vector':只需创建一个空向量并添加'std :: copy(sprites.begin (),sprites.end(),std :: back_inserter(sprites_c2)); ' – pie3636