Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL / image et surface (gestion souris)

Sujet résolu
    5 mai 2006 à 9:34:56

    Bonjour,

    Cela fait un petit temps que je cherche a trouver comment gerer un clic de souris sur un surface/image.

    Par exemple, j'ai une image d'afficher à l'écran, si je clique sur celle-ci, elle est remplacée par une autre.

    merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      5 mai 2006 à 9:48:17

      un p'tit algorithme que tu traduira en C:

      les variables:
      position_image; (structure SDL_Rect contenant la position de l'image)
      coordonée; (structure pour stocker les coordonées de la souris à l'ecran)

      source:
      boucle d'evenement:
      si clic de souris alors:
      recupérer coordonnée du clic;

      si coordonnée.x >= position.x et coordonée.x <= position.x+taille_image_largeur et coordonnée.y >=position.y et coordonnée.y <=position.y+taille_image_hauteur alors
      //on chage l'image car on a cliqué sur image en cours
      fin si;
      fin si;
      fin boucle;

      fin code;


      voila tu n'as besoin que des cours de mateo popur faire ça

      • Partager sur Facebook
      • Partager sur Twitter
        5 mai 2006 à 9:48:40


        int on_surface(SDL_Surface *surf,SDL_Rect pos){
            switch(event.type){
                case SDL_MOUSEBUTTONDOWN :
                if(event.button.button == SDL_BUTTON_LEFT){
                    if(event.button.x >= pos.x && event.button.x <= (pos.x+surf->w) && event.button.y >= pos.y && event.button.y <= (pos.y+surf->h))
                        return 1;
                }
                break;
            }
            return 0;
        }

        J'ai pas testé mais ça doit marcher.

        Tu donnes à la fonction la surface, et sa position.
        ++

        EDIT : Bon, bah j'ai été grillé...
        Petites rectifications du code
        Mais j'ai fait le code tout seul :D
        • Partager sur Facebook
        • Partager sur Twitter
          5 mai 2006 à 13:27:50

          Merci, j ai fait ce que tu propose Binabik, ca marche nickel. Si maintenant je veux que ce soit une fois sur deux qu'il affiche une image et l autre fois qu'il affiche une autre image, comment compter les clics de la souris?

          • Partager sur Facebook
          • Partager sur Twitter
            5 mai 2006 à 13:34:36

            Citation : ficus

            Merci, j ai fait ce que tu propose Binabik, ca marche nickel. Si maintenant je vous que ce soit une fois sur deux qu'il affiche une image et l autre fois qu'il afiche une autre image, comment compter les clic de la souris?


            int nb_de_clicks; ?
            • Partager sur Facebook
            • Partager sur Twitter
              5 mai 2006 à 13:37:05

              problème resolu :D

              Mais j ai une nouvelle question, j ai prevu plusieurs surfaces avec plusieurs positions et pour les initialiser, je fais une boucle avec for

              puis plus loin dans le code, pour afficher les surfaces, je fais a nouveau une boucle:

              SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

                 for(i==1; i==9; i++)
                  {
                    cases[i] = IMG_Load("case_vide.png");
                    SDL_BlitSurface(cases[i], NULL, ecran, &position_cases[i]);
                  }
                 
                 SDL_Flip(ecran);


              mais rien ne s affiche...
              • Partager sur Facebook
              • Partager sur Twitter
                6 mai 2006 à 19:06:57

                Personne n a de solution?
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  6 mai 2006 à 22:14:59

                  for(i==1; i==9; i++)


                  Liste des erreurs:

                  • i == 1: Le signe == sert a savoir si une valeur correspond à une autre, pas a assigner une valeur a une variable. Il faudrait faire =.
                  • i == 9: Là, tu fais "tant que i est égal à 1", mais puisque i est initialisée à 1, la condition est fausse et la boucle ne sera jamais exécutée. Il faudrait faire i < 9, ce qui correspond à "tant que i est plus petit que 9".


                  Rectification du code:

                  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

                     for(i = 1; i < 9; i++)
                      {
                        cases[i] = IMG_Load("case_vide.png");
                        SDL_BlitSurface(cases[i], NULL, ecran, &position_cases[i]);
                      }
                     
                     SDL_Flip(ecran);


                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 mai 2006 à 23:03:03

                    Merci beaucoup pour la correction qu'en relisant je trouve avoir fait une faute stupide...
                    J ai juste mis i<10 a la place de 9 etant donné que mon but au depart etait d afficher jusqu a i=9
                    • Partager sur Facebook
                    • Partager sur Twitter

                    SDL / image et surface (gestion 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