Forum Clubic

Pb avec la gestion des evenement en c/c++ et SDL

Bonjour,

Voici un petit exercice qui me permet d’apprendre le languageC/C++.
Il s’agit de faire apparaitre une dizaine de fois maximum un petit personnage quand on cliquesur la souris. Je sais que cela n’a aucun interet mais je ne suis qu’en train d’apprendre ce langage. Le soucis c’est qu’au 2e clic, j’ai 2 image qui apparaissent au lieu d’une seule. Pourquoi ?

Voici mon code, pouvez vous me dire ou est situé l’erreur. Merci

#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;
}

Peux tu préciser qu’il s’agit de la SDL dans le titre de ton topic?

On reconnait tout de suite un tuto sur la SDL qui vient du site du zero :lol:


#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

/* Load an image from a file */
SDL_Surface *IMG_Load(const char *file)
{
    SDL_RWops *src = SDL_RWFromFile(file, "rb");
    char *ext = strrchr(file, '.');
    if(ext) {
        ext++;
    }
    if(!src) {
        /* The error message has been set in SDL_RWFromFile */
        return NULL;
    }
    return IMG_LoadTyped_RW(src, 1, ext);
}

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 = -500;
       positionZozor[pos].y = -500;
   }

   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
                   {
                       if ((positionZozor[pos].x != -500) && (positionZozor[pos].y != -500))
                        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 0;
}

Nesquik69>c’est quoi l’intérêt de ta réponse ? :heink: