Bonjour,
Je vous écris pour vous demander un petit conseil sur le chargement de plusieurs images avec SDL_loadBMP.
Dans mon jeu (de morpion), j'ai une vingtaine d'images.
J'ai défini une struct de SDL_Surface (dans laquelle j'ai tous mes Jeton), une fonction ChargementImages (qui initialise toute les images et met la couleur blanche en transparent) et une fonction LiberationImages (qui libère les images)
Comme le code de la fonction ChargementImages est long et répétitif , j'ai modifié la fonction ChargementImages et introduis une fonction Chargement :
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 typedef struct Images Images; struct Images { SDL_Surface *x; SDL_Surface *o; ... }; int ChargementImages(Images *Jeton) { if(Jeton->o!=NULL)//Vérification de l'allocation des surfaces { SDL_FreeSurface(Jeton->o); Jeton->o = NULL; } Jeton->o = SDL_LoadBMP("image-o.bmp");//Chargement de toutes les images dans les surfaces associées if(Jeton->o==NULL) { printf("Probleme de chargement d'une ou plusieurs images"); return faux; }//On a testé le retour du chargement if(Jeton->x!=NULL) { SDL_FreeSurface(Jeton->x); Jeton->x = NULL; } Jeton->x = SDL_LoadBMP("image-x.bmp"); if(Jeton->x==NULL) { printf("Probleme de chargement d'une ou plusieurs images"); return faux; }//On a testé le retour du chargement ... } void LiberationImages(Images *Jeton)//Libération des images { SDL_FreeSurface(Jeton->o); SDL_FreeSurface(Jeton->x); ... }
Ce code fonctionne parfaitement mais j'aimerais l'améliorer car :
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 int ChargementImages(Images *Jeton)//reorganisé { int erreur=faux; erreur=Chargement(&Jeton->o,"image-o.bmp"); erreur=Chargement(&Jeton->x,"image-x.bmp"); ... return erreur; } int Chargement(SDL_Surface **surface, char texte[]) { if(*surface!=NULL)//Si la surface a allouée n'est pas vide { SDL_FreeSurface(*surface);//alosr on la vide surface = NULL; } *surface = SDL_LoadBMP(texte);//Chargement de l'image dans la surface associée if(surface==NULL)//Vérification de l'allocation de la surface { fprintf(stderr, "Problème de chargement de l'image %s\n", texte);//Test du retour du chargement return faux; } else fprintf(stderr, "Bon chargement de l'image %s\n", texte); //Test du retour du chargement if(SDL_SetColorKey(*surface, SDL_SRCCOLORKEY, SDL_MapRGB((*surface)->format, coulBlanc))==-1)//Transparence de coulBlanc { fprintf(stderr, "Problème de chargement de la transparence totale de l'image %s\n", texte); return faux; } return vrai; }
1. Je suis obligé de fournir &Jeton->o et "image-o.bmp" pour chaque image. N'y a t il pas moyen de mettre un seul paramètre ? (ils sont toujours du style &Jeton->truc et "image-truc.bmp"
2. Pour libérer toutes les images, n'y a-t-il pas moyen de faire ça avec une boucle for du style for(image 1 à image finale) free(...), plutôt que d'écrire le nom de chaque image
3. Lorsque je crée ou supprime image, je dois modifier une ligne dans mon struct, dans mon chargerImage, sans oublier le LiberationImage, (au risque d'oublier une modification)
Je pense que si j'avais créé un tableau Image[i] cela serait facile avec une boucle for.
Mais je trouve plus pratique de travailler avec des noms explicites comme &Jeton->o et &Jeton->x, plutôt que Image[0] et Image[1].
A moins que l'on puisse définir que &Jeton->o et Image[0] comme étant le même objet et que l'on puisse utiliser l'un comme l'autre sans problème (le SDL_LoadBMP et free sur l'un modifierait l'autre).
Je n'ai pas réussi à trouver quelque chose qui puisse vraiment m'aider sur les sites que j'ai trouvé, c'est pour cela que je me permets de vous demander conseil.
Je vous remercie de l'aide que vous pourrez m'apporter.
Cordialement
Ludovic
Partager