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 passer d'une classe fille à l'autre?


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut Comment passer d'une classe fille à l'autre?
    Bonjour,

    Je dois réaliser un tétris en 2D, 3D en parallèle et 3D en perspective avec OpenGL. L'utilisateur doit pouvoir passer d'un affichage à l'autre en cliquant sur un bouton.

    Dans un premier temps, j'ai développé le tétris en 2D en suivant le modèle MVC. J'ai donc une classe Modele qui gère le jeu en cours, une classe View qui gère l'affichage à l'écran et une classe Controller qui gère les interactions de l'utilisateur. Le tétris en 2D est fonctionnel.

    Ce que je comptais faire pour l'affichage en 3D, c'est de faire une classe View3D qui hérite de View, mais je rencontre un problème. J'ai déclaré ma classe View comme singleton. Je vois mal comment va fonctionner l'héritage avec ce pattern en place et comment autoriser l'utilisateur de passer d'une View à l'autre ? Une gestion centralisée dans une autre classe ? Si oui, comment faire cela efficacement ?

    Merci d'avance pour vos suggestions.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    En fait, ce n'est pas ta vue qui devrait être singleton, mais, si tu tiens à en avoir un, "quelque chose" qui se trouve "au dessus" de la vue: le jeu lui-même.

    Ta vue ne serait qu'un membre de ton singleton (déclaré en tant que pointeur), et, lorsque tu voudrais changer la vue, tu commence par libérer correctement la mémoire de l'ancienne avant d'allouer la mémoire à l'autre.

    Cela pourrait prendre la forme (améliorable, surement) de
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    /* le singleton */
    class Game
    {
        publc:
            static  Game& instance()
            {
                if(!inst)
                    inst = new Game;
                return *inst;
            }    
            static void destroy()
            {
                delete inst;
            }
            void changeVue()
            {
                ++vueType;
                /* considérons 3 vues possibles, que l'on peut parcourrir 
                 * en boucle 
                 */
                if(vueType<3)
                    vueType = 0;
                /* libérons correctement la mémoire de l'ancienne vue
                 */
                delete view;
                /* et allouons la mémoire pour la nouvelle */
                switch(vueType)
                {
                    case 0 : /* vue 2D */
                        view = new View2D;
                        break;
                    case 1 : /* vue "3D isometrique" */
                        view = new View3DIso;
                        break;
                    case 2 = /* vue "3DTruc" */
                        view = new View3DTruc;
                        break;
                }
            }
        private:
            Game():vueType(0)
            {
                view = new View2D;
            }
            ~Game()
            {
                delete view;
            }
            int vueType;
            View * view;
            static Game* inst;
            /* tout ce qu'il faut d'autre */
    }
    /* les différentes vues */
    class View
    {
        public:
            /*...*/
            virtual void draw() = 0;
    };
    class View2D : public View
    {
        public:
            /*...*/
            virtual void draw();
    }; 
    class View3DIso : public View
    {
        public:
            /*...*/
            virtual void draw();
    };
    /* toutes les autres */
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Salut et merci pour ta réponse.

    Cette solution me semble envisageable mais on si je le fais, je ne respecte plus le modèle MVC, si ? C'est une de mes contraintes du projet.

    D'après ta première ligne, la View ne devrait pas être singleton, comment tu ferais pour être sûr d'utiliser le même dans le main (initialisation d'OpenGL) et dans controller lors du traitement des interactions clavier/souris ?

    Edit: après réflexion, le plus simple serait peut-être de garder la singleton dans View et de faire la gestion centralisée dans la classe mère (View).
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par v4np13 Voir le message
    Salut et merci pour ta réponse.

    Cette solution me semble envisageable mais on si je le fais, je ne respecte plus le modèle MVC, si ? C'est une de mes contraintes du projet.
    Je ne vois absolument pas pourquoi il ne respecterait plus le modèle MVC...

    Tu ne fais que rajouter une contrôleur propre à l'ensemble des éléments qui doivent être géré de manière commune
    D'après ta première ligne, la View ne devrait pas être singleton, comment tu ferais pour être sûr d'utiliser le même dans le main (initialisation d'OpenGL) et dans controller lors du traitement des interactions clavier/souris ?
    Je n'ai pas mis la méthode, mais, rien ne t'empêche de prévoir un accesseur qui renvoie l'instance en cours de la vue, ni de faire de même que pour tout objet faisant partie du "jeu" que tu voudrait récupérer

    En effet, rien n'empêche (et ce serait d'ailleurs conseillé) de faire de manière à ce que le singleton représenté par la classe Game dispose, également, d'une instance de score, du système de gestion des "top score", du système de sélection de la prochaine piece, etc...

    Bref, de tout ce qui sera utilisé par la vue pour effectuer l'affichage cohérent, mais aussi de tout ce qui sera utilisé par le jeu en lui-même
    Edit: après réflexion, le plus simple serait peut-être de garder la singleton dans View et de faire la gestion centralisée dans la classe mère (View).
    Ca, c'est à toi de voir
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 9
    Dernier message: 12/08/2006, 13h01
  2. Réponses: 8
    Dernier message: 30/05/2006, 01h26
  3. Réponses: 6
    Dernier message: 01/05/2006, 19h05
  4. comment passer d'une cellule à une autre
    Par khier dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/04/2006, 17h35
  5. Réponses: 7
    Dernier message: 13/12/2005, 16h22

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