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

 C Discussion :

SDL: faire glisser une image à la souris


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 24
    Par défaut SDL: faire glisser une image à la souris
    Bonjour à tous,

    Je découvre les bases du C depuis peu et je "joue" actuellement avec la bibliothèque SDL.

    Pour l'instant j'arrive à déplacer une image de façon instantanée en cliquant avec la souris (en positionnant l'image à la position event.button en x et y).
    J'arrive aussi à faire en sorte que l'image suive le mouvement de la souris (event.motion en x et y).

    Je n'arrive par contre pas à combiner les deux
    Je souhaiterai que l'image suive le mouvement de la souris uniquement lorsque un des boutons de cette dernière est enfoncé.

    Je travaille à partir d'une structure de ce type (avec ce code l'image suis le mouvement de la souris):

    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
     
    SDL_EnableKeyRepeat(10,10);
        while(continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym) /*on regarde quelle touche a appuyée */
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                        case SDLK_UP:
                            positionImage.y = positionImage.y -1;
                            break;
                        case SDLK_DOWN:
                            positionImage.y = positionImage.y +1;
                            break;
                        case SDLK_LEFT:
                            positionImage.x = positionImage.x -1;
                            break;
                        case SDLK_RIGHT:
                            positionImage.x = positionImage.x +1;
                            break;
                        default:
                            break;
                    }
                    break;
                case SDL_MOUSEMOTION:               
                        positionImage.x = event.motion.x;
                        positionImage.y = event.motion.y;                
                        break;
            }
     
            /* on efface l'ecran*/
            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
     
            /*On fait les SDL_BlitSurface nécessaires*/
            SDL_BlitSurface(zozor,NULL,ecran,&positionImage);
     
            /*On met l'affichage à jour*/
            SDL_Flip(ecran);
        }
    La partie au clavier fonctionne correctement; si je reste appuyé sur une touche le déplacement continue grâce au SDL_EnableKeyRepeat.

    J'ai essayé, pour résoudre mon problème, d'utiliser une boucle do{ ... } while mais sans succès.

    Avez-vous une piste quand à la structure à utiliser?

    Merci beaucoup !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Bonjour,

    Il existe les événements SDL_MOUSEBUTTONUP et SDL_MOUSEBUTTONDOWN. Tu peux te servir de l'un et l'autre pour fixer l'état d'un flag indiquant si l'on doit ou non déplacer ton image, et continuer à le faire sur un SDL_MOUSEMOTION en fonction de l'état de ce flag.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 24
    Par défaut
    Merci Obsidian !

    Voici ce que j'ai fait en suivant ton conseil:

    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
     
    SDL_EnableKeyRepeat(10,10);
        while(continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym) /*on regarde quelle touche a appuyée */
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                        case SDLK_UP:
                            positionImage.y = positionImage.y -1;
                            break;
                        case SDLK_DOWN:
                            positionImage.y = positionImage.y +1;
                            break;
                        case SDLK_LEFT:
                            positionImage.x = positionImage.x -1;
                            break;
                        case SDLK_RIGHT:
                            positionImage.x = positionImage.x +1;
                            break;
                        default:
                            break;
                    }
                    break;
                case SDL_MOUSEBUTTONDOWN:
                    sourisDown = 1;
                    break;
                case SDL_MOUSEBUTTONUP:
                    sourisDown = 0;
                    break;
                default : break;
     
            }
     
            if (sourisDown)
            {
                positionImage.x = event.motion.x;
                positionImage.y = event.motion.y;
            }
     
            /* on efface l'ecran*/
            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
     
            /*On fait les SDL_BlitSurface nécessaires*/
            SDL_BlitSurface(zozor,NULL,ecran,&positionImage);
     
            /*On met l'affichage à jour*/
            SDL_Flip(ecran);
        }
    Je vais faire un tableau d'entier qui regroupera les flags pour toutes les touches du clavier et un autre pour les boutons de la souris.

    Merci encore

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    De rien, mais je ne vois plus SDL_MOUSEMOTION dans ton dernier code ...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 24
    Par défaut
    J'ai juste défini la nouvelle position de l'image à la position actuelle de la souris lorsqu'un bouton est enfoncé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (sourisDown)
            {
                positionImage.x = event.motion.x;
                positionImage.y = event.motion.y;
            }
    Je ne veux pas que l'image se déplace dès qu'un mouvement de la souris a lieu, mais bien qu'elle suive son mouvement lorsque je reste appuyé sur un de ses boutons.

    Il aurait été mieux d'intégrer la nouvelle position de l'image dans un cas SDL_MOUSEMOTION du switch ?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Citation Envoyé par gizmo2937 Voir le message
    Il aurait été mieux d'intégrer la nouvelle position de l'image dans un cas SDL_MOUSEMOTION du switch ?
    Oui, car en l'occurrence, ce sont bien les SDL_MOUSEMOTION qui font débloquer l'appel SDL_WaitEvent(), même si tu les traites pas toi-même. En outre, ça ne fonctionne que parce que la structure de l'événement contient toujours les champs motion.x et motion.y et que la lib a la gentillesse de te les remplir même lorsque l'événement reçu n'a rien à voir (ce qui reste à vérifier, d'ailleurs).

    Avec la X-Lib, tu ne pourrais pas l'écrire du tout et, dans le cas présent, un appui sur une touche ou tout autre événement trop lointain de la souris risque d'envoyer ton image n'importe où parce que les champs n'auront pas éte initialisés.

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

Discussions similaires

  1. Faire glisser une image
    Par zooffy dans le forum Silverlight
    Réponses: 4
    Dernier message: 30/04/2009, 16h56
  2. Faire clignoter une image avec la SDL?
    Par francoisd42 dans le forum SDL
    Réponses: 2
    Dernier message: 29/04/2009, 16h31
  3. Faire glisser une image dans un cadre avec la souris
    Par fab76000 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/11/2008, 12h38
  4. Faire glisser une image trop grande avec la souris
    Par avogadro dans le forum Général JavaScript
    Réponses: 25
    Dernier message: 28/07/2006, 16h50
  5. [MouseEntered] pb de localisation souris pour faire apparaitre une image
    Par sebpsi dans le forum Interfaces Graphiques en Java
    Réponses: 12
    Dernier message: 23/06/2006, 11h03

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