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

Auteur Sujet: TextEntered sfml2.0 et rien  (Lu 3392 fois)

0 Membres et 1 Invité sur ce sujet

tiouil

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
TextEntered sfml2.0 et rien
« le: Mars 30, 2013, 08:41:33 pm »
Bonjour, je suis passé à la SFML2.0 en début de semaine pour un tout nouveau projet. Après un soucis d'ouverture de fenêtre (le truc de base), me voila avec un soucis de texte entré pas l'utilisateur.

J'ai vraiment fait un copié/collé du code trouvé dans la doc officielle pour l'évènement TextEntered :  http://www.sfml-dev.org/tutorials/2.0/window-events-fr.php mais cela ne fonctionne pas. Il ne passe jamais le premier IF, comme ci il ne voyait pas que c'est un évènement TextEntered.

De plus quels évènements je dois intercepter (Espace, effacement) et comment car je m'embrouille entre les Keyboard:: les Event:: et le reste.

Tout cela c'est pour la saisie d'un prénom pour un jeu donc les accents seraient pas mal, les espaces quasi-obligatoires, les chiffres tolérés, et les "-" ainsi que l'apostrophe et l'underscore.

Sinon j'ai compilé moi même les dernières sources en début de semaine, Mardi 26 Mars 2013 donc.

Merci par avance (à Laurent je pense...).
Le design, un peché mignon.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : TextEntered sfml2.0 et rien
« Réponse #1 le: Mars 30, 2013, 08:46:14 pm »
Même si tu n'as fait que reprendre le code du tutoriel, il faudrait que tu nous montres ton code. Un minimal, qui ne fasse que reproduire le problème, ce serait bien. Et complet bien entendu :)
Laurent Gomila - SFML developer

tiouil

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Re : TextEntered sfml2.0 et rien
« Réponse #2 le: Mars 30, 2013, 09:15:14 pm »
Bonsoir et merci du temps que tu va passer pour moi.

Voici le code complet de mon traitement des évènements :
bool ArchiVue::treatEvents()
{
    bool result = false;
    if(_window->isOpen())
    {
        result = true;
        Event event;
        while (_window->pollEvent(event))
        {
            if(event.type == sf::Event::KeyPressed)
            {
                    cout<<"Espion 1 event"<<endl;
                    if (event.type == sf::Event::TextEntered)
                    {
                        cout<<"Here"<<endl;
                        if (event.text.unicode < 128)
                            cout << "Caractere : "<<static_cast<char>(event.text.unicode)<<endl;
                    }
            }
        }
    }
    return result;
}
 

Le problème c'est qu'il m'affiche que "Espion 1 event" il ne m'affiche jamais "Here" et encore moins le texte entré.

C'est normal que le "TextEntered" soit à l'intérieur du "KeyPressed" car ce n'est pas le code complet, et j'ai besoin de le laisser pour éviter qui me fasse 36 tests de if pour une action complètement différente. Ce code à la même action : c'est à dire aucune (sauf le "Espion 1 event" qui s'affiche).

Au cas où, (vu que maintenant je reviendrais que demain matin), voiçi le code complet de cette fonction :
bool ArchiVue::treatEvents()
{
    bool result = false;
    if(_window->isOpen())
    {
        result = true;
        Event event;
        while (_window->pollEvent(event))
        {
            if(event.type == sf::Event::KeyPressed)
            {
                if(event.key.code == sf::Keyboard::Escape)//Appui sur la touche Echap
                {
                    //Reactive l'ecran de veille apres fin execution du programme
                    if(bSaverActive)
                        SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0, 0);
                    result = false;
                }
                if(_etat == "Demande nom")
                {
                    cout<<"Espion 1 event"<<endl;
                    bool modifNom = false;
                    if (event.type == sf::Event::TextEntered)
                    {
                        cout<<"Here"<<endl;
                        if (event.text.unicode < 128)
                            cout << "Caractere : "<<static_cast<char>(event.text.unicode)<<endl;
                    }

                }
            }
            else if((event.type == sf::Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))//Clic gauche
            {
                if(_etat == "Menu")
                {
                    if(sourisDessus(_sprite_quitter_select))
                    {//Reactive l'ecran de veille apres fin execution du programme
                        if(bSaverActive)
                            SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0, 0);
                        result = false;
                    }
                    else if(sourisDessus(_sprite_nouvelle_partie_select))
                    {
                        _etat = "Demande nom";
                    }
                    else if(sourisDessus(_sprite_charger_select))
                    {
                        _etat = "Charger partie";
                    }
                }
            }
        }
    }
    return result;
}
 
« Modifié: Mars 30, 2013, 09:17:44 pm par tiouil »
Le design, un peché mignon.

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : TextEntered sfml2.0 et rien
« Réponse #3 le: Mars 30, 2013, 10:04:38 pm »
Je vois pas comment tu peux espérer que ton event.type soit égal à deux valeurs différentes en même temps (sf::Event::KeyPressed et sf::Event::TextEntered), c'est juste totalement illogique non ?  ???
Sors donc ton "if (event.type == sf::Event::TextEntered)" de ton autre if ! ;)
Citer
C'est normal que le "TextEntered" soit à l'intérieur du "KeyPressed"
Non, cela n'a rien de normal.

Sinon c'est ni complet (ça compile pas en un copier/coller), ni minimal (y'a plein de code inutile).
« Modifié: Mars 30, 2013, 10:06:12 pm par G. »

tiouil

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Re : TextEntered sfml2.0 et rien
« Réponse #4 le: Mars 31, 2013, 12:32:17 pm »
Bonjour et merci.

Effectivement ce n'était pas normal  ;D !

Mais comme il m'affichait le 1er cout pour moi le prolbème n'était pas là.
Du coup mon problème est résolu. Voici le code final de cette partie, si ca peut aider quelqu'un :
void ArchiVue::modifNomJoueur()
{
    _s_nom_joueur = _c_nouveau_nom_joueur;
    supprimeCaractereWstring(_s_nom_joueur, ' ');//Enleve les espaces en fin de chaine
}

bool ArchiVue::treatEvents()
{
     wchar_t _c_nouveau_nom_joueur[25];
     wstring _s_nom_joueur = "";
     int _nb_char_nouveau_nom = 0;

    bool result = false;
    if(_window->isOpen())
    {
        result = true;
        Event event;
        while (_window->pollEvent(event))
        {
            if(event.type == sf::Event::TextEntered)
            {
               
                    if (event.text.unicode == '\b')//Effacement -> backspace
                    {
                        if(_nb_chars_nouveau_nom > 0)
                        {
                            _c_nouveau_nom_joueur[_nb_chars_nouveau_nom-1] = ' ';
                            _nb_chars_nouveau_nom--;
                            modifNomJoueur();
                        }
                    }
                    else if (event.text.unicode < 255)//Ajout d'un caractère même accentué ou espace
                    {
                        if(_nb_chars_nouveau_nom < 24)
                        {
                            _c_nouveau_nom_joueur[_nb_chars_nouveau_nom] = static_cast<wchar_t>(event.text.unicode);
                            _nb_chars_nouveau_nom++;
                            modifNomJoueur();
                        }
                    }
                }
            }
        }
    }
    return result;
}
 
Le design, un peché mignon.

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : TextEntered sfml2.0 et rien
« Réponse #5 le: Mars 31, 2013, 03:56:24 pm »
Ben ouai, si t'appuies sur la touche A par exemple tu vas avoir 2 évènements générés, un KeyPressed, et un TextEntered. ;)
Quand, dans ta boucle d'évènement, tu tombes sur le KeyPressed, tu vas passer le premier test (== KeyPressed), mais pas le second (== TextEntered) et donc avoir ton cout Espion 1, et quand tu tombes sur le TextEntered, tu ne passeras pas le premier test (== KeyPressed) et ta seconde condition (== TextEntered) ne sera même pas testée puisque tu ne rentres pas dans ton premier if.