[algo]coupure de mot, champ de texte
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
Code:
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 |
GLineText.cpp
Code:
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
}
}
} |
voilà j'espère que vous pourrez m'aider...je bloque
pour info après 8 ou 9 entré de lettre, segmentation fault !
ps : je suis sous linux
merci d'avance !!