2016-07-30 62 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