IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Introuvable dans un jeu pong


Sujet :

SDL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 23
    Points
    23
    Par défaut Introuvable dans un jeu pong
    Bonjour, je fais un jeu Pong et il est presque terminé mais j'ai un gros problème : quand je veux jouer et puis quitter la fonction jouer(en appuiant sur escape) il plante et si je continue à jouer jusqu'à ce que je perde, il plante aussi après avoir appelé ma fonction enregisterScore et avoir sauvegardé.
    Mon code est assez volumineux alors je ne met que les parties sucseptibles de planter. si vous trouvez que je dois mettre plus de code dites le moi.

    j'appelle mes fonctions comme ceci : menu-> niveau-> jouer-> enregistrerScore (là normalement je devrais quitter la fonction enregisterScore et jouer mais le programme s'arrête.


    jouer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     while (continuer && continuer2)
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer2 = 0;
                    break;
                    case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_UP:
                    if(posRect[0].y <= 0)
                    {
                        posRect[0].y = posRect[0].y;
                    }
                    else
                    {
                        if(difficulte == 1 || difficulte == 2)
                        {
                        posRect[0].y -= 2;
                        }
                        else
                        {
                        posRect[0].y--;
                        }
                    }
                      break;
                    case SDLK_DOWN:
                    if(posRect[0].y + 90 >= HAUTEUR)
                    {
                        posRect[0].y = posRect[0].y;
                    }
                    else
                    {
                        if(difficulte == 1 || difficulte == 2)
                        {
                        posRect[0].y += 2;
                        }
                        else
                        {
                        posRect[0].y++;
                        }
                    }
                      break;
                    case SDLK_ESCAPE:
                        continuer = 0;
                        break;
                    default:
                      break;
     
                }
                    break;
                    default:
                    break;
            }
     / *a partir d'ici c'est la gestion des collisions qui marche très bien alors je le zappe*/
    }

    Ma fonction enregisterScore:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    	FILE* fichier = NULL;
     
     
        texte = TTF_RenderText_Blended(police, " GAME OVER ", ecritureBlanche);
     
        if (point == 0 || point == 1)
        {
            sprintf(chaineScore, "vous avez ""%d"" point", point);
        }
        else
        {
            sprintf(chaineScore, "vous avez ""%d"" points", point);
        }
    	textePoint = TTF_RenderText_Blended(police, chaineScore, ecritureBlanche);
     
     
    	posTexte.x = LARGEUR / 2 - texte->w / 2;
    	posTexte.y = HAUTEUR / 2 - texte->h / 2;
    	posTextePoint.x = LARGEUR / 2 - textePoint->w / 2;
    	posTextePoint.y = posTexte.y + 20;
     
     
        fichier = fopen("score.txt", "r");
     
        if (fichier != NULL)
        {
            fscanf(fichier, "%ld", &score);
     
    	if (point > score)
    	{
     
    	   nouveauScore = 1;
    	   fclose(fichier);
     
    	}
    	else
    	{
    	   fclose(fichier);
    	}
        }
        else
        {
        nouveauScore = 1;
        }
        if (nouveauScore)
        {
            FILE *fichier = fopen ("score.txt", "w");
                if (fichier != NULL)
                {
                    fprintf (fichier, "%.ld", point);
                    fclose(fichier);
                }
        }
    	while (continuer && continuer2)
        	{
            	SDL_WaitEvent(&event);
            	switch(event.type)
            	{
                	case SDL_QUIT:
                    	continuer2 = 0;
                    	break;
                    	case SDL_KEYDOWN:
                	switch(event.key.keysym.sym)
                	{
                    	case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                      	default:
                            break;
     
                	}
                    	break;
                    	default:
                    	break;
            	}
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
            SDL_BlitSurface(texte, NULL, ecran, &posTexte);
            SDL_BlitSurface(textePoint, NULL, ecran, &posTextePoint);
            SDL_Flip(ecran);
            }
    Je n'ai pas mis mes declarations de variables car pour moi ce n'est pas ça qui fait que mon programme bugue

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Salut,

    Avant de regarder ton code de plus pres, je voudrais savoir exactement ce qui se passe :

    quand je veux jouer et puis quitter la fonction jouer(en appuiant sur escape) il plante
    alors, il plante comment ? arret brutal du programme, comportement non voulu (il continue alors qu'il devrait s'arreter ...), ...
    Retourne t'il un message d'erreur ?

    je continue à jouer jusqu'à ce que je perde, il plante aussi après avoir appelé ma fonction enregisterScore et avoir sauvegardé.
    Sais tu quelle est la ligne qui fait planter ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    en disant il plante, je voulais dire qu'il faisait un arrêt brutal mais je viens de recompiler et la il sort normalement de mes fonctions et me laisse appuyer sur une touche après quoi il s'arrête directement.
    je n'ai pas réussi à trouver la ligne la ligne où ça plante

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Bonjour, depuis mon dernier post j'ai trouvé quelques bugs mais j'en ai un ernier dans enregister score qui fait que quand on appelle cette fonction la une deuxième fois le programme s'arrete directement.

    cette fois-ci je sais où est la ligne qui plante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    void enregistrerScore(SDL_Surface *ecran, TTF_Font *police, SDL_Color ecritureBlanche, long point)
      {
    	SDL_Surface *texte = NULL, *textePoint = NULL;
    	SDL_Rect posTexte, posTextePoint;
    	SDL_Event event;
    	long score = 0, pointAffiche = 0;
    	int nouveauScore = 0;
    	char chaineScore[30] = "";
    	int continuer = 1, repetition = 0;
    	int tempsPrecedent = 0, tempsActuel = 0;
     
    	FILE* fichier = NULL;
    printf("2\n");
     
    	posTexte.x = LARGEUR / 2;
    	posTexte.y = HAUTEUR / 2;
    	posTextePoint.x = LARGEUR / 2;
    	posTextePoint.y = posTexte.y + 15;
     
        fichier = fopen("score.txt", "r");
     
        if (fichier != NULL)
        {
            printf("7\n");
            fscanf(fichier, "%ld", &score);
     
            if (point > score)
            {
                nouveauScore = 1;
                fclose(fichier);
     
            }
            else
            {
                fclose(fichier);
            }
        }
        else
        {
            nouveauScore = 1;
        }
        if (nouveauScore)
        {
            FILE *fichier = fopen ("score.txt", "w");
                if (fichier != NULL)
                {
                    fprintf (fichier, "%ld", point);
                    fclose(fichier);
                }
        }
    printf("test\n");
    //  /!\Voila c'est ici entre test et test2/!\
        texte = TTF_RenderText_Blended(police, " GAME OVER ", ecritureBlanche);
    printf("test2\n");
    	while (continuer && continuer2)
        	{
            	SDL_PollEvent(&event);
            	switch(event.type)
            	{
                	case SDL_QUIT:
                    	continuer2 = 0;
                    	break;
                    	case SDL_KEYDOWN:
                	switch(event.key.keysym.sym)
                	{
                    	case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                      	default:
                            break;
     
                	}
                    	break;
                    	default:
                    	break;
            	}
            tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent > 30)
            {
                    tempsPrecedent = tempsActuel;
                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                if((point == 0 || point == 1) && repetition != 1)
                {
                    sprintf(chaineScore, "vous avez %ld point", point);
                    repetition = 1;
                }
                else if (pointAffiche < point)
                {
                    SDL_FreeSurface(textePoint);
                    sprintf(chaineScore, "vous avez %ld points", pointAffiche);
                    textePoint = TTF_RenderText_Blended(police, chaineScore, ecritureBlanche);
                    pointAffiche++;
                }
                else
                {
                    SDL_FreeSurface(textePoint);
                    sprintf(chaineScore, "vous avez %ld points", point);
                    textePoint = TTF_RenderText_Blended(police, chaineScore, ecritureBlanche);
                }
            }
            else
            {
                SDL_Delay(30 - (tempsActuel - tempsPrecedent));
            }
                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 50));
                SDL_BlitSurface(texte, NULL, ecran, &posTexte);
                SDL_BlitSurface(textePoint, NULL, ecran, &posTextePoint);
                SDL_Flip(ecran);
        }
        SDL_FreeSurface(texte);
        SDL_FreeSurface(textePoint);
      }

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Bonjour,

    Deja, continuer2 n'est pas declaré.

    Je continue a regarder ton code.

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Bonjour, j'ai vite fait regarder ton code, chez moi il compile et ne me mets pas d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    void enregistrerScore(SDL_Surface *ecran, TTF_Font *police, SDL_Color ecritureBlanche, long point)
    {
    	SDL_Surface *texte = TTF_RenderText_Blended(police, " GAME OVER ", ecritureBlanche);
    	SDL_Rect posTexte;
            posTexte.x = LARGEUR / 2;
            posTexte.y = HAUTEUR / 2;
     
    	SDL_Surface *textePoint = NULL;
        SDL_Rect posTextePoint;
            posTextePoint.x = LARGEUR / 2;
            posTextePoint.y = posTexte.y + 15;
     
        /* Servira a faire une sorte de compteur de point */
    	long pointAffiche = 0;
     
    	/* Booleen permettant de savoir si on doit enregistrer le score du joueur */
    	int nouveauScore = 0;
    	char chaineScore[30] = "";
    	int repetition = 0;
     
     
    	int tempsPrecedent = 0, tempsActuel = 0;
     
     
     
     
     
        /* On ouvre le fichier "score" */
        FILE* fichier = fopen("score.txt", "r");
        if (fichier != NULL)
        {
            long score;
            fscanf(fichier, "%ld", &score);
     
            if (score < point)
                nouveauScore = 1;
        }
        else
            nouveauScore = 1;
     
        /* De toute facon, il faut fermer le fichier */
        fclose(fichier);
     
        if (nouveauScore)
        {
            /* C'est normal que tu redefinisse fichier ?? */
            FILE *fichier = fopen ("score.txt", "w");
            if (fichier != NULL)
            {
                fprintf (fichier, "%ld", point);
                fclose(fichier);
            }
        }
     
     
     
     
     
        int continuer = 1;
    	while (continuer)
        {
            SDL_Event event;
            while (SDL_PollEvent(&event))
                switch(event.type)
                {
                    case SDL_QUIT:
                        continuer = 0;
                        break;
                    case SDL_KEYDOWN:
                        switch(event.key.keysym.sym)
                        {
                            case SDLK_ESCAPE:
                                continuer = 0;
                                break;
                            default:
                                break;
                        }
                        break;
                    default:
                        break;
                }
     
            tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent > 30)
            {
                tempsPrecedent = tempsActuel;
     
                /* On librere la surface d'ecriture */
                SDL_FreeSurface(textePoint);
     
                if((point == 0 || point == 1) && repetition != 1)
                {
                    sprintf(chaineScore, "vous avez %ld point", point);
                    repetition = 1;
                }
                else
                    if (pointAffiche < point)
                    {
                        sprintf(chaineScore, "vous avez %ld points", pointAffiche);
                        pointAffiche++;
                    }
                    else
                        sprintf(chaineScore, "vous avez %ld points", point);
     
                /* On ecrit notre texte dans notre surface */
                textePoint = TTF_RenderText_Blended(police, chaineScore, ecritureBlanche);
            }
            else
                SDL_Delay(30 - (tempsActuel - tempsPrecedent));
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 50));
            SDL_BlitSurface(texte, NULL, ecran, &posTexte);
            SDL_BlitSurface(textePoint, NULL, ecran, &posTextePoint);
            SDL_Flip(ecran);
        }
        SDL_FreeSurface(texte);
        SDL_FreeSurface(textePoint);
     
      }
    C'est quasiment le meme sauf que je l'ai modifier pour faire plus propre. J'ai relever une petite erreur, dans un des cas, ton fichier n'etait pas refermer.
    De plus, tu redefine ton fichier. Est-ce que c'st voulu, ou est-ce que c'est un malheureux copier-coller ??

    Si tu as des probleme, utilise un debuggeur, un vrai, pas avec des printf (car de une, cela ne te dit pas l'erreur, et de deux, ce n'est pas forcement la que ca plante).

    Plusieurs remarque : si tu est en C, mon code va peut etre planter a cause de l'endroit ou je declare mes variable. Pas de panique, il suffit juste de remettre les variable au debut du bloc.

    Pour ton code, pitié, prend l'habitude de mieux declarer tes variable. Avoir 18 variable aligné n'aide pas celui qui veut t'aider. Encore heureux que tes nom de variable soit explicite, sinon c'est l'enfer assurer.

    La variable continuer2 est inutile selon ton contexte car tu ne cherche pas a savoir si l'utilisateur a cliquer sur la croix ou s'il a appuyer sur echap.

    Tu n'as pas besoins de te trimballer ta surface ecran a travers tes parametre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void enregistrerScore(SDL_Surface *ecran, TTF_Font *police, SDL_Color ecritureBlanche, long point)
    {
       ...
    }
    devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void enregistrerScore(TTF_Font *police, SDL_Color ecritureBlanche, long point)
    {
        SDL_Surface *ecran = SDL_GetVideoSurface();
       ...
    }

    De plus tu envoie une couleur en parametre et une police d'ecriture.
    Cela ne regarde que moi, mais pourquoi ne redefinie tu pas la couleur et la police d'ecriture ? Cela allegerai le nombre de parametre passer et donc la comprehension.
    A moins que tu ne passe differente couleur ou differente police en fonction du score (et encore, tu pourrait faire un switch - case), tu peux faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void enregistrerScore(long point)
    {
        SDL_Surface *ecran = SDL_GetVideoSurface();
     
        TTF_Font *police = TTF_OpenFont("###.ttf", 20);
        SDL_Color ecritureBlanche = {255, 255, 255};
       ...
     
        TTF_CloseFont(police);
    }
    Ainsi, il n'y aurait pas beaucoup de parametre.

    Voila, si le code que je t'ai donner ne marche pas ou si tu ne comprend pas certains de mes conseil, tu sais quoi faire

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Merci pour tout tes conseils, j'ai bien compris ton code et je vais essayer que le mien soit un peu plus clair. Pour mon fichier la première fois je l'ouvre en lecture seule, je regarde si il faut écrire dedans puis je le ferme, si il fallait écrire dedans je le rouvre en mode écriture seule (qui a l'avantage de créer un nouveau fichier si le mien n'existe pas). même avec ton code j'ai le même problème donc à mon avis l'erreur n'est pas là. Aurais-tu de bon site pour apprendre à débugger facilement (même si c'est en englais) car avec google je trouve pas. Merci.

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Bonsoir,

    Pour utiliser le debuggeur de code::block : http://www.google.fr/search?hl=fr&cl...+block&spell=1

    c'est une recherche google.

    Ensuite, pour eviter de chercher une erreur trop longtemps, je te conseille de tester le retour des fonction TTF, SDL et compagnie ... A voir avec la doc.

    Sinon, décris moi mieux ton probleme et l'erreur que te retourne le compilo.

    Si tu ne trouve vraiment pas, le mieux et de tout reprendre petit a petit et de toujours tester. Faire simple dabord, puis compliquer ensuite.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Grace a tes conseils, j'ai trouve, je desalouais 2 fois la même surface. Merci beaucoup.

    P.S. Il y a une erreur dans le titre du topic le titre que j'ai voulu mettre était erreur introuvable.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 04/04/2007, 16h02
  2. [AS2] dialogue dans un jeu
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 09/11/2005, 16h02
  3. [TP] Problème dans un jeu de ping pong
    Par kellog02 dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 05/11/2005, 11h41
  4. Le réseau dans un jeu ?
    Par Ekinoks dans le forum Développement
    Réponses: 8
    Dernier message: 03/11/2005, 11h36
  5. soumettre un formulaire contenu dans un jeu de cadre
    Par nicoulou dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/06/2005, 21h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo