2016-07-30 16 views
-1

zur Zeit habe ich ein Problem mit meinem Code. Ich habe alles versucht. image is here Ich hoffe jemand kann mir helfen :). Btw neu in C++C++ SFML gibt alle Sprites aus der Karte zurück

+0

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

+0

Können Sie mir sagen, was los ist in meinem Code? –

+0

Sie führen eine Iteration über sprites.comp_value durch, die eine Vergleichsfunktion für die Sprites in Ihrer Map ist und in diesem Kontext keinen Sinn ergibt. Ich schlage vor zu versuchen: 'für (auto sprite: sprites)', die über die Schlüssel iterieren werden. Sie können dann mit 'sprite.second' auf die Werte zugreifen. Dies setzt voraus, dass Sie den STL-Map-Container verwenden. – pie3636

Antwort

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

Sie möchten den ursprünglichen Post beim nächsten Mal bearbeiten. Dieser Abschnitt ist für Personen gedacht, die versuchen, Ihre Frage zu beantworten. – pie3636

0

for each ich bin nicht gültig ist C++; beginnend mit 11 C++, versuchen, der richtige Ausdruck ist for (<type> <variable> : <collection>)

Hier können Sie auch die Sammlung von Elementen durch sprites.value_comp zugreifen zu können, die eine Funktion ist und hier nicht sinnvoll.

Unter der Annahme, sprites ist ein std::set Container, können Sie über sie iterieren auf diese Weise:

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

Wenn Sie eine std::map stattdessen verwenden, die gleiche Schleife verwenden, aber sprite nicht enthalten Ihre sf::Sprite aber seine Schlüssel, und Sie müssen sprite.second verwenden, um auf das Sprite zuzugreifen.

Beachten Sie, dass das Schlüsselwort auto den Compiler den Typ der Variablen bestimmen lässt.

Wenn Ihr Compiler nicht C++ 11 nicht unterstützt, müssen Sie so etwas wie dies zu tun, statt:

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

ein mit 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 
} 

Wenn Sie nur konvertieren möchten aber Ihr std::set in eine std::vector, gibt es einfachere Wege, das zu tun:

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

Für eine std::map gibt es keine Single-Line-Versionen, so dass Sie mit einer Schleife wie oben erwähnt iterieren müssen.

+0

Vielen Dank. –

+0

Beachten Sie, dass es einen noch einfacheren Weg gibt, wenn Sie nur versuchen, ein 'std :: set' in ein' std :: vector' zu konvertieren: Erstellen Sie einfach einen leeren Vektor und fügen Sie 'std :: copy (sprites.begin(), sprites.end(), std :: back_inserter (sprites_c2)); ' – pie3636