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