Bonsoir, suite au plantage de mon ordi, je suis obligé d'installer la sdl2 et j'en profite pour améliorer mes programmes.
Pour l'instant, j'apprivoise juste les fonctions élémentaires dont j'aurais besoin pour modifier mes anciens programmes.
Dans mes anciens programmes, je faisais quelque chose du style :
Init{sdl, fenetre, audio, video, ttf, police}
InitImage{image1, image2, image3,...}
QuitSDL{fermeture de police, ttf, sdl_quit}
QuitImage{fermeture de image1, fermeture de image2, fermeture de image3,...}
main
{
si (Init=OK)
alors
---si(InitImage =ok)
---alors ......
---else QuitImage
else QuitSDL
}
Avec la sdl2, j'ai plutôt écris:
car je ne détruis que ce que j'ai déjà créé avant l'apparition du problème.Code:
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 void initSDL(SDL_Window **window, SDL_Renderer **renderer, int w, int h, TTF_Font **PoliceSoulignee) { fprintf(fichierErreur, "Chargement des windows, renderer, sdl, ttf, police,... : en cours.\n"); //Si l'initialisation de la SDL a échoué, on retourne faux if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO )!=0) { fprintf(fichierErreur, "Problème pour charger SDL_Init_Video et SDL_Init_AUDIO : %s\n", SDL_GetError()); //Si l'initialisation de la SDL a échoué, on retourne faux fclose(fichierErreur); exit(EXIT_FAILURE); //quitter le programme } else fprintf(fichierErreur, "Chargement de SDL_Init (video et audio) : OK.\n"); if(SDL_CreateWindowAndRenderer(w, h, SDL_WINDOW_SHOWN, window, renderer)!=0) { fprintf(fichierErreur, "Problème pour charger SDL_CreateWindowAndRenderer : %s\n", SDL_GetError()); //Si l'initialisation de Window et Renderer a échoué, on retourne faux fclose(fichierErreur); exit(EXIT_FAILURE); //quitter le programme } else fprintf(fichierErreur, "Chargement de Window et Renderer : OK. \n"); if(TTF_Init()==-1) { fprintf(fichierErreur, "Problème pour charger TTF_Init : %s\n", SDL_GetError()); //Si l'initialisation de la TTF_Init a échoué, fclose(fichierErreur); SDL_DestroyRenderer(*renderer);//fermeture renderer, window, sdl SDL_DestroyWindow(*window); SDL_Quit(); exit(EXIT_FAILURE); //quitter le programme } else fprintf(fichierErreur, "Chargement de TTF_Init : OK.\n"); *PoliceSoulignee=TTF_OpenFont("times.ttf", 30); if(*PoliceSoulignee==NULL)//si erreur d'allocation de police de soulignement { fprintf(fichierErreur, "Erreur de chargement de la police : %s\n", SDL_GetError()); //Si l'initialisation de la TTF_Init a échoué, fclose(fichierErreur); SDL_DestroyRenderer(*renderer);//fermeture renderer, window, sdl SDL_DestroyWindow(*window); TTF_Quit(); SDL_Quit(); exit(EXIT_FAILURE); //quitter le programme } else { fprintf(fichierErreur, "Chargement de Police : OK. %s\n", SDL_GetError()); //Si l'initialisation de la SDL a échoué, on retourne faux TTF_SetFontStyle(*PoliceSoulignee, TTF_STYLE_UNDERLINE);//pour ecrire en souligné } }
J'ai crée un fichierErreur.txt, car je ne trouve pas où sont écrits les SDL_GetError.
Est-ce une bonne idée de mettre des exit(EXIT_FAILURE) sachant que j'ai normalement détruis tout ce que j'ai créé avant
J'ai crée une fonction QuitSDL qui ferme tout ce que est en rapport avec la SDL lorsque tout s'est bien ouvert (à utiliser en cours ou fin de programme prinicipal)
De même pour les images: j'ai envie de faire :Code:
1
2
3
4
5
6
7
8
9 void QuitSDL(SDL_Window **window, SDL_Renderer **renderer, int w, int h, TTF_Font **Police) { fclose(fichierErreur); SDL_DestroyRenderer(*renderer);//fermeture renderer, window, sdl SDL_DestroyWindow(*window); TTF_CloseFont(*Police); TTF_Quit(); SDL_Quit(); }
chargement image 1
si ok, chargement de l'image 2
si probleme avec l'image 2, destruction de l'image 1+QuitSDL (mais je serais obligé de lui passer police en paramètre alors que je n'en ai pas besoin pour charger une image)
si ok avec l'image2, chargement de l'imagfe3
si probleme avec l'image 3, destruction des images 2 et 1+QuitSDL
Mais si j'ai 50 images, est-ce la bonne solution de traiter individuellement le cas de chargement pour chaque image ?
Je pourrais bien faire un tableau d'images et si l'image 23 n'est pas chargée correctement, désinstaller les images 1->22.
Mais dans ce cas les images vont s'appeler image[i]. Comment faire si mes images s'appellent fourchette, cuillère, couteau,...
De plus, pour charger une image, j'ai 3 risques d'erreurs (avec la surface, la texture, la transparence). (
Je suis un peu perdu pour trouver une bonne méthode.
Comment me conseillez-vous de traiter la vérification des bons chargements et leur destruction en cas de problème ?
Merci à ceux qui voudront bien me conseiller
ChamLudo