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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 728
    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 Expert
    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 : 35
    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
    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 .

  3. #3
    Membre expérimenté
    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
    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 très actif Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 728
    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
    27 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 151
    Billets dans le blog
    150
    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 expérimenté
    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
    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.

+ 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