Bon, j'ai commencé un petit projet personnel que je voudrais finir avant vendredi 22 Janvier. Il avance bien mais je tombe sur deux os :
Le premier est que je n'arrive pas à faire afficher une image que je charge depuis un png. Il m'affiche un écran noir au lieu de l'image. Je n'ai aucune erreur avec SDL_GetError.
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 int main(int argc, char** argv) { SDL_Window* GameWindow = NULL; SDL_Event event; SDL_Renderer *Pencil = NULL; Mix_Music* MusicList[5]; Mix_Chunk* SFX[14]; Sprite ImageArray[20]; //Tableau qui contient à la fois les surfaces et textures int loop = 1; int i = 0; int playMusic=0; GameWindow = SDL_Start(); // Démarre les fonction SDL if (!GameWindow) { fprintf(stderr, "Erreur de création de la fenêtre: %s\n", SDL_GetError()); SDL_Delay(5000); return -1; } InitiateImageArray(ImageArray); // Initie toutes les valeurs du tableau à NULL Pencil = SDL_CreateRenderer(GameWindow, -1, SDL_RENDERER_ACCELERATED); if (!Pencil) { fprintf(stdout, "Échec de chargement du renderer (%s)\n", SDL_GetError()); SDL_Delay(5000); return -1; } LoadMusicList(MusicList); for (i = 0; i < 5; i++) { if (MusicList[i]==NULL) { printf("Erreur de chargement de la musique.\n"); } } LoadSFX(SFX); for (i = 0; i < 14; i++) { if (SFX[i]==NULL) { printf("Erreur de chargement d'un son.\n"); } } ImageArray[0]=LoadBackground (Pencil);//Charge l'image du background dans le tableau while (loop==1) { while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { loop = 0; } if (event.type == SDL_KEYDOWN) { if (event.key.keysym.sym == SDLK_ESCAPE) { loop = 0; } } } RefreshImage(Pencil,&ImageArray[0],0,0);//Raffaichit l'image avec le renderer, la texture la surface donnée et les coordonnées à 0,0 PlayMusic (MusicList[0],&playMusic); SDL_RenderPresent(Pencil); } CloseImageArray (&ImageArray[20]);// Détruit les textures les surfaces rentrés dans le tableau Mix_HaltMusic(); FreeSFX(SFX); FreeMusicList(MusicList); SDL_Stop(); //Arrête les fonctions SDL return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //Structure Sprite qui contient à la fois la surface et la texture pour son traitement dans les fonctions suivantes typedef struct Sprite Sprite; struct Sprite { SDL_Surface* Image; SDL_Texture* Texture; };
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 //Fonction de chargement des images Sprite LoadImage(SDL_Renderer* Pencil,char FileName[100])//Crée la surface et la texture { Sprite sprite; sprite.Image = IMG_Load(FileName); if (!sprite.Image) { fprintf(stdout, "Échec de création de l'image (%s)\n", SDL_GetError()); SDL_Delay(5000); } sprite.Texture = SDL_CreateTextureFromSurface(Pencil, sprite.Image); if (!sprite.Texture) { fprintf(stdout, "Échec de création de la texture (%s)\n", SDL_GetError()); SDL_Delay(5000); } return sprite; } void RefreshImage(SDL_Renderer* Pencil, Sprite* sprite,int x,int y)//Copie la texture dans le renderer { SDL_Rect dest = { x - sprite->Image->w, y - sprite->Image->h, sprite->Image->w, sprite->Image->h }; SDL_RenderCopy(Pencil, sprite->Texture, NULL, &dest); } void CloseImage(Sprite* sprite)//Ferme l'image { SDL_DestroyTexture(sprite->Texture); SDL_FreeSurface(sprite->Image); }L'autre problème est qu'à la fin du programme, il plante. Après débogage, j'apprends qu'il y a une segmentation fault sur la fonction CloseArrayImage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 // Code qui permet de charger l'image (qui est en fait un arrière plan) Sprite LoadBackground (SDL_Renderer *Pencil) { Sprite Image; Image = LoadImage(Pencil, "Background/Zone1.png"); return Image; }
La segmentation fault arrive à i=9 (sachant que le tableau fait 20) et le tableau est initialisé à NULL grâce à cette fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 //Ferme le tableau de Sprite void CloseImageArray (Sprite ImageArray[20]) { int i =0; for (i=0;i<20;i++) { if (ImageArray[i].Image!=NULL && ImageArray[i].Texture!=NULL) { CloseImage(&ImageArray[i]); } } }
Aussi, le if lance le code même si les éléments du tableau sont NULL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 //Initialise le tableau de Sprite void InitiateImageArray (Sprite ImageArray[20]) { int i = 0; for (i=0;i<20;i++) { ImageArray[i].Image = NULL; ImageArray[i].Texture = NULL; } }
Une petite idée ?
Edit :
Bon, grâce à un tableau dynamique, j'ai pu régler le second problème mais le premier reste entier.
Partager