diff --git a/V1/Makefile b/V1/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..c5c5b88aefd404c9f11d1d0ce5191747c17c9340 --- /dev/null +++ b/V1/Makefile @@ -0,0 +1,21 @@ +CFLAGS = -Wall -O3 `sdl2-config --cflags` +LDFLAGS = -m64 `sdl2-config --libs` -lSDL2_ttf -lm + +INC = sdl2.h logic.h graphics.h const.h data.h sdl2-ttf.h event.h +SRC = main.c sdl2.c logic.c graphics.c data.c sdl2-ttf.c event.c +OBJ = $(SRC:%.c=%.o) +PROG = fastcar + +%.o: %.c $(INC) + gcc $(CFLAGS) -c $< + +fastcar: $(OBJ) + gcc $(CFLAGS) $(OBJ) $(LDFLAGS) -o $@ + +doc: $(PROG) + doxygen ./$(PROG) + make -C latex + +clean: + rm -f *~ *.o $(PROG) + rm -rf latex html diff --git a/V1/Makefile_win b/V1/Makefile_win new file mode 100644 index 0000000000000000000000000000000000000000..318c22134078590eff221d770e82af69891b5533 --- /dev/null +++ b/V1/Makefile_win @@ -0,0 +1,24 @@ +CFLAGS = -Wall -O3 -Dmain=SDL_main +LDFLAGS = -m64 -lm -lmingw32 -lSDL2main -lSDL2 -lSDL2_ttf +SDL2_INCLUDE_DIR = C:\SDL2-2.0.12\x86_64-w64-mingw32\include +SDL2_LIBRARIES_DIR = C:\SDL2-2.0.12\x86_64-w64-mingw32\lib + +INC = sdl2.h logic.h graphics.h const.h data.h sdl2-ttf.h event.h +SRC = main.c sdl2.c logic.c graphics.c data.c sdl2-ttf.c event.c +OBJ = $(SRC:%.c=%.o) + +PROG = fastcar.exe + +%.o: %.c $(INC) + gcc $(CFLAGS) -c $< -I $(SDL2_INCLUDE_DIR) + +$(PROG): $(OBJ) + gcc $(CFLAGS) $(OBJ) $(LDFLAGS) -o $@ -L $(SDL2_LIBRARIES_DIR) + +doc: $(PROG) + doxygen $(PROG) + +.PHONY: clean +clean: + del /f /q *.o *~ $(PROG) + rd /s /q latex html diff --git a/V1/const.h b/V1/const.h new file mode 100644 index 0000000000000000000000000000000000000000..f4a314a8e3d555ad704180aa16685590f3babec2 --- /dev/null +++ b/V1/const.h @@ -0,0 +1,62 @@ +/** + * \file const.h + * \brief Rassemblement des constantes utiles au jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 26 septembre 2021 + */ +#ifndef __CONST_H__ +#define __CONST_H__ + + + +/** + * \brief Largeur de l'écran de jeu + */ +#define SCREEN_WIDTH 840 + +/** + * \brief Hauteur de l'écran de jeu + */ +#define SCREEN_HEIGHT 650 + + +/** + * \brief Taille d'un vaisseau + */ +#define SHIP_SIZE 100 + +/** + * \brief Nombre de bullets + */ +#define NB_BULLETS 30 + + +/** + * \brief Nombre de bullets + */ +#define BULLET_SIZE 8 + + +/** + * \brief Hauteur de la ligne d'arrivée + */ +#define FINISH_LINE_HEIGHT 10 + + +/** + * \brief Pas de déplacement horizontal du vaisseau + */ +#define MOVING_STEP 10 + + +/** + * \brief Vitesse initiale de déplacement vertical des éléments du jeu + */ +#define INITIAL_SPEED 2 + +#define NB_BACKGROUND 2000 + +#define NB_VOITURES 3 + + +#endif \ No newline at end of file diff --git a/V1/data.h b/V1/data.h new file mode 100644 index 0000000000000000000000000000000000000000..6e2cd2c62457614e8584e976550444f04b30acf7 --- /dev/null +++ b/V1/data.h @@ -0,0 +1,132 @@ +/** + * \file data.h + * \brief Gestion des données du jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 26 septembre 2021 + */ + +#ifndef __DATA_H__ +#define __DATA_H__ + +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> + +#include "sdl2.h" +#include "sdl2-ttf.h" +#include "const.h" + + + + +enum{ + SPACESHIP, + BULLET, + METEORE, + FINISH_LINE, + BACKGROUND, +}; + + +enum{ + CONTINUE, + EXIT, + LOOSE, + WIN, +}; + + + +/** + * \brief Représentation du sprite +*/ +struct sprite_s{ + double x; /*!<L'abscisse au centre*/ + double y; /*!<L'ordonnée au centre*/ + double w; /*!<largeur*/ + double h; /*!<hauteur*/ + char is_visible; /*!< Champ indiquant si le sprite est visible */ + int type; /*!< Champ indiquant le type de sprite (cf l'enum de ce fichier) */ +}; +/** + * \brief Type qui correspond aux sprite + */ +typedef struct sprite_s sprite_t ; + + + + +/** + * \brief Représentation des bullets +*/ +struct bullet_s{ + sprite_t bullet; + double vy; +}; +/** + * \brief Type qui correspond aux bullet + */ +typedef struct bullet_s bullet_t; + + +/** + * \brief Représentation des bullets +*/ +struct bullets_s{ + bullet_t bullet[NB_BULLETS]; + int bullet_nb; +}; +/** + * \brief Type qui correspond aux bullets + */ +typedef struct bullets_s bullets_t; + + +/** + * \brief Représentation d'un spaceship +*/ +struct spaceship_s{ + sprite_t spaceship; + bullets_t bullets; +}; +/** + * \brief Type qui correspond à un spaceship + */ +typedef struct spaceship_s spaceship_t; + + +/** + * \brief Représentation du monde du jeu +*/ +struct world_s{ + spaceship_t spaceship; + sprite_t background; + sprite_t finish_line; + double vy; /*!< Champ indiquant la vitesse sur l'axe des y */ + + int gameover; /*!< Champ indiquant si l'on est à la fin du jeu */ + + Uint32 t0; /*!<Ticks de la première frame (SDL_GetTicks()) */ +}; +/** + * \brief Type qui correspond aux données du monde + */ +typedef struct world_s world_t; + + + +#include "graphics.h" + + + +int is_game_over(world_t *world); +void init_spaceship(spaceship_t *spaceship); +void init_sprite(sprite_t *sprite, double x, double y, double w, double h, int type); +void init_data(world_t *world); +void init_bullet(spaceship_t *spaceship); +void clean_data(world_t *world); + +void update_background(world_t* world); +void update_data(world_t *world); + +#endif \ No newline at end of file diff --git a/V1/event.h b/V1/event.h new file mode 100644 index 0000000000000000000000000000000000000000..385a54a125cec018dc381fdfca8d0ae89c353887 --- /dev/null +++ b/V1/event.h @@ -0,0 +1,24 @@ +/** + * \file event.h + * \brief Gestion des entrées claviers du joueur + * \author YATIME Marouane - AIT OUALI Marouane + * \date 26 septembre 2021 + */ +#ifndef __EVENT_H__ +#define __EVENT_H__ + +#include <stdio.h> +#include <stdlib.h> + +#include "sdl2.h" +#include "sdl2-ttf.h" +#include "const.h" +#include "data.h" + + + +void handle_events(SDL_Event *event, world_t *world); + + + +#endif \ No newline at end of file diff --git a/V1/graphics.h b/V1/graphics.h new file mode 100644 index 0000000000000000000000000000000000000000..d51359c3b53d9ecfb2a1dfad0c57043407f463a0 --- /dev/null +++ b/V1/graphics.h @@ -0,0 +1,53 @@ +/** + * \file graphics.h + * \brief Gestion de l'affichage du jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 26 septembre 2021 + */ +#ifndef __GRAPHICS_H__ +#define __GRAPHICS_H__ + +#include <stdio.h> +#include <stdlib.h> + +#include "sdl2.h" +#include "sdl2-ttf.h" +#include "const.h" + + + +/** + * \brief Représentation pour stocker les textures nécessaires à l'affichage graphique +*/ +struct ressources_s{ + SDL_Texture* background; /*!< Texture liée à l'image du fond de l'écran. */ + SDL_Texture* spaceship; /*!< Texture liée au vaisseau affiché sur l'écran. */ + SDL_Texture* finish_line; /*!< Texture liée à la ligne d'arrivée affiché sur l'écran. */ + SDL_Texture* meteorite; /*!< Texture liée au météorite sur l'écran. */ + SDL_Texture* bullet; /*!< Texture liée à la bullet sur l'écran. */ + TTF_Font* font; /*!< Police d'écriture utilisé */ +}; +/** + * \brief Type qui correspond aux textures du jeu +*/ +typedef struct ressources_s ressources_t; + + + +#include "data.h" + + + +void init_textures(SDL_Renderer *renderer, ressources_t *ressources); +void clean_textures(ressources_t *ressources); +void apply_background(SDL_Renderer *renderer, SDL_Texture *texture); +void apply_sprite(SDL_Renderer *renderer, SDL_Texture *texture, sprite_t* sprite); +void apply_bullets(SDL_Renderer *renderer, SDL_Texture *texture, bullets_t *bullets); +void print_all_text(SDL_Renderer *renderer, ressources_t *ressources, world_t *world); +void print_menu_debut(SDL_Renderer *renderer, ressources_t *ressources, world_t *world); +void print_menu_fin(SDL_Renderer *renderer, ressources_t *ressources, world_t *world); +void refresh_graphics(SDL_Renderer *renderer, world_t *world,ressources_t *ressources); + + + +#endif \ No newline at end of file diff --git a/V1/logic.h b/V1/logic.h new file mode 100644 index 0000000000000000000000000000000000000000..660f024fe724e15b69ca0a705b3844c2228c47d8 --- /dev/null +++ b/V1/logic.h @@ -0,0 +1,26 @@ +/** + * \file logic.h + * \brief Gestion de la logique du jeu (physique) + * \author YATIME Marouane - AIT OUALI Marouane + * \date 26 septembre 2021 + */ +#ifndef __LOGIC_H__ +#define __LOGIC_H__ + +#include <stdio.h> +#include <stdlib.h> + +#include "sdl2.h" +#include "sdl2-ttf.h" +#include "const.h" +#include "data.h" + + + +void screen_collide(sprite_t* s); +int sprites_collide(sprite_t *sp1, sprite_t *sp2); +void handle_sprites_collision(sprite_t *sp1, sprite_t *sp2, world_t *world); + + + +#endif \ No newline at end of file diff --git a/V1/sdl2-ttf.h b/V1/sdl2-ttf.h new file mode 100644 index 0000000000000000000000000000000000000000..acad08879eebad0517ab2aba8d0fefaac2080c61 --- /dev/null +++ b/V1/sdl2-ttf.h @@ -0,0 +1,58 @@ +/** + * \file sdl2-ttf.h + * \brief + * \author YATIME Marouane - AIT OUALI Marouane + * \date 26 septembre 2021 + */ + +#ifndef __SDL2_TTF_H +#define __SDL2_TTF_H + +#include <SDL2/SDL.h> +#include <SDL2/SDL_ttf.h> + + +/** + * \brief La fonction initialise l'environnement TTF +*/ +void init_ttf(); + + +/** + * \brief La fonction charge une police + * \param path le chemin du fichier correpondant à la police + * \param font_size la taille de la police + * \return la police chargée +*/ + +TTF_Font * load_font(const char* path, int font_size); + +/** + * \brief La fonction applique un texte dans une certaine police sur le renderer à une certaine position et avec une certaine dimension + * \param renderer le renderer + * \param x abscisse du coin en haut à gauche du texte + * \param y son abscisse + * \param w la largeur du message + * \param h sa hauteur + * \param text le texte à afficher + * \param font la police +*/ + +void apply_text(SDL_Renderer *renderer, int x, int y, int w, int h, const char *text, TTF_Font *font, SDL_Color color); + + + +/** + * \brief La fonction nettoie une police en mémoire + * \param font la police +*/ +void clean_font(TTF_Font * font); + + +/** + * \brief La fonction ferme et nettoie l'environnement TTF +*/ +void clean_ttf(); + +#endif + diff --git a/V1/sdl2.h b/V1/sdl2.h new file mode 100644 index 0000000000000000000000000000000000000000..f5127d14dacd29bb7df603e7c06d8f82a68c9a9b --- /dev/null +++ b/V1/sdl2.h @@ -0,0 +1,87 @@ +/** + * \file sdl2.h + * \brief en-tête du module correspondant à une sur-couche de SDL2 pour simplifier son utilisation pour le projet + * \author YATIME Marouane - AIT OUALI Marouane + * \date 26 septembre 2021 + */ + + +#ifndef __SDL2__H__ +#define __SDL2__H__ + +#include <SDL2/SDL.h> + + +/** + * \brief La fonction nettoie le renderer et la fenêtre du jeu en mémoire + * \param renderer le renderer à nettoyer + * \param window la fenêtre à nettoyer +*/ + +void clean_sdl(SDL_Renderer *renderer,SDL_Window *window); + +/** + * \brief La fonction charge une image et renvoie la texture correspondante où la couleur RGB (255, 0, 255) est rendue transparente. + * \param path est le chemin du fichier image. Le fichier doit être obligatoirement du BMP. + * \param renderer le renderer + * \return la surface SDL contenant l'image avec la couleur RGB (255,0,255) rendue transparente. Elle renvoie NULL si le chargement a échoué + * (ex. le fichier path n'existe pas) +*/ +SDL_Texture *load_image(const char path[], SDL_Renderer *renderer); + + +/** + * \brief La fonction initialise la SDL. + * Elle crée la fenêtre du jeu ainsi que le renderer + * \param window la fenêtre du jeu + * \param renderer le renderer + * \param width largeur de l'écran de jeu + * \param height hauteur de l'écran de jeu + * \return -1 en cas d'erreur, 0 sinon +*/ + +int init_sdl(SDL_Window **window, SDL_Renderer **renderer, int width, int height); + +/** + * \brief La fonction nettoie une texture en mémoire + * \param texture la texture à nettoyer +*/ + +void clean_texture(SDL_Texture *texture); + + +/** + * \brief La fonction permet d'appliquer une texture sur le renderer à une position donnée. La hauteur et la largeur est la même que celle de la texture. + * \param texture la texture que l'on va appliquer + * \param renderer le renderer qui va recevoir la texture + * \param x l'abscisse sur le renderer de l'endroit où est appliquée texture (point en haut à gauche de la surface) + * \param y l'ordonnée sur le renderer de l'endroit où est appliquée texture (point en haut à gauche de la surface) +*/ + +void apply_texture(SDL_Texture *texture,SDL_Renderer *renderer,int x, int y); + + + +/** + * \brief La fonction vide le contenu graphique du renderer lié à l'écran de jeu + * \param renderer le renderer de l'écran +*/ + +void clear_renderer(SDL_Renderer *renderer); + +/** + * \brief La fonction met à jour l'écran avec le contenu du renderer + * \param renderer le renderer de l'écran +*/ + +void update_screen(SDL_Renderer *renderer); + +/** + * \brief La fonction met le programme en pause pendant un laps de temps + * \param time ce laps de temps en milliseconde +*/ + + +void pause(int time); + +#endif