Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un while qui se répète jamais ??? o_O

même avec un while(1)

Sujet résolu
    23 mai 2006 à 18:09:50

    Voilà, j'ai un ptit jeu que je code pour l'anniv de mon père.
    A la manière du Sokoban de matéo, j'ai une fonction main avec initiation SDL, qui lance une fonction jouer() située dans un autre fichier(jeu.c).
    Le problème, c'est que la boucle principale SDL du jeu.c ne ... boucle jamais !!! o_O

    Même avec un while(1), la boucle ne se fait pas ... J'ai débuggué avec codeblocks en mettant un breakpoint dans la boucle, et un juste après, et bien en effet, ca ne boucle pas ...

    main.c

    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include "jeu.h"

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *fond = NULL, *texte = NULL, *texte2 = NULL;
        TTF_Font *police = NULL, *police2 = NULL;
        SDL_Rect positionTexte, positionTexte2;
        SDL_Color couleurBleu = {21, 24, 123}, couleurBlanche = {255, 255, 255};
        SDL_Event event;
        int continuer = 1;

        // ************************* Initialisation SDL *************************

        SDL_Init(SDL_INIT_VIDEO);
        TTF_Init();

        //SDL_WM_SetIcon(IMG_Load("icone.bmp"), NULL);

        ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE);

        atexit(SDL_Quit);

        SDL_WM_SetCaption("Catch-It!", NULL);

        //************************** Actions SDL préliminaires ****************

        fond = IMG_Load("fond.jpg");
        police = TTF_OpenFont("black_boys.ttf", 100);
        texte = TTF_RenderText_Blended(police, "Catch-It, DaD !", couleurBleu);
        positionTexte.x = (800 - texte->w)/2;
        positionTexte.y = (600 - texte->h)/2 - 200;
        positionTexte.w = texte->w;
        positionTexte.h = texte->w;

        police2 = TTF_OpenFont("black_boys.ttf", 60);
        texte2 = TTF_RenderText_Blended(police2, "Pressez Entrer pour jouer", couleurBlanche);
        positionTexte2.x = (800 - texte2->w)/2;
        positionTexte2.y = (600 - texte2->h)/2 + 100;
        positionTexte2.w = texte2->w;
        positionTexte2.h = texte2->w;

        SDL_BlitSurface(fond, NULL, ecran, NULL);
        SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
        SDL_BlitSurface(texte2, NULL, ecran, &positionTexte2);

        SDL_Flip(ecran);

        // *************************** Boucle principale du programme ****************

        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;

                        case SDLK_RETURN:
                            if(!jouer(ecran, fond))
                                continuer=0;
                            break;
                    }
                    break;
            }
        }

        // **************************** Liberation de la mémoire ***********************

        TTF_CloseFont(police);
        TTF_CloseFont(police2);
        TTF_Quit();

        SDL_FreeSurface(texte);
        SDL_FreeSurface(texte2);
        SDL_FreeSurface(fond);

        // ***** END ***********

        return EXIT_SUCCESS;
    }



    jeu.h
    #ifndef DEF_JEU
    #define DEF_JEU

        int jouer(SDL_Surface *ecran, SDL_Surface *fond);

    #endif


    jeu.c

    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include "jeu.h"

    int jouer(SDL_Surface *ecran, SDL_Surface *fond){
        SDL_Surface *texte = NULL, *texte2 = NULL, *dad = NULL;
        TTF_Font *police3 = NULL;
        SDL_Rect positionDad;
        SDL_Rect positionTexte, positionTexte2;
        SDL_Color couleurBleu = {21, 24, 123};
        SDL_Event event;
        int continuer = 1;

        dad= IMG_Load("dad.png");

        positionDad.x = 300;
        positionDad.y = 600-215;

        police3 = TTF_OpenFont("black_boys.ttf", 50);

        positionTexte.x = 50;
        positionTexte.y = 50;

        positionTexte2.x = 700;
        positionTexte2.y = 50;

        while (1)
        {
            /*SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    //continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            //continuer = 0;
                            break;

                        case SDLK_LEFT:
                            if(positionDad.x > 0)
                                positionDad.x -= 20;
                            if(positionDad.x < 0)
                                positionDad.x = 0;
                            break;

                        case SDLK_RIGHT:
                            if(positionDad.x < (800-215))
                                positionDad.x += 20;
                            if(positionDad.x > (800-215))
                                positionDad.x = 800-215;
                            break;
                    }
                    break;
            }

            texte = TTF_RenderText_Solid(police3, "Composants : 21", couleurBleu);
            positionTexte.w = texte->w;
            positionTexte.h = texte->h;

            texte2 = TTF_RenderText_Solid(police3, "Matos perdu : 10", couleurBleu);
            positionTexte2.w = texte2->w;
            positionTexte2.h = texte2->h;

            SDL_BlitSurface(fond, NULL, ecran, NULL);
            SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
            SDL_BlitSurface(texte2, NULL, ecran, &positionTexte2);
            SDL_BlitSurface(dad, NULL, ecran, &positionDad);
            SDL_Flip(ecran);*/

        }

        TTF_CloseFont(police3);

        SDL_FreeSurface(texte);
        SDL_FreeSurface(texte2);
        SDL_FreeSurface(dad);

        return 1;
    }


    J'ai fais exprès de mettre l'ensemble de la boucle SDL de jeu.c pour être sur que le problème ne venais pas de la .. ca ne change rien, la boucle ne boucle pas ..

    Quelqu'un aurait-il une idée svp ?
    PS : Désolé d'avoir posté TOUT le code, mais cela permet de voire si une erreure c'est glissée quelque part ...

    Merci d'avance !! :p
    Swop

    EDIT : Je m'apperçois que j'ai une erreur qui revient a chaque exécution du programmme (execution depuis codeblock, me dis que le programme se finit avec un retour de 1).
    J'ai un stderr qui se crée avec ca dedans : Fatal signal: Segmentation Fault (SDL Parachute Deployed)
    Peut etre que cela pourrai vous aider ...
    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2006 à 21:25:27

      Si tu as une Segmentation Fault, c'est surement que tu as mal manipulé les pointeurs quelque part... Si ton code se compile correctement, mais qu'il s'arrête anormalement, alors tente de savoir précisément OU il s'arrête : tu remplit ton code de fprintf(stderr, "ici\n") pour savoir jusqu'où ton programme est aller, et ensuite tu découvre précisément d'où vient l'erreur...
      Vu que tu ne vérifié pas les pointeurs sur les police, l'erreur peut venir de là, mais je suis pas sûr, j'ai juste aprcouru le code...
      En prenant l'habitude de vérifier la valeur de chacune de tes polices, images et autres, tu pourra téviter des tas d'erreurs, tout du moins les dénicher...

      Bonne chance !
      • Partager sur Facebook
      • Partager sur Twitter
        23 mai 2006 à 23:37:29

        Oki, merci pour l'info !
        En effet, ca venait des ressources (image, non les polices en fait).
        Une image en png qui ne passait pas apparament ... le problème est réglé !

        Merci pour tout et pour les conseil !!
        swop
        • Partager sur Facebook
        • Partager sur Twitter
          24 mai 2006 à 1:16:55

          Pense à mettre ton topic en résolu stp ;)
          • Partager sur Facebook
          • Partager sur Twitter

          Un while qui se répète jamais ??? o_O

          × 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