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

Auteur Sujet: [Résolu] Seconde fenêtre freeze lors de sa création  (Lu 2775 fois)

0 Membres et 1 Invité sur ce sujet

totorigolo

  • Newbie
  • *
  • Messages: 32
    • Voir le profil
[Résolu] Seconde fenêtre freeze lors de sa création
« 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
« Modifié: Octobre 26, 2013, 11:28:07 pm par totorigolo »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Seconde fenêtre freeze lors de sa création
« Réponse #1 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).
Laurent Gomila - SFML developer

totorigolo

  • Newbie
  • *
  • Messages: 32
    • Voir le profil
Re : Seconde fenêtre freeze lors de sa création
« Réponse #2 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.
« Modifié: Octobre 26, 2013, 11:27:12 pm par totorigolo »

 

anything