Forum de la communauté SFML

Aide => Fenêtrage => Discussion démarrée par: LD_FLO le Avril 20, 2015, 12:24:24 am

Titre: hasFocus() - Crash
Posté par: LD_FLO le Avril 20, 2015, 12:24:24 am
Bonsoir, lorsque je change de fenêtre Windows (mozilla, bloc note, etc..), je mets mon application SFML en attente à l'aide de sf::Window::hasFocus.
Lorsque je reviens dessus, il arrive de manière totalement aléatoire que la fenêtre plante ("... ne répond pas"), alors que le programme en lui-même continue de tourner (l'affichage console marche).

Une idée à mon problème ?
Titre: Re : hasFocus() - Crash
Posté par: Laurent le Avril 20, 2015, 07:43:05 am
Citer
je mets mon application SFML en attente à l'aide de sf::Window::hasFocus.
Gné ?

Citer
Une idée à mon problème ?
Sans aucun détail (surtout ton code), on ne peut pas faire grand chose.
Titre: Re : hasFocus() - Crash
Posté par: LD_FLO le Avril 20, 2015, 11:11:42 am
Corps principal du programme:

while (true)
{
        if (app->fenetre->hasFocus())
        {
                if (app->input->gerer()) //Gestion des inputs (renvoie true si fermeture du programme)
                {
                        app->fenetre->close();
                        break;
                }
                app->gerer(); //Gestion du programme
                app->afficher(); //Affichage
        }
}
 
Titre: Re : hasFocus() - Crash
Posté par: Laurent le Avril 20, 2015, 11:24:49 am
Il faut que tu continues à faire tourner la boucle d'évènements même quand ta fenêtre n'a plus le focus, pour qu'elle continue à être réactive.
Titre: Re : hasFocus() - Crash
Posté par: LD_FLO le Avril 20, 2015, 11:52:52 am
Super, ça à l'air de fonctionner. Merci  :)
Tant qu'on y est, il arrive aussi parfois que l'évènement
 
if (event.type == sf::Event::Closed)

soit vrai lorsque je lance mon programme (lors de la 1ère frame disponible, résultant la fermeture du programme).

Mon code:

bool CInput::gerer()
{
        app->fenetre->pollEvent(event);

        if (event.type == sf::Event::Closed) {return true;}

        ...
}

Pour palier à ce problème, j'utilise un booléen statique:

bool CInput::gerer()
{
        app->fenetre->pollEvent(event);

        static bool quit = false;
        if (event.type == sf::Event::Closed) {return quit;}
        quit = true;

        ...
}

Ça marche, mais je trouve ça un peu dégueulasse, une idée encore une fois ?
Titre: Re : hasFocus() - Crash
Posté par: Laurent le Avril 20, 2015, 11:57:08 am
Relis la doc, les tutoriels, les exemples, ... surtout le tutoriel.
Titre: Re : hasFocus() - Crash
Posté par: LD_FLO le Avril 20, 2015, 01:09:23 pm
Trouvé !

if (app->fenetre->pollEvent(event))
{
    if (event.type == sf::Event::Closed)
         return true;
}
 

Je gère les évènements clavier avec sf::Keyboard (bien plus souple).