Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Objet] Menu

Plan et réflexion

    7 décembre 2007 à 19:38:53

    Bonjour,

    Je tente actuellement de créer un objet de type O_Menu.

    Le but de cet objet serait de faciliter la mise en place d'un menu au début de l'exécution d'un programme
    (Oui, moi aussi ça me semble logique... ;) )

    Mais avant de coder comme un bourin, je préfère vous demander de l'aide pour ne faire n'importe quoi.
    Donc voici les objectifs de mon MENU :

    1 Pouvoir Afficher des boutons.
    2 Pouvoir Afficher des bouton-cochoirs
    3 Pouvoir affiher des listes déroulantes.
    4 Pouvoir Afficher du Texte.
    5 Pouvoir Afficher des Images.

    6 Contrôler les déplacements de la souris (Si possible)...

    -> tout ça grâce à la SFML.

    Les Objectifs peuvent changer selon que je vois qu'ils sont inutiles ou non... (Là je pense à texte et Images...)
    Le controle de déplacements de la souris revient à ça :
    1. Si la souris passe sur un bouton,
    2. ALORS le bouton change de couleur.
    3. SI la souris clique sur un bouton
    4. ALORS Menu réagit.


    De plus, j'aimerai que mon menu se "construise" grâce au constructeur, mais aussi grâce à des fonctiosn comme :
    1. Menu.AddButton("Images/bouton1.png",100,20)

    Mais le problème est que :
    Je voudrais que le menu controle la présence d'objets (Bouton, liste...) à cet endroit précis.
    Si un objet s'y trouve déjà, il décale le nouvel objet à créer...
    MAIS :
    Comment faire en sorte que Menu puisse controler la position de tous les objets qu'il contient ? Faut-il utiliser un tableau ? C'est là ce que je pense être le plus dur. Cette question s'utilise aussi pour controler le déplacement de la souris (est-elle sur un objet ?)


    J'espère que vous pourrez m'aider à répondre à ma question et que vous pourrez critiquer ou non mon projet.

    Merci !



    • Partager sur Facebook
    • Partager sur Twitter
      7 décembre 2007 à 19:57:19

      - une classe abstraite Widget
      - tu créés toutes tes classes Button, etc qui derivent de Widget
      - Menu ne serait qu'une sorte de conteneur
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        7 décembre 2007 à 20:19:45

        Tu peux faire ça :
        1 classe Bouton,
        1 classe liste,
        1 classe "zone de texte",
        ...

        1 classe Menu ("conteneur" comme l'a nommée Chlab_lak).
        Cette dernière est effectivement plus compliqué à gérer.
        Elle pourrait contenir un tableau (de préférence std::vector pour simplifier l'agrandissement, la gestion et tout ça) de "Bouton", un autre de "Liste", un autre de , etc...
        Quand tu veux vérifier si la souris se trouve sur un bouton, tu parcours tout le tableau de Bouton pour voir s'elle se trouve bien en dessus d'un d'eux. Si c'est le cas, tu peux faire appel à une fonction membre du bouton en question pour gérer la "seconde image". (enfin, le principe est assez simple, je pense que tu as compris qu'il s'applique aussi aux autre tableau).

        Il reste à concevoir comment exécuter l'action désiré en cas de pression d'un bouton... Si tu veux que je te donne mes idée là dessus, je le ferais, mais si tu veux y penser par toi-même c'est encore mieux ;) .
        • Partager sur Facebook
        • Partager sur Twitter
          7 décembre 2007 à 21:07:12

          Hum...
          J'ai l'impression que je m'attaque à un gros truc en fait... :-°^^

          Bon :
          Pour rapeller les fonctions commandées par les boutons, pourquoi ne pas utiliser des CALLBACK ?
          c'est compliqué, je pense, et je ne sais pas encore vraiment m'en servir, surtout en C++... Mais on est la pour apprendre, hein ! ;)

          Je ne sais par contre pas DU TOUT ce qu'est un vecteur... (en programation, hein ? Parce que mes cours de maths, ça je connais ^^ )

          Ensuite : conteneur, ect... Ca me fait bien penser à du GTK tout ça... J'avoue qu'au début j'ai pensé à faire du GTK+, mais il me manqué la personalisation... En GTK, à part mettre un fond d'image personalisé, on ne peut pas faire grand chose... Là mes boutons auraient la tête que je veux, ect...

          Encore ensuite : Est ce que c'est jouable d'utiliser une méthode du style :

          1. Menu::gerer_programme (sf::RenderWindow Fenetre)
          2. {
          3.     /* La gestion d'évènements passe par là et n'est plus confiée au MAIN pour un temps indéterminé -> Jusqu'à ce que l'utilisateur lance la partie (dans le cas d'un jeu, par exemple, puisque c'est mon objectif final.)... */
          4. }



          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            7 décembre 2007 à 21:26:37

            Ce n'est pas rien en effet. ;)
            Mais il faut te dire que tu vas apprendre des quantité de choses! C'est que bénéf' pour toi.

            Je ne sais pas vraiment bien gérer les callback personnellement (ma méthode est pas assez efficace pour que te la donne).

            Pour ce qui est du vector, tu trouveras un bon tuto ici (en) : http://www.roguewave.com/support/docs/hppdocs/stdug/5.html
            Ou encore ici (en) : http://www.cplusplus.com/reference/stl/vector/ mais le premier lien est de meilleur qualité.

            Pour ton code, il ne compilera pas, mais le principe est là.
            En fait, s'il ne compilera pas c'est parce que tu ne peux pas faire de copie de sf::Window (ou sf::RenderWindow). Mais pas de panique, il y a une solution : les références.

            Pourquoi cette classe n'est pas copiable? Car elle hérite de "sf::NonCopyable" (qui comme sont nom l'indique est non copiable). Cette classe empêche la copie en ayant son constructeur en private.

            Donc le code serait :
            1. Menu::gerer_programme (sf::RenderWindow& Fenetre)
            2. {
            3.     /* La gestion d'évènements passe par là et n'est plus confiée au MAIN pour un temps indéterminé -> Jusqu'à ce que l'utilisateur lance la partie (dans le cas d'un jeu, par exemple, puisque c'est mon objectif final.)... */
            4. }
            • Partager sur Facebook
            • Partager sur Twitter
              7 décembre 2007 à 21:40:40

              pour appeler une fonction dans une fonction, je m'inspire personellement de la SL. ex:
              1. template <class InputIterator, class UnaryFunction>
              2. UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f);


              • Partager sur Facebook
              • Partager sur Twitter
                7 décembre 2007 à 21:53:05

                Bon, après mure réflexion, j'ai choisit de ne pas utiliser les vecteurs.
                En effet, je ne cherche qu'à créer un menu 'interactif', pas un truc de professionel ^^

                Après ça, je pense que mon idée de la fonction gérer_programme est pas si mal, vu que en +, vous semblez me dire que ça peut marcher.

                Ensuite j'ai fait quelque essais à l'arrache et j'ai vu que :
                1 - Au final, les boutons n'ont pas forcément à appeller un fonction.
                * Seuls certains doivent le faire : Ceux qui font accéder l'utilisateur à un sous menu.
                * Les boutons comme "quitter" retournent EXIT_SUCCESS, ou appellent terminate().
                * Les autres ne servent qu'à stoker des valeurs qui serviront à générer le jeu en lui-même : DIFFICILE, FACILE, VOLUME_MOYEN, ect...

                Donc du coup ça simplifie le problème d'appel de fonctions.
                A ce sujet, j'avoue que je suis un eu largué par le code présenté par Chlab_lac... ^^

                EDIT IDEE SOUDAINE

                En essayant le code suivant :
                1. Widget.NewButton(std::string Texte, long x, long y);
                2. Widget.Grid(long x, long y,/* xxx */);


                Je me suis rendu compte qu'il me "suffisait" de mettre à la place des xxx un pointeur vers le bouton créé juste au dessus. Ainsi, le déplacement de la souris serait géré contrôlé par rapport à la grille.
                Et en cas d'interraction (le bouton change de couleur, par exemple), la grille renverrai l'adresse du bouton pour pouvoir changer son etat de 0 (normal) à 1 (changer_couleur).

                Vous en pensez quoi ?
                Merci !

                PS : C'est pas bien de lire les narutos en ligne... :-°
                • Partager sur Facebook
                • Partager sur Twitter
                  7 décembre 2007 à 22:22:59

                  - ton idée n'est pas mauvaise, mais je preferais celle de mon premier post (plus facile a modifier, plus OO, mieux structurée)

                  - pour le code (qui n'est pas le mien) ci-dessus, for_each est un des algorithmes de <algorithm>. mais je ne saurais t'expliquer les concepts utilisés (je les connais, mais je n'arriverais pas a les expliquer)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [Objet] Menu

                  × 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