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 :

SDL_MOUSEMOTION et SDL_MOUSEBUTTONDOWN


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 26
    Points
    26
    Par défaut SDL_MOUSEMOTION et SDL_MOUSEBUTTONDOWN
    Bonjour,
    je suis en train de programmer un mastermind, en c avec la sdl2.
    Pour faciliter le pb, supposons que je dois trouver une combinaison de 4 jetons avec 2 couleurs (rouge et vert).
    J'ai, en bas de mon écran la liste des couleurs disponibles, donc un rouge et un vert.
    J'ai en haut de mon écran, 4 places vides.
    Avec ma souris, je clique sur le rouge, pour sélectionner la couleur, puis sur les cases pour les remplir.
    J'arrive même à tirer en "rafale" pour remplir les 4 cases en rouge, en déplaçant la souris en même temps que je clique :clic-clic-clic-clic.

    J'ai décidé de conserver le pointeur flèche de la souris et d'afficher une petite bille de la couleur sélectionnée en bas de la flèche, afin de savoir quelle couleur est en cours.
    J'arrive à déplacer mon curseur, suivi par la petite bille de la bonne couleur.

    Le problème que je rencontre est que je ne peux plus tirer en rafale.
    En effet, je suis obligé de déplacer ma souris sur la 1ere case, de marquer un léger temps d'arrêt sans bouger et de cliquer, puis de déplacer sur la 2eme case, de marquer un léger temps d'arrêt sans bouger et de cliquer, ... quasiment obligé de lacher la souris et de cliquer avec un seul doigt, pour ne pas bouger. stop-clic-stop-clic-stop-clic-stop-clic.

    Comme j'utilise un SWITCH CASE avec SDL_MOUSEMOTION pour afficher la petite bille au bon endroit, chaque "léger" déplacement redessine mon écran et ne prend pas en compte le clic, avec SDL_MOUSEBUTTONDOWN.
    Est-il possible de "prioriser" un clic sur un déplacement ?

    J'ai essayé de placer ma partie déplacement à plusieurs endroits, sans plus de succès

    Y a-t-il une solution pour fluidifier tout ceci ?
    Est-ce que mes CASE sont mal positionnés ?

    Merci de votre aide

    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
     
    long AttendEvenement(SDL_Renderer *Renderer,Images *Jeton,ChoixDuMenu *Menu, Coord *ClicSouris,int Ligne, int Page)/
    {
     while (ActionValide==NON)//tant que pas d'evenement, on boucle ici
        {
            while(SDL_PollEvent(&event))
            {
                switch(event.type) // selon l'événement
                {
                case SDL_WINDOWEVENT: // clic sur la croix de la fenêtre
                    if (event.window.event == SDL_WINDOWEVENT_CLOSE) // Fermeture de la fenêtre
                    {
                       ...
                    }//arret de la boucle
                    break;
                case SDL_KEYDOWN://si on appuie sur la touche...
                    if(event.key.keysym.sym==SDLK_ESCAPE)//touche echap
                    {
                        ...
                    }//arret de la boucle
                    break;
                case SDL_MOUSEMOTION: //Si souris déplacée
                    ClicSouris->ZoneClic=ZC_JEU_MOUVEMENT;
                    renvoi=OUI;
                    ActionValide=OUI;
                    ClicSouris->x=event.motion.x; //position souris
                    ClicSouris->y=event.motion.y;
                    break;
                case SDL_MOUSEBUTTONDOWN://si on clic, bouton enfoncé,
                    if(event.button.button==SDL_BUTTON_LEFT)// si c'est clic gauche
                    {
                        ClicSouris->x=event.button.x;//recupêration des coordonnees du clic
                        ClicSouris->y=event.button.y;
                    }
                    /*   default:
                           ClicSouris->ZoneClic=ZC_JEU_MOUVEMENT;
                           renvoi=OUI;
                           ActionValide=OUI;
                           ClicSouris->x=event.motion.x; //position souris
                           ClicSouris->y=event.motion.y;
                           break;*/
                }
                //   SDL_Delay(10);
            }
        }
    }
    //***************************
    void AfficheTableauVerificationCouleur(SDL_Renderer *Renderer,Images *Jeton,ChoixDuMenu Menu,int Tableau[],char Comp1[],int NumeroLigne,char *ListeSuperGlobal, int Partie)
    {
        ...
     
      //  SDL_Rect positionCoulSelect= {event.motion.x,event.motion.y,17,17}; //pour afficher les support de toutes les lignes
     // SDL_Rect selectCoulSelect= {34*CoulSelectionnee,0,34,34}; //pour afficher les support de toutes les lignes
    //    SDL_RenderCopy(Renderer,Jeton->Image[0],&selectCoulSelect,&positionCoulSelect); // Copie de la selectionCorrection
     
        SDL_RenderPresent(Renderer);//Actualisation
    }
     
    //***************************
    void AffichePointeur(SDL_Renderer *Renderer,Coord ClicSouris,Images *Jeton, int CoulSelectionnee)
    {
        SDL_Rect positionCoulSelect= {ClicSouris.x,ClicSouris.y+10,17,17}; //pour afficher les support de toutes les lignes
        SDL_Rect selectCoulSelect= {34*CoulSelectionnee,0,34,34}; //pour afficher les support de toutes les lignes
     
        SDL_RenderCopy(Renderer,Jeton->Image[0],&selectCoulSelect,&positionCoulSelect); // Copie de la selectionCorrection
        SDL_RenderPresent(Renderer);//Actualisation//////////////////a supprimer ensuite
    }

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    J'ai toujours trouvé l'utilisation de SDL_PollEvent bancal. Notamment, car pour peu que le programme se fasse noyer d'événements (ce qui est facile, rien qu'en déplaçant la souris), alors le programme se bloque, le temps de traiter tout ça.
    Du coup, j'utiliserai plutôt SDL_GetMouseState() ( https://wiki.libsdl.org/SDL2/SDL_GetMouseState ) qui retourne l'information dont on a besoin, au moment où l'on en a besoin.
    Par conséquent, j'aurais uniquement une boucle et dans la boucle, je dessine l'écran et met à jour le jeu.
    Une piste de ce à quoi je pense est décrit ici : https://alexandre-laurent.developpez...boucle-de-jeu/

    Accessoirement, votre logique est étrange, notamment la variable ActionValide. Aussi, vous faites un break, cela veut dire que dès que l'on bouge la souris, on sort des boucles, donc si dans la liste des événements, il y avait eu le clic, on l'aurait ignoré.
    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.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Merci de votre réponse.
    Je ne connaissais pas SDL_GetMouseState().
    Cela veut dire que je devrais remplacer tous les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    case SDL_WINDOWEVENT: 
                    if (event.window.event == SDL_WINDOWEVENT_CLOSE) // Fermeture de la fenêtre
                        ...
                    break;
    case SDL_KEYDOWN://si on appuie sur la touche...
                    if(event.key.keysym.sym==SDLK_ESCAPE)//touche echap
                    ...
                    break;
    case SDL_MOUSEBUTTONDOWN://si on clic, bouton enfoncé,
                    if(event.button.button==SDL_BUTTON_LEFT)
    ...
                    break;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SDL_PumpEvents();
     
    if ( pKeyStates[SDL_SCANCODE_ESCAPE] )...
     
    SDL_GetMouseState(&x,&y); ...
    J'ai survolé tout cela et je pense le reprendre plus en détail prochainement pour bien assimiler les modifications à effectuer.

    Est-ce que SDL_WINDOWEVENT_CLOSE est traité avec cette nouvelle manière ?

    J'utilise la variable ActionValide, pour modifier le type de vérification des billes du jeu.
    Dans une version "classique", chaque bille est vérifiée : bien placée, mal placée, inexistante, avec jetons blancs et noirs que l'on connait habituellement.
    Dans une version "globale", je décide pour chaque combinaison proposée, si je veux connaitre que les billes bien placées, ou que les billes mal placées.
    La variable me sert juste à savoir si je dois afficher directement la vérification, ou si je dois fournir une indication (bien/mal placée) avant d'afficher la vérification.
    A juste titre, sans le cas SDL_MOUSEMOTION, la variable jouait parfaitement son rôle, mais depuis que j'ai inséré SDL_MOUSEMOTION, elle ne le jouait plus, car au moindre déplacement, mon choix était ignoré.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    A juste titre, sans le cas SDL_MOUSEMOTION, la variable jouait parfaitement son rôle, mais depuis que j'ai inséré SDL_MOUSEMOTION, elle ne le jouait plus, car au moindre déplacement, mon choix était ignoré.
    Oui, car dans le cas du SDL_MOUSEMOTION, vous placez la variable ActionValide à OUI et vous avez un break. Par conséquent, vous quittez la première boucle et la deuxième boucle. Bref, vous quittez immédiatement la fonction AttendEvenement().
    Le problème du SDL_PollEvent() c'est qu'il ne faut pas s'arrêter dès que l'on trouve l'événement qui va bien. En réalité, il y a une pile d'événements reçues, et SDL_PollEvent() vous permet de récupérer le premier reçu. Mais vous pouvez très bien en avoir encore 50 autres. Dans l'exemple de la documentation, c'est aussi indiqué. Il faut traiter tous les événements jusqu'à ne plus en recevoir.
    Et c'est "pénible" . Du coup, oui, je préfère passer par les SDL_GetMouseState() et consorts .

    Est-ce que SDL_WINDOWEVENT_CLOSE est traité avec cette nouvelle manière ?
    Pour fermer la fenêtre, je ne trouve pas la bonne solution. Je sais que je passe par une touche du clavier (Échap) pour contourner cela .
    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.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup, j'ai pu résoudre mon problème.

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

Discussions similaires

  1. difficulter avec SDL_MOUSEMOTION
    Par aliwatte dans le forum SDL
    Réponses: 9
    Dernier message: 04/06/2009, 22h53
  2. rapidité sdl_mousemotion coordonnées
    Par |Psk| dans le forum SDL
    Réponses: 2
    Dernier message: 13/07/2007, 00h41

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