Bonjour à tous, amis programmeurs,
Je suis actuellement en train de suivre un tutoriel C d'un site. J'en suis arrivé à la partie de l'écriture en SDL avec sdl_ttf. A la fin de ce cours, Mateo21 propose de faire le jeu du clique (faire un maximum de clics en un temps donné).
Je tente de l'améliorer en créant un menu, et en affichant des explications avant de commencer à jouer.
Mon problème est le suivant: au moment où, sur la page des explications, j'appuies sur la touche S pour commencer à jouer, le programme plante.
J'espere que vous pourrez m'apporter votre aide, car cela fait des semaines que je regarde mon code minutieusement pour essayer de trouver l'erreur, mais je ne trouve rien.
Voici mon code:
le fichier main.c:
Le fichier explications.c:
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 #include "main.h" int main(int argc, char *argv[]) { SDL_Surface *ecran = NULL, *bienvenu = NULL, *jouer = NULL; TTF_Font *police = NULL; SDL_Event event; SDL_Rect position; SDL_Color couleurNoire = {0, 0, 0}, couleurBleu = {0, 0, 255}; int continuer = 1; if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Erreur d'initialisation de la SDL: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } SDL_putenv("SDL_WINDOW_POS=center"); if(TTF_Init() < 0) { fprintf(stderr, "Erreur d'initialisation de SDL_TTF: %s\n", TTF_GetError()); exit(EXIT_FAILURE); } ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENTRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); if(ecran == NULL) { fprintf(stderr, "Erreur lors du chargement de la fenetre: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } SDL_WM_SetCaption("Clickeur", NULL); police = TTF_OpenFont("cheddar.ttf", 65); if(police == NULL) { fprintf(stderr, "Erreur lors du chargement de la police: %s", TTF_GetError()); exit(EXIT_FAILURE); } // Ecriture du texte dans la SDL bienvenu = TTF_RenderText_Blended(police, "CLICKEUR", couleurNoire); jouer = TTF_RenderText_Blended(police, "1. Jouer", couleurNoire); 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_1: explications(ecran, police); break; case SDLK_DOWN: SDL_FreeSurface(jouer); jouer = TTF_RenderText_Blended(police, "1. Jouer", couleurBleu); break; case SDLK_RETURN: explications(ecran, police); break; } break; } SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); position.x = ecran->w / 2 - bienvenu->w / 2; position.y = 100; SDL_BlitSurface(bienvenu, NULL, ecran, &position); position.x = ecran->w / 2 - jouer->w / 2; position.y = 300; SDL_BlitSurface(jouer, NULL, ecran, &position); SDL_Flip(ecran); } TTF_CloseFont(police); TTF_Quit(); SDL_FreeSurface(bienvenu); SDL_FreeSurface(jouer); SDL_Quit(); return EXIT_SUCCESS; }
Et le fichier niveauUn.c:
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 #include "main.h" void explications(SDL_Surface *ecran, TTF_Font *police) { SDL_Surface *texte1 = NULL, *texte2 = NULL, *texte3 = NULL, *texte4 = NULL, *texteSuivant = NULL, *texteMenu = NULL; TTF_Font *policeSuivant = NULL; SDL_Rect position; SDL_Event event; SDL_Color couleurNoire = {0, 0, 0}; int continuer = 1; policeSuivant = TTF_OpenFont("cheddar.ttf", 30); if(policeSuivant == NULL) { fprintf(stderr, "Erreur lors du chargement de la police: %s", TTF_GetError()); exit(EXIT_FAILURE); } texte1 = TTF_RenderText_Blended(police, "Vous avez 30 secondes", couleurNoire); texte2 = TTF_RenderText_Blended(police, "Faites un maximum de clics dans", couleurNoire); texte3 = TTF_RenderText_Blended(police, "le temps imparti", couleurNoire); texte4 = TTF_RenderText_Blended(police, "Bonne chance!", couleurNoire); texteSuivant = TTF_RenderText_Blended(policeSuivant, "Appuyez sur la touche S pour continuer", couleurNoire); texteMenu = TTF_RenderText_Blended(policeSuivant, "Appuyer sur la touche ECHAP pour retourner au menu", couleurNoire); 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: main(NULL, NULL); break; case SDLK_s: niveauUn(ecran, police); break; } break; } SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); position.x = ecran->w / 2 - texte1->w / 2; position.y = 80; SDL_BlitSurface(texte1, NULL, ecran, &position); position.x = ecran->w / 2 - texte2->w / 2; position.y = 150; SDL_BlitSurface(texte2, NULL, ecran, &position); position.x = ecran->w / 2 - texte3->w / 2; position.y = 190; SDL_BlitSurface(texte3, NULL, ecran, &position); position.x = ecran->w / 2 - texte4->w / 2; position.y = 290; SDL_BlitSurface(texte4, NULL, ecran, &position); position.x = ecran->w / 2 - texteSuivant->w / 2; position.y = 380; SDL_BlitSurface(texteSuivant, NULL, ecran, &position); position.x = ecran->w / 2 - texteMenu->w / 2; position.y = 410; SDL_BlitSurface(texteMenu, NULL, ecran, &position); SDL_Flip(ecran); } TTF_CloseFont(police); TTF_CloseFont(policeSuivant); SDL_FreeSurface(texte1); SDL_FreeSurface(texte2); SDL_FreeSurface(texte3); SDL_FreeSurface(texte4); SDL_FreeSurface(texteSuivant); }
Merci d'avance pour votre aide
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 #include "main.h" void niveauUn(SDL_Surface *ecran, TTF_Font *police) { SDL_Surface *clics = NULL, *temps = NULL; SDL_Rect position; SDL_Event event; SDL_Color couleurNoire = {0, 0, 0}, couleurBlanche = {255, 255, 255}; int continuer = 1; int tempsActuel = 0, tempsPrecedent = 0, compteurTemps = 30, compteurClics = 0; char nombreDeClics[1000] = "", tempsEcoule[30] = ""; // Initialisation du texte et de SDL_GetTicks() tempsActuel = SDL_GetTicks(); sprintf(tempsEcoule, "Temps: %d", compteurTemps); temps = TTF_RenderText_Shaded(police, tempsEcoule, couleurNoire, couleurBlanche); sprintf(nombreDeClics, "Clics: %d", compteurClics); clics = TTF_RenderText_Shaded(police, nombreDeClics, couleurNoire, couleurBlanche); SDL_Delay(1000); while(continuer) { while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: continuer = 0; break; case SDL_MOUSEBUTTONDOWN: if(event.button.button == SDL_BUTTON_LEFT) { compteurClics++; sprintf(nombreDeClics, "clics: %d", compteurClics); SDL_FreeSurface(clics); clics = TTF_RenderText_Shaded(police, nombreDeClics, couleurNoire, couleurBlanche); } else if(event.button.button == SDL_BUTTON_RIGHT) { clics = TTF_RenderText_Blended(police, "Utilisez le clic gauche", couleurNoire); position.x = event.button.x; position.y = event.button.y; SDL_BlitSurface(clics, NULL, ecran, &position); SDL_FreeSurface(clics); } break; } } SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); tempsActuel = SDL_GetTicks(); if(tempsActuel - tempsPrecedent >= 1000) { compteurTemps -= 1; sprintf(tempsEcoule, "Temps: %d", compteurTemps); temps = TTF_RenderText_Shaded(police, tempsEcoule, couleurNoire, couleurBlanche); SDL_FreeSurface(temps); tempsActuel = tempsPrecedent; } position.x = ecran->w / 2 - temps->w / 2; position.y = 100; SDL_BlitSurface(temps, NULL, ecran, &position); position.x = ecran->w / 2 - clics->w / 2; position.y = 210; SDL_BlitSurface(clics, NULL, ecran, &position); SDL_Flip(ecran); } TTF_CloseFont(police); SDL_FreeSurface(temps); SDL_FreeSurface(clics); }![]()
Partager