Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [résolu] Utilisation des itérateurs impossible ?  (Lu 1513 fois)

0 Membres et 1 Invité sur ce sujet

Plume

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
[résolu] Utilisation des itérateurs impossible ?
« 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
« Modifié: Novembre 17, 2013, 10:26:20 pm par Plume »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Utilisation des itérateurs impossible ?
« Réponse #1 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).
Laurent Gomila - SFML developer

Plume

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Utilisation des itérateurs impossible ?
« Réponse #2 le: Novembre 17, 2013, 10:14:58 pm »
Effectivement, sans comparateur, ça allait être bien dure...

Merci beaucoup !