Partage
  • Partager sur Facebook
  • Partager sur Twitter

pb avec le gestion des evenements

    7 mai 2006 à 13:46:17

    Bonjour,

    Dans le cours sur la gestion des événements, à la fin, un exercice propose d'afficher un zozor à chaque clic de souris et ce avec un maximum de 10 zozor.

    J'y suis presque arrivé mais au 2e clic de souris et uniquement au 2e, un zozor apparait en haut à gauche en plus de celui qui devait apparaitre normalement (du au clic de souris). Mais je n'arrive pas à voir où est mon erreur. Pourriez-vous m'aider.

    Merci.

    Voici le code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *zozor = NULL;
        SDL_Rect positionZozor[10];
        int continuer = 1, nbZozor = 0, pos = 0;
        SDL_Event event;


        SDL_Init(SDL_INIT_VIDEO);

        SDL_WM_SetIcon(IMG_Load("sdl_icone.bmp"), NULL);
        ecran = SDL_SetVideoMode(900, 800, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Exercice SDL", NULL);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));

        zozor = IMG_Load("zozor.bmp");
        SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

        for(pos=0; pos<10; pos++)//toutes les positions de tous les zozor sont mises a -100 pour ne pas les voir
        {
            positionZozor[pos].x = -100;
            positionZozor[pos].y = -100;
        }

        while(continuer)//debut de la boucle des evenements
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                break;

                case SDL_MOUSEBUTTONDOWN:

                    if (nbZozor<10)//on n'affiche que 10 zozor
                    {
                        positionZozor[nbZozor].x = event.button.x;// on recupere la position de la souris que l'on met dans le position de zozor
                        positionZozor[nbZozor].y = event.button.y;

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

                        for(pos=0; pos<10; pos++)//on affiche les 10 derniers zozor
                        {
                            SDL_BlitSurface(zozor, NULL, ecran, &positionZozor[pos]);
                        }
                        nbZozor++;//on passe au zozor suivant
                    }
                    else
                    {
                       nbZozor = 0;
                    }
                break;

                case SDL_KEYDOWN:
                    switch (event.key.keysym.sym)
                    {
                        case SDLK_DELETE:
                             for(pos=0; pos<10; pos++)
                             {
                                 positionZozor[pos].x = -100;
                                 positionZozor[pos].y = -100;
                             }
                             SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                        break;
                    }
                break;

            }

        SDL_Flip(ecran);
        }

        SDL_FreeSurface(zozor);
        SDL_Quit();
        return EXIT_SUCCESS;
    }
    • Partager sur Facebook
    • Partager sur Twitter
      7 mai 2006 à 17:04:34

      la balise code, tu connais :-° ?
      #include <stdio.h>
      #include <stdlib.h>
      #include <SDL/SDL.h>
      #include <SDL/SDL_image.h>

      int main(int argc, char *argv[])
      {
      SDL_Surface *ecran = NULL, *zozor = NULL;
      SDL_Rect positionZozor[10];
      int continuer = 1, nbZozor = 0, pos = 0;
      SDL_Event event;


      SDL_Init(SDL_INIT_VIDEO);

      SDL_WM_SetIcon(IMG_Load("sdl_icone.bmp"), NULL);
      ecran = SDL_SetVideoMode(900, 800, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
      SDL_WM_SetCaption("Exercice SDL", NULL);
      SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));

      zozor = IMG_Load("zozor.bmp");
      SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

      for(pos=0; pos<10; pos++)//toutes les positions de tous les zozor sont mises a -100 pour ne pas les voir
      {
      positionZozor[pos].x = -100;
      positionZozor[pos].y = -100;
      }

      while(continuer)//debut de la boucle des evenements
      {
      SDL_WaitEvent(&event);
      switch(event.type)
      {
      case SDL_QUIT:
      continuer = 0;
      break;

      case SDL_MOUSEBUTTONDOWN:

      if (nbZozor<10)//on n'affiche que 10 zozor
      {
      positionZozor[nbZozor].x = event.button.x;// on recupere la position de la souris que l'on met dans le position de zozor
      positionZozor[nbZozor].y = event.button.y;

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

      for(pos=0; pos<10; pos++)//on affiche les 10 derniers zozor
      {
      SDL_BlitSurface(zozor, NULL, ecran, &positionZozor[pos]);
      }
      nbZozor++;//on passe au zozor suivant
      }
      else
      {
      nbZozor = 0;
      }
      break;

      case SDL_KEYDOWN:
      switch (event.key.keysym.sym)
      {
      case SDLK_DELETE:
      for(pos=0; pos<10; pos++)
      {
      positionZozor[pos].x = -100;
      positionZozor[pos].y = -100;
      }
      SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
      break;
      }
      break;

      }

      SDL_Flip(ecran);
      }

      SDL_FreeSurface(zozor);
      SDL_Quit();
      return EXIT_SUCCESS;
      }
      • Partager sur Facebook
      • Partager sur Twitter
        7 mai 2006 à 17:09:53

        ainsi que la touche tabulation ca peut aider...
        • Partager sur Facebook
        • Partager sur Twitter
          7 mai 2006 à 17:12:28

          Merci d'utiliser la balise "code" pour mettre en forme les codes, comme expliqué dans ce post-it :
          http://www.siteduzero.com/forum-83-6661-regles-de-ce-forum.html

          Cela aura pour effet de "colorer" votre code et donc d'en faciliter grandement la lecture. Vous aurez ainsi beaucoup plus de chances d'avoir des réponses.

          Voici un exemple de code non coloré avec la balise "citation" (mauvais exemple) :

          Citation : Pas de titre

          int main(int argc, char *argv[])
          {
          long choixOperation;

          printf("Choisissez l'operation a effectuer \n\n");
          /* etc. */
          }



          Voici maintenant le même code coloré, si vous aviez utilisé la balise "code" (bon exemple) :

          int main(int argc, char *argv[])
          {
              long choixOperation;

              printf("Choisissez l'operation a effectuer \n\n");
              /* etc. */
          }


          C'est plus clair n'est-ce pas ? :)
          N'hésitez pas à éditer votre message pour changer la balise afin de colorer votre code.


          [Ceci est une réponse semi-automatique]
          • Partager sur Facebook
          • Partager sur Twitter

          If you'd like to join us, read "How do we work at OpenClassrooms"! :)

            8 mai 2006 à 10:44:35

            Désolé d'avoir oublié la balise CODE, c'est vrai que c'est beaucoup mieux, je suis impardonnable. Vous voulez bien m'aider quand même :(
            • Partager sur Facebook
            • Partager sur Twitter

            pb avec le gestion des evenements

            × 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