Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Plume le Novembre 17, 2013, 09:15:43 pm

Titre: [résolu] Utilisation des itérateurs impossible ?
Posté par: Plume le Novembre 17, 2013, 09:15:43 pm
Bonsoir,

dans un programme utilisant un classe héritant de sf::RenderWindow. Ne voulant pas charger 15 fois la même texture en mémoire, j'aimerai avoir un mécanisme permettant de vérifier la présence de la-dite texture et d'agir en conséquence. Utilisant un std::vector pour mes textures, je voulais utiliser directement une fonctionnalité de la STL. Par contre, pour une raison ou une autre, le compilateur ne semble pas aimer la ligne suivante:

std::vector<sf::Texture>::iterator it = std::find(movTex.begin(), movTex.end(), tex);

Il semblerait qu'il y a un problème de comparaison entre un sf::Texture et un const sf::Texture.

Le code se trouve dans une fonction permettant d'ajouter un sprite à partir de l'emplacement d'une image.

void MaClasse::ajouterSprite (std::string &source)
{
    sf::Texture tex;
    tex.loadFromFile(source);
    std::vector<sf::Texture>::iterator it = std::find(TexVector.begin(), TexVector.end(), tex);
    if (it == TexVector.end())
    {
        TexVector.push_back(sf::Texture());
        TexVector.back().loadFromFile(source);
        SpriteVector.push_back(sf::Sprite(TexVector.back()));
    }
    else
    {
        SpriteVector.push_back(sf::Sprite(*it));
    }
}
TexVector est un std::vector<sf::Texture>, SpriteVector un std::vector<sf::Sprite>

Quelqu'un verrait-il l'erreur?
Merci d'avance
Titre: Re : Utilisation des itérateurs impossible ?
Posté par: Laurent le Novembre 17, 2013, 09:30:36 pm
Cet appel provoque une erreur car sf::Texture ne possède pas d'opérateur ==.

En fait tu t'y prends très mal ;) Une texture n'est pas un objet anodin que tu peux copier, comparer, etc. C'est une ressource très lourde, chargée en mémoire vidéo, et que tu ne peux ensuite utiliser que pour dessiner (tu ne peux plus la relire si facilement). Ce qu'il faut faire c'est comparer le nom de fichier, pas la texture. Et si possible avant de la charger pour rien ;)

Le mieux ici sera d'utiliser un std::map<std::string, sf::Texture>, la clé étant ici le nom de fichier. Ca te permet de retrouver immédiatement la texture associée à un nom de fichier, et en bonus, c'est un conteneur qui ne va pas causer de copies inutiles de ses éléments (contrairement à std::vector).
Titre: Re : Utilisation des itérateurs impossible ?
Posté par: Plume le Novembre 17, 2013, 10:14:58 pm
Effectivement, sans comparateur, ça allait être bien dure...

Merci beaucoup !