affichage_image.c 6.54 KB
Newer Older
Valentin MEUNIER's avatar
Valentin MEUNIER committed
1
2
3
4
#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_ttf.h>
5
#include "affichage_image.h"
Valentin MEUNIER's avatar
Valentin MEUNIER committed
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160

/*
 *chargement des textures
 */
SDL_Texture* load_texture_from_image(char  *  file_image_name, SDL_Renderer *renderer)
{
    SDL_Surface* my_image = NULL;
    SDL_Texture* my_texture = NULL;
    my_image = IMG_Load(file_image_name);

    if (my_image == NULL) exit(EXIT_FAILURE);

    my_texture = SDL_CreateTextureFromSurface(renderer, my_image); // Chargement de l'image de la surface vers la texture
    SDL_FreeSurface(my_image);                                     // la SDL_Surface ne sert que comme élément transitoire
    if (my_texture == NULL) exit(EXIT_FAILURE);

    return my_texture;
}


/*
 *affiche les textures du labyrinthes en fonction de la position des murs autour de la case
 */
void affichage_texture(SDL_Texture *my_texture,SDL_Window *window,SDL_Renderer *renderer,int x,int coord_colonne,int coord_ligne,int taille_cell) {
  SDL_Rect source = {0},  // Rectangle définissant la zone de la texture à récupérer
    window_dimensions = {0}, // Rectangle définissant la fenêtre, on  n'utilisera que largeur et hauteur
    destination = {0}, // Rectangle définissant où la zone_source doit être déposée dans le renderer
    state = {0};

  SDL_GetWindowSize(window,                   // Récupération des dimensions de la fenêtre
                    &window_dimensions.w,
                    &window_dimensions.h);
  SDL_QueryTexture(my_texture, NULL, NULL,    // Récupération des dimensions de l'image
                   &source.w, &source.h);
  float zoom = (float)taille_cell/(float)109;                // valeur du zoom pour l'affichage final
  int offset_x = source.w / 14,                // La largeur d'une vignette de l'image 14
      offset_y = source.h / 9.4;                // La hauteur d'une vignette de l'image 9.4 
 	state.w = offset_x;
  	state.h = offset_y;
  
  switch (x){
  	case 6 :
  		state.x = 140;
  		state.y = 15;
		break;
  	case 10 :
  		state.x = 265;
  		state.y = 15;
		break;
 
  	case 5 :
  		state.x = 139;
  		state.y = 140;
		break;
  
  	case 9 :
  		state.x = 265;
  		state.y = 140;
		break;

  	case 3 :
  		state.x = 10;
  		state.y = 0;
		break;

  	case 12 :
  		state.x = 10;
  		state.y = 143;
		break;

  	case 15 :
  		state.x = 1162;
  		state.y = 13;
		break;
  
  	case 7 :
  		state.x = 522;
  		state.y = 271;
		break;
  
  	case 11 :
  		state.x = 649;
  		state.y = 271;
		break;

  	case 13 :
  		state.x = 522;
  		state.y = 398;
		break;
  
  	case 14 :
  		state.x = 650;
  		state.y = 399;
		break;
  
  	case 2 :
  		state.x = 1034;
  		state.y = 266;
		break;
  
  	case 1 :
  		state.x = 1161;
  		state.y = 265;
		break;

  	case 8 :
  		state.x = 1161;
  		state.y = 398;
		break;
  
  	case 4 :
  		state.x = 1036;
  		state.y = 398;
 		break;
	case 0 :
  		state.x = 0;
  		state.y = 265;
 		break;
  }

 /* construction des différents rectangles autour de chacune des vignettes de la planche */

  destination.w = offset_x * zoom+1;            // Largeur du sprite à l'écran
  destination.h = offset_y * zoom+1;            // Hauteur du sprite à l'écran
  destination.x = 1+coord_colonne*(source.h / 9.4)*zoom; // Position en x pour l'affichage du sprite
  destination.y = 1+coord_ligne*(source.h / 9.4)*zoom;  // Position en y pour l'affichage du sprite
  SDL_RenderCopy(renderer,my_texture,&state, &destination);   // Préparation de l'affichage

}


void affichage_fin(SDL_Texture *my_texture,SDL_Window *window,SDL_Renderer *renderer,int coord_colonne,int coord_ligne,int taille_cell) {
  SDL_Rect source = {0},  // Rectangle définissant la zone de la texture à récupérer
    window_dimensions = {0}, // Rectangle définissant la fenêtre, on  n'utilisera que largeur et hauteur
    destination = {0}, // Rectangle définissant où la zone_source doit être déposée dans le renderer
    state = {0};

  SDL_GetWindowSize(window,                   // Récupération des dimensions de la fenêtre
                    &window_dimensions.w,&window_dimensions.h);
  SDL_QueryTexture(my_texture, NULL, NULL,    // Récupération des dimensions de l'image
                   &source.w, &source.h);
  float zoom = (float)taille_cell/(float)16.1;                // valeur du zoom pour l'affichage final
  int offset_x = source.w / 56,                // La largeur d'une vignette de l'image 56
      offset_y = (float)source.h / (float)12;                // La hauteur d'une vignette de l'image 11
  	state.x = 0;
  	state.y = source.h-3*offset_y-3;
 	state.w = offset_x;
  	state.h = offset_y;
  destination.w = offset_x * zoom+1;            // Largeur du sprite à l'écran
  destination.h = offset_y * zoom+1;            // Hauteur du sprite à l'écran
  destination.y = 1+coord_colonne*(source.w / 56)*zoom; // Position en x pour l'affichage du sprite
  destination.x = coord_ligne*(source.w / 56)*zoom+6;  // Position en y pour l'affichage du sprite
  SDL_RenderCopy(renderer,my_texture,&state, &destination);   // Préparation de l'affichage
}

161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
void afficherImageBrouillard(SDL_Renderer *renderer,SDL_Window *window,int **tab,int taille_cell,SDL_Texture* texture, int pos_x, int pos_y)
{
	int i1,j1,x,noeud=0;
	int * voisin = malloc(4*sizeof(int));

	SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0);
	SDL_RenderClear(renderer);
	
	if (tab[pos_y][pos_x] & FLAG_N)
		voisin[0]=pos_x+P*pos_y -P;
	if (tab[pos_y][pos_x] & FLAG_S)
		voisin[1]=pos_x+P*pos_y+P ;
	if (tab[pos_y][pos_x] & FLAG_O)
		voisin[2]=pos_x+P*pos_y -1;
	if (tab[pos_y][pos_x] & FLAG_E)
		voisin[3]=pos_x+P*pos_y+1;
	for (int j=0; j<4; j++)
	{	
		if (voisin[j]!=-1)
		{

			x=tab[voisin[j]%P][voisin[j]/P];
			i1=(noeud%P); //coordonee colonne du noeud
			j1=(noeud/P); // coordonee ligne du noeud
		}
	}
	affichage_texture(texture,window,renderer,x,i1,j1,taille_cell);
	free(voisin);
}
Valentin MEUNIER's avatar
Valentin MEUNIER committed
190

191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
void afficherImage(SDL_Renderer *renderer,SDL_Window *window,int **tab,int taille_cell,SDL_Texture* texture)
{
	int i1,j1,x,noeud=0;

	SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0);
	SDL_RenderClear(renderer);

	for (int i=0;i<N;i++)
	{
		for (int j=0;j<P;j++)
		{
			x=tab[j][i];
			i1=(noeud%P); //coordonee colonne du noeud
			j1=((int)noeud/P); // coordonee ligne du noeud

			affichage_texture(texture,window,renderer,x,i1,j1,taille_cell);
			noeud+=1;
		}
	}
Valentin MEUNIER's avatar
Valentin MEUNIER committed
210
211
}

Valentin MEUNIER's avatar
le    
Valentin MEUNIER committed
212
213
void peindreMap(SDL_Texture * texture, SDL_Window* window ,SDL_Renderer *renderer, int noeuds, int taille_cell, int ** laby)
{
Valentin MEUNIER's avatar
le    
Valentin MEUNIER committed
214
	//printf("peindre case %d %d %d \n",noeuds%P,noeuds/P,laby[noeuds%P][noeuds/P]);
Valentin MEUNIER's avatar
le    
Valentin MEUNIER committed
215
216
217
218
        affichage_texture(texture,window, renderer, laby[noeuds%P][noeuds/P], noeuds%P, noeuds/P, taille_cell);
}