Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Jeu de shoot

Probleme de blitage

Anonyme
    24 juillet 2006 à 16:08:50

    Bonjour bonjour ! Voila j'ai suivi ce que nous a montre mat dans son dernier cours, et j'me suis lance dans mon FPS (mouais on va l'appeler comme ca :D ) Baaaa evidemment fallait bien que ca plante hein ^^ Donc je sais pas pourquoi le Zozor veut pas s'afficher, et s'pas tres pratique pour lu tirer dessus :lol: Donc si quelqu'un pouvait me dire quel est le probleme dans mon code ce serait cool !

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <FMOD/fmod.h>
    #include <SDL/SDL_image.h>
    #include <time.h>


    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *viseur = NULL, *zozor = NULL;
        SDL_Event event;
        int continuer = 1;
        SDL_Rect position, positionZozor;
        FSOUND_SAMPLE *tir = NULL;
        long positionZozorX = 0, positionZozorY = 0;
        const long MAX = 600, MIN = 1;


        SDL_Init(SDL_INIT_VIDEO);
        FSOUND_Init(44100, 32, 0);

        SDL_ShowCursor(SDL_DISABLE);
        ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Jeu de shoot", NULL);
        viseur = IMG_Load("viseur.png");
        zozor = SDL_LoadBMP("zozor.bmp");
        SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

        tir = FSOUND_Sample_Load(FSOUND_FREE, "pan.wav", 0, 0, 0);

        srand(time(NULL));
        positionZozorX = (rand() % (MAX - MIN + 1)) + MIN;
        srand(time(NULL));
        positionZozorY = (rand() % (MAX - MIN + 1)) + MIN;

        SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);

        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                continuer = 0;
                break;
                case SDL_MOUSEBUTTONDOWN:
                FSOUND_PlaySound(FSOUND_FREE, tir);
                if(position.x == positionZozor.x && position.y == positionZozor.y)
                {
                    positionZozor.x = positionZozorX;
                    positionZozor.y = positionZozorY;
                }
                break;
                case SDL_MOUSEMOTION:
                position.x = event.motion.x - (viseur->w / 2);
                position.y = event.motion.y - (viseur->h / 2);
                break;
            }
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(viseur, NULL, ecran, &position);
            SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
            SDL_Flip(ecran);
        }

        FSOUND_Sample_Free(tir);
        FSOUND_Close();
        SDL_Quit();

        return EXIT_SUCCESS;
    }


    Merci d'avance et bonne journee a tous !

    PS : pour gerer le positionnement aleatoire de Zozor, j'ai eu l'idee d'utiliser la fonction de Mateo pour le jeu du plus ou moins...C'est peut etre ca qui fait planter. Vala, encore bonne journee ! Bye
    • Partager sur Facebook
    • Partager sur Twitter
      24 juillet 2006 à 19:46:05

      Salut ! Je veux bien essayer de t'aider, je ne suis pas un expert mais ce n'est pas du code compliqué ^^.

      srand(time(NULL));

      ne doit être appelé qu'une fois

      donc avant la boucle principale je mettrai plutot
      srand(time(NULL));
      positionZozor.x = (rand() % (MAX - MIN + 1)) + MIN;
      positionZozor.y = (rand() % (MAX - MIN + 1)) + MIN;

      pour que Zozor soit visible dès le début (pas besoin de blitter)

      ensuite
      positionZozorX = (rand() % (MAX - MIN + 1)) + MIN;
      positionZozorY = (rand() % (MAX - MIN + 1)) + MIN;

      après le switch et

      if(position.x == positionZozor.x && position.y == positionZozor.y)

      Pour que cela soit vrai, il faudrait que l'on tombe pile-poile sur le pixel supérieur gauche de Zozor, donc il te faut trouvé le moyen de savoir si le curseur est dans la surface Zozor.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        24 juillet 2006 à 20:49:37

        Merci ca m'aide deja pas mal mais c'est pas encore au point...Je m'explique : quand je clique sur Zozor, il change de position mais que dans la hauteur :-° Et puis des fois quand je clique sur Zozor rien ne se passe :( Voila le bout de code qui permet de modifier la position de Zozor :
        case SDL_MOUSEBUTTONDOWN:
                    FSOUND_PlaySound(FSOUND_FREE, tir);
                    if(position.x > positionZozor.x && position.x < positionZozor.x+84 && position.y > positionZozor.y && position.y < positionZozor.y+95)
                    {
                        srand(time(NULL));
                        positionZozor.x = (rand() % (MAX - MIN + 1)) + MIN;
                        positionZozor.y = (rand() % (MAX - MIN + 1)) + MIN;
                    }
                    break;


        J'explique le if(...) : mon image fait 84x95. J'ai donc defini que Zozor se deplace si le viseur est compris entre positionZozor.x et positionZozor + 84, qui represente la droite de l'image. J'ai fait pareil pour l'axe y. Meme avec ca, ca ne marche pas tout a fait...Mais quel est le probleme ?
        • Partager sur Facebook
        • Partager sur Twitter
          24 juillet 2006 à 21:28:23

          ... Enleve srand(time(NULL)); , il ne doit y être qu'une seule fois !!

          Ensuite c'est normal que ça ne marche pas bien, tu as centré le curseur au milieu de ton viseur, alors il faut faire la condition avec la position du curseur, et non avec les coordonées de l'image de ton viseur !


          Voilà comment je modifierai ton code :

          #include <stdlib.h>
          #include <stdio.h>
          #include <SDL/SDL.h>
          #include <FMOD/fmod.h>
          #include <SDL/SDL_image.h>
          #include <time.h>


          int main(int argc, char *argv[])
          {
              SDL_Surface *ecran = NULL, *viseur = NULL, *zozor = NULL;
              SDL_Event event;
              int continuer = 1;
              SDL_Rect position, positionZozor;
              FSOUND_SAMPLE *tir = NULL;
              long positionZozorX = 0, positionZozorY = 0;
              const long MAX = 600, MIN = 1;


              SDL_Init(SDL_INIT_VIDEO);
              FSOUND_Init(44100, 32, 0);

              SDL_ShowCursor(SDL_DISABLE);
              ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
              SDL_WM_SetCaption("Jeu de shoot", NULL);
              viseur = IMG_Load("viseur.png");
              zozor = SDL_LoadBMP("zozor.bmp");
              SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

              tir = FSOUND_Sample_Load(FSOUND_FREE, "pan.wav", 0, 0, 0);

              srand(time(NULL));

              positionZozor.x = (rand() % (MAX - MIN + 1)) + MIN;
              positionZozor.y = (rand() % (MAX - MIN + 1)) + MIN;


              while (continuer)
              {
                  SDL_WaitEvent(&event);
                  switch(event.type)
                  {
                      case SDL_QUIT:
                      continuer = 0;
                      break;
                      case SDL_MOUSEBUTTONDOWN:
                      FSOUND_PlaySound(FSOUND_FREE, tir);
                      if(event.motion.x > positionZozor.x && event.motion.x < positionZozor.x+84 && event.motion.y > positionZozor.y && event.motion.y < positionZozor.y+95)
                      {
                          positionZozor.x =  positionZozorX;
                          positionZozor.y = positionZozorY;
                      }

                      break;
                      case SDL_MOUSEMOTION:
                      position.x = event.motion.x - (viseur->w / 2);
                      position.y = event.motion.y - (viseur->h / 2);
                      break;
                  }

                      positionZozorX = (rand() % (MAX - MIN + 1)) + MIN;
                      positionZozorY = (rand() % (MAX - MIN + 1)) + MIN;
                  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                  SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
                  SDL_BlitSurface(viseur, NULL, ecran, &position);
                  SDL_Flip(ecran);
              }

              FSOUND_Sample_Free(tir);
              FSOUND_Close();
              SDL_Quit();

              return EXIT_SUCCESS;
          }


          Remarque : j'ai blitter zozor avant le viseur, comme ça le viseur passera par dessus zozor.

          Remarque 2 : enlève la hauteur de zozor à MAX, comme ça il ne descendra pas sous l'écran, et même mieux, positionZozor.y sera au maximum à 600(hauteur max de la fenêtre), alors que la largeur maximum de la fenêtre est 800. Tu pourrai créer un MAX_X = 800 - 84(largeur de zozor) et un MAX_Y = 600 - 95(hauteur de zozor). Nan le mieux c'est de remplacer MAX dans les rand pour les X par ecran->w et MAX par ecran->h pour les rand Y

          positionZozorX = (rand() % (ecran->w - MIN + 1)) + MIN;
          positionZozorY = (rand() % (ecran->h - MIN + 1)) + MIN;

          Pis, si MIN = 1, on pourrai écrire (rand() % (ecran->h))

          Je sais que ce n'est que des exos pour s'entrainer, Mais lors d'un vrai jeu il faut y penser ;)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            24 juillet 2006 à 23:39:57

            Merci beaucoup ca marche enfin ! J'ai encore simplifie le code, j'ai carement enleve le positionZozorX et positionZozorY, ils ne servaient a rien ^^ Vala le code final :
            #include <stdlib.h>
            #include <stdio.h>
            #include <SDL/SDL.h>
            #include <FMOD/fmod.h>
            #include <SDL/SDL_image.h>
            #include <time.h>


            int main(int argc, char *argv[])
            {
                SDL_Surface *ecran = NULL, *viseur = NULL, *zozor = NULL;
                SDL_Event event;
                int continuer = 1;
                SDL_Rect position, positionZozor;
                FSOUND_SAMPLE *tir = NULL;


                SDL_Init(SDL_INIT_VIDEO);
                FSOUND_Init(44100, 32, 0);

                SDL_ShowCursor(SDL_DISABLE);
                ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
                SDL_WM_SetCaption("Jeu de shoot", NULL);
                viseur = IMG_Load("viseur.png");
                zozor = SDL_LoadBMP("zozor.bmp");
                SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

                tir = FSOUND_Sample_Load(FSOUND_FREE, "pan.wav", 0, 0, 0);

                srand(time(NULL));
                positionZozor.x = (rand() % (ecran->w - 84));
                positionZozor.y = (rand() % (ecran->h - 95));

                while (continuer)
                {
                    SDL_WaitEvent(&event);
                    switch(event.type)
                    {
                        case SDL_QUIT:
                        continuer = 0;
                        break;
                        case SDL_MOUSEBUTTONDOWN:
                        FSOUND_PlaySound(FSOUND_FREE, tir);
                        if(position.x > positionZozor.x && position.x < positionZozor.x+84 && position.y > positionZozor.y && position.y < positionZozor.y+95)
                        {
                            positionZozor.x = (rand() % (ecran->w - 84));
                            positionZozor.y = (rand() % (ecran->h - 95));
                        }
                        break;
                        case SDL_MOUSEMOTION:
                        position.x = event.motion.x - (viseur->w / 2);
                        position.y = event.motion.y - (viseur->h / 2);
                        break;
                    }
                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                    SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
                    SDL_BlitSurface(viseur, NULL, ecran, &position);
                    SDL_Flip(ecran);
                }

                FSOUND_Sample_Free(tir);
                FSOUND_Close();
                SDL_Quit();

                return EXIT_SUCCESS;
            }
            Maintenant j'vais essayer de faire apparaitre les cibles au bout de temps de temps et les faire disparaitre au bout de temps de temps...ca devrait pas etre dur :) J'vais aussi essayer de faire un systeme de point en faisant nombre de balles/nombre de tues. Vala vala, vais m'y mettre. Encore merci !
            • Partager sur Facebook
            • Partager sur Twitter
              24 juillet 2006 à 23:49:35

              Eh bien bonne chance, présente nous ton jeu quand tu l'auras fini ;)
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                25 juillet 2006 à 0:11:07

                Merci beaucoup et compte sur moi pour le presenter ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  25 juillet 2006 à 2:30:08

                  Oui oui j'aimerai bien voir ton mini jeu quand il sera finit ! Moi même j'ai l'idée d'en faire un, mais il n'est que dans la tête pour l'instant ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    25 juillet 2006 à 16:50:40

                    J'ai a nouveau un probleme...J'aimerais pouvoir faire un decompte qui s'active une fois que j'ai appuye sur "e", touche qui lance le jeu et la musique. Le seul probleme c'est que pour faire un decompte il ne faut plus du WaitEvent mais du PollEvent...J'ai donc fait 2 whiles un avec Poll et l'autre avec Wait. Il me lance l'exe mais j'ai beau appuyer sur "e", rien ne se passe...Je lance mon code, je sais qu'il est dur a comprendre (je ne sais pas vraiment comment presenter mon code mais il est automatiquement indenté par code::blocks).

                    #include <stdlib.h>
                    #include <stdio.h>
                    #include <SDL/SDL.h>
                    #include <FMOD/fmod.h>
                    #include <SDL/SDL_image.h>
                    #include <time.h>
                    #include <SDL/SDL_ttf.h>


                    int main(int argc, char *argv[])
                    {
                        SDL_Surface *ecran = NULL, *viseur = NULL, *zozor = NULL, *intro = NULL, *texte = NULL;
                        SDL_Event event;
                        int continuer = 1;
                        SDL_Rect position, positionZozor, positionIntro, positionTemps;
                        FSOUND_SAMPLE *tir = NULL;
                        FSOUND_STREAM *musique = NULL;
                        TTF_Font *police = NULL;
                        long blit = 1, demarrage = 1, shoot = 0, decompte = 0;
                        SDL_Color couleurNoire = {0, 0, 0}, couleurBlanche = {255, 255, 255};
                        int tempsActuel = 0, tempsPrecedent = 0, compteur = 0;
                        char temps[20] = "";


                        SDL_Init(SDL_INIT_VIDEO);
                        FSOUND_Init(44100, 32, 0);
                        TTF_Init();

                        SDL_ShowCursor(SDL_DISABLE);
                        ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
                        SDL_WM_SetCaption("Jeu de shoot", NULL);
                        viseur = IMG_Load("viseur.png");
                        zozor = SDL_LoadBMP("zozor.bmp");
                        SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));
                        intro = IMG_Load("intro.JPG");

                        tir = FSOUND_Sample_Load(FSOUND_FREE, "pan.wav", 0, 0, 0);
                        musique = FSOUND_Stream_Open("fond.wma", 0, 0, 0);
                        police = TTF_OpenFont("angelina.ttf", 65);

                        positionIntro.x = 0;
                        positionIntro.y = 0;
                        SDL_BlitSurface(intro, NULL, ecran, &positionIntro);

                        tempsActuel = SDL_GetTicks();
                        sprintf(temps, "Temps : %d", compteur);
                        texte = TTF_RenderText_Shaded(police, temps, couleurNoire, couleurBlanche);


                       while (continuer)
                        {
                            SDL_PollEvent(&event);
                            switch(event.type)
                            {
                                case SDL_QUIT:
                                continuer = 0;
                                break;
                            }

                            if(decompte)
                            {
                                tempsActuel = SDL_GetTicks();
                            if (tempsActuel - tempsPrecedent >= 1000)
                            {
                                compteur += 1000;
                                sprintf(temps, "Temps : %d", compteur);
                                SDL_FreeSurface(texte);
                                texte = TTF_RenderText_Shaded(police, temps, couleurNoire, couleurBlanche);
                                tempsPrecedent = tempsActuel;
                            }
                            else
                            {
                                SDL_Delay(1000 - (tempsActuel - tempsPrecedent));
                            }

                            positionTemps.x = 750;
                            positionTemps.y = 0;
                            SDL_BlitSurface(texte, NULL, ecran, &positionTemps);
                            }

                        }

                        while (continuer)
                        {
                            SDL_WaitEvent(&event);
                            switch(event.type)
                            {
                                case SDL_QUIT:
                                continuer = 0;
                                break;
                                case SDL_MOUSEMOTION:
                                position.x = event.motion.x - (viseur->w / 2);
                                position.y = event.motion.y - (viseur->h / 2);
                                break;
                                case SDL_KEYDOWN:
                                if (event.key.keysym.sym == SDLK_e)
                                {
                                    FSOUND_Stream_Play(FSOUND_FREE, musique);
                                    blit = 0;
                                    shoot = 1;
                                    decompte = 1;
                                    if(demarrage)
                                    {
                                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                                srand(time(NULL));
                                positionZozor.x = (rand() % (ecran->w - 84));
                                positionZozor.y = (rand() % (ecran->h - 95));
                                    SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
                                    SDL_BlitSurface(viseur, NULL, ecran, &position);
                                    SDL_Flip(ecran);
                                    }
                                    demarrage = 0;
                                }
                                break;
                                case SDL_MOUSEBUTTONDOWN:
                                if (shoot)
                                {
                                    FSOUND_PlaySound(FSOUND_FREE, tir);
                                }
                                if(position.x > positionZozor.x && position.x < positionZozor.x+84 && position.y > positionZozor.y && position.y < positionZozor.y+95)
                                        {
                                            positionZozor.x = (rand() % (ecran->w - 84));
                                            positionZozor.y = (rand() % (ecran->h - 95));
                                        }
                                        break;

                                }

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

                            if(blit)
                            {
                                SDL_BlitSurface(intro, NULL, ecran, &positionIntro);
                            }
                            SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
                            SDL_BlitSurface(viseur, NULL, ecran, &position);
                            SDL_Flip(ecran);
                        }

                        TTF_CloseFont(police);
                        TTF_Quit();

                        SDL_FreeSurface(texte);
                        FSOUND_Stream_Close(musique);
                        FSOUND_Sample_Free(tir);
                        FSOUND_Close();
                        SDL_Quit();

                        return EXIT_SUCCESS;
                    }



                    Voila voila si quelqu'un trouve l'erreur qu'il me la donne queje termine mon jeu ^^ Bye et bonne aprem'
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [SDL] Jeu de shoot

                    × 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