Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Bug lors d'un simple prog

J'ai beau chercher...

Sujet résolu
    14 mai 2006 à 18:20:42

    Hello !
    Voila, l'envie me vient de coder un Snake, et dès les premieres lignes de code, ça foire déjà :o

    Je fais appelle à vous :

    CONSTANTES.H :
    int jeu (SDL_Surface* ecran);

    #define TAILLE_BLOC 20 /* LARGEUR ET HAUTEUR */
    #define NB_BLOC_LARGEUR 20
    #define NB_BLOC_HAUTEUR 20
    #define LARGEUR_ECRAN (TAILLE_BLOC * NB_BLOC_LARGEUR)
    #define HAUTEUR_ECRAN (TAILLE_BLOC * NB_BLOC_HAUTEUR)

    enum {HAUT, BAS, GAUCHE, DROITE};
    enum {CORPS, QUEUE, TETE};

    #include <SDL/SDL.h>


    MAIN.C :


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

    #include "constantes.h"


    int main(int argc, char *argv[])
    {
        SDL_Surface* ecran = NULL, *fond = NULL;
        SDL_Rect Pfond;
        SDL_Event event;
        int continuer = 1, gagner = 0;
       
        if (SDL_Init (SDL_INIT_VIDEO) == -1)
        {
               exit (EXIT_FAILURE);
        }

       SDL_WM_SetCaption ("Snake", NULL);
       ecran = SDL_SetVideoMode (LARGEUR_ECRAN,HAUTEUR_ECRAN,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
       fond = SDL_LoadBMP("Menu.bmp");
       Pfond.x = 0;
       Pfond.y = 0;
       
     
       while (continuer)
       {
            SDL_WaitEvent (&event);
           
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                   
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_KP1 :
                            gagner = jeu(ecran);
                            continuer = 1;
                            break;
                           
                        case SDLK_KP2 :
                            /* Option */
                            break;
                           
                        case SDLK_KP3 :
                            /* Instruction */
                            break;
                           
                       case SDLK_KP4 :
                            continuer = 0;
                            break;
                    }
                    break;
            }
           
         
           
       SDL_FillRect (ecran, NULL, SDL_MapRGB (ecran -> format,255,255,255))
       SDL_BlitSurface (fond, NULL, ecran, &Pfond);
       SDL_Flip(ecran);     
      } 
        SDL_FreeSurface(fond);
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }


    JEU.C :

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

    #include "constantes.h"

    int jeu (SDL_Surface* ecran)
    {
        int gagner = 0;
        int tailleSerpent = 5, continuer = 1;
       
        SDL_Surface* serpent[400], *mur;
        SDL_Rect Pmur, Pserpent[400];
        SDL_Event event;
       
       /* DEFINITIONS VARIABLES */
       
        for (int i = 0; i < tailleSerpent; i++) /* On créer des carrés verts (= corps serpent) */
        {
         serpent[i] = SDL_CreateRGBSurface (SDL_HWSURFACE, TAILLE_BLOC, TAILLE_BLOC, 32, 0, 0, 0, 0);
         SDL_FillRect (serpent[i], NULL, SDL_MapRGB (ecran -> format,0,255,0));
        }
        SDL_FillRect (serpent[tailleSerpent - 1], NULL, SDL_MapRGB (ecran -> format,255,0,0)); /* Tête serpent en rouge */

       /* POSITION INITIALE (sera sans doute remplacer par une     fonction "charger niveau" )*/
       
        Pserpent[0].x = 20;
        Pserpent[0].y = 20;
       
        for (int i = 1; i < tailleSerpent; i++)
        {
           Pserpent[i].x = Pserpent[i--].x + TAILLE_BLOC; // On ajoute TAILLE_BLOC au dernier carré du serpent
           Pserpent[i].y = TAILLE_BLOC;
        }
       
               
        /* JEU */
       
         while (continuer)
       {
            SDL_WaitEvent (&event);
           
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
            }
           
            SDL_FillRect (ecran, NULL, SDL_MapRGB (ecran -> format, 255,255,255));
            for (int i = 0; i < tailleSerpent; i++)
            {
               SDL_BlitSurface (serpent[i], NULL, ecran, &Pserpent[i]);
            }
            SDL_Flip (ecran);
      }
     
     
      SDL_FreeSurface (mur);
      for (int i = 0; i < 400; i++)
      {
           SDL_FreeSurface (serpent[i]);
      }

        return gagner;
    }


    Le problème vient surement de la fonction jeu. Quand on veut jouer, il ne répond plus et bug si on veut le fermer ("Ce programme ne répond pas..." ou "Snake.exe a rencontré un problème et doit fermer...").

    Heelp !
    • Partager sur Facebook
    • Partager sur Twitter
      14 mai 2006 à 18:50:19

      C'st surement du a une boucle infinie.
      Je vais me pencher sur ton code si j'ai le temps.
      +!NiCo!
      • Partager sur Facebook
      • Partager sur Twitter
        14 mai 2006 à 19:04:26

        essaie d'utiliser une seule surface que tu blittes plusieurs fois au lieu de creer 400 surfaces deja

        je regarde le code
        • Partager sur Facebook
        • Partager sur Twitter
          14 mai 2006 à 19:04:56

          A la programmation, que de bugs et que de prises de tete :s
          Enfin, bonne chance a toi.
          • Partager sur Facebook
          • Partager sur Twitter
            14 mai 2006 à 19:06:48

            Pserpent[i].x = Pserpent[i--].x + TAILLE_BLOC; // On ajoute TAILLE_BLOC au dernier carré du serpent
            Pserpent[i].y = TAILLE_BLOC;

            Tu voulais sans doute mettre i-1 et non i--. Ici, la variable est incrémentée puis décrémentée, ce qui fait que la boucle ne se termine jamais.

            De rien !
            • Partager sur Facebook
            • Partager sur Twitter
              14 mai 2006 à 19:08:25

              Runtime -> t'as pas honte de poster pour dire ca?

              Sinon, j'ai trouvé la source de ton probleme.
              Dans jeu.c tu as :
              for (int i = 1; i < tailleSerpent; i++)
                  {
                     Pserpent[i].x = Pserpent[i--].x + TAILLE_BLOC; // On ajoute TAILLE_BLOC au dernier carré du serpent
                     Pserpent[i].y = TAILLE_BLOC;
                  }


              -> Pserpent[i--].x
              i-- ne renvoie pas la valeur de i-1 mais decremente la variable i.
              or ton for est basé sur l'incrementation de i. Du coup i reste a la meme valeur et ta boucle est infinie.

              Remplace par :
              for (int i = 1; i < tailleSerpent; i++)
                  {
                     Pserpent[i].x = Pserpent[i-1].x + TAILLE_BLOC; // On ajoute TAILLE_BLOC au dernier carré du serpent
                     Pserpent[i].y = TAILLE_BLOC;
                  }


              Voilou ;)
              +!NiCo!

              EDIT : Ah bah remram44 a repondu pendant que je tapais mon message.
              • Partager sur Facebook
              • Partager sur Twitter
                14 mai 2006 à 19:34:34

                Ha merci, je savais pas du tout !

                Merci beaucoup. :):)
                • Partager sur Facebook
                • Partager sur Twitter

                [SDL] Bug lors d'un simple prog

                × 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