Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - totorigolo

Pages: [1]
1
Fenêtrage / [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

Pages: [1]