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

SDL Discussion :

Evénements clavier et souris !


Sujet :

SDL

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Evénements clavier et souris !
    Bonjour !


    J'ai créé Deux fonctions séparées, l'une pour les événements clavier et l'autrre pour ceux de la souris, toutes deux appelées dans la boucle principale comme suite:
    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
     
       while (! quit)
       {
          /*
           * Attente d'un evenement utilisateur.
           */
          SDL_WaitEvent (& event);
     
     
          /*
           * Evenements utilisateur.
           */
          quit = mouse_events     (& win);
          quit = keyboard_events  (event);
     
          if (event.type == SDL_QUIT)
          {
             quit = SDL_TRUE;
          }
     
     
          /*
           * Dessin de la scene.
           */
          draw (& win);
       }
    Le problème: seuls les événements souris sont récupérés et si j'inverse l'ordre d'appel des deux fonctions et bien ... c'est l'inverse, seuls les événements clavier sont gérés ... j'ai loupé le coche quelque part

    Quelqu'un peut-il m'expliquer comment résoudre ce problème ?


    Merci d'avance

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    C'est quoi le & win dans mouse_events(& win); ?

    Et tu pourrais donner le code de tes fonctions mouse_events et keyboard_events ?

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Eusebe
    C'est quoi le & win dans mouse_events(& win); ?

    Et tu pourrais donner le code de tes fonctions mouse_events et keyboard_events ?
    Pour ta question, l'argument que je passe est l'adresse de la structure de ma fenetre, rien de bien important.

    Voici le code comme tu me l'as demandé:
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
     
    /*
     * Evenements clavier.
     */
    SDL_bool keyboard_events (SDL_Event event)
    {
       SDL_bool quit = SDL_FALSE;
     
     
       switch (event.type)
       {
          case SDL_KEYDOWN:
          {
             switch (event.key.keysym.sym)
             {
                case SDLK_ESCAPE:
                {
                   quit = SDL_TRUE;
                }
                break;
     
                default:
                   break;
             }
          }
          break;
     
          default:
             break;
       }
     
     
       return quit;
    }
     
     
    /*
     * Evenements souris.
     */
    SDL_bool mouse_events (win_st * st)
    {
       SDL_bool quit     = SDL_FALSE;
       Uint8 mouse_state = 0;
       int x             = 0;
       int y             = 0;
       int i             = 0;
     
     
       /*
        * Recuperation de l'etat de la souris.
        */
       mouse_state = SDL_GetMouseState (& x, & y);
     
     
       if (st->input == SDL_FALSE)
       {
          /*
           * Determine si la souris passe au-dessus du bouton "fleche ver le haut".
           */
          if (st->btn_arrow_up_active == SDL_TRUE)
          {
             if (x >= st->btn_arrow_up_rect.x                            &&
                 x <= st->btn_arrow_up_rect.x + st->btn_arrow_up_rect.w  &&
                 y >= st->btn_arrow_up_rect.y                            &&
                 y <= st->btn_arrow_up_rect.y + st->btn_arrow_up_rect.h)
             {
                st->btn_arrow_up_stat_over = SDL_TRUE;
     
                if (mouse_state & SDL_BUTTON (SDL_BUTTON_LEFT))
                {
                   if (st->current_page > 1)
                   {
                      st->current_page--;
                      st->btn_arrow_up_stat_over = SDL_FALSE;
                   }
                }
             }
             else
             {
                st->btn_arrow_up_stat_over = SDL_FALSE;
             }
          }
     
     
          /*
           * Determine si la souris passe au-dessus du bouton "fleche ver le bas".
           */
          if (st->btn_arrow_down_active == SDL_TRUE)
          {
             if (x >= st->btn_arrow_down_rect.x                             &&
                 x <= st->btn_arrow_down_rect.x + st->btn_arrow_down_rect.w &&
                 y >= st->btn_arrow_down_rect.y                             &&
                 y <= st->btn_arrow_down_rect.y + st->btn_arrow_down_rect.h)
             {
                st->btn_arrow_down_stat_over = SDL_TRUE;
     
                if (mouse_state & SDL_BUTTON (SDL_BUTTON_LEFT))
                {
                   if (st->current_page < st->nb_pages)
                   {
                      st->current_page++;
                      st->btn_arrow_down_stat_over = SDL_FALSE;
                   }
                }
             }
             else
             {
                st->btn_arrow_down_stat_over = SDL_FALSE;
             }
          }
     
     
          /*
           * Determine si la souris passe au-dessus d'un des trois boutons
           * principaux de l'interface.
           */
          for (i = 0; i < NB_MAIN_BTN; i++)
          {
             if (x >= st->btn_rect[i].x                      &&
                 x <= st->btn_rect[i].x + st->btn_rect[i].w  &&
                 y >= st->btn_rect[i].y                      &&
                 y <= st->btn_rect[i].y + st->btn_rect[i].h)
             {
                switch_btn_state (st, i);
     
                if (mouse_state & SDL_BUTTON (SDL_BUTTON_LEFT))
                {
                   get_main_btn_callback (i, & quit);
                }
             }
             else if (y >= 0 && y <= st->btn_rect[0].y)
             {
                switch_btn_state (st, -1);
             }
          }
       }
     
     
       return quit;
    }

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Bon tout est de ma faute, je viens tout juste de le remarquer, chaque appel de ces fonctions remet le flag "quit" sur faux donc ca risque de clocher quelque part, je viens de mettre des test dans ma boucle et ca va deja mieux

    Merci quand même

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Sans savoir pourquoi cela plante chez toi, première remarque :

    Passe le pointeur de la structure event à ta fonction.

    Ensuite, je ferais plutôt ceci :
    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
     
            while(!quit) 
             {
                    /* On recupere tous les evenements */
                    while(SDL_PollEvent(&event)) {
                            recup = mouse_events     (&win, &event, &quit);
                            if(!recup) 
                              {
                              recup = keyboard_events  (&event, &quit);
     
                              if(!recup)
                               {
                               //le reste...
                                }
                              }
             }
    A savoir que: Pour chaque evenement on demande a la fonction qui gere la souris si cela l'interesse, ensuite on demande au clavier si cela n'interessait pas la souris...

    Enfin au reste du programme...

    Si la gestion des evenements est indépendante... Donc tes fonctions commenceront par un switch pour voir si l'événement l'intéresse...

    J'utiliserais aussi Poll à la place de Wait, c'est plus intéressant...

    En espérant que cela aide et sinon on trouvera bien...

    Jc

  6. #6
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    j'ai pas bien compris ce que tu dis par "seul ...est géré", mais je remarque tout de même un petit soucis qui pourrai peut-être expliquer ton erreur.

    Tu appelles deux fonctions à la suite, et tu met le résultats de ces fonctions dans un même booléen. Du coup le résultat de la première fonction est écrasé par la seconde. C'est pas tip top.
    Met dans deux variables, ou arrange autrement ta sauce ;-)

    Enfin, sinon si ça vient pas de là le soucis, tu peut expliquer mieux ce qui ne fonctionne pas ? Les évènements ne sont pas traiter ?

    Edit : arf grillé ^^

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Oui pour le test du retour des fonctions j'avais pas fait gaf à ca et je les avais omis, tout est rentré dans l'ordre maintenant

  8. #8
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    comment ouvrir et boucler un post pendant que je bouffe... même pas pu participer


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Désactiver l'impression par raccourcis clavier et souris?
    Par delphine71 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 16/02/2007, 11h10
  2. help plus d'USB clavier et souris
    Par GreenGoblin dans le forum Matériel
    Réponses: 1
    Dernier message: 15/03/2006, 11h37
  3. [Avancé][keyboard] evènements clavier dans le système
    Par thecaptain dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 25/10/2005, 01h35
  4. Ecouter les evenements clavier et souris
    Par init dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 24/11/2004, 20h02
  5. Clavier et souris virtuels
    Par M.Dlb dans le forum Matériel
    Réponses: 8
    Dernier message: 12/06/2004, 09h39

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