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 :

évenement souris cliquée gauche avec déplacement


Sujet :

SDL

  1. #1
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut évenement souris cliquée gauche avec déplacement
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_ball_manager1->m_follow_mouse = m_mainEvent->type == SDL_MOUSEBUTTONDOWN;
    m_follow_mouse est un booléen, si la souris est cliquée m_mainEvent->type == SDL_MOUSEBUTTONDOWN vaut "true" mais si elle est cliquée et en déplacement ça vaut "false".

    Comment faire pour détecter le clic gauche en continu même en déplacement svp ?

    Edit :

    J'ai essayé aussi avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int8_t mouse_state = SDL_GetMouseState(NULL, NULL);
                m_ball_manager1->m_follow_mouse = 0;
     
                if(m_mainEvent->button.button == SDL_BUTTON_LEFT){
                    m_ball_manager1->m_follow_mouse = 1;
     
                }
                if(m_mainEvent->button.button == SDL_BUTTON_RIGHT)
                {
                    m_ball_manager1->m_follow_mouse = 2;
                }
    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_mainEvent->button.button == SDL_BUTTON_LEFT
    - Si je fait un seul clic sans bouger souris, ça vaut true en boucle, mais si je bouge la souris ça vaut false
    - SI je garde le clic ça vaut true en boucle avec ou sans déplacement (fonctionne)

    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_mainEvent->button.button == SDL_BUTTON_RIGHT
    - Si je fait un seul clic sans bouger souris, ça vaut true en boucle, mais si je bouge la souris ça vaut false
    - si je garde le clic ça vaut true en boucle, mais vaut false si déplacement souris en même temps.

    J'aimerais que sur un clic ça vaille true qu'une fois, mais que sur un clic prolongé ça vaille true en boucle (tant que le bouton est pressé) avec ou sans déplacement de souris

  2. #2
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Je suis étonné que pour le clic gauche ça fonctionne Oo.

    La SDL t'envois un évenement lors du changement d'état d'une entrée utilisateur, donc:
    Clic souris appuyé = un évenement (SDL_MOUSEBUTTONDOWN)
    Clic souris simple = deux évenement (SDL_MOUSEBUTTONDOWN puis SDL_MOUSEBUTTONUP)

    Avec dans la structure l'information de quel clic il s'agit (gauche ou droit).
    Le mouvement de la souris est un autre évenement (MOUSEMOVE si je me souviens bien).

    Donc tu n'auras jamais clic + mousemove, c'est à toi d'enregistrer l'état de tes boutons ou de demander à SDL dans quel état se situe un bouton.

    L'idéal serait de faire comme suit:
    Enregistrer lors du MOUSEDOWN un booléen
    Appliquer les actions à faire lors d'un mousemove que si le booléen est à TRUE.

    Enfin perso c'est comme ça que je faisais .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Bonjour,

    Attention à ne pas confondre l'état du bouton avec un évènement (qui est un changement d'état).

    Un évènement est fugitif et si l'on bouge la souris : il s'en produit beaucoup. Le m_mainEvent->type garde l'état du dernier évènement donc, le comportement décrit est normal.

    Comment faire pour détecter le clic gauche en continu même en déplacement svp ?
    Eh bien ce que l'on détecte ce sont des EVENEMENTS (transitions) : le bouton gauche passe de relaché à enfoncé (SDL_MOUSEBUTTONDOWN) ou le contraire (SDL_MOUSEBUTTONUP).
    Si l'on veut l'ETAT du bouton gauche il suffit de le gérer soi-même en faisant un set lors de SDL_MOUSEBUTTONDOWN et un reset lors de SDL_MOUSEBUTTONUP.

  4. #4
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Merci pour vos réponses

    J'ai mis avant la boucle while

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int8_t mouse_state = SDL_GetMouseState(NULL, NULL);
    et j'ai mis ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     if(m_mainEvent->button.button == SDL_BUTTON_LEFT){
                    m_ball_manager1->m_follow_mouse = 1;
                }
                if(m_mainEvent->button.button == SDL_BUTTON_RIGHT){
                    m_ball_manager1->m_follow_mouse = 2;
                }
     
                if(m_mainEvent->type == SDL_MOUSEBUTTONUP){
                    m_ball_manager1->m_follow_mouse = 0;
                }
    Et ça marche parfaitement pour le clic gauche (contrairement à ce que j'ai décrit dans le premier post).
    En revanche ça bug autant pour le clic droite (il faut arreter deplacement souris pour que le clic bas et clic haut soient pris en compte). C'est bien la preuve que la SDL2 est bugguée niveau inputs.

    Qu'en pensez vous ?

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    J'en pense qu'elle n'est pas boguée, ou alors il me faudra une preuve (un ticket, du bugtracker officiel). Je pense que vous n'optez pas pour la bonne solution (et c'est courant, sachant que trop de tutoriels se penche sur cette solution en oubliant qu'elle n'est pas unique).
    Dans ce tutoriel sur les événements de la SDL2, les deux approches sont présentées. Du coup, je vous conseille la seconde approche (qui, d'après moi, est la plus utile pour la majorité des cas). Du coup, je vous conseille les fonctions SDL_GetMouseState().
    Et bien entendu, il y a un exemple d'utilisation
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut Gestion des évènements
    Bonjour,

    Qu'en pensez vous ?
    Je pense que pour filtrer les évènements il faut mieux utiliser un switch() que des if() car les case/break sont exclusifs l'un de l'autre (on ne risque pas de passer dans les deux et donc la détermination de l'évènement est non ambigue).
    Mais surtout, pour déterminer effectivement de cette façon, il faut un filtrage structuré, c'est à dire :
    Switcher d'abord sur le type : SDL_MOUSEMOTION, SDL_MOUSEBUTTONUP, SDL_MOUSEBUTTONDOWN, SDL_KEYDOWN ...
    et ensuite, à l'intérieur du type, switcher sur le button index (SDL_BUTTON_LEFT, SDL_BUTTON_RIGHT ...)

    Evidement il faut mettre tous les switchs dans un bloc:

    while ( SDL_PollEvent(&event) )
    {

    }

    Ce que que je conseillerais c'est de faire une détection propre des évènements comme ci-dessus et de positionner les différents états en fonction de ces évènements.
    Ensuite les états peuvent être testés à votre guise avec des if() sans changer la structure déjà mise en place dans le programme.

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Pourquoi reproduire des états, alors que SDL_GetMouseState(), SDL_GetKeyboardState() et les autres pour les joysticks retournent des états ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Bonjour LittleWhite,

    Bien sur si l'on ne s’intéresse qu'aux états on n'a pas besoin de gérer les évènements ...

    Il m'a semblé ici intéressant de rappeler la différence entre les deux car le message de guitz est "évènement souris cliquée".
    La détection d'un clic est plutôt un évènement et c'est tout l'intérêt de SDL de pouvoir les détecter, je suis d'accord que guitz parle de "détecter le clic gauche en continu" donc on peut en déduire qu'il s’intéresse à l'état du bouton.

    Je voulais faire ressortir que le test de (m_mainEvent->button.button) n'est pertinent que dans le cas d'un évènement et pas pour tester l'état du bouton.

    Je ne sais pas si j'ai réussi ...

  9. #9
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Merci à tous,

    Je suis entrain de me pencher dessus

    Edit :

    Super ça marche , bravo LittleWhite !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    m_ball_manager1->m_follow_mouse = 0;
     
                SDL_PumpEvents();
                if(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(1)){
                    m_ball_manager1->m_follow_mouse = 1;
                }else if(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(3)){
                    m_ball_manager1->m_follow_mouse = 2;
                }

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/12/2010, 10h21
  2. Gérer l'événement "déplacement souris + clic gauche"
    Par vladvad dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/10/2008, 23h47
  3. évenement clique droit-clique gauche
    Par maa dans le forum C#
    Réponses: 4
    Dernier message: 19/05/2008, 23h57
  4. [C] Clique gauche automatique de la souris
    Par jambono dans le forum Windows
    Réponses: 18
    Dernier message: 08/06/2006, 02h37
  5. IFRAME : pas d"évenement souris en mode editable
    Par alheim dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/02/2006, 11h48

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