Bonjour,
Ceci n'est pas une demande d'aide, mais une proposition
En fait j'ai telement galéré pour un truc aussi simple en ne trouvant rien sur le net, que je me suis dit que ça serait pas plus mal de mettre à disposition ces petits bouts de code simple mais utiles:
Dessiner un rectangle plein, fonctione simplifiée
Dessiner un rectangle vide:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void drawFullRect(SDL_Surface * surf,int posX, int posY, int width, int length, int R, int G, int B) { SDL_Rect Rect; Rect.x = posX; Rect.y = posY; Rect.w = length-1; Rect.h = width-1; SDL_FillRect(surf, &Rect, SDL_MapRGB(surf->format, R, G, B)); }
Methode pour tracer une ligne (Convertit une couleur R G B en long, et vient avec une fonction pour tracer un pixel avec cette couleur) - Pour info, il s'agit de l'algorithme de Bresenham :
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 void drawEmptyRect(SDL_Surface * surf,int posX, int posY, int width, int length, int R, int G, int B) { SDL_Rect ligneHaut; ligneHaut.x = posX-1; ligneHaut.y = posY-1; ligneHaut.w = length; ligneHaut.h = 1; SDL_FillRect(surf, &ligneHaut, SDL_MapRGB(surf->format, R, G, B)); SDL_Rect ligneDroite; ligneDroite.x = posX+length-1; ligneDroite.y = posY-1; ligneDroite.w = 1; ligneDroite.h = width; SDL_FillRect(surf, &ligneDroite, SDL_MapRGB(surf->format, R, G, B)); SDL_Rect ligneGauche; ligneGauche.x = posX-1; ligneGauche.y = posY-1; ligneGauche.w = 1; ligneGauche.h = width; SDL_FillRect(surf, &ligneGauche, SDL_MapRGB(surf->format, R, G, B)); SDL_Rect ligneBas; ligneBas.x = posX-1; ligneBas.y = posY+width-1; ligneBas.w = length; ligneBas.h = 1; SDL_FillRect(surf, &ligneBas, SDL_MapRGB(surf->format, R, G, B)); }
Enfin, fonction pour tracer et remplir un rectangle avec des rayures.. un rectangle rayé, quoi :
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 unsigned long Color(int R, int G, int B) {//Convertit RGB en long return 65536*R + 256*G + B; } void PutPixel(SDL_Surface *surface, int x, int y, unsigned long pixel) { int bpp = surface->format->BytesPerPixel; unsigned char *p = (unsigned char *)surface->pixels + y * surface->pitch + x * bpp; if (bpp==4) *(unsigned long*)p = pixel; } void drawLine(SDL_Surface* surf,int x1,int y1, int x2,int y2, int R, int G, int B) // Bresenham { unsigned long couleur = Color(R, G, B); int x,y; int Dx,Dy; int xincr,yincr; int erreur; int i; Dx = abs(x2-x1); Dy = abs(y2-y1); if(x1<x2) xincr = 1; else xincr = -1; if(y1<y2) yincr = 1; else yincr = -1; x = x1; y = y1; if(Dx>Dy) { erreur = Dx/2; for(i=0;i<Dx;i++) { x += xincr; erreur += Dy; if(erreur>Dx) { erreur -= Dx; y += yincr; } PutPixel(surf,x, y,couleur); } } else { erreur = Dy/2; for(i=0;i<Dy;i++) { y += yincr; erreur += Dx; if(erreur>Dy) { erreur -= Dy; x += xincr; } PutPixel(surf,x, y,couleur); } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void drawStrippedRect(SDL_Surface * surf, int posX, int posY, int width, int length, int R, int G, int B) { drawEmptyRect(surf, posX+1, posY+1, width-2, length-2, R, G, B); int esp=5, i, j, tmp=esp; unsigned long couleurPixel = Color(R, G, B); for(j=posY; j<posY+width-1; j++) for(i=posX+(tmp++%esp); i<posX+length-1; i+=esp) PutPixel(surf, i, j, couleurPixel); }
Voila... C'est tout bête, mais comme je débute et que je dois faire quelque chose de simple ça m'a prit un moment pour tout faire... alors j'espère que ça pourra être utile à un autre boulet comme moi
Partager