Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C]utilisation pointeurs de fonction

finalité-> SDL: création de boutons

    6 novembre 2006 à 19:43:44

    Bonsoir!

    dans le cadre du développement d'un petit programme avec la SDL, j'ai besoin de créer des boutons qui sont relier à des fonctions. Plutôt que de les créer 'directement' dans le programme et qu'ils en soient entièrement dépendants, je préfère réaliser ça un peu à la manière des GUI pour pouvoir réutiliser le code sur d'autres projets.

    donc il faudrait pouvoir:
    ->créer un bouton
    ->lui attitrer une fonction
    ->le rendre actif/inactif

    le problème que je rencontre c'est sur les pointeurs de fonctions. Comme dans leur définition on doit spécifier le type de retour ainsi que le type des arguments de la fonction, je ne vois pas comment 'connecter', à l'aide d'une structure par exemple, n'importe quelle fonction sur n'importe quel bouton.

    comment s'organiser pour réaliser ça?

    la BU ferme, je reviens demain soir :(
    • Partager sur Facebook
    • Partager sur Twitter
      6 novembre 2006 à 23:00:48

      Citation : freecircus

      Bonsoir!

      dans le cadre du développement d'un petit programme avec la SDL, j'ai besoin de créer des boutons qui sont relier à des fonctions. Plutôt que de les créer 'directement' dans le programme et qu'ils en soient entièrement dépendants, je préfère réaliser ça un peu à la manière des GUI pour pouvoir réutiliser le code sur d'autres projets.

      donc il faudrait pouvoir:
      ->créer un bouton
      ->lui attitrer une fonction
      ->le rendre actif/inactif

      le problème que je rencontre c'est sur les pointeurs de fonctions. Comme dans leur définition on doit spécifier le type de retour ainsi que le type des arguments de la fonction, je ne vois pas comment 'connecter', à l'aide d'une structure par exemple, n'importe quelle fonction sur n'importe quel bouton.

      comment s'organiser pour réaliser ça?

      Un bouton, c'est une zone active. Tu lui assignes un traitement "on click" comme n'importe quelle zone active. (y'a pas ça en SDL ?). Quand à l'activation ou non, il suffit de connecter ou non la zone active.

      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        7 novembre 2006 à 0:28:48

        Non le bouton ca n'existe pas en SDL :p (Enfin dans mes souvenirs.. :euh: )
        Arrêtez moi si je me trompe, je crois que le code suivant est correct ! :-°

        typedef struct bouton
        {
           SDL_Rect zoneActive;
           void (*onClick)()
        }bouton;

        bouton boutons[10];

        boutons[0].onClick = SDL_Quit;
        boutons[0].zoneActive.x = ...
        boutons[0].zoneActive.y = ...
        boutons[0].zoneActive.w = ...
        boutons[0].zoneActive.h = ...

        /*
        ...
        Suite des définitions des boutons... (1 à 10)
        ...
        */


        // Boucle d'evenement..
        case SDL_MOUSEBUTTONUP:
              for(i=0; i <10; ++i)
              {
                  if( // Si la souris est dans la zone active..
                     (event.button.x > boutons[i].zoneActive.x) &&
                     (event.button.x < (boutons[i].zoneActive.x + boutons[i].zoneActive.w)) &&
                     (event.button.y > boutons[i].zoneActive.y) &&
                     (event.button.y < (boutons[i].zoneActive.y + boutons[i].zoneActive.h))
                    )
                  bouton[i].onClick();
              }

        • Partager sur Facebook
        • Partager sur Twitter
        Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
          7 novembre 2006 à 10:50:06

          Citation :

          Arrêtez moi si je me trompe, je crois que le code suivant est correct !


          à quelques petites erreurs près c'est correct ( boutons[0].onClick = SDL_Quit(); boutons[0].onClick = SDL_Quit; )

          le problème est que ça marche bien dans le cas de SDL_Quit() puis qu'elle ne prend aucun paramètres et qu'elle retourne void. Peut on aussi utiliser le type void quel que soit ce que retourne la fonction pointée? ça fait pas un peu bourrin comme méthode?
          • Partager sur Facebook
          • Partager sur Twitter
            7 novembre 2006 à 10:52:07

            Citation : iNaKoll

            Non le bouton ca n'existe pas en SDL :p (Enfin dans mes souvenirs.. :euh: )
            Arrêtez moi si je me trompe, je crois que le code suivant est correct ! :-°


            Ah ouais, c'est rustique ! Ca me rappelle l'INT 33h sous DOS... En tout cas, ça à l'air correct.

            Je te conseille de prévoir un pointeur 'neutre' pour les données :

            typedef struct bouton
            {
               SDL_Rect zoneActive;
               void (*onClick)(void *);
               void *p_user;
            }bouton;

            <...>

            boutons[0].onClick = SDL_Quit();
            boutons[0].p_user = &data; /* contexte utilisateur ou NULL */

            <...>
                      bouton[i].onClick(bouton[i].p_user);

            Ca ne mange pas (trop) de pain et le jour où on en a besoin, on est content de l'avoir d'écrire du code propre sans globales.
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !
              7 novembre 2006 à 15:19:14

              ok, j'vais fonctionner comme ça alors..
              merçi!

              dans la doc' SDL il y a une fonction qui doit faire un peu ça mais je comprend pas son utilisation:

              Citation : doc SDL

              SDL_UserEvent
              Name

              SDL_UserEvent -- A user-defined event type

              Structure Definition

              typedef struct{
              Uint8 type;
              int code;
              void *data1;
              void *data2;
              }SDL_UserEvent;

              Structure Data

              type SDL_USEREVENT through to SDL_NUMEVENTS-1
              code User defined event code
              data1 User defined data pointer
              data2 User defined data pointer


              Description

              SDL_UserEvent is in the user member of the structure SDL_Event. This event is unique, it is never created by SDL but only by the user. The event can be pushed onto the event queue using SDL_PushEvent. The contents of the structure members or completely up to the programmer, the only requirement is that type is a value from SDL_USEREVENT to SDL_NUMEVENTS-1 (inclusive).

              Examples

              SDL_Event event;

              event.type = SDL_USEREVENT;
              event.user.code = my_event_code;
              event.user.data1 = significant_data;
              event.user.data2 = 0;
              SDL_PushEvent(&event);

              • Partager sur Facebook
              • Partager sur Twitter
                7 novembre 2006 à 20:00:53

                Bonsoir !


                Cela permet de mettre dans la queue des évènements SDL des évènements créé par l'utilisateur.


                // Définition de l'évènement de la boucle principale
                SDL_Event event;

                // Définition des codes des évènements utilisateur
                enum USER_EVENT {BOUTON_ACTIVE [..]}
                SDL_Event *user_event;

                // Définition du tableau de 10 boutons
                typedef struct bouton
                {
                   SDL_Rect zoneActive;
                   void (*onClick)()
                }bouton;

                bouton boutons[10];

                boutons[0].onClick = SDL_Quit;
                boutons[0].zoneActive.x = ...
                boutons[0].zoneActive.y = ...
                boutons[0].zoneActive.w = ...
                boutons[0].zoneActive.h = ...

                /*
                ...
                Suite des définitions des boutons... (1 à 10)
                ...
                */


                // Boucle d'évènements
                while(SDL_PollEvent(&event))
                {
                    switch (event.type)
                    {
                    case SDL_MOUSEBUTTONUP:
                          for(i=0; i <10; ++i)
                          {
                               if
                               ( // Si la souris est dans la zone active..
                                    (event.button.x > boutons[i].zoneActive.x) &&
                                    (event.button.x < (boutons[i].zoneActive.x
                                                      + boutons[i].zoneActive.w)) &&

                                    (event.button.y > boutons[i].zoneActive.y) &&
                                    (event.button.y < (boutons[i].zoneActive.y
                                                      + boutons[i].zoneActive.h))
                                )
                         
                                user_event = (SDL_Event*)malloc(sizeof SDL_Event);

                                user_event->type = SDL_USEREVENT;
                                user_event->user.code = BOUTON_ACTIVE;
                                user_event->user.data1 = &bouton[i];
                                user_event->user.data2 = NULL;

                                SDL_PushEvent(user_event);
                          }
                    case BOUTON_ACTIVE: // évènement défini par l'utilisateur...
                         event.user.data1->onClick(event.data2);
                    }
                }

                Je suis pas un pro de la SDL, c'est peut-être pas comme ça que ça s'utilise. Ce code n'a pas été testé. Si quelqun pouvait confirmer !
                • Partager sur Facebook
                • Partager sur Twitter
                Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.

                [C]utilisation pointeurs de fonction

                × 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