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

Auteur Sujet: (Résolu) Problème itérator sur map et sf::Text  (Lu 2601 fois)

0 Membres et 1 Invité sur ce sujet

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
(Résolu) Problème itérator sur map et sf::Text
« le: Mars 17, 2013, 01:54:41 pm »
Bonjour,

Dans le cadre de mon jeu, j'ai 1 classe quete qui contient 2 map (1 pour le titre de la quete et 1 pour l'objectif avec un id correspondant)
Dans la gui, j'ai une fonction Gui::boite de dialogue qui recupére des données et les affiche.

Quand j'affectionne une quete à une entite, cela affiche le titre de la quete (avec un iterateur sur la 1ere map) et quand je clic sur la quete j'ai le descriptif de cette derniére avec l'objectif qui s'affichent (iterateur sur la 2eme map pour l'objectif)

Et là c'est le drame si j'affectionne l'objectif 1 (1ere case de la map j'ai un joli segmenlt fault) par contre le 2, 3 etc... fonctionnent.
Par contre si j'affectionne une autre quete à une entite qui a pour objectif la case n°2 et que je lui parle en 1er, si je vais voir celui qui a l'objectif 1 ensuite et que je lui parle, cela fonctionne.

En isolant un peu de code je me suis rendu compte que c'est au moment du setString que cela coince car avec un std::cout cela fonctionne ...

Je ne parle pas de la 1ere map (titre de la quete) ou cela fonctionne bien.

Du code maintenant:
Partie où je me sers des iterateurs
 if(entite_cible_actuelle.recup_pnj_a_quete())
            {
                //Affichage de l'icone quête si le pnj a une quête
                spr_icone_quete = new sf::Sprite;
                spr_icone_quete->setTexture(texture_icone_quete);
                spr_icone_quete->setScale(0.2, 0.2);
                spr_icone_quete->setPosition(pos_vue.x - 428, pos_vue.y - 127);
                target.draw(*spr_icone_quete);
                //iterator pour parcourir le conteneur map de quêtes
                std::map<int, std::string>::iterator id_quete = texte_quete.recup_titre_quete().find(entite_cible_actuelle.recup_id_quete());
                //Affichage du titre de la quête
                if(id_quete == texte_quete.recup_titre_quete().end())
                std::cout << "Titre de la quete introuvable." << std::endl;
                else
                {
                    titre_quete = new sf::Text;
                    titre_quete->setString(id_quete->second); ///// ICI cela fonctionne ////
                    titre_quete->setCharacterSize(15);
                    if(!color_titre_quete)
                    titre_quete->setColor(sf::Color::Black);
                    else
                    {
                        titre_quete->setColor(sf::Color::Blue);
                        titre_quete->setScale(1.1f, 1.1f);
                    }
                    titre_quete->setStyle(sf::Text::Italic);
                    titre_quete->setPosition(pos_vue.x - 400, pos_vue.y - 120);
                    box_titre_quete = titre_quete->getGlobalBounds();
                    target.draw(*titre_quete);
                }
            }
            spr_annuler = new sf::Sprite; //Bouton Annuler
            spr_annuler->setTexture(texture_annuler);
            spr_annuler->setPosition(pos_vue.x - 270, pos_vue.y + 170);
            box_bouton_annuler = spr_annuler->getGlobalBounds();
            target.draw(*spr_annuler);
        }
        //DESCRIPTIF QUETE
        else
        {
            //Changement position et taille icone quête
            delete spr_icone_quete;
            spr_icone_quete = NULL;
            //Changement position et taille titre quête
            titre_quete->setColor(sf::Color::Black);
            titre_quete->setStyle(sf::Text::Underlined);
            titre_quete->setCharacterSize(18);
            titre_quete->setPosition(pos_vue.x - 430, pos_vue.y - 175);
            target.draw(*titre_quete);
            //Affichage du descriptif de la quete
            sf::Text text_quete[texte_quete.descriptif_quete(entite_cible_actuelle.recup_id_quete(), joueur.recup_pseudo()).size()];
            //text_accueil->setFont(font_quete);
            for(unsigned int i = 0; i < texte_quete.descriptif_quete(entite_cible_actuelle.recup_id_quete(), joueur.recup_pseudo()).size(); i++)
            {
                text_quete[i].setString(texte_quete.descriptif_quete(entite_cible_actuelle.recup_id_quete(), joueur.recup_pseudo())[i]);
                text_quete[i].setCharacterSize(14);
                text_quete[i].setColor(sf::Color::Black);
                text_quete[i].setPosition(pos_vue.x - 430, pos_vue.y - 140 + (i *15));
                target.draw(text_quete[i]);
            }
            //iterator pour parcourir le conteneur map d'objectif de quete
            std::map<int, std::string>::iterator objectif_quete = texte_quete.recup_objectif_quete().find(entite_cible_actuelle.recup_id_quete());
            if(objectif_quete ==  texte_quete.recup_objectif_quete().end())
            std::cout << "Objectif de la quete introuvable" << std::endl;
            else
            {
                //Objectif(s)
                sf::Text text_objectif[2];
                text_objectif[0].setString("Objectif :");
                text_objectif[0].setColor(sf::Color::Black);
                text_objectif[0].setStyle(sf::Text::Underlined);
                text_objectif[0].setCharacterSize(18);
                text_objectif[0].setPosition(pos_vue.x - 430, pos_vue.y);
                text_objectif[1].setString(objectif_quete->second);  ///////// ICI si j'affectionne la 1ere case à une entite, J'ai le plantage //////////
                text_objectif[1].setColor(sf::Color::Black);
                text_objectif[1].setCharacterSize(14);
                text_objectif[1].setPosition(pos_vue.x - 430, pos_vue.y + 30);
                for(unsigned int i = 0; i < 2; i++)
                target.draw(text_objectif[i]);
           }
 

La partie où il ya mes maps et qui les renvoit

Quete::Quete()
{
    //Ajout des quêtes dans le conteneur
    list_quetes[1] = "Un réveil brutal";
    list_quetes[2] = "Un monde chaothique";
    list_quetes[3] = "La dette de Pascal";
    list_quetes[4] = "L'entrainement de base";
    list_quetes[5] = "En route pour l'aventure";

    //Ajout d'objectif de quete
    objectif_quetes[1] = "Parler à Mouloud.";
    objectif_quetes[2] = "Parler à Azerty pour en apprendre plus \nsur ce monde.";
}

std::map<int, std::string> Quete::recup_titre_quete() const
{
    return list_quetes;
}

std::map<int, std::string> Quete::recup_objectif_quete() const
{
    return objectif_quetes;
}
 

Voila ce que le compilo me mets quand ça plante :

#0 6609D508     std::string::length() const() (D:\Projet\World of Chaos\sfml-system-d-2.dll:??)
#1 660822ED     sf::String::String(this=0x27c824, ansiString=..., locale=...) (D:\developpement\sfml-master\src\SFML\System\String.cpp:85)
#2 0040556A     _fu6___ZSt4cout() (D:\Projet\World of Chaos\gui.cpp:282)
#3 0040729C     Jeu::Jeu(this=0x27d960) (D:\Projet\World of Chaos\jeu.cpp:74)
#4 00407A90     main() (D:\Projet\World of Chaos\main.cpp:6)
 

Je ne vois d'où peut venir le problème.
J'utilise code block 10.05
la version de sfml : SFML-2.0-rc-windows-32-gcc4-sjlj
« Modifié: Mars 18, 2013, 10:50:45 pm par Arnibou »

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Re : Problème itérator sur map et sf::Text
« Réponse #1 le: Mars 18, 2013, 12:55:32 pm »
Bon j'ai rajouté un
objectif_quete[0] = "";
pour contourner le problème (vu qu'il ne sera jamais utilisé) par contre j'aurais vraiment aimer comprendre pourquoi ça ne fonctionnait pas ...

J'ai mis Résolu quand même.