diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..d564005163a46bf1edd682ba7c60988b3598e3e4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "files.associations": { + "sdl2-light.h": "c", + "world.h": "c", + "display.h": "c" + } +} \ No newline at end of file diff --git a/Makefile b/Makefile index 1add66b926038fe7544211eb47363dae5cdfe054..74d11f05f1628b2f348f6cffd38ac49d930335c1 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,17 @@ -CFLAGS = -O3 -Dmain=SDL_main +CFLAGS = -O3 -Dmain=SDL_main LDFLAGS = -lm -lmingw32 -lSDL2main -lSDL2 SDL2_INCLUDE_DIR = src/include SDL2_LIBRARIES_DIR = src/lib -INC = sdl2-light.h -SRC = main.c sdl2-light.c +INC = sdl2-light.h library/Display/Display.h library/World/world.h +SRC = main.c sdl2-light.c library/Display/Display.c library/World/world.c + OBJ = $(SRC:%.c=%.o) PROG = spacecorridor.exe %.o: %.c $(INC) - gcc $(CFLAGS) -c $< -I $(SDL2_INCLUDE_DIR) + gcc $(CFLAGS) -c $< -I $(SDL2_INCLUDE_DIR) -o $@ $(PROG): $(OBJ) gcc $(CFLAGS) $(OBJ) $(LDFLAGS) -o $@ -L $(SDL2_LIBRARIES_DIR) @@ -21,4 +22,4 @@ doc: $(PROG) .PHONY: clean clean: del /f /q *.o *~ $(PROG) - rd /s /q latex html + rd /s /q latex html \ No newline at end of file diff --git a/constante.c b/constante.c new file mode 100644 index 0000000000000000000000000000000000000000..bd2ee450ee5967343de2dc532fcf42ec07e493b8 --- /dev/null +++ b/constante.c @@ -0,0 +1,45 @@ +/** + * \brief Largeur de l'écran de jeu + */ +#define SCREEN_WIDTH 300 + +/** + * \brief Hauteur de l'écran de jeu + */ +#define SCREEN_HEIGHT 480 + + +/** + * \brief Taille d'un vaisseau + */ + +#define SHIP_SIZE 32 + + +/** + * \brief Taille d'un météorite +*/ + +#define METEORITE_SIZE 32 + + +/** + * \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 \ No newline at end of file diff --git a/library/Display/Display.c b/library/Display/Display.c new file mode 100644 index 0000000000000000000000000000000000000000..4b0a4c760017f5a32bf1dd65176476aa063e7c27 --- /dev/null +++ b/library/Display/Display.c @@ -0,0 +1,75 @@ +#include "Display.h" +#include "../../constante.c" + +void init_textures(SDL_Renderer *renderer, textures_t *textures){ + textures->background = load_image( "ressources/space-background.bmp",renderer); + textures->ship = load_image( "ressources/spaceship.bmp",renderer); + textures->meteorite = load_image( "ressources/meteorite.bmp",renderer); + textures->finishLine = load_image( "ressources/finish_line.bmp",renderer); +} + +void apply_background(SDL_Renderer *renderer, SDL_Texture *texture){ + if(texture != NULL){ + apply_texture(texture, renderer, 0, 0); + } +} + +void apply_sprite(SDL_Renderer * renderer, SDL_Texture *texture, sprite_t *sprite){ + if(texture != NULL){ + SDL_Rect rect; + rect.x = sprite->x; + rect.y = sprite->y; + rect.w = sprite->w; + rect.h = sprite->h; + SDL_RenderCopy(renderer, texture, NULL, &rect); + } +} + +void apply_wall(SDL_Renderer * renderer, SDL_Texture *texture, int x, int y){ + if(texture != NULL){ + SDL_Rect rect; + rect.x = x; + rect.y = y; + rect.w = METEORITE_SIZE; + rect.h = METEORITE_SIZE; + SDL_RenderCopy(renderer, texture, NULL, &rect); + } +} + + +void refresh_graphics(SDL_Renderer *renderer, world_t *world,textures_t *textures){ + + //on vide le renderer + clear_renderer(renderer); + + //application des textures dans le renderer + apply_background(renderer, textures->background); + /* A COMPLETER */ + apply_sprite(renderer, textures->ship, world->vaisseau); + + apply_sprite(renderer, textures->finishLine, world->ligneArriver); + + for (int i = 0; i < world->mur->w/METEORITE_SIZE ; i++){ + for (int i2 = 0; i2 < world->mur->h/METEORITE_SIZE ; i2++){ + apply_wall(renderer, textures->meteorite, world->mur->x+i*METEORITE_SIZE, world->mur->y+i2*METEORITE_SIZE); + } + } + + + // on met à jour l'écran + update_screen(renderer); +} + + +void clean(SDL_Window *window, SDL_Renderer * renderer, textures_t *textures, world_t * world){ + clean_data(world); + clean_textures(textures); + clean_sdl(renderer,window); +} + +void clean_textures(textures_t *textures){ + SDL_DestroyTexture(textures->background); + SDL_DestroyTexture(textures->ship); + SDL_DestroyTexture(textures->meteorite); + SDL_DestroyTexture(textures->finishLine); +} \ No newline at end of file diff --git a/library/Display/Display.h b/library/Display/Display.h new file mode 100644 index 0000000000000000000000000000000000000000..b47d3d8180bbbf1f34a06f17aec4f1882ab60c35 --- /dev/null +++ b/library/Display/Display.h @@ -0,0 +1,79 @@ +#include "../../sdl2-light.h" +#include "../World/world.h" +#include "../../constante.c" + +#ifndef DISPLAY_H +#define DISPLAY_H +/** + * \brief Représentation pour stocker les textures nécessaires à l'affichage graphique +*/ + +struct textures_s{ + SDL_Texture* background; /*!< Texture liée à l'image du fond de l'écran. */ + SDL_Texture* ship; /*!< Texture liée à l'image du vaisseau. */ + SDL_Texture* meteorite; /*!< Texture liée à l'image du météorite. */ + SDL_Texture* finishLine; /*!< Texture liée à l'image de la ligne d'arrivée. */ + /* A COMPLETER */ +}; + +/** + * \brief Type qui correspond aux textures du jeu +*/ + +typedef struct textures_s textures_t; + +void init_textures(SDL_Renderer *renderer, textures_t *textures); + +/** + * \brief La fonction applique la texture du fond sur le renderer lié à l'écran de jeu + * \param renderer le renderer + * \param texture la texture liée au fond +*/ +void apply_background(SDL_Renderer *renderer, SDL_Texture *texture); + +/** + * \brief La fonction qui applique la texture \a texture sur le renderer \a renderer en fonction des données du sprite \a sprite + * + * \param texture + * \param renderer + * \param sprite + */ +void apply_sprite(SDL_Renderer * renderer, SDL_Texture *texture, sprite_t *sprite); + +/** + * \brief La fonction qui applique la texture \a texture sur le renderer \a renderer en fonction des coordonnées \a x et \a y + * + * \param renderer + * \param texture + * \param x + * \param y + */ +void apply_wall(SDL_Renderer * renderer, SDL_Texture *texture, int x, int y); + + +/** + * \brief La fonction rafraichit l'écran en fonction de l'état des données du monde + * \param renderer le renderer lié à l'écran de jeu + * \param world les données du monde + * \param textures les textures + */ +void refresh_graphics(SDL_Renderer *renderer, world_t *world,textures_t *textures); + +/** + * \brief La fonction nettoie les textures + * \param textures les textures +*/ + +void clean_textures(textures_t *textures); + +/** +* \brief fonction qui nettoie le jeu: nettoyage de la partie graphique (SDL), nettoyage des textures, nettoyage des données +* \param window la fenêtre du jeu +* \param renderer le renderer +* \param textures les textures +* \param world le monde +*/ + +void clean(SDL_Window *window, SDL_Renderer * renderer, textures_t *textures, world_t * world); + +#endif \ No newline at end of file diff --git a/library/Display/Display.o b/library/Display/Display.o new file mode 100644 index 0000000000000000000000000000000000000000..0aa5943d43618e3d783f6253bdcc9e0a6864a7be Binary files /dev/null and b/library/Display/Display.o differ diff --git a/library/World/world.c b/library/World/world.c new file mode 100644 index 0000000000000000000000000000000000000000..041ecc434271583ac25ca335de3f0c6c552de8ed --- /dev/null +++ b/library/World/world.c @@ -0,0 +1,77 @@ +#include "world.h" + +/** + * \brief La fonction met à jour les données en tenant compte de la physique du monde + * \param les données du monde + */ + +void update_data(world_t *world){ + world->ligneArriver->y += INITIAL_SPEED - world->speed_h; + world->mur->y += INITIAL_SPEED - world->speed_h; +} + +/** + * \brief La fonction indique si le jeu est fini en fonction des données du monde + * \param world les données du monde + * \return 1 si le jeu est fini, 0 sinon + */ + +int is_game_over(world_t *world){ + return world->gameover; +} + +void print_sprite(sprite_t *sprite){ + printf("x = %d, y = %d, w = %d, h = %d\n", sprite->x, sprite->y, sprite->w, sprite->h); +} + +/** + * \brief La fonction initialise les sprites du jeu + * + * \param sprite + * \param x + * \param y + * \param w + * \param h + */ +sprite_t *init_sprite(sprite_t *sprite, int x, int y, int w, int h){ + sprite = malloc(sizeof(sprite_t)); + sprite->x = x; + sprite->y = y; + sprite->w = w; + sprite->h = h; + return sprite; +} + +/** + * \brief La fonction initialise les données du monde du jeu + * \param world les données du monde + */ + + +void init_data(world_t * world){ + + //on n'est pas à la fin du jeu + world->gameover = 0; + world->speed_h = 0; + + // Initialisation du vaisseau + world->vaisseau = init_sprite(world->vaisseau, SCREEN_WIDTH/2 - SHIP_SIZE/2, SCREEN_HEIGHT - SHIP_SIZE, SHIP_SIZE, SHIP_SIZE); + world->mur = init_sprite(world->mur, 0, 0, 3*METEORITE_SIZE, 7*METEORITE_SIZE); + world->ligneArriver = init_sprite(world->ligneArriver, 0, -40, SCREEN_WIDTH, FINISH_LINE_HEIGHT); + + print_sprite(world->vaisseau); +} + + +/** + * \brief La fonction nettoie les données du monde + * \param world les données du monde + */ + + +void clean_data(world_t *world){ + /* utile uniquement si vous avez fait de l'allocation dynamique (malloc); la fonction ici doit permettre de libérer la mémoire (free) */ + free(world->vaisseau); +} + + diff --git a/library/World/world.h b/library/World/world.h new file mode 100644 index 0000000000000000000000000000000000000000..64e7afee74475f1f91651bd203bde7ebfb0b318b --- /dev/null +++ b/library/World/world.h @@ -0,0 +1,55 @@ + +/** + * \brief Fichier qui contient les données du monde du jeu + * + */ + +#include "../../constante.c" + +#ifndef WORLD_H +#define WORLD_H + +/** + * \brief Représentation pour stocker les données du vaisseau ou autre sprites + * + */ + +struct sprite_s{ + int x; + int y; + int w; + int h; +}; + +typedef struct sprite_s sprite_t; + +/** + * \brief Représentation du monde du jeu +*/ +struct world_s{ + sprite_t *vaisseau ; /*!< Représentation du vaisseau */ + sprite_t *mur; /*!< Représentation du météorite */ + sprite_t *ligneArriver; + int gameover; /*!< Champ indiquant si l'on est à la fin du jeu */ + int speed_h; /*!< Vitesse de déplacement horizontal des éléments du jeu */ + +}; +/** + * \brief Type qui correspond aux données du monde + */ + +typedef struct world_s world_t; + +void update_data(world_t *world); + +int is_game_over(world_t *world); + +void print_sprite(sprite_t *sprite); + +sprite_t *init_sprite(sprite_t *sprite, int x, int y, int w, int h); + +void init_data(world_t * world); + +void free_data(world_t * world); + +#endif diff --git a/library/World/world.o b/library/World/world.o new file mode 100644 index 0000000000000000000000000000000000000000..69556e66efb4aa19c8232a04632ed7f93c23de64 Binary files /dev/null and b/library/World/world.o differ diff --git a/main.c b/main.c index 64e2ec0568aa76b2274f2abb7e67826eb5d1a904..da291ac105268e6d9e3076916fe51bb7c451d211 100644 --- a/main.c +++ b/main.c @@ -8,198 +8,16 @@ #include "sdl2-light.h" #include <stdio.h> - -/** - * \brief Largeur de l'écran de jeu - */ -#define SCREEN_WIDTH 300 - -/** - * \brief Hauteur de l'écran de jeu - */ -#define SCREEN_HEIGHT 480 - - -/** - * \brief Taille d'un vaisseau - */ - -#define SHIP_SIZE 32 - - -/** - * \brief Taille d'un météorite -*/ - -#define METEORITE_SIZE 32 - - -/** - * \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 - - - - -/** - * \brief Représentation pour stocker les textures nécessaires à l'affichage graphique -*/ - -struct textures_s{ - SDL_Texture* background; /*!< Texture liée à l'image du fond de l'écran. */ - SDL_Texture* ship; /*!< Texture liée à l'image du vaisseau. */ - SDL_Texture* meteorite; /*!< Texture liée à l'image du météorite. */ - SDL_Texture* finishLine; /*!< Texture liée à l'image de la ligne d'arrivée. */ - /* A COMPLETER */ -}; +#include "library/Display/Display.h" +#include "library/World/world.h" -/** - * \brief Type qui correspond aux textures du jeu -*/ - -typedef struct textures_s textures_t; - - -/** - * \brief Représentation pour stocker les données du vaisseau - * - */ -struct sprite_s{ - int x; - int y; - int w; - int h; -}; - -typedef struct sprite_s sprite_t; - -/** - * \brief Représentation du monde du jeu -*/ - -struct world_s{ - sprite_t *vaisseau ; /*!< Représentation du vaisseau */ - sprite_t *mur; /*!< Représentation du météorite */ - sprite_t *ligneArriver; - int gameover; /*!< Champ indiquant si l'on est à la fin du jeu */ - int speed_h; /*!< Vitesse de déplacement horizontal des éléments du jeu */ - -}; - -/** - * \brief Type qui correspond aux données du monde - */ - -typedef struct world_s world_t; - /** * \brief Fonction qui affiche les données du vaisseau * */ -void print_sprite(sprite_t *sprite){ - printf("x = %d, y = %d, w = %d, h = %d\n", sprite->x, sprite->y, sprite->w, sprite->h); -} - -/** - * \brief La fonction initialise les sprites du jeu - * - * \param sprite - * \param x - * \param y - * \param w - * \param h - */ -sprite_t *init_sprite(sprite_t *sprite, int x, int y, int w, int h){ - sprite = malloc(sizeof(sprite_t)); - sprite->x = x; - sprite->y = y; - sprite->w = w; - sprite->h = h; - return sprite; -} - -/** - * \brief La fonction initialise les données du monde du jeu - * \param world les données du monde - */ - - -void init_data(world_t * world){ - - //on n'est pas à la fin du jeu - world->gameover = 0; - world->speed_h = 0; - - // Initialisation du vaisseau - - - world->vaisseau = init_sprite(world->vaisseau, SCREEN_WIDTH/2 - SHIP_SIZE/2, SCREEN_HEIGHT - SHIP_SIZE, SHIP_SIZE, SHIP_SIZE); - world->mur = init_sprite(world->mur, 0, 0, 3*METEORITE_SIZE, 7*METEORITE_SIZE); - world->ligneArriver = init_sprite(world->ligneArriver, 0, -40, SCREEN_WIDTH, FINISH_LINE_HEIGHT); - - print_sprite(world->vaisseau); -} - - - - -/** - * \brief La fonction nettoie les données du monde - * \param world les données du monde - */ - - -void clean_data(world_t *world){ - /* utile uniquement si vous avez fait de l'allocation dynamique (malloc); la fonction ici doit permettre de libérer la mémoire (free) */ - free(world->vaisseau); -} - - - -/** - * \brief La fonction indique si le jeu est fini en fonction des données du monde - * \param world les données du monde - * \return 1 si le jeu est fini, 0 sinon - */ - -int is_game_over(world_t *world){ - return world->gameover; -} - - - -/** - * \brief La fonction met à jour les données en tenant compte de la physique du monde - * \param les données du monde - */ - -void update_data(world_t *world){ - world->ligneArriver->y += INITIAL_SPEED - world->speed_h; - world->mur->y += INITIAL_SPEED - world->speed_h; -} - - - /** * \brief La fonction gère les évènements ayant eu lieu et qui n'ont pas encore été traités * \param event paramètre qui contient les événements @@ -251,121 +69,12 @@ void handle_events(SDL_Event *event,world_t *world){ } } - -/** - * \brief La fonction nettoie les textures - * \param textures les textures -*/ - -void clean_textures(textures_t *textures){ - clean_texture(textures->background); - clean_texture(textures->ship); - clean_texture(textures->meteorite); - clean_texture(textures->finishLine); - - /* A COMPLETER */ -} - - - /** * \brief La fonction initialise les textures nécessaires à l'affichage graphique du jeu * \param screen la surface correspondant à l'écran de jeu * \param textures les textures du jeu */ -void init_textures(SDL_Renderer *renderer, textures_t *textures){ - textures->background = load_image( "ressources/space-background.bmp",renderer); - textures->ship = load_image( "ressources/spaceship.bmp",renderer); - textures->meteorite = load_image( "ressources/meteorite.bmp",renderer); - textures->finishLine = load_image( "ressources/finish_line.bmp",renderer); - - /* A COMPLETER */ - - -} - - -/** - * \brief La fonction applique la texture du fond sur le renderer lié à l'écran de jeu - * \param renderer le renderer - * \param texture la texture liée au fond -*/ - -void apply_background(SDL_Renderer *renderer, SDL_Texture *texture){ - if(texture != NULL){ - apply_texture(texture, renderer, 0, 0); - } -} - -void apply_sprite(SDL_Renderer * renderer, SDL_Texture *texture, sprite_t *sprite){ - if(texture != NULL){ - SDL_Rect rect; - rect.x = sprite->x; - rect.y = sprite->y; - rect.w = sprite->w; - rect.h = sprite->h; - SDL_RenderCopy(renderer, texture, NULL, &rect); - } -} - -void apply_wall(SDL_Renderer * renderer, SDL_Texture *texture, int x, int y){ - if(texture != NULL){ - SDL_Rect rect; - rect.x = x; - rect.y = y; - rect.w = METEORITE_SIZE; - rect.h = METEORITE_SIZE; - SDL_RenderCopy(renderer, texture, NULL, &rect); - } -} - - -/** - * \brief La fonction rafraichit l'écran en fonction de l'état des données du monde - * \param renderer le renderer lié à l'écran de jeu - * \param world les données du monde - * \param textures les textures - */ - -void refresh_graphics(SDL_Renderer *renderer, world_t *world,textures_t *textures){ - - //on vide le renderer - clear_renderer(renderer); - - //application des textures dans le renderer - apply_background(renderer, textures->background); - /* A COMPLETER */ - apply_sprite(renderer, textures->ship, world->vaisseau); - - apply_sprite(renderer, textures->finishLine, world->ligneArriver); - - for (int i = 0; i < world->mur->w/METEORITE_SIZE ; i++){ - for (int i2 = 0; i2 < world->mur->h/METEORITE_SIZE ; i2++){ - apply_wall(renderer, textures->meteorite, world->mur->x+i*METEORITE_SIZE, world->mur->y+i2*METEORITE_SIZE); - } - } - - - // on met à jour l'écran - update_screen(renderer); -} - - - -/** -* \brief fonction qui nettoie le jeu: nettoyage de la partie graphique (SDL), nettoyage des textures, nettoyage des données -* \param window la fenêtre du jeu -* \param renderer le renderer -* \param textures les textures -* \param world le monde -*/ - -void clean(SDL_Window *window, SDL_Renderer * renderer, textures_t *textures, world_t * world){ - clean_data(world); - clean_textures(textures); - clean_sdl(renderer,window); -} diff --git a/main.o b/main.o index ea24b91200aa77c889204cf77230e9a71b225a18..1c4119f69837b2b9e6960a091117f09ef7b55d13 100644 Binary files a/main.o and b/main.o differ diff --git a/spacecorridor.exe b/spacecorridor.exe index f6afb07d558e13762ed9955ea1aea9a6dfc42eda..9c007bfc6c0c05ab510c84aba673698a64238917 100644 Binary files a/spacecorridor.exe and b/spacecorridor.exe differ