Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL]Les évènements de la souris

Sujet résolu
    27 mai 2006 à 13:25:28

    Bonjour à tous.
    Bon n'ayant pas trouvé la réponse à mon problème je poste ce message pour espérer en avoir une.

    Je suis actuellement en train de faire le cours de C/C++ de M@teo et comme vous l'aurez deviné j'en suis aux évènements de la souris, et bien sur j'ai un soucis(sinon je serai pas là :p ).

    Alors en fait le truc c'est que rien ne se passe lorsque je clique avec ma souris.J'ai pourtant le même code que dans le cours et rien n'y fait.

    Voilà mon code, au cas ou j'ai une erreur et que je ne m'en sois pas aperçu on sait jamais:
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *zozor = NULL;
        SDL_Event event; /* Cette variable servira plus tard à gérer les évènements */
        SDL_Rect positionZozor;
            int continuer = 1;

        if (SDL_Init(SDL_INIT_VIDEO) == -1)
        {
            fprintf(stderr, "Erreur d'initialisation de la SDL");
            exit(EXIT_FAILURE);
        }

        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        if (ecran == NULL) // Si l'ouverture a échoué, on écrit l'erreur et on arrête
        {
            fprintf(stderr, "Impossible de charger le mode vidéo : %s\nq", SDL_GetError());
            exit(EXIT_FAILURE);
        }
        SDL_WM_SetCaption("Faire bouger Zozor", NULL);

            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 149, 49, 38));
            zozor =  SDL_LoadBMP("zozor.bmp");
            SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));// On rend le bleu derrière Zozor transparent

            //On centre zozor à l'écran
            positionZozor.x = ecran->w / 2 - zozor->w / 2;
            positionZozor.y = ecran->h / 2 - zozor->h / 2;

            SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);//On affiche Zozor à l'écran

            SDL_Flip(ecran); //Mise à jour de l'écran avec sa nouvelle couleur

            SDL_EnableKeyRepeat(10, 10);//Pour la répétition des touches quand on reste appuyé dessus
            while (continuer) //TANT QUE la variable ne vaut pas 0
        {
            SDL_WaitEvent(&event); //On attend un évènement qu'on récupère dans event
            switch(event.type) //On teste le type d'évènement
            {
                case SDL_QUIT: //Si c'est un évènement QUITTER
                    continuer = 0; //On met le booléen à 0, donc la boucle va s'arrêter
                    break;
                            case SDL_KEYDOWN:
                                    switch (event.key.keysym.sym)
                                    {
                                            case SDLK_ESCAPE: //Appui sur la touche Echap, on arrête le programme
                                                    continuer = 0;
                                                    break;
                                            case SDLK_UP: // Flèche haut
                                                    positionZozor.y -= 5;
                                                    break;
                                            case SDLK_DOWN: // Flèche bas
                                                    positionZozor.y += 5;
                                                    break;
                                            case SDLK_RIGHT: // Flèche droite
                                                    positionZozor.x += 5;
                                                    break;
                                            case SDLK_LEFT: // Flèche gauche
                                                    positionZozor.x -= 5;
                                                    break;
                                            case SDL_MOUSEBUTTONUP:
                                                    if (event.button.button == SDL_BUTTON_RIGHT) //On arrête le programme si on a fait un clic droit
                                                            continuer = 0;
                                                    if (event.button.button == SDL_BUTTON_LEFT) //On arrête le programme si on a fait un clic droit
                                                            continuer = 0;
                                                    if (event.button.button == SDL_BUTTON_MIDDLE) //On arrête le programme si on a fait un clic droit
                                                            continuer = 0;
                                                    if (event.button.button == SDL_BUTTON_WHEELUP) //On arrête le programme si on a fait un clic droit
                                                            continuer = 0;
                                                    if (event.button.button == SDL_BUTTON_WHEELDOWN) //On arrête le programme si on a fait un clic droit
                                                            continuer = 0;
                                                    break;
                                    }
                                    break;

            }
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 149, 49, 38)); //On efface l'écran (ici fond blanc)
                    //On fait tous les SDL_BlitSurface nécessaires pour coller les surfaces à l'écran
                    SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);//On affiche Zozor à l'écran
                    SDL_Flip(ecran); //On met à jour l'affichage
        }
            SDL_FreeSurface(zozor);
        SDL_Quit();

        return EXIT_SUCCESS;
    }


    Pour informations, ça peut peut-être aider, j'ai une MX1000 comme souris et j'utilise le driver de Logitech avec.
    • Partager sur Facebook
    • Partager sur Twitter
      27 mai 2006 à 13:54:33

      Bonjour
      SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);//On affiche Zozor à l'écran

      Tu blitte la surface avant de faire les changements nécéssaires
      positionZozor.x = ecran->w / 2 - zozor->w / 2;
              positionZozor.y = ecran->h / 2 - zozor->h / 2;

      Tu crois pas que ca devrais être ca:
      positionZozor.x =(ecran->w / 2) - (zozor->w / 2);
              positionZozor.y = (ecran->h / 2) - (zozor->h / 2);

      • Partager sur Facebook
      • Partager sur Twitter
        27 mai 2006 à 13:59:54

                      case SDL_KEYDOWN:
                                        switch (event.key.keysym.sym)
                                        {
                                                case SDLK_ESCAPE:
                                                        continuer = 0;
                                                        break;
                                                case SDLK_UP: // Flèche haut
                                                        positionZozor.y -= 5;
                                                        break;
                                                case SDLK_DOWN: // Flèche bas
                                                        positionZozor.y += 5;
                                                        break;
                                                case SDLK_RIGHT: // Flèche droite
                                                        positionZozor.x += 5;
                                                        break;
                                                case SDLK_LEFT: // Flèche gauche
                                                        positionZozor.x -= 5;
                                                        break;
                                                  }
                          break;

                          case SDL_MOUSEBUTTONUP:
                                ................ 

        j'ai repris ton code, en modifiant "les cases".

        le cours:
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_MOUSEBUTTONUP:
                if (event.button.button == SDL_BUTTON_RIGHT) /* On arrête le programme si on a fait un clic droit */
                    continuer = 0;
                break;
        }



        tu n'a pas la meme chose que dans le cours... d'ou le probleme :)
        • Partager sur Facebook
        • Partager sur Twitter
          27 mai 2006 à 14:36:46

          Oulalalala mais quel boulet je fais des fois, j'ai mis le code pour les évènements de la souris dans le sqitch pour les évènements des touches.

          Bon je te remercie C@rn@GE59 de m'avoir montré ma faute, ça m'apprendra.

          Sinon oussama1305 je comprends pas trop ta remarque sachant que je fais ça:

          //On centre zozor à l'écran
          positionZozor.x = ecran->w / 2 - zozor->w / 2;
          positionZozor.y = ecran->h / 2 - zozor->h / 2;

          SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);//On affiche Zozor à l'écran


          Donc dans l'ordre quoi.
          • Partager sur Facebook
          • Partager sur Twitter

          [SDL]Les évènements de la souris

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown