diff --git a/Graphique/Makefile b/Graphique/Makefile new file mode 100644 index 0000000..5791d72 --- /dev/null +++ b/Graphique/Makefile @@ -0,0 +1,29 @@ +# +# Makefile pour la bibliotheque graphique +# + +SOURCES = $(wildcard *.c) +OBJETS = $(SOURCES:.c=.o) +CIBLE = libgraph.a + +# +# Nom de la cible principale +# + +all: $(CIBLE) + +# +# Cible de nettoyage +# + +clean: + rm -f core *.o $(CIBLE) + +# +# Dependances pour la bibliotheque +# + +$(CIBLE): $(OBJETS) + $(AR) rs $@ $? + +$(CIBLE:.a=).o: $(CIBLE:.a=).c $(CIBLE:.a=).h diff --git a/Graphique/libgraph.c b/Graphique/libgraph.c new file mode 100644 index 0000000..99658e1 --- /dev/null +++ b/Graphique/libgraph.c @@ -0,0 +1,239 @@ +/**** Bibliotheque graphique ****/ + +/** Fichiers d'inclusion **/ + +#include +#include +#include "libgraph.h" + +/** Types **/ + +typedef struct +{ + int r, v, b; +} couleur; + +/** Constantes **/ + +#define BITS_PAR_PIXEL 32 +#define TAILLE_POLICE 20 + +static const couleur couleurs[] = { { 255, 255, 255 }, { 0, 0, 0 }, { 255, 0, 0 }, + { 0, 255, 0 }, { 0, 0, 255 }, { 255, 105, 180 }, + { 150, 150, 150 }, { -1, -1, -1 } }; + +static const char policeDefaut[]="/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; + +/** Variables globales **/ + +static SDL_Surface *surface; +TTF_Font* police; + +/** Fonctions **/ + +void choisirPolice(const char *chemin, int taille){ + police=TTF_OpenFont(chemin, taille); +} + +void initialiserTexte() { + TTF_Init(); + choisirPolice(policeDefaut, TAILLE_POLICE); +} + +/* Initialisation de la surface dessinable */ +unsigned char creerSurface (int largeur, int hauteur, char *titre) +{ + SDL_Init (SDL_INIT_VIDEO); + SDL_WM_SetCaption (titre, titre); + surface = SDL_SetVideoMode (largeur, hauteur, BITS_PAR_PIXEL, SDL_DOUBLEBUF); + initialiserTexte(); + + return (surface != NULL && police != NULL); +} + +/* Fermeture de la surface dessinable */ + +void fermerSurface (void) +{ + if (surface != NULL) SDL_FreeSurface (surface); + if (police != NULL) TTF_CloseFont(police); + TTF_Quit(); + SDL_Quit (); +} + +/* Creation d'une couleur */ + +static int creerCouleur (int ncouleur) +{ + couleur c = couleurs[ncouleur]; + return SDL_MapRGB (surface->format, c.r, c.v, c.b); +} + +/* Dessin d'un rectangle plein */ + +void rectanglePlein (int x, int y, int l, int h, int c) +{ + SDL_Rect rectangle = { x, y, l, h }; + SDL_FillRect (surface, &rectangle, creerCouleur (c)); + // SDL_Flip(surface); +} + +/* Manipulation de lutins */ + +static SDL_Surface *lutins[MAX_LUTINS]; +static int lutins_nb = 0; + +int lutinTexte(char* texte, int couleurTexte) { + couleur c=couleurs[couleurTexte]; + SDL_Color couleur={c.r, c.v, c.b}; + SDL_Surface* lutin=TTF_RenderText_Solid(police, texte, couleur); + if (lutin != NULL) + { + lutins[lutins_nb++] = lutin; + return lutins_nb - 1; + } + return -1; +} + +static void configurerLutin (SDL_Surface *lutin, int ncouleur) +{ + couleur c = couleurs[ncouleur]; + int fond = SDL_MapRGB (lutin->format, c.r, c.v, c.b); + SDL_SetColorKey (lutin, SDL_SRCCOLORKEY | SDL_RLEACCEL, fond); +} + +int chargerLutin (char *fichier, int couleur) +{ + if (lutins_nb >= MAX_LUTINS) return -2; + SDL_Surface *lutin = SDL_LoadBMP (fichier); + if (lutin != NULL) + { + lutins[lutins_nb++] = lutin; + if (couleur >= 0) configurerLutin (lutin, couleur); + return lutins_nb - 1; + } + return -1; +} + +void afficherLutin (int lutin, int x, int y) +{ + SDL_Rect position; + position.x = x; + position.y = y; + SDL_BlitSurface (lutins[lutin], NULL, surface, &position); +} + +int creerLutin (int x, int y, int largeur, int hauteur, int couleur) +{ + if (lutins_nb >= MAX_LUTINS) return -2; + int rmask, gmask, bmask, amask; +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + rmask = 0xff000000; + gmask = 0x00ff0000; + bmask = 0x0000ff00; + amask = 0x000000ff; +#else + rmask = 0x000000ff; + gmask = 0x0000ff00; + bmask = 0x00ff0000; + amask = 0xff000000; +#endif + if (couleur < 0) amask = 0x00000000; + SDL_Surface *lutin = + SDL_CreateRGBSurface (0, largeur, hauteur, BITS_PAR_PIXEL, rmask, gmask, bmask, amask); + SDL_Rect fenetre; + fenetre.x = x; + fenetre.y = y; + fenetre.h = hauteur; + fenetre.w = largeur; + SDL_BlitSurface (surface, &fenetre, lutin, NULL); + lutins[lutins_nb++] = lutin; + if (couleur >= 0) configurerLutin (lutin, couleur); + return lutins_nb - 1; +} + +void tailleLutin (int lutin, int *largeur, int *hauteur) +{ + *largeur = lutins[lutin]->w; + *hauteur = lutins[lutin]->h; +} + +int sauverLutin (int lutin, char *nom) { return SDL_SaveBMP (lutins[lutin], nom); } + +/* Manipulation de copie de surface en BMP */ + +int sauverSurface (char *fichier) { return SDL_SaveBMP (surface, fichier); } + +unsigned char chargerSurface (char *fichier) +{ + SDL_Surface *image = SDL_LoadBMP (fichier); + if (image != NULL) + { + SDL_BlitSurface (image, NULL, surface, NULL); + SDL_Flip (surface); + } + return (image != NULL); +} + +void majSurface (void) { SDL_Flip (surface); } + +/* Trouver la couleur d'un pixel */ + +int couleurPixel (int x, int y) +{ + int bpp = surface->format->BytesPerPixel; + Uint32 *p = (Uint32 *)(surface->pixels + y * surface->pitch + x * bpp); + Uint8 r, v, b; + SDL_GetRGB (*p, surface->format, &r, &v, &b); + int i = 0; + while (1) + { + if (couleurs[i].r < 0) break; + if (r == couleurs[i].r && v == couleurs[i].v && b == couleurs[i].b) break; + i++; + } + if (couleurs[i].r < 0) + return -1; + else + return i; +} + +/* Fonction de traitement des événements */ + +void lireEvenement (evenement *evt, char *touche, void **detail) +{ + static SDL_keysym _detail; + SDL_Event event; + while (SDL_PollEvent (&event)) + { + if (event.type == SDL_QUIT) *evt = quitter; + if (event.type == SDL_KEYDOWN || event.type == SDL_KEYUP) + { + *evt = (event.type == SDL_KEYDOWN) ? toucheBas : toucheHaut; + char *nom = SDL_GetKeyName (event.key.keysym.sym); + if (strlen (nom) == 1 && nom[0] >= 32 && nom[0] < 128) + *touche = nom[0]; + else + *touche = 0; + if (detail != NULL) + { + _detail = event.key.keysym; + *detail = &_detail; + } + break; + } + } +} + +void attendreEvenement (void) +{ + SDL_Event event; + while (SDL_WaitEvent (&event)) switch (event.type) + { + case SDL_QUIT: + exit (0); + case SDL_KEYDOWN: + case SDL_MOUSEBUTTONDOWN: + return; + } +} diff --git a/Graphique/libgraph.h b/Graphique/libgraph.h new file mode 100644 index 0000000..f518cff --- /dev/null +++ b/Graphique/libgraph.h @@ -0,0 +1,156 @@ +/**** Bibliotheque graphique (definitions) ****/ + +/** Constantes **/ + +#define COULEUR_BLANC 0 +#define COULEUR_NOIR 1 +#define COULEUR_ROUGE 2 +#define COULEUR_VERT 3 +#define COULEUR_BLEU 4 +#define COULEUR_ROSE 5 +#define COULEUR_GRIS 6 + +#define MAX_LUTINS 16 + +typedef enum {toucheBas, toucheHaut, quitter} evenement; + +/** Prototypes **/ + +/** + * @brief cree une fenetre 2D + * + * @param largeur en pixels de la fenetre + * @param hauteur en pixels de la fenetre + * @param titre de la fenetre (chaine de caractere) + */ +unsigned char creerSurface (int largeur, int hauteur, char *titre); + +/** + * @brief permet de charger un fichier image au format bmp (bitmap) + * + * @param fichier nom du fichier + */ +unsigned char chargerSurface (char *fichier); + + +/** + * @brief permet de sauvegarder une surface en image (format bmp) + * + * @param fichier nom du fichier + * @return 0 si OK, valeur negative sinon + */ +int sauverSurface (char *fichier); + +/** + * @brief met a jour la surface d'affichage + */ +void majSurface (void); + + +/** + * @brief libere la surface d'affichage + * a faire lors de la fermeture + * du programme + */ +void fermerSurface (void); + +/** + * @brief choisit la police de caractères à utiliser pour afficher du texte + * @param chemin nom du fichier de police (format .ttf, voir /usr/share/fonts/truetype) + * @param taille taille de la police + */ +void choisirPolice(const char *chemin, int taille); + +/** + * @brief dessine un rectange de taille (l,h) aux coordonnêes + * (x,y) et de couleur c + * + * @param x 0 <= x <= l_surface + * @param y 0 <= y <= h_surface + * @param l largeur en pixels + * @param h longueur en pixels + * @param c indice de couleur voir variable couleurs dans le fichier .c + */ +void rectanglePlein (int x, int y, int l, int h, int c); + + +/** + * @brief permet de determiner l'indice du tableau de couleur du + * pixel aux coordonnees (x,y) + * + * @param x 0 <= x <= l_surface + * @param y 0 <= y <= h_surface + * @return indice de couleur voire variable couleurs dans le fichier .c + */ +int couleurPixel (int x, int y); + +/** + * @brief crée un lutin à partir d'un texte + * + * @param texte le texte + * @param couleur indice de couleur du texte + * @return numero de lutin dans le tableau dynamique de lutin (< MAX_LUTINS) + */ +int lutinTexte(char *texte, int couleur); + +/** + * @brief charge un lutin à partir du fichier + * + * @param fichier image bitmap du lutin à charger + * @param couleur indice de couleurs à charger + * @return numero de lutin dans le tableau dynamique de lutin (< MAX_LUTINS) + */ +int chargerLutin (char *fichier, int couleur); + +/** + * @brief afficher un lutin aux coordonnées (x,y) + * + * @param lutin numero du lutin à afficher (< MAX_LUTINS) + * @param x abscisse de départ + * @param y ordonnée de départ + */ +void afficherLutin (int lutin, int x, int y); + +/** + * @brief creer un lutin de taille (l,h) aux coordonnées (x,y) + * + * @param x abscisse de départ + * @param y ordonnée de départ + * @param largeur largeur du lutin + * @param hauteur hauteur du lutin + * @param couleur indice de couleur à partir du tableau _couleurs_ + * @return indice du lutin dans le tableau global (< MAX_LUTINS) + */ +int creerLutin (int x, int y, int largeur, int hauteur, int couleur); + +/** + * @brief sauvegarde un lutin dans un fichier + * + * @param lutin numero de lutin à sauvegarder (< MAX_LUTINS) + * @param nom fichier pour la sauvegarde + * @return 0 si OK valeur négative sinon + */ +int sauverLutin (int lutin, char *nom); + +/** + * @brief calcule la taille (largeur,hauteur) d'un lutin + * + * @param lutin index du lutin (< MAX_LUTINS) + * @param largeur pointeur sur la largeur + * @param hauteur pointeur sur la hauteur + */ +void tailleLutin (int lutin, int *largeur, int *hauteur); + +/** + * @brief lire une touche au clavier + * + * @param evt pointeur sur evenement + * @param touche pointeur sur la touche pressée + * @param detail NULL ou keysim + */ +void lireEvenement (evenement *evt, char *touche, void **detail); + +/** + * @brief attente d'un evenement bouton, souris, fin de programme + */ +void attendreEvenement (void); diff --git a/ListeC/Liste.c b/ListeC/Liste.c deleted file mode 100644 index fc20058..0000000 --- a/ListeC/Liste.c +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include "Liste.h" - -void creer_liste(struct liste_entite *l) -{ - l = malloc(sizeof(struct liste_entite)); -} - -struct entite creer_entite(int x, int y, int idd) -{ - struct entite e; - e.posx=x; - e.posy=y; - e.id=idd; - return e; -} - -void ajout_tete(struct liste_entite **pL, struct entite x) -{ - struct liste_entite *tmp; - tmp = malloc(sizeof(struct liste_entite)); - tmp->enti = x; - tmp->suivant = *pL; - *pL = tmp; -} - - -void imprimer_liste(struct liste_entite *l) -{ - struct liste_entite *p; - p = l; - while (p != NULL) - { - printf("%d -> ",p->enti.posx); - p=p->suivant; - } - printf("\n"); -} - - diff --git a/ListeC/Liste.h b/ListeC/Liste.h deleted file mode 100644 index d2599fc..0000000 --- a/ListeC/Liste.h +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include - -struct entite -{ - int posx; - int posy; - int id; -}; - - -struct liste_entite -{ - struct entite enti; - struct liste_entite *suivant; -}; - - -void ajout_tete(struct liste_entite**, struct entite); - -void creer_liste(struct liste_entite*); - -struct entite creer_entite(int,int,int); - -void imprimer_liste(struct liste_entite*); diff --git a/Main/Makefile b/Main/Makefile deleted file mode 100644 index 3e94592..0000000 --- a/Main/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -CC=clang -TARGET=exec -CFLAGS=-g -W -Wall -Wextra -LDFLAGS=-I Graphique -l graph -L ../Graphique -l SDL -l SDL_ttf - -default: $(TARGET) - -Liste.o : ../ListeC/Liste.c ../ListeC/Liste.h - clang $(CFLAGS) -c ../ListeC/Liste.c - -Monstre.o : ../Monstre/Monstre.c ../Monstre/Monstre.h ../ListeC/Liste.h - clang $(CFLAGS) -c ../Monstre/Monstre.c - -Missile.o : ../Missile/Missile.c ../Missile/Missile.h ../ListeC/Liste.h - clang $(CFLAGS) -c ../Missile/Missile.c - -main.o : main.c ../ListeC/Liste.h - clang $(CFLAGS) -c main.c - - -$(TARGET): Liste.o main.o Monstre.o Missile.o - clang main.o Liste.o Monstre.o Missile.o -o $(TARGET) $(LDFLAGS) - -.PHONY: clean -clean: - rm -f *.o - rm -f $(TARGET) diff --git a/Main/main.c b/Main/main.c deleted file mode 100644 index 6cd88fb..0000000 --- a/Main/main.c +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include -#include -#include "../Graphique/libgraph.h" -#include "../ListeC/Liste.h" -#include "../Monstre/Monstre.h" -#include "../Missile/Missile.h" - -#define TailleX 500 -#define TailleY 500 -//clang Try.c -I Graphique -l graph -L Graphique -l SDL -l SDL_ttf - - -char touche() -{ - char touche; - evenement even; - lireEvenement (&even,&touche,NULL); - return touche; -} - -int main() -{ - struct liste_entite *enemies = NULL; - creer_liste(enemies); - ajout_tete(&enemies,creer_entite(50,50,0)); - ajout_tete(&enemies,creer_entite(150,50,0)); - ajout_tete(&enemies,creer_entite(250,50,0)); - imprimer_liste(enemies); - int sens=1; - int *psens=&sens; - - struct entite joueur; - joueur.posx=225; - joueur.posy=470; - int canon = chargerLutin("../../Lutins/invader_canon.bmp",COULEUR_NOIR); - - struct liste_entite *tires = NULL; - creer_liste(tires); - //ajout_tete(&tires,creer_entite(225,470,0)); - Tirer(joueur,&tires); - imprimer_liste(tires); - int missile = chargerLutin("../../Lutins/invader_missile.bmp",COULEUR_NOIR); - - char Nom[20]="PremiereFenetre"; - creerSurface(TailleX,TailleY,Nom); - int lulu = chargerLutin("../../Lutins/invader_monstre1_1.bmp",COULEUR_NOIR); - - while(1) - { - afficherLutin(canon,joueur.posx,joueur.posy); - DeplacementLutin(lulu,enemies,psens,1); - - char c = touche(); - printf("%c",c); - DeplacementTire(missile,tires); - - majSurface(); - rectanglePlein(0,0,TailleX,TailleY,COULEUR_NOIR); - SDL_Delay(20); - } - return 0; -} diff --git a/Missile/Missile.c b/Missile/Missile.c deleted file mode 100644 index c66e2fe..0000000 --- a/Missile/Missile.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include "../Graphique/libgraph.h" -#include "../ListeC/Liste.h" -#include "Missile.h" - - -void Tirer(struct entite joueur, struct liste_entite **pl) -{ - ajout_tete(pl,creer_entite(joueur.posx+18,joueur.posy-5,0)); -} - - -void DeplacementTire(int tire,struct liste_entite *l) -{ - struct liste_entite *ml=l; - while(ml != NULL) - { - ml->enti.posy-=5; - afficherLutin(tire,ml->enti.posx,ml->enti.posy); - ml=ml->suivant; - } -} diff --git a/Missile/Missile.h b/Missile/Missile.h deleted file mode 100644 index 070415a..0000000 --- a/Missile/Missile.h +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -void Tirer(struct entite, struct liste_entite**); - -void DeplacementTire(int,struct liste_entite*); diff --git a/Monstre/Monstre.c b/Monstre/Monstre.c deleted file mode 100644 index 689d6a0..0000000 --- a/Monstre/Monstre.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include -#include "../Graphique/libgraph.h" -#include "../ListeC/Liste.h" -#include "Monstre.h" - -//sens 1 = Va vers la droite -void DeplacementLutin(int lutin,struct liste_entite *l, int *psens, int speed) -{ - int ind=0; - struct liste_entite *ml=l; - while(ml != NULL) - { - if (*psens==1) - { - ml->enti.posx+=speed; - if(ml->enti.posx>=450)ind=1; - afficherLutin(lutin,ml->enti.posx,ml->enti.posy); - } - else - { - ml->enti.posx-=speed; - if(ml->enti.posx<=50)ind=2; - afficherLutin(lutin,ml->enti.posx,ml->enti.posy); - } - ml=ml->suivant; - } - if (ind==1) - { - *psens=0; - struct liste_entite *ml2=l; - while(ml2 != NULL) - { - ml2->enti.posy+=30; - ml2=ml2->suivant; - } - } - else if (ind==2) - { - *psens=1; - struct liste_entite *ml2=l; - while(ml2 != NULL) - { - ml2->enti.posy+=30; - ml2=ml2->suivant; - } - } -} - diff --git a/Monstre/Monstre.h b/Monstre/Monstre.h deleted file mode 100644 index 231eafa..0000000 --- a/Monstre/Monstre.h +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include - -void DeplacementLutin(int,struct liste_entite*,int*,int); -- libgit2 0.21.2