Salut ! Dans le cadre d'un projet sfml, je voudrais coder une classe champ de text (GLineText), j'ai commencé et je dois maintenant faire en sorte de ne pas afficher les premières lettres quand il y en a trop, mais ça coince ! voici en gros ce que je veux faire :
Je récupère à chaque appuis de touche un sf::Uint32 que je met dans
std::deque<sf::Uint32> contenu_entier
j'appel ensuite dessus la méthode analyser(std::deque<sf::Uint32> &tab) dans laquelle :
- je copie le tableau deque donné en param dans un std::deque<sf::Uint32> contenu_af; (contenu affichable)
- je compte le nombre de lettre
- si il y en a plus de 8
-> je calcul le nombre de lettre en trop
-> je prend la première lettre de contenu_af et je la met dans un std::deque<sf::Uint32> reserve_lettre;
-> je supprime la première lettre de contenu_af
-> je répète ces dernières instructions autant de fois qu'il y a de lettre en trop
je place ensuite le contenu de contenu_sf dans un std::basic_string<sf::Uint32> str;, cette variable sera mi en paramètre d'une fonction de dessin de text propre à la sfml.
Voici mon code commenté et racourci :
GLineText.h
GLineText.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #ifndef DEF_GLINETEXT #define DEF_GLINETEXT #include <SFML/Graphics.hpp> #include <string> #include <deque> /* Class GLineText Champ de text SFML par guidono */ class GLineText { public: GLineText(sf::RenderWindow *app, float X, float Y, sf::Color &colorFond, sf::Color &borderColor); ~GLineText(); void ecouter_sourie(sf::Event &event); void ecouter_sourie(sf::Event &event, std::deque<GLineText*> tab_g_line_text); void ecouter_clavier(sf::Event &event); //ces deux méthodes sont importantes pour ce que je veux faire void insertText(sf::Uint32 &t); void analyser(std::deque<sf::Uint32> &tab); //bon je met pas tout private: //blablabla sf::String contenu; //contenu qui sera affiché std::basic_string<sf::Uint32> str; std::deque<sf::Uint32> reserve_lettre; //pour les lettres en trop std::deque<sf::Uint32> contenu_entier; //le contenu de départ std::deque<sf::Uint32> contenu_af; //contenu que l'on voudra afficher avec les lettres en moins //blablabla }; #endif
voilà j'espère que vous pourrez m'aider...je bloque
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 void GLineText::ecouter_clavier(sf::Event &event) { if(event.Type == sf::Event::TextEntered) { if(is_use) {insertText(event.Text.Unicode);} //si il y a le focus, on insert le texte entré } } void GLineText::insertText(sf::Uint32 &t) { contenu_entier.push_back(t); analyser(contenu_entier); //on analyse std::cout << "[taille] contenu_af :" << contenu_af.size() << std::endl; //je vois ici taille = 0...bizzar for(int i = 0; i < contenu_af.size(); i++) { //avec taille = 0 str ne se remplit pas... str += contenu_af[i]; } contenu.SetText(str); contenu.SetSize(15); contenu.SetX(posX + espace_x + text.GetRect().GetWidth() + 7); contenu.SetY(posY-1); } void GLineText::analyser(std::deque<sf::Uint32> &tab) { int nbr_lettre = 0; //pour compter le nombre de lettres for(int i = 0; i < tab.size(); i++) { contenu_af[i] = tab[i]; //on copie le tableau entier dans le tableau qu'on modifira nbr_lettre++; } if(nbr_lettre > 8) { //si il y a trop de lettre int en_trop = nbr_lettre - 8; //on calcul le nombre de lettre en trop for(int i = 0; i < en_trop; i++) { reserve_lettre.push_front(contenu_af.front()); //on prend la 1er lettre en trop et on la met dans le tableau de reserve de lettre contenu_af.pop_front(); //on supprime la 1er lettre } } }
pour info après 8 ou 9 entré de lettre, segmentation fault !
ps : je suis sous linux
merci d'avance !!
Partager