IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Comment ne pas dependre du système de fenêtrage


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 21
    Points
    21
    Par défaut Comment ne pas dependre du système de fenêtrage
    Salut !
    J'aimerai me lancer dans un projet: la création d'un moteur 3D puis par la suite l'utiliser pour créer un jeu-vidéo.

    Je sais qu'il existe déjà beaucoup de moteur performant (Ogre, CrystalSpace, etc...) mais si je souhaite créer mon moteur 3D c'est surtout pour apprendre.

    J'ai malheureusement quelque soucis, à commencer par le choix du système de fenêtrage. J'ai le choix entre la SFML et la SDL. L'utilisation du système de fenêtrage me servira qu'à créer un contexte OpenGL et à récupérer les evenements.

    Mais voilà le soucis: j'aurai une classe Camera, puis une autre CameraFreeFly qui heritera de Camera. Cette CameraFreeFly devra agir en fonction des evenements clavier et souris: mais je veux faire en sorte que les evenements que je lui passe en argument ne soient pas dépendant de la SDL ou de la SFML. Par exemple si un jour je change de SDL à SFML, je veux pas aller bidouiller toute mes classes.

    J'ai pensé à re-définir une sur-couche, encapsulant les données de ces systèmes de fenêtrage. Qu'en pensez-vous ? Voyez-vous une autre solution ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    C'est pas comme si c'était lourd, la surcouche.
    T'as 2*n (press/release) + 1 (move) functions simples pour la souris, par exemple, où n est le nombre de boutons (tu peux aussi virer le n et coder cette info par un entier).
    Boost ftw

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 21
    Points
    21
    Par défaut
    J'imagine bien que ce n'est pas si lourd, mais je voulais juste avoir des avis, pour voir s'il n'y avait pas une meilleure solution ou un approche différente.
    Merci pour ton avis ^^

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Très bonne réflexion et soucis du "détail", entre guillemet car c'est bien souvent ce qui fait la différence.

    Je te conseille de créer une interface de fenêtrage, par exemple "IWindow" imposant les fonctions indispensable, selon toi et ton besoin que devra assurer une fenêtre (par exemple, SetSize(x, y).

    Ensuite, tu utilises le pattern Observer, pour avertir de tout évennement qui te sont nécessaires.

    Par la suite, les fenêtres concrètes, "CSDLWindow" utilisant la SDL, "CSFMLWindow" utilisant SFML et à terme selon ton besoin, d'autres qui utiliseront d'autres librairies.

    Pour le choix de la lib de fenêtrage, tu peux utiliser des "#defines". Au final, celà ressemblera à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    class IWindow
    {
    public:
       virtual void SetSize(int x, int y) = 0;
       void AddListener(IWindowListener* pListener);
       void RemoveListener(IWindowListener* pListener);
    private:
       std::vector<IWindowListener*> m_vecListeners;
    };
     
    class IWindowListener
    {
    friend class IWindow;
    protected:
       virtual void OnKeyPress(...) = 0;
    };
     
    class CSDLWindow : public IWindow
    {
    private:
       virtual void SetSize(); // Utilisera la SDL
    };
     
    class CSFMLWindow : public IWindow
    {
    private:
       virtual void SetSize(); // Utilisera la SFML
    };
     
    class CMyApp : public IWindowListener
    {
    public:
       CMyApp();
     
    private:
       virtual void OnKeyPress(...);
       IWindow m_Window; // Manipulation de la fenêtre via son interface
    };
     
    CMyApp::CMyApp
    {
    #ifdef USE_SDL
        m_Window = new CSDLWindow();
    #else
        m_Window = new CSFMLWindow();
    #endif // USE_SDL
     
       m_Window.AddListener(this);
       m_Window.SetSize(800, 600);
    };
    Je ne sais pas si ce code compile correctement, mais voilà le principe.
    Pour un peu de lecture, fait des recherches sur :
    - Le pattern Façade ou Adapter
    - Le pattern Observer

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

Discussions similaires

  1. Pas de uname, pas de /proc : comment se renseigner sur le système ?
    Par shalala dans le forum Administration système
    Réponses: 10
    Dernier message: 31/08/2007, 15h52
  2. [][Excel] Comment ne pas détruire les formules ?
    Par flyangelNext dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/07/2003, 11h38
  3. Réponses: 6
    Dernier message: 10/09/2002, 03h35
  4. Comment ne pas rejouer une animation après un clic ?
    Par mmmmhhh dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 04/09/2002, 16h11
  5. Webbrowser : Comment ne pas prendre la page en cache
    Par cedm78 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 30/08/2002, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo