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