Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bug(s) de programmation

Sujet résolu
    3 janvier 2009 à 18:54:10

    Bonjour,j'aurais deux questions :

    Premièrement, a chaque fois que je programme une fenêtre avec SDL, une fenêtre console apparaît avant de lancer la fenêtre SDL, est-ce normal ?

    Ensuite, je suis en train d'essayer de programmer un jeu de poker, Le menu du jeu marche :

    int main(int argc, char *argv[])
    {  
        SDL_Surface *ecran = NULL, *fond = NULL, *TJouer = NULL, *TQuitter = NULL;
        SDL_Event event;
        int continuer = 1;
        int Menu = 0;
        TTF_Font *police = NULL;
        SDL_Rect Zero, T1, T2;
    
        Zero.x = 0;
        Zero.y = 0;
    
        T1.x = 640/2+75;
        T1.y = 480/3+75;
    
        T2.x = 640/2+75;
        T2.y = 480/3*2+25;
    
        SDL_Color couleurBleu = {0, 0, 255};
        SDL_Color couleurNoir = {0, 0, 0};
    
        SDL_Init(SDL_INIT_VIDEO);
        TTF_Init();
    
        SDL_WM_SetIcon(IMG_Load("Icon.JPG"), NULL);
        police = TTF_OpenFont("font.ttf", 60);
        fond = IMG_Load("fond.jpg");
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE | SDL_DOUBLEBUF);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        SDL_WM_SetCaption("Poker", NULL);
    
        SDL_Flip(ecran);
    
        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;
                    }
                break;
                case SDL_MOUSEMOTION:
                    if (event.motion.x > T1.x && event.motion.x < (T1.x + TJouer->w) && event.motion.y > T1.y && event.motion.y < (T1.y + TJouer->h))
                    {
                        Menu = 1;
                    }
                    else if (event.motion.x > T2.x && event.motion.x < (T2.x + TQuitter->w) && event.motion.y > T2.y && event.motion.y < (T2.y + TQuitter->h))
                    {
                        Menu = 2;
                    }
                    else
                    {
                        Menu = 0;
                    }
                    break;
                case SDL_MOUSEBUTTONUP:
                    if (Menu == 1)
                    {
                        TTF_CloseFont(police);
                        SDL_FreeSurface(fond);
                        SDL_FreeSurface(TJouer);
                        SDL_FreeSurface(TQuitter);
    
                        Menu();
                    }
                    if (Menu == 2)
                    {
                        continuer = 0;
                    }
                    break;
    
            }
    
            SDL_FreeSurface(TJouer);
            SDL_FreeSurface(TQuitter);
    
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            if (Menu == 1)
            {
                TJouer = TTF_RenderText_Blended(police, "Jouer", couleurBleu);
                TQuitter = TTF_RenderText_Blended(police, "Quitter", couleurNoir);
            }
            else if (Menu == 2)
            {
                TJouer = TTF_RenderText_Blended(police, "Jouer", couleurNoir);
                TQuitter = TTF_RenderText_Blended(police, "Quitter", couleurBleu);
            }
            else
            {
                TJouer = TTF_RenderText_Blended(police, "Jouer", couleurNoir);
                TQuitter = TTF_RenderText_Blended(police, "Quitter", couleurNoir);
            }
            SDL_BlitSurface(fond, NULL, ecran, &Zero);
            SDL_BlitSurface(TJouer, NULL, ecran, &T1);
            SDL_BlitSurface(TQuitter, NULL, ecran, &T2);
            SDL_Flip(ecran);
    
        }
    
        TTF_CloseFont(police);
    
        SDL_FreeSurface(fond);
        SDL_FreeSurface(TJouer);
        SDL_FreeSurface(TQuitter);
    
        TTF_Quit();
        SDL_Quit();
    
        return EXIT_SUCCESS;
    }
    


    Jusque la, pas de probleme, ensuite le pseudo menu :
    int Menu()
    {
        SDL_Rect PP1, PP2, PP3, PP4, PP5, PJ, PQ, Zero;
        SDL_Surface *ecran = NULL, *fond = NULL, *P1 = NULL, *P2 = NULL, *P3 = NULL, *P4 = NULL, *P5 = NULL, *PJouer = NULL, *PQuitter = NULL;
        int continuer = 1;
        int Menu = 0;
        SDL_Color couleurBleu = {0, 0, 255};
        SDL_Color couleurNoir = {0, 0, 0};
        TTF_Font *police = NULL, *police2 = NULL;
        SDL_Event event;
    
        PP1.x = 10;
        PP1.y = 10;
    
        PP2.x = 10;
        PP2.y = 50;
    
        PP3.x = 10;
        PP3.y = 100;
    
        PP4.x = 10;
        PP4.y = 150;
    
        PP5.x = 10;
        PP5.y = 200;
    
        Zero.x = 0;
        Zero.y = 0;
    
        PJ.x = 500;
        PJ.y = 420;
    
        PQ.x = 20;
        PQ.y = 420;
    
        SDL_WM_SetIcon(IMG_Load("Icon.JPG"), NULL);
        police = TTF_OpenFont("font2.ttf", 32);
        police2 = TTF_OpenFont("font.ttf", 48);
        fond = IMG_Load("fond.jpg");
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE | SDL_DOUBLEBUF);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        SDL_WM_SetCaption("Poker", NULL);
    
        P1 = TTF_RenderText_Blended(police, "-----------------------------Royal Flush : x250----------------------------", couleurBleu);
        P2 = TTF_RenderText_Blended(police, "Straight Flush : x50                                                Carre : x20", couleurBleu);
        P3 = TTF_RenderText_Blended(police, "Full House : x6                                                         Flush : x5", couleurBleu);
        P4 = TTF_RenderText_Blended(police, "Suite : x4                                                              Brelan : x3", couleurBleu);
        P5 = TTF_RenderText_Blended(police, "2 paires : x2                                                   Paire Forte : x1", couleurBleu);
        PJouer = TTF_RenderText_Blended(police2, "Jouer", couleurNoir);
        PQuitter = TTF_RenderText_Blended(police2, "Quitter", couleurNoir);
        SDL_Flip(ecran);
    
        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;
                    }
                    break;
                case SDL_MOUSEMOTION:
                    if (event.motion.x > PJ.x && event.motion.x < (PJ.x + PJouer->w) && event.motion.y > PJ.y && event.motion.y < (PJ.y + PJouer->h))
                    {
                        Menu = 1;
                    }
                    else if (event.motion.x > PQ.x && event.motion.x < (PQ.x + PQuitter->w) && event.motion.y > PQ.y && event.motion.y < (PQ.y + PQuitter->h))
                    {
                        Menu = 2;
                    }
                    else
                    {
                        Menu = 0;
                    }
                    break;
                case SDL_MOUSEBUTTONUP:
                    if (Menu == 1)
                    {
                        TTF_CloseFont(police);
                        TTF_CloseFont(police2);
                        SDL_FreeSurface(fond);
                        SDL_FreeSurface(PJouer);
                        SDL_FreeSurface(PQuitter);
                        SDL_FreeSurface(P1);
                        SDL_FreeSurface(P2);
                        SDL_FreeSurface(P3);
                        SDL_FreeSurface(P4);
                        SDL_FreeSurface(P5);
    
                        TTF_Quit();
                        SDL_Quit();
    
                        Jeu();
                    }
                    if (Menu == 2)
                    {
                        continuer = 0;
                    }
                    break;
            }
    
            SDL_FreeSurface(PJouer);
            SDL_FreeSurface(PQuitter);
    
            if (Menu == 1)
            {
                PJouer = TTF_RenderText_Blended(police2, "Jouer", couleurBleu);
                PQuitter = TTF_RenderText_Blended(police2, "Quitter", couleurNoir);
            }
            else if (Menu == 2)
            {
                PJouer = TTF_RenderText_Blended(police2, "Jouer", couleurNoir);
                PQuitter = TTF_RenderText_Blended(police2, "Quitter", couleurBleu);
            }
            else
            {
                PJouer = TTF_RenderText_Blended(police2, "Jouer", couleurNoir);
                PQuitter = TTF_RenderText_Blended(police2, "Quitter", couleurNoir);
            }
    
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(fond, NULL, ecran, &Zero);
            SDL_BlitSurface(P1, NULL, ecran, &PP1);
            SDL_BlitSurface(P2, NULL, ecran, &PP2);
            SDL_BlitSurface(P3, NULL, ecran, &PP3);
            SDL_BlitSurface(P4, NULL, ecran, &PP4);
            SDL_BlitSurface(P5, NULL, ecran, &PP5);
            SDL_BlitSurface(PJouer, NULL, ecran, &PJ);
            SDL_BlitSurface(PQuitter, NULL, ecran, &PQ);
    
            SDL_Flip(ecran);
        }
    
        TTF_CloseFont(police);
        TTF_CloseFont(police2);
    
        SDL_FreeSurface(fond);
        SDL_FreeSurface(P1);
        SDL_FreeSurface(P2);
        SDL_FreeSurface(P3);
        SDL_FreeSurface(P4);
        SDL_FreeSurface(P5);
        SDL_FreeSurface(PJouer);
        SDL_FreeSurface(PQuitter);
    
        TTF_Quit();
        SDL_Quit();
    
        return EXIT_SUCCESS;
    }
    


    Le problème est que quand j'appuie sur quitter, la fenêtre dispparait (comme prévu) mais une fenêtre windows s'affiche et dit "The program Poker.exe has encountered a problem and needs to close" (aussi bizarre que cela peut paraître j'ai Windows en anglais). :D

    Pourquoi ? :(

    Je précise que j'ai mis tout les "includes" nécessaires et que j'ai toutes les images et le TTF requis.

    Le probleme n'est pas si grave en soit, mais le problème se complique :

    Le Jeu(), dont voici le code apparaît comme un éclair puis disparaît, sur la console c'est écrit : "Process terminated with status -11" et dans le fichier "stderr.txt", c'est ecrit : "Fatal signal: Segmentation Fault (SDL Parachute Deployed)"

    int Jeu()
    {
        SDL_Surface *ecran = NULL, *fond = NULL;
        carte C1, C2, C3, C4, C5, C6, C7, C8, C9, C10;
        SDL_Surface *SC1 = NULL, *SC2 = NULL, *SC3 = NULL, *SC4 = NULL, *SC5 = NULL;
        int continuer = 1;
        SDL_Color couleurBleu = {0, 0, 255};
        SDL_Color couleurNoir = {0, 0, 0};
        SDL_Rect PC1, PC2, PC3, PC4, PC5, Zero;
        TTF_Font *police = NULL;
        SDL_Event event;
        char CC1[50] = "", CC2[50] = "", CC3[50] = "", CC4[50] = "", CC5[50] = "";
    
        Zero.x = 0;
        Zero.y = 0;
    
        PC1.x = 25;
        PC1.y = 100;
    
        PC2.x = 125;
        PC2.y = 100;
    
        PC3.x = 225;
        PC3.y = 100;
    
        PC4.x = 325;
        PC4.y = 100;
    
        PC5.x = 425;
        PC5.y = 100;
    
        SDL_Init(SDL_INIT_VIDEO);
        TTF_Init();
    
        SDL_WM_SetIcon(IMG_Load("Icon.jpg"), NULL);
        police = TTF_OpenFont("font.ttf", 48);
        fond = IMG_Load("fond.jpg");
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE | SDL_DOUBLEBUF);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        SDL_WM_SetCaption("Poker", NULL);
        SDL_Flip(ecran);
    
        C1.couleur = RCouleur();
        C1.nombre = RNombre();
    
        do
        {
            C2.couleur = RCouleur();
            C2.nombre = RNombre();
        } while (C2.couleur == C1.couleur && C2.nombre == C1.nombre);
    
        do
        {
            C3.couleur = RCouleur();
            C3.nombre = RNombre();
        } while ((C3.couleur == C1.couleur && C3.nombre == C1.nombre) || (C3.couleur == C2.couleur && C3.nombre == C2.nombre));
    
        do
        {
            C4.couleur = RCouleur();
            C4.nombre = RNombre();
        } while ((C4.couleur == C1.couleur && C4.nombre == C1.nombre) || (C4.couleur == C2.couleur && C4.nombre == C2.nombre) || (C4.couleur == C3.couleur && C4.nombre == C3.nombre));
    
        do
        {
            C5.couleur = RCouleur();
            C5.nombre = RNombre();
        } while ((C5.couleur == C1.couleur && C5.nombre == C1.nombre) || (C5.couleur == C2.couleur && C5.nombre == C2.nombre) || (C5.couleur == C3.couleur && C5.nombre == C3.nombre) || (C5.couleur == C4.couleur && C5.nombre == C4.nombre));
    
        fprintf(CC1, "%ldC%ld.png", C1.couleur, C1.nombre); //Les images des cartes sont nommés 1C2 pour 3 de pique et 2C4 pour 5 de trèfle etc.
        fprintf(CC2, "%ldC%ld.png", C2.couleur, C2.nombre);
        fprintf(CC3, "%ldC%ld.png", C3.couleur, C3.nombre);
        fprintf(CC4, "%ldC%ld.png", C4.couleur, C4.nombre);
        fprintf(CC5, "%ldC%ld.png", C5.couleur, C5.nombre);
    
        SC1 = IMG_Load(CC1);
        SC2 = IMG_Load(CC2);
        SC3 = IMG_Load(CC3);
        SC4 = IMG_Load(CC4);
        SC5 = IMG_Load(CC5);
    
        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;
                    }
                break;
            }
    
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(fond, NULL, ecran, &Zero);
            SDL_BlitSurface(SC1, NULL, ecran, &PC1);
            SDL_BlitSurface(SC2, NULL, ecran, &PC2);
            SDL_BlitSurface(SC3, NULL, ecran, &PC3);
            SDL_BlitSurface(SC4, NULL, ecran, &PC4);
            SDL_BlitSurface(SC5, NULL, ecran, &PC5);
    
            SDL_Flip(ecran);
        }
    
        TTF_CloseFont(police);
        SDL_FreeSurface(fond);
        SDL_FreeSurface(SC1);
        SDL_FreeSurface(SC2);
        SDL_FreeSurface(SC3);
        SDL_FreeSurface(SC4);
        SDL_FreeSurface(SC5);
    
        TTF_Quit();
        SDL_Quit();
    
        return EXIT_SUCCESS;
    }
    


    Merci pour votre aide, je sais que ma programmation est un peu brouillon donc je m'en excuse :euh:

    EDIT : Je travaille sous windows avec Code::Blocks.
    • Partager sur Facebook
    • Partager sur Twitter
      3 janvier 2009 à 19:00:27

      Bonsoir, pour ton problème d'erreur, je crois qu'il ne faut pas appeler SDL_Quit() dans ta fonction Menu() car tu le fais déjà dans le main().
      Pour la console qui s'affiche, il faut regarder dans les options du projet..je ne me rappelle plus de la manip désolé. (ça dépend de ton IDE)
      • Partager sur Facebook
      • Partager sur Twitter
        3 janvier 2009 à 19:12:20

        Merci bcp! :lol:

        Le premier probleme est réglé, mais le deuxieme persiste toujours...
        • Partager sur Facebook
        • Partager sur Twitter
          3 janvier 2009 à 19:32:53

          Edit: erreur de ma part, tu peux très bien réutiliser les pointeurs de surface après un SDL_Free().
          • Partager sur Facebook
          • Partager sur Twitter
            3 janvier 2009 à 19:36:56

            Pourtant je le fais aussi dans le main() :

            SDL_FreeSurface(TJouer);
                    SDL_FreeSurface(TQuitter);
            
                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                    if (Menu == 1)
                    {
                        TJouer = TTF_RenderText_Blended(police, "Jouer", couleurBleu);
                        TQuitter = TTF_RenderText_Blended(police, "Quitter", couleurNoir);
                    }
                    else if (Menu == 2)
                    {
                        TJouer = TTF_RenderText_Blended(police, "Jouer", couleurNoir);
                        TQuitter = TTF_RenderText_Blended(police, "Quitter", couleurBleu);
                    }
                    else
                    {
                        TJouer = TTF_RenderText_Blended(police, "Jouer", couleurNoir);
                        TQuitter = TTF_RenderText_Blended(police, "Quitter", couleurNoir);
                    }
            


            Lui marche bien pourtant...

            A mon avis le problee vient de la :
            fprintf(CC1, "%ldC%ld.png", C1.couleur, C1.nombre);
                fprintf(CC2, "%ldC%ld.png", C2.couleur, C2.nombre);
                fprintf(CC3, "%ldC%ld.png", C3.couleur, C3.nombre);
                fprintf(CC4, "%ldC%ld.png", C4.couleur, C4.nombre);
                fprintf(CC5, "%ldC%ld.png", C5.couleur, C5.nombre);
            
                SC1 = IMG_Load(CC1);
                SC2 = IMG_Load(CC2);
                SC3 = IMG_Load(CC3);
                SC4 = IMG_Load(CC4);
                SC5 = IMG_Load(CC5);
            


            En effet le programme marchait avant...
            • Partager sur Facebook
            • Partager sur Twitter
              3 janvier 2009 à 19:51:42

              Ah dans ce cas, ce n'est pas sprintf() que tu devrais utiliser ? fprintf() sert à écrire dans un fichier.
              • Partager sur Facebook
              • Partager sur Twitter
                4 janvier 2009 à 9:58:18

                Bien vu!, je ne l'avais pas remarque, je vais l'essayer!

                EDIT: Ca marche merci beaucoup!!!
                • Partager sur Facebook
                • Partager sur Twitter

                Bug(s) de programmation

                × 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