Partage
  • Partager sur Facebook
  • Partager sur Twitter

Enumération dans une énumération

Possible et comment

Sujet résolu
    25 juin 2007 à 14:42:31

    Bonjours
    Je suis en train d'essayer de coder un petit jeu en C++/SDL
    Dans mon fichier constantes.h j'ai les énumérations suivantes
    enum {HAUT, BAS, GAUCHE, DROITE, ATTAQUE, MORT};

    enum {VIDE, MUR, SORTIE, HEROS, ENNEMI};


    Mon probléme c'est que les deux personage peuve être : en vie, en attaque ou mort (je sépare vie et attaque je pense que cela sera plus simple)

    Mon probléme c'est que les personnages peuvent être en vie (par exemple)et orienté dans diférente diréction... ce qui pouré se traduire par une énumération dans une énumération...

    Donc je voudrai savoir si je peut faire quelque chose comme
    enum {VIE(enum {HAUT, BAS, GAUCHE, DROITE}) ATTAQUE(enum{HAUT, BAS, GAUCHE, DROITE}), MORT(enum{HAUT, BAS, GAUCHE, DROITE}) };
    ou si doit faire
    enum{VIE_HAUT, VIE_BAS, VIE_GAUCHE, VIE_DROITE};
    enum {MORT_HAUT, MORT_BAS, MORT_GAUCHE, MORT_DROITE};
    enum {ATTAQUE_HAUT, ATTAQUE_BAS, ATTAQUE_GAUCHE, ATTAQUE_DROITE};


    Merci

    EDIT :Désolé le post est la deux fois je ne sais pas pourquoi.
    • Partager sur Facebook
    • Partager sur Twitter
      25 juin 2007 à 14:51:31

      Pourquoi ne fais-tu pas simplement :
      enum { VIE, ATTAQUE, MORT };
      // et
      enum { HAUT, BAS, GAUCHE, DROITE};


      C'est plus simple à mon avis, puisque dans tes 3 états tu as exactement les 4 directions...
      • Partager sur Facebook
      • Partager sur Twitter
        25 juin 2007 à 14:56:07

        Ou alors une énumération d'énumération dans une énumération liée à une énumération?
        • Partager sur Facebook
        • Partager sur Twitter
          25 juin 2007 à 14:56:54

          il ne peut pas à ma connaissance pouvoire mettre une enumeration dans une enumeration.
          du fait que les sous variable sont comparable à des chiffres non???
          • Partager sur Facebook
          • Partager sur Twitter
            25 juin 2007 à 15:00:44

            Je n'en vois de toutes façons pas l'intérêt.
            Déjà oui, une énumération c'est pour définir des constantes qui ont une valeur entière. Par défaut, si tu n'indiques rien, le premier est égal à zéro et à chaque constante tu fais +1.
            L'intérêt d'une énumération c'est de pouvoir mettre plusieurs constantes en parallèle sous un même nom (celui de l'énumération qu'on peut alors transformé en type) et d'utiliser ces noms pour expliciter le code.
            • Partager sur Facebook
            • Partager sur Twitter
              25 juin 2007 à 15:20:10

              D'accord j'ai pris ton code psychoh13 mais je ne vois pas comment indiquer que le joueur doit être en VIE et HAUT dans mon code...
              • Partager sur Facebook
              • Partager sur Twitter
                25 juin 2007 à 15:29:17

                En utilisant 2 variables différentes (ou une pair<,>)

                C'est le plus simple.

                • Partager sur Facebook
                • Partager sur Twitter
                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                  25 juin 2007 à 15:31:12

                  Tu veux dire que tu veux combiner différentes constantes ?

                  Pourquoi ne pas utiliser des flags ?

                  Exemple :
                  enum
                  {
                      //Entite
                      VIDE = 0,
                      MUR = 1 << 0,
                      SORTIE = 2 << 0,
                      HEROS = 3 << 0,
                      ENNEMI = 4 << 0,

                      //Etat
                      MORT = 1 << 1,

                      //Action
                      ATTAQUE = 1 << 2,

                      //Direction
                      HAUT = 0 << 3,
                      BAS = 1 << 3,
                      GAUCHE = 2 << 3,
                      DROITE = 3 << 3
                  };


                  Ainsi, tu peux faire :
                  if(etat & HEROS) && (etat & MORT))
                      //Le personnage héros est mort


                  Ceci étant du code plutôt C. Tu peux aussi à la place utiliser des concepts C++ (puisqu'il s'agit d'un projet C++), comme les std::map (qui te permettrait de blitter la bonne surface en fonction de la direction du personnage), et l'héritage (polymorphisme) distinguant Heros de Ennemi, tous deux dérivant de Personnage possédant un booléen "m_mort" et une direction, par exemple.

                  P.S: Tu peux même dériver Personnage de Entite (possédant entre autre une méthode virtuelle pure "dessiner"), dont dérive aussi Vide, Sortie et Mur (ou autre chose).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 juin 2007 à 15:38:01

                    Ok je pense que je vais suivre vos conseil
                    Merci bien
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 juin 2007 à 15:50:41

                      Citation : kidpaddle2

                      Tu veux dire que tu veux combiner différentes constantes ?

                      Pourquoi ne pas utiliser des flags ?



                      Mais quel intérêt sincèrement ? Tu as deux variables et tu vérifies si les deux sont à la bonne valeur et puis c'est tout !

                      if(direction == HAUT && etat == MORT)


                      ...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 juin 2007 à 16:42:22

                        Niveau conception, c'est à revoir (je préconise d'ailleurs autre chose en C++, voir mon post), mais je ne fais que traduire ses besoins, au même titre que vous : libre à lui de choisir par la suite ce qui lui convient le mieux.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Enumération dans une énumération

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown