Forum de la communauté SFML

Aide => Général => Discussion démarrée par: zedex le Octobre 23, 2013, 12:16:35 am

Titre: Gérer une fenêtre avec une classe
Posté par: zedex le Octobre 23, 2013, 12:16:35 am
Bonsoir.

Je cherche à gérer une fenêtre par une classe du genre :

Classe :
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>

class Window : public sf::RenderWindow
{
    public :
        Window();

        sf::Sprite  getSprite();        // Renvoie le sprite de la fenetre.

    private :
        sf::RenderWindow    m_window;   // Render Window.
        sf::Texture         m_texture;  // Texture contenant la feuille de tuiles.
        sf::Sprite          m_sprite;   // Sprite contenant et affichant la texture.

};

Méthodes :
Window::Window()
{
    // Cree une fenetre.
    m_window.create(sf::VideoMode(400,350),"My Window");

    // Chargement de la texture de présentation.
    m_texture.loadFromFile("image.png");

    // Incorporation de la texture dans le sprite.
    m_sprite.setTexture(m_texture);
}

sf::Sprite Window::getSprite()
{
    return m_sprite;
}

main :
int main(int argc, char *argv[])
{
    Window myWindow;

    while (myWindow.isOpen())
    {
        sf::Event event;

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

        myWindow.clear();
        myWindow.draw(myWindow.getSprite());
        myWindow.display();
    }

    return 0;
}

À la compilation il n'y a pas de problèmes, mais lors de l'exécution la fenêtre s'ouvre puis se ferme immédiatement. Est-ce que je m'y prend mal ?

Merci.
Titre: Re : Gérer une fenêtre avec une classe
Posté par: Threonine le Octobre 23, 2013, 12:33:56 am
Tu n'as pas besoin d'un attribut RenderWindow (m_window dans ta classe) puisque ta classe est elle même un RenderWindow. Je pense que tu peux le supprimer, et modifier la première ligne de ton constructeur pour que la méthode soit directement appelée sur l'instance de te classe.

Il faut donc remplacer :
m_window.create(sf::VideoMode(400,350),"My Window");

Par simplement :
create(sf::VideoMode(400,350),"My Window");
Titre: Re : Gérer une fenêtre avec une classe
Posté par: zedex le Octobre 23, 2013, 08:50:00 am
Ha oui exact, merci beaucoup. Tout marche nikel.
En revanche dans mon code j'utilise des commandes :
create(sf::VideoMode(400,350),"My Window");
// ou
this->create(sf::VideoMode(400,350),"My Window");

setIcon(m_icon.getSize().x,m_icon.getSize().y,m_icon.getPixelsPtr());
//ou
this->setIcon(m_icon.getSize().x,m_icon.getSize().y,m_icon.getPixelsPtr());
Les deux lignes fonctionnent, mais laquelle est "la plus propre", "la plus sûre" ?
Titre: Re : Gérer une fenêtre avec une classe
Posté par: G. le Octobre 23, 2013, 10:08:33 am
Ecrire this-> ou pas quand on a le choix, c'est surtout une question de goût, les avis divergent. En tout cas quand on n'est pas trop à l'aise je pense que c'est mieux de l'écrire.
Bref si t'as le choix, tu fais comme tu le sens. :D
Titre: Re : Gérer une fenêtre avec une classe
Posté par: zedex le Octobre 23, 2013, 11:55:10 am
D'accord, merci :D