Commit 8959b9d7bf0b692be1a3b513d5c3de553968ea38
0 parents
"premiere livraison"
Showing
8 changed files
with
560 additions
and
0 deletions
Show diff stats
No preview for this file type
No preview for this file type
No preview for this file type
1 | +++ a/libgraph.c | |
... | ... | @@ -0,0 +1,239 @@ |
1 | +/**** Bibliotheque graphique ****/ | |
2 | + | |
3 | +/** Fichiers d'inclusion **/ | |
4 | + | |
5 | +#include <SDL/SDL.h> | |
6 | +#include <SDL/SDL_ttf.h> | |
7 | +#include "libgraph.h" | |
8 | + | |
9 | +/** Types **/ | |
10 | + | |
11 | +typedef struct | |
12 | +{ | |
13 | + int r, v, b; | |
14 | +} couleur; | |
15 | + | |
16 | +/** Constantes **/ | |
17 | + | |
18 | +#define BITS_PAR_PIXEL 32 | |
19 | +#define TAILLE_POLICE 20 | |
20 | + | |
21 | +static const couleur couleurs[] = { { 255, 255, 255 }, { 0, 0, 0 }, { 255, 0, 0 }, | |
22 | + { 0, 255, 0 }, { 0, 0, 255 }, { 255, 105, 180 }, | |
23 | + { 150, 150, 150 }, { -1, -1, -1 } }; | |
24 | + | |
25 | +static const char policeDefaut[]="/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; | |
26 | + | |
27 | +/** Variables globales **/ | |
28 | + | |
29 | +static SDL_Surface *surface; | |
30 | +TTF_Font* police; | |
31 | + | |
32 | +/** Fonctions **/ | |
33 | + | |
34 | +void choisirPolice(const char *chemin, int taille){ | |
35 | + police=TTF_OpenFont(chemin, taille); | |
36 | +} | |
37 | + | |
38 | +void initialiserTexte() { | |
39 | + TTF_Init(); | |
40 | + choisirPolice(policeDefaut, TAILLE_POLICE); | |
41 | +} | |
42 | + | |
43 | +/* Initialisation de la surface dessinable */ | |
44 | +unsigned char creerSurface (int largeur, int hauteur, char *titre) | |
45 | +{ | |
46 | + SDL_Init (SDL_INIT_VIDEO); | |
47 | + SDL_WM_SetCaption (titre, titre); | |
48 | + surface = SDL_SetVideoMode (largeur, hauteur, BITS_PAR_PIXEL, SDL_DOUBLEBUF); | |
49 | + initialiserTexte(); | |
50 | + | |
51 | + return (surface != NULL && police != NULL); | |
52 | +} | |
53 | + | |
54 | +/* Fermeture de la surface dessinable */ | |
55 | + | |
56 | +void fermerSurface (void) | |
57 | +{ | |
58 | + if (surface != NULL) SDL_FreeSurface (surface); | |
59 | + if (police != NULL) TTF_CloseFont(police); | |
60 | + TTF_Quit(); | |
61 | + SDL_Quit (); | |
62 | +} | |
63 | + | |
64 | +/* Creation d'une couleur */ | |
65 | + | |
66 | +static int creerCouleur (int ncouleur) | |
67 | +{ | |
68 | + couleur c = couleurs[ncouleur]; | |
69 | + return SDL_MapRGB (surface->format, c.r, c.v, c.b); | |
70 | +} | |
71 | + | |
72 | +/* Dessin d'un rectangle plein */ | |
73 | + | |
74 | +void rectanglePlein (int x, int y, int l, int h, int c) | |
75 | +{ | |
76 | + SDL_Rect rectangle = { x, y, l, h }; | |
77 | + SDL_FillRect (surface, &rectangle, creerCouleur (c)); | |
78 | + // SDL_Flip(surface); | |
79 | +} | |
80 | + | |
81 | +/* Manipulation de lutins */ | |
82 | + | |
83 | +static SDL_Surface *lutins[MAX_LUTINS]; | |
84 | +static int lutins_nb = 0; | |
85 | + | |
86 | +int lutinTexte(char* texte, int couleurTexte) { | |
87 | + couleur c=couleurs[couleurTexte]; | |
88 | + SDL_Color couleur={c.r, c.v, c.b}; | |
89 | + SDL_Surface* lutin=TTF_RenderText_Solid(police, texte, couleur); | |
90 | + if (lutin != NULL) | |
91 | + { | |
92 | + lutins[lutins_nb++] = lutin; | |
93 | + return lutins_nb - 1; | |
94 | + } | |
95 | + return -1; | |
96 | +} | |
97 | + | |
98 | +static void configurerLutin (SDL_Surface *lutin, int ncouleur) | |
99 | +{ | |
100 | + couleur c = couleurs[ncouleur]; | |
101 | + int fond = SDL_MapRGB (lutin->format, c.r, c.v, c.b); | |
102 | + SDL_SetColorKey (lutin, SDL_SRCCOLORKEY | SDL_RLEACCEL, fond); | |
103 | +} | |
104 | + | |
105 | +int chargerLutin (char *fichier, int couleur) | |
106 | +{ | |
107 | + if (lutins_nb >= MAX_LUTINS) return -2; | |
108 | + SDL_Surface *lutin = SDL_LoadBMP (fichier); | |
109 | + if (lutin != NULL) | |
110 | + { | |
111 | + lutins[lutins_nb++] = lutin; | |
112 | + if (couleur >= 0) configurerLutin (lutin, couleur); | |
113 | + return lutins_nb - 1; | |
114 | + } | |
115 | + return -1; | |
116 | +} | |
117 | + | |
118 | +void afficherLutin (int lutin, int x, int y) | |
119 | +{ | |
120 | + SDL_Rect position; | |
121 | + position.x = x; | |
122 | + position.y = y; | |
123 | + SDL_BlitSurface (lutins[lutin], NULL, surface, &position); | |
124 | +} | |
125 | + | |
126 | +int creerLutin (int x, int y, int largeur, int hauteur, int couleur) | |
127 | +{ | |
128 | + if (lutins_nb >= MAX_LUTINS) return -2; | |
129 | + int rmask, gmask, bmask, amask; | |
130 | +#if SDL_BYTEORDER == SDL_BIG_ENDIAN | |
131 | + rmask = 0xff000000; | |
132 | + gmask = 0x00ff0000; | |
133 | + bmask = 0x0000ff00; | |
134 | + amask = 0x000000ff; | |
135 | +#else | |
136 | + rmask = 0x000000ff; | |
137 | + gmask = 0x0000ff00; | |
138 | + bmask = 0x00ff0000; | |
139 | + amask = 0xff000000; | |
140 | +#endif | |
141 | + if (couleur < 0) amask = 0x00000000; | |
142 | + SDL_Surface *lutin = | |
143 | + SDL_CreateRGBSurface (0, largeur, hauteur, BITS_PAR_PIXEL, rmask, gmask, bmask, amask); | |
144 | + SDL_Rect fenetre; | |
145 | + fenetre.x = x; | |
146 | + fenetre.y = y; | |
147 | + fenetre.h = hauteur; | |
148 | + fenetre.w = largeur; | |
149 | + SDL_BlitSurface (surface, &fenetre, lutin, NULL); | |
150 | + lutins[lutins_nb++] = lutin; | |
151 | + if (couleur >= 0) configurerLutin (lutin, couleur); | |
152 | + return lutins_nb - 1; | |
153 | +} | |
154 | + | |
155 | +void tailleLutin (int lutin, int *largeur, int *hauteur) | |
156 | +{ | |
157 | + *largeur = lutins[lutin]->w; | |
158 | + *hauteur = lutins[lutin]->h; | |
159 | +} | |
160 | + | |
161 | +int sauverLutin (int lutin, char *nom) { return SDL_SaveBMP (lutins[lutin], nom); } | |
162 | + | |
163 | +/* Manipulation de copie de surface en BMP */ | |
164 | + | |
165 | +int sauverSurface (char *fichier) { return SDL_SaveBMP (surface, fichier); } | |
166 | + | |
167 | +unsigned char chargerSurface (char *fichier) | |
168 | +{ | |
169 | + SDL_Surface *image = SDL_LoadBMP (fichier); | |
170 | + if (image != NULL) | |
171 | + { | |
172 | + SDL_BlitSurface (image, NULL, surface, NULL); | |
173 | + SDL_Flip (surface); | |
174 | + } | |
175 | + return (image != NULL); | |
176 | +} | |
177 | + | |
178 | +void majSurface (void) { SDL_Flip (surface); } | |
179 | + | |
180 | +/* Trouver la couleur d'un pixel */ | |
181 | + | |
182 | +int couleurPixel (int x, int y) | |
183 | +{ | |
184 | + int bpp = surface->format->BytesPerPixel; | |
185 | + Uint32 *p = (Uint32 *)(surface->pixels + y * surface->pitch + x * bpp); | |
186 | + Uint8 r, v, b; | |
187 | + SDL_GetRGB (*p, surface->format, &r, &v, &b); | |
188 | + int i = 0; | |
189 | + while (1) | |
190 | + { | |
191 | + if (couleurs[i].r < 0) break; | |
192 | + if (r == couleurs[i].r && v == couleurs[i].v && b == couleurs[i].b) break; | |
193 | + i++; | |
194 | + } | |
195 | + if (couleurs[i].r < 0) | |
196 | + return -1; | |
197 | + else | |
198 | + return i; | |
199 | +} | |
200 | + | |
201 | +/* Fonction de traitement des événements */ | |
202 | + | |
203 | +void lireEvenement (evenement *evt, char *touche, void **detail) | |
204 | +{ | |
205 | + static SDL_keysym _detail; | |
206 | + SDL_Event event; | |
207 | + while (SDL_PollEvent (&event)) | |
208 | + { | |
209 | + if (event.type == SDL_QUIT) *evt = quitter; | |
210 | + if (event.type == SDL_KEYDOWN || event.type == SDL_KEYUP) | |
211 | + { | |
212 | + *evt = (event.type == SDL_KEYDOWN) ? toucheBas : toucheHaut; | |
213 | + char *nom = SDL_GetKeyName (event.key.keysym.sym); | |
214 | + if (strlen (nom) == 1 && nom[0] >= 32 && nom[0] < 128) | |
215 | + *touche = nom[0]; | |
216 | + else | |
217 | + *touche = 0; | |
218 | + if (detail != NULL) | |
219 | + { | |
220 | + _detail = event.key.keysym; | |
221 | + *detail = &_detail; | |
222 | + } | |
223 | + break; | |
224 | + } | |
225 | + } | |
226 | +} | |
227 | + | |
228 | +void attendreEvenement (void) | |
229 | +{ | |
230 | + SDL_Event event; | |
231 | + while (SDL_WaitEvent (&event)) switch (event.type) | |
232 | + { | |
233 | + case SDL_QUIT: | |
234 | + exit (0); | |
235 | + case SDL_KEYDOWN: | |
236 | + case SDL_MOUSEBUTTONDOWN: | |
237 | + return; | |
238 | + } | |
239 | +} | ... | ... |
1 | +++ a/libgraph.h | |
... | ... | @@ -0,0 +1,156 @@ |
1 | +/**** Bibliotheque graphique (definitions) ****/ | |
2 | + | |
3 | +/** Constantes **/ | |
4 | + | |
5 | +#define COULEUR_BLANC 0 | |
6 | +#define COULEUR_NOIR 1 | |
7 | +#define COULEUR_ROUGE 2 | |
8 | +#define COULEUR_VERT 3 | |
9 | +#define COULEUR_BLEU 4 | |
10 | +#define COULEUR_ROSE 5 | |
11 | +#define COULEUR_GRIS 6 | |
12 | + | |
13 | +#define MAX_LUTINS 16 | |
14 | + | |
15 | +typedef enum {toucheBas, toucheHaut, quitter} evenement; | |
16 | + | |
17 | +/** Prototypes **/ | |
18 | + | |
19 | +/** | |
20 | + * @brief cree une fenetre 2D | |
21 | + * | |
22 | + * @param largeur en pixels de la fenetre | |
23 | + * @param hauteur en pixels de la fenetre | |
24 | + * @param titre de la fenetre (chaine de caractere) | |
25 | + */ | |
26 | +unsigned char creerSurface (int largeur, int hauteur, char *titre); | |
27 | + | |
28 | +/** | |
29 | + * @brief permet de charger un fichier image au format bmp (bitmap) | |
30 | + * | |
31 | + * @param fichier nom du fichier | |
32 | + */ | |
33 | +unsigned char chargerSurface (char *fichier); | |
34 | + | |
35 | + | |
36 | +/** | |
37 | + * @brief permet de sauvegarder une surface en image (format bmp) | |
38 | + * | |
39 | + * @param fichier nom du fichier | |
40 | + * @return 0 si OK, valeur negative sinon | |
41 | + */ | |
42 | +int sauverSurface (char *fichier); | |
43 | + | |
44 | +/** | |
45 | + * @brief met a jour la surface d'affichage | |
46 | + */ | |
47 | +void majSurface (void); | |
48 | + | |
49 | + | |
50 | +/** | |
51 | + * @brief libere la surface d'affichage | |
52 | + * a faire lors de la fermeture | |
53 | + * du programme | |
54 | + */ | |
55 | +void fermerSurface (void); | |
56 | + | |
57 | +/** | |
58 | + * @brief choisit la police de caractères à utiliser pour afficher du texte | |
59 | + * @param chemin nom du fichier de police (format .ttf, voir /usr/share/fonts/truetype) | |
60 | + * @param taille taille de la police | |
61 | + */ | |
62 | +void choisirPolice(const char *chemin, int taille); | |
63 | + | |
64 | +/** | |
65 | + * @brief dessine un rectange de taille (l,h) aux coordonnêes | |
66 | + * (x,y) et de couleur c | |
67 | + * | |
68 | + * @param x 0 <= x <= l_surface | |
69 | + * @param y 0 <= y <= h_surface | |
70 | + * @param l largeur en pixels | |
71 | + * @param h longueur en pixels | |
72 | + * @param c indice de couleur voir variable couleurs dans le fichier .c | |
73 | + */ | |
74 | +void rectanglePlein (int x, int y, int l, int h, int c); | |
75 | + | |
76 | + | |
77 | +/** | |
78 | + * @brief permet de determiner l'indice du tableau de couleur du | |
79 | + * pixel aux coordonnees (x,y) | |
80 | + * | |
81 | + * @param x 0 <= x <= l_surface | |
82 | + * @param y 0 <= y <= h_surface | |
83 | + * @return indice de couleur voire variable couleurs dans le fichier .c | |
84 | + */ | |
85 | +int couleurPixel (int x, int y); | |
86 | + | |
87 | +/** | |
88 | + * @brief crée un lutin à partir d'un texte | |
89 | + * | |
90 | + * @param texte le texte | |
91 | + * @param couleur indice de couleur du texte | |
92 | + * @return numero de lutin dans le tableau dynamique de lutin (< MAX_LUTINS) | |
93 | + */ | |
94 | +int lutinTexte(char *texte, int couleur); | |
95 | + | |
96 | +/** | |
97 | + * @brief charge un lutin à partir du fichier | |
98 | + * | |
99 | + * @param fichier image bitmap du lutin à charger | |
100 | + * @param couleur indice de couleurs à charger | |
101 | + * @return numero de lutin dans le tableau dynamique de lutin (< MAX_LUTINS) | |
102 | + */ | |
103 | +int chargerLutin (char *fichier, int couleur); | |
104 | + | |
105 | +/** | |
106 | + * @brief afficher un lutin aux coordonnées (x,y) | |
107 | + * | |
108 | + * @param lutin numero du lutin à afficher (< MAX_LUTINS) | |
109 | + * @param x abscisse de départ | |
110 | + * @param y ordonnée de départ | |
111 | + */ | |
112 | +void afficherLutin (int lutin, int x, int y); | |
113 | + | |
114 | +/** | |
115 | + * @brief creer un lutin de taille (l,h) aux coordonnées (x,y) | |
116 | + * | |
117 | + * @param x abscisse de départ | |
118 | + * @param y ordonnée de départ | |
119 | + * @param largeur largeur du lutin | |
120 | + * @param hauteur hauteur du lutin | |
121 | + * @param couleur indice de couleur à partir du tableau _couleurs_ | |
122 | + * @return indice du lutin dans le tableau global (< MAX_LUTINS) | |
123 | + */ | |
124 | +int creerLutin (int x, int y, int largeur, int hauteur, int couleur); | |
125 | + | |
126 | +/** | |
127 | + * @brief sauvegarde un lutin dans un fichier | |
128 | + * | |
129 | + * @param lutin numero de lutin à sauvegarder (< MAX_LUTINS) | |
130 | + * @param nom fichier pour la sauvegarde | |
131 | + * @return 0 si OK valeur négative sinon | |
132 | + */ | |
133 | +int sauverLutin (int lutin, char *nom); | |
134 | + | |
135 | +/** | |
136 | + * @brief calcule la taille (largeur,hauteur) d'un lutin | |
137 | + * | |
138 | + * @param lutin index du lutin (< MAX_LUTINS) | |
139 | + * @param largeur pointeur sur la largeur | |
140 | + * @param hauteur pointeur sur la hauteur | |
141 | + */ | |
142 | +void tailleLutin (int lutin, int *largeur, int *hauteur); | |
143 | + | |
144 | +/** | |
145 | + * @brief lire une touche au clavier | |
146 | + * | |
147 | + * @param evt pointeur sur evenement | |
148 | + * @param touche pointeur sur la touche pressée | |
149 | + * @param detail NULL ou keysim | |
150 | + */ | |
151 | +void lireEvenement (evenement *evt, char *touche, void **detail); | |
152 | + | |
153 | +/** | |
154 | + * @brief attente d'un evenement bouton, souris, fin de programme | |
155 | + */ | |
156 | +void attendreEvenement (void); | ... | ... |
1 | +++ a/makefile | |
... | ... | @@ -0,0 +1,28 @@ |
1 | +# Makefile for the graphical library (libgraph.a) | |
2 | + | |
3 | +# Compiler and archiver | |
4 | +CC = gcc | |
5 | +AR = ar | |
6 | +CFLAGS = -Wall -g | |
7 | +ARFLAGS = rs | |
8 | + | |
9 | +# Source files and objects | |
10 | +SOURCES = $(wildcard *.c) | |
11 | +OBJETS = $(SOURCES:.c=.o) | |
12 | +CIBLE = libgraph.a | |
13 | + | |
14 | +# Main target | |
15 | +.PHONY: all | |
16 | +all: $(CIBLE) | |
17 | + | |
18 | +# Clean rule | |
19 | +.PHONY: clean | |
20 | +clean: | |
21 | + rm -f core *.o $(CIBLE) | |
22 | + | |
23 | +# Dependencies for the library | |
24 | +$(CIBLE): $(OBJETS) | |
25 | + $(AR) $(ARFLAGS) $@ $^ | |
26 | + | |
27 | + | |
28 | + | ... | ... |
1 | +++ a/test.c | |
... | ... | @@ -0,0 +1,96 @@ |
1 | +#include <stdio.h> | |
2 | +#include <SDL/SDL.h> | |
3 | +#include <SDL/SDL_ttf.h> | |
4 | +#include "libgraph.h" | |
5 | +#include "test.h" | |
6 | +#include <stdbool.h> | |
7 | +#include <stdlib.h> | |
8 | + | |
9 | +#define MAX_LUTINS 16 | |
10 | +#define BITS_PAR_PIXEL 32 | |
11 | +#define TAILLE_POLICE 20 | |
12 | + | |
13 | + | |
14 | + | |
15 | +liste_entite * ajout_en_tete(liste_entite premiere_entite,struct entite * une_entite ) | |
16 | +{ | |
17 | + liste_entite * nouvelleentite = (liste_entite * )malloc(sizeof(liste_entite)); | |
18 | + | |
19 | + if(nouvelleentite == NULL) | |
20 | + { | |
21 | + return NULL; | |
22 | + } | |
23 | + | |
24 | + nouvelleentite->premiere_entite = une_entite; | |
25 | + return nouvelleentite; | |
26 | +} | |
27 | + | |
28 | + | |
29 | +liste_entite * ajout_apres(liste_entite * entite, struct entite une_entite) | |
30 | +{ | |
31 | +// a terminer | |
32 | + | |
33 | + | |
34 | + | |
35 | + | |
36 | + return NULL; | |
37 | +} | |
38 | + | |
39 | + | |
40 | + | |
41 | +/*liste_entite * supression_entete(liste_entite * une_entite) | |
42 | + | |
43 | +{ if(une_entite == NULL) return NULL; | |
44 | + liste_entite * current_entite = une_entite->premiere_entite; | |
45 | + free(une_entite); | |
46 | + return current_entite; | |
47 | +}*/ | |
48 | + | |
49 | + | |
50 | + | |
51 | + | |
52 | + | |
53 | + | |
54 | + | |
55 | + | |
56 | +/*void initiliserlejeu(void) | |
57 | +{ creerSurface(800,600,"space invaders"); | |
58 | + | |
59 | + | |
60 | + | |
61 | + | |
62 | + | |
63 | +}*/ | |
64 | + | |
65 | +int main() | |
66 | + | |
67 | +{ | |
68 | + | |
69 | + if (creerSurface(800, 600, "Space Invaders")) { | |
70 | + int monsterSprite = chargerLutin("invader_monstre1_1.bmp", COULEUR_ROUGE); | |
71 | + if (monsterSprite != -1) { | |
72 | + afficherLutin(monsterSprite, 100, 100); | |
73 | + majSurface(); | |
74 | + } | |
75 | + | |
76 | + attendreEvenement(); | |
77 | + | |
78 | + | |
79 | + rectanglePlein(0, 0, 800, 600, COULEUR_NOIR); | |
80 | + majSurface(); | |
81 | + | |
82 | + | |
83 | + int anotherSprite = chargerLutin("invader_monstre1_1.bmp", COULEUR_BLEU); | |
84 | + if (anotherSprite != -1) { | |
85 | + afficherLutin(anotherSprite, 200, 100); | |
86 | + majSurface(); | |
87 | + } | |
88 | + | |
89 | + attendreEvenement(); | |
90 | + | |
91 | + | |
92 | +} | |
93 | +fermerSurface(); | |
94 | +} | |
95 | + | |
96 | + | ... | ... |
1 | +++ a/test.h | |
... | ... | @@ -0,0 +1,41 @@ |
1 | +#ifndef test_h | |
2 | +#define test_h | |
3 | + | |
4 | +#define type_monstre 0 | |
5 | +#define type_vaisseau 1 | |
6 | +#define type_bouclier 2 | |
7 | + | |
8 | +typedef struct entite | |
9 | +{ int x,y; | |
10 | + int etat ; | |
11 | + int identifiant_entite; | |
12 | + int type ; | |
13 | + | |
14 | +}entite; | |
15 | + | |
16 | + | |
17 | + | |
18 | + | |
19 | +typedef struct liste_entite | |
20 | +{ | |
21 | + entite * premiere_entite; | |
22 | + int capacite; | |
23 | +}liste_entite; | |
24 | + | |
25 | + | |
26 | + | |
27 | +liste_entite * initiliserentite(liste_entite * entite ); | |
28 | +liste_entite * suppression_entite(liste_entite * entite); | |
29 | + | |
30 | + | |
31 | + | |
32 | + | |
33 | + | |
34 | + | |
35 | + | |
36 | + | |
37 | + | |
38 | + | |
39 | + | |
40 | + | |
41 | +#endif | ... | ... |