Forum de la communauté SFML

Aide => Fenêtrage => Discussion démarrée par: totorigolo le Octobre 26, 2013, 06:29:14 pm

Titre: [Résolu] Seconde fenêtre freeze lors de sa création
Posté par: totorigolo le Octobre 26, 2013, 06:29:14 pm
Bonjour à tous.

Je me suis construit quelques fonctions pour pouvoir créer des boites de dialogues facilement (message d'erreur, d'info, demande de texte ou de nombre,...). Avec la SFML 2.0, il n'y avait pas de soucis, mais maintenant que je suis passé à la 2.1, mon code ne marche plus.

En gros, je crée une fenêtre, dessine une image, du texte, un bouton (un rectangle + du texte), et je fais une petite boucle d'évènements pour gérer le tout. Je crée la fenêtre via une fonction, ce qui fait que la fenêtre actuelle ne répond plus (normal, et ça permet de rendre la pop-up modale) et l'autre est sensée prendre le relais. Or, bien que la pop-up se crée, elle est figée. J'ai trouvé deux solutions pour la faire fonctionner : mettre un point d'arrêt (j'ai marqué la ligne dans le code minimal dessous) et relancer la fenêtre, ou alors déplacer la fenêtre initiale.

J'ai donc créé une sorte de code minimal qui reproduit le problème.

#include <SFML/Graphics.hpp>

int main()
{
   // Charge la fenêtre de rendu
   sf::RenderWindow window(sf::VideoMode(800U, 600U), "test");

   while (window.isOpen())
   {
      sf::Event event;
      while (window.pollEvent(event))
      {
         if (event.type == sf::Event::Closed)
            window.close();

         if (event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::O)
         {
            // Création de la fenêtre et des évènements
            sf::RenderWindow *window = new sf::RenderWindow(sf::VideoMode(500, 150, 32), "pop-up");
            sf::View windowView(window->getDefaultView());

            // Création du texte
            sf::Font f;
            f.loadFromFile("C:/Windows/Fonts/calibri.ttf");
            sf::Text text("blablablablablablabla", f);
            text.scale(0.8f, 0.8f);
            text.setColor(sf::Color::Black);
            text.move(140.f, 60.f);

            // Calcul de l'emplacement du bouton
            float x = text.getGlobalBounds().left + 20.f;
            float y = text.getGlobalBounds().top + text.getGlobalBounds().height + 20.f;
            // Création du bouton
            sf::RectangleShape button(sf::Vector2f(140.f, 30.f));
            button.setFillColor(sf::Color::Transparent);
            button.setOutlineColor(sf::Color::Black);
            button.setOutlineThickness(1.f);
            button.setPosition(x, y);
            sf::Text txtButton("Valider", f);
            txtButton.scale(0.6f, 0.6f);
            txtButton.setColor(sf::Color::Black);
            txtButton.setPosition(x + 5.f, y + 2.f);
           
            // Création du fond de survol
            sf::RectangleShape backgroung(sf::Vector2f(140.f, 30.f));
            backgroung.setFillColor(sf::Color(255, 0, 0, 128));

            // Boucle d'affichage
            bool overFlying = false;
            while (window->isOpen())
            {
               sf::Event event2;
               while (window->pollEvent(event2))
               {
                  // Si on appuie sur le bouton rouge ou sur échap : on quitte
                  if (event2.type == sf::Event::Closed ||
                     (event2.type == sf::Event::KeyReleased && (event2.key.code == sf::Keyboard::Return || event2.key.code == sf::Keyboard::Escape)))
                     window->close();
                 
                  // Si la souris survole un bouton : on met le fond
                  else if (event2.type == sf::Event::MouseMoved)
                  {
                     overFlying = true;
                     if (button.getGlobalBounds().contains(event2.mouseMove.x, event2.mouseMove.y))
                        backgroung.setPosition(button.getPosition());
                     else
                        overFlying = false;
                  }

                  // Clic gauche : on vérifie si on est sur un bouton et on quitte la cas échéant
                  else if (event2.type == sf::Event::MouseButtonReleased)
                  {
                     if (button.getGlobalBounds().contains(event2.mouseButton.x, event2.mouseButton.y))
                        window->close();
                  }
               }
               // On efface l'écran
               window->clear(sf::Color(240, 240, 240)); // Beige
               window->setView(windowView);

               // On affiche le texte
               window->draw(text);
               
               // On affiche le fond de survol du bouton
               if (overFlying)
                  window->draw(backgroung);

               // On affiche le bouton
               window->draw(button);
               window->draw(txtButton);

               // On affiche l'écran
               window->display(); /* Point d'arrêt ici par exemple */
            }
         }
      }

      window.clear(sf::Color::Black);
      window.display();
   }

   return 0;
}
 

Merci de votre attention  :)
totorigolo
Titre: Re : Seconde fenêtre freeze lors de sa création
Posté par: Laurent le Octobre 26, 2013, 07:37:12 pm
C'est déjà corrigé (fais un tour du côté du bug tracker lorsque tu as un doute).
Titre: Re : Seconde fenêtre freeze lors de sa création
Posté par: totorigolo le Octobre 26, 2013, 07:42:49 pm
Ah, je vais aller voir. Merci :)

(réponse ultra rapide  :D )

Edit : J'ai téléchargé SFML à partir du dépot, recompilé, et ça fonctionne  :) Merci.