diff --git a/V4 - version final/IMG/barrage.bmp b/V4 - version final/IMG/barrage.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d5c498c03bd1d78c92b075234cd97da8bf4874cc Binary files /dev/null and b/V4 - version final/IMG/barrage.bmp differ diff --git a/V4 - version final/IMG/barrage.png b/V4 - version final/IMG/barrage.png new file mode 100644 index 0000000000000000000000000000000000000000..b01e074720bc538cb66be3a6937ac0941c89c193 Binary files /dev/null and b/V4 - version final/IMG/barrage.png differ diff --git a/V4 - version final/IMG/boutton.bmp b/V4 - version final/IMG/boutton.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fdef830b2cc98ca53885150389932558be2690ed Binary files /dev/null and b/V4 - version final/IMG/boutton.bmp differ diff --git a/V4 - version final/IMG/boutton.png b/V4 - version final/IMG/boutton.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b505b2c71b86b852cd654c2ee8cb0e6a583a77 Binary files /dev/null and b/V4 - version final/IMG/boutton.png differ diff --git a/V4 - version final/IMG/bullet.bmp b/V4 - version final/IMG/bullet.bmp new file mode 100644 index 0000000000000000000000000000000000000000..41727a4cbdc2fd2b879a2b0136f90740d896a38c Binary files /dev/null and b/V4 - version final/IMG/bullet.bmp differ diff --git a/V4 - version final/IMG/enemy_car.bmp b/V4 - version final/IMG/enemy_car.bmp new file mode 100644 index 0000000000000000000000000000000000000000..921f7b8ba0e7b0c8508eabdb007acbb8aac6c4fe Binary files /dev/null and b/V4 - version final/IMG/enemy_car.bmp differ diff --git a/V4 - version final/IMG/enemy_car.png b/V4 - version final/IMG/enemy_car.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c7ee8e071f3adbe06f9de12da1b2f28ea4ef8e Binary files /dev/null and b/V4 - version final/IMG/enemy_car.png differ diff --git a/V4 - version final/IMG/exit.bmp b/V4 - version final/IMG/exit.bmp new file mode 100755 index 0000000000000000000000000000000000000000..e98608dab41c7d04b685f2c406914b957a9ccf0d Binary files /dev/null and b/V4 - version final/IMG/exit.bmp differ diff --git a/V4 - version final/IMG/main_car.bmp b/V4 - version final/IMG/main_car.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6cbf99e55e53368df10e0642f6a02ae78635f873 Binary files /dev/null and b/V4 - version final/IMG/main_car.bmp differ diff --git a/V4 - version final/IMG/menu.bmp b/V4 - version final/IMG/menu.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2279f00e33796aba5c7f80a5e082724788c4cf08 Binary files /dev/null and b/V4 - version final/IMG/menu.bmp differ diff --git a/V4 - version final/IMG/new_game.bmp b/V4 - version final/IMG/new_game.bmp new file mode 100755 index 0000000000000000000000000000000000000000..6de58c8de83b7cecb2e4ba256212ed3e6b76bbe3 Binary files /dev/null and b/V4 - version final/IMG/new_game.bmp differ diff --git a/V4 - version final/IMG/road.bmp b/V4 - version final/IMG/road.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2279f00e33796aba5c7f80a5e082724788c4cf08 Binary files /dev/null and b/V4 - version final/IMG/road.bmp differ diff --git a/V4 - version final/IMG/settings.bmp b/V4 - version final/IMG/settings.bmp new file mode 100755 index 0000000000000000000000000000000000000000..48e5326011de7f88fa580b50431a88b97df42c44 Binary files /dev/null and b/V4 - version final/IMG/settings.bmp differ diff --git a/V4 - version final/IMG/voiture.png b/V4 - version final/IMG/voiture.png new file mode 100644 index 0000000000000000000000000000000000000000..4f3dc697771868eff55c5ab38d5dcc49ec727736 Binary files /dev/null and b/V4 - version final/IMG/voiture.png differ diff --git a/V4 - version final/Makefile b/V4 - version final/Makefile new file mode 100755 index 0000000000000000000000000000000000000000..18461e7b658986564b6d54dd97a1d560f7384d89 --- /dev/null +++ b/V4 - version final/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -W -Wall -ansi -std=c99 -g +LIBS = -L./SDL2_ttf/.libs -L./SDL2_image/.libs +LDFLAGS = `sdl2-config --cflags --libs` -lSDL2_ttf -lSDL2_image -lSDL2_ttf +INCLUDES = -I./SDL2_ttf -I./SDL2_image +EXEC = main +SRC = main.c fonctions_SDL.c data.c logic.c colision.c events.c graphics.c liste.c +OBJ = $(SRC:.c=.o) -lm + +all: $(EXEC) +main: $(OBJ) + $(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LIBS) $(LDFLAGS) +%.o: %.c + $(CC) $(CFLAGS) -o $@ -c $< +clean: + rm -rf *.o *~ +mrproper: clean + rm -rf $(EXEC) + \ No newline at end of file diff --git a/V4 - version final/colision.c b/V4 - version final/colision.c new file mode 100755 index 0000000000000000000000000000000000000000..8189cd56d88111d8c32e49785c33f0ad578a762e --- /dev/null +++ b/V4 - version final/colision.c @@ -0,0 +1,99 @@ +/** + * \file collision.c + * \brief Gestion des collisions du jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#include "colision.h" +#include "liste.h" +#include <stdio.h> + +void handle_Main_Barrage_collision(sprite_t *sp1, sprite_t *sp2, world_t *world, resources_t *textures, + SDL_Renderer *renderer) { + if (sprites_collide(sp1, sp2)) { + sp1->direction = 2; + move_all_except_rick(world, renderer, textures); + sp1->direction = 0; + sp1->speed = 0; + } +} + +void handle_Main_Enemy_collision(world_t *world, sprite_t *sp1, sprite_t *sp2) { + + if (sprites_collide(sp1, sp2)) { + + int push = 200 + (rand() % (100 * world->Main_car.speed)); + + if (world->Main_car.life > 0) { + world->Main_car.life--; + if (world->Main_car.life <= 0 && world->dead == 0) { + world->dead = 1; + world->time_mort = time(NULL); + } + + if (sp1->position.x <= sp2->position.x) { + if (sp1->position.y <= sp2->position.y) { + sp2->position.x += push; + sp2->position.y += push; + } else { + sp2->position.x += push; + sp2->position.y -= push; + } + } else { + if (sp1->position.y <= sp2->position.y) { + sp2->position.x -= push; + sp2->position.y += push; + } else { + sp2->position.x += push; + sp2->position.y -= push; + } + } + } + + } +} + + +void handle_Bullet_Enemy_collision(world_t *world, sprite_t *sp1, sprite_t *sp2) { + + if (sprites_collide(sp1, sp2)) { + + int recul = 100 + (rand() % 100); + + if (sp1->position.x <= sp2->position.x) { + if (sp1->position.y <= sp2->position.y) { + sp2->position.x += recul; + } else { + sp2->position.x += recul; + } + } else { + if (sp1->position.y <= sp2->position.y) { + sp2->position.x -= recul; + } else { + sp2->position.x += recul; + } + } + + + if (sp2->life > 0) { + sp2->life--; + int temp = 0; + temp = sp2->h; + sp2->h = sp2->w; + sp2->w = temp; + sp2->direction = sp1->direction; + if (sp1->direction != 1) { + sp2->position.x -= sp2->w; + } + } + + sp2->count = 0; + + + sp1->position.x = 100000; + sp1->position.y = 100000; + } +} + + diff --git a/V4 - version final/colision.h b/V4 - version final/colision.h new file mode 100755 index 0000000000000000000000000000000000000000..daafbaa05d3e6c24dabab8f81917d7a3be2c330f --- /dev/null +++ b/V4 - version final/colision.h @@ -0,0 +1,22 @@ +/** + * \file collision.h + * \brief Gestion des collisions du jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#ifndef V1_COLISION_H +#define V1_COLISION_H + +#include "data.h" +#include "logic.h" + +void handle_Main_Enemy_collision(world_t *world, sprite_t *sp1, sprite_t *sp2); + +void handle_Bullet_Enemy_collision(world_t *world, sprite_t *sp1, sprite_t *sp2); + +void handle_Main_Barrage_collision(sprite_t *sp1, sprite_t *sp2, world_t *world, resources_t *textures, + SDL_Renderer *renderer); + + +#endif //V1_COLISION_H diff --git a/V4 - version final/colision.o b/V4 - version final/colision.o new file mode 100644 index 0000000000000000000000000000000000000000..3beee060e12a631e751ac9c9ed4dfa6853b82b42 Binary files /dev/null and b/V4 - version final/colision.o differ diff --git a/V4 - version final/constants.h b/V4 - version final/constants.h new file mode 100755 index 0000000000000000000000000000000000000000..d9d1853113c37b121b664cdabaa5c86d3cc47dc6 --- /dev/null +++ b/V4 - version final/constants.h @@ -0,0 +1,66 @@ +/** + * \file const.h + * \brief Rassemblement des constantes utiles au jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#include <SDL2/SDL.h> +#include <SDL2/SDL_ttf.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <time.h> +#include <math.h> +#include <string.h> + + +#include "fonctions_SDL.h" + + +#ifndef V1_CONSTANTS_H +#define V1_CONSTANTS_H + + +#define SCREEN_WIDTH 840 + +#define SCREEN_HEIGHT 650 + +#define RICK_STEP 50 + +#define SPEED_LIIMIT 10 + +#define NUMBER_ENEMY_CAR 5 + +#define NUMBER_LIFES 10 + +#define NUMBER_BARRAGE 50 + +#define NUMBER_ROADS 100 + + +struct resources_s { + + SDL_Texture *main_car; + + SDL_Texture *enemy_car; + + SDL_Texture *barrage; + + SDL_Texture *road; + + SDL_Texture *bullet; + + SDL_Texture *menu; + + SDL_Texture *exit_button; + + SDL_Texture *new_game_button; + + SDL_Texture *settings_button; + + TTF_Font *font; +}; +typedef struct resources_s resources_t; + +#endif diff --git a/V4 - version final/data.c b/V4 - version final/data.c new file mode 100755 index 0000000000000000000000000000000000000000..260ac84f03ee6764ad462c37264eafc498537377 --- /dev/null +++ b/V4 - version final/data.c @@ -0,0 +1,469 @@ +/** + * \file data.c + * \brief Gestion des données du jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#include "data.h" +#include "graphics.h" +#include "liste.h" +#include "logic.h" +#include "colision.h" +#include <stdio.h> + + +void init_sprite_ptr(sprite_t *sprite, int x, int y, int w, int h, int v, int life, nature_t nat) { + sprite->direction = 0; + sprite->dir_texture = 3; + sprite->count = 0; + sprite->position.y = y; + sprite->h = h; + sprite->w = w; + sprite->disappear = 0; + sprite->speed = v; + sprite->life = life; + sprite->nature = nat; + sprite->position.x = x; +} + + +sprite_t init_sprite(sprite_t sprite, int x, int y, int w, int h, int v, int life, nature_t nat) { + sprite.dir_texture = 3; + sprite.count = 0; + sprite.h = h; + sprite.w = w; + sprite.disappear = 0; + sprite.speed = v; + sprite.life = life; + sprite.nature = nat; + sprite.position.x = x; + sprite.position.y = y; + sprite.direction = 0; + return sprite; +} + + +void init_data(world_t *world) { + + srand(time(NULL)); + world->mouse = init_sprite(world->mouse, (SCREEN_WIDTH) / 2, (SCREEN_HEIGHT) / 2, 1, 1, 1, 1, Menu); + + world->Enemy_car = l_vide(); + world->Barrage = l_vide(); + world->Road = l_vide(); + world->bullet = l_vide(); + world->gameover = 0; + world->nb_bullets = 0; + world->stop_menu = 0; + world->dead = 0; + + + world->Menu = init_sprite(world->Menu, (SCREEN_WIDTH) / 2, + (SCREEN_HEIGHT) / 2, + SCREEN_WIDTH, + SCREEN_HEIGHT, + 1, 1, Menu); + + + world->new_game_menu = init_sprite(world->new_game_menu, 150, 100, + 200, + 100, + 1, 1, Menu); + + world->settings_menu = init_sprite(world->settings_menu, 400, + 100, + 200, + 100, + 1, 1, Menu); + + world->exit_menu = init_sprite(world->exit_menu, 650, + 100, + 200, + 100, + 1, 1, Menu); + + + init_sprite_ptr(&world->Main_car, SCREEN_WIDTH / 2, 3 * SCREEN_HEIGHT / 4, 45, 100, 0, 10, Main_car); + + + for (int i = 0; i < NUMBER_ROADS; i++) { + + int x = SCREEN_WIDTH / 2; + int y = ((i + 2) * 650) - (650 * NUMBER_ROADS); + + sprite_t temp_sprite; + temp_sprite = init_sprite(temp_sprite, x, y, 840, 650, 1, 1, Road); + world->Road = ajouter(world->Road, temp_sprite); + } + + + for (int i = 0; i < NUMBER_ENEMY_CAR; i++) { + + int x = i * 20; + int y = 1500; + + sprite_t temp_sprite; + temp_sprite = init_sprite(temp_sprite, x, y, 45, 100, 7, 4, Enemy_car); + world->Enemy_car = ajouter(world->Enemy_car, temp_sprite); + } + + + for (int i = 0; i < NUMBER_BARRAGE; i++) { + + int x = rand() % (SCREEN_WIDTH - 110); + int y = -500 - (rand() % NUMBER_ROADS * 650); + + sprite_t temp_sprite; + temp_sprite = init_sprite(temp_sprite, x, y, 210, 109, 1, 1, Barrage); + world->Barrage = ajouter(world->Barrage, temp_sprite); + } + + +} + + +void init_game(SDL_Window **window, SDL_Renderer **renderer, resources_t *textures, world_t *world) { + init_ttf(); + init_sdl(window, renderer, SCREEN_WIDTH, SCREEN_HEIGHT); + init_data(world); + init_textures(*renderer, textures, world); + +} + + +void update_menu(world_t *world, resources_t *textures, SDL_Renderer *renderer) { + +} + + +void update_data(world_t *world, resources_t *textures, SDL_Renderer *renderer) { + move_enemy_car(world, textures, renderer); + move_bullets(world, textures, renderer); + move_all_except_rick(world, renderer, textures); + + + list_t temp_Barrage = world->Barrage; + while (temp_Barrage != NULL) { + handle_Main_Barrage_collision(&world->Main_car, &temp_Barrage->val, world, textures, renderer); + temp_Barrage = temp_Barrage->nxt; + } + + if (SDL_GetTicks() % 10000 > 9990) { + + } + if (world->dead == 1 && (time(NULL) - world->time_mort > 5)) { + world->gameover = 1; + } +} + + +int is_game_over(world_t *world) { + return world->gameover; +} + + +void move_all_except_rick(world_t *world, SDL_Renderer *renderer, resources_t *textures) { + if (world->Main_car.life > 0) { + list_t temp_enemy_car = world->Enemy_car; + list_t temp_barrage = world->Barrage; + list_t temp_road = world->Road; + list_t temp_bullet = world->bullet; + sprite_t temp_main_car = world->Main_car; + int d = world->Main_car.direction; + + + if (d == 0) { + temp_main_car.position.y -= RICK_STEP; + } else if (d == 1) { + temp_main_car.position.x += RICK_STEP; + } else if (d == 2) { + temp_main_car.position.y += RICK_STEP; + } else if (d == 3) { + temp_main_car.position.x -= RICK_STEP; + } + + + switch (d) { + case 0: + temp_enemy_car = world->Enemy_car; + while (temp_enemy_car != NULL) { + temp_enemy_car->val.position.y += world->Main_car.speed; + if (temp_enemy_car->val.life != 0 && (distance(temp_enemy_car->val, world->Main_car) < 400)) { + handle_Main_Enemy_collision(world, &world->Main_car, &temp_enemy_car->val); + } + temp_enemy_car = temp_enemy_car->nxt; + } + temp_barrage = world->Barrage; + while (temp_barrage != NULL) { + temp_barrage->val.position.y += world->Main_car.speed; + temp_barrage = temp_barrage->nxt; + } + temp_road = world->Road; + while (temp_road != NULL) { + temp_road->val.position.y += world->Main_car.speed; + temp_road = temp_road->nxt; + } + temp_bullet = world->bullet; + while (temp_bullet != NULL) { + temp_bullet->val.position.y += world->Main_car.speed; + temp_bullet = temp_bullet->nxt; + } + break; + case 1: + temp_enemy_car = world->Enemy_car; + while (temp_enemy_car != NULL) { + temp_enemy_car->val.position.x -= world->Main_car.speed; + if (temp_enemy_car->val.life != 0 && (distance(temp_enemy_car->val, world->Main_car) < 400)) { + handle_Main_Enemy_collision(world, &world->Main_car, &temp_enemy_car->val); + } + temp_enemy_car = temp_enemy_car->nxt; + } + temp_barrage = world->Barrage; + while (temp_barrage != NULL) { + temp_barrage->val.position.x -= world->Main_car.speed; + temp_barrage = temp_barrage->nxt; + } + temp_road = world->Road; + while (temp_road != NULL) { + temp_road->val.position.x -= world->Main_car.speed; + temp_road = temp_road->nxt; + } + temp_bullet = world->bullet; + while (temp_bullet != NULL) { + temp_bullet->val.position.x -= world->Main_car.speed; + temp_bullet = temp_bullet->nxt; + } + break; + case 2: + temp_enemy_car = world->Enemy_car; + while (temp_enemy_car != NULL) { + temp_enemy_car->val.position.y -= world->Main_car.speed; + if (temp_enemy_car->val.life != 0 && (distance(temp_enemy_car->val, world->Main_car) < 400)) { + handle_Main_Enemy_collision(world, &world->Main_car, &temp_enemy_car->val); + } + temp_enemy_car = temp_enemy_car->nxt; + } + temp_barrage = world->Barrage; + while (temp_barrage != NULL) { + temp_barrage->val.position.y -= world->Main_car.speed; + temp_barrage = temp_barrage->nxt; + } + temp_road = world->Road; + while (temp_road != NULL) { + temp_road->val.position.y -= world->Main_car.speed; + temp_road = temp_road->nxt; + } + temp_bullet = world->bullet; + while (temp_bullet != NULL) { + temp_bullet->val.position.y -= world->Main_car.speed; + temp_bullet = temp_bullet->nxt; + } + break; + case 3: + temp_enemy_car = world->Enemy_car; + while (temp_enemy_car != NULL) { + temp_enemy_car->val.position.x += world->Main_car.speed; + if (temp_enemy_car->val.life != 0 && (distance(temp_enemy_car->val, world->Main_car) < 400)) { + handle_Main_Enemy_collision(world, &world->Main_car, &temp_enemy_car->val); + } + temp_enemy_car = temp_enemy_car->nxt; + } + temp_barrage = world->Barrage; + while (temp_barrage != NULL) { + temp_barrage->val.position.x += world->Main_car.speed; + temp_barrage = temp_barrage->nxt; + } + temp_road = world->Road; + while (temp_road != NULL) { + temp_road->val.position.x += world->Main_car.speed; + temp_road = temp_road->nxt; + } + temp_bullet = world->bullet; + while (temp_bullet != NULL) { + temp_bullet->val.position.x += world->Main_car.speed; + temp_bullet = temp_bullet->nxt; + } + break; + } + + } +} + + +void move_enemy_car(world_t *world, resources_t *textures, SDL_Renderer *renderer) { + list_t temp_enemy_car = world->Enemy_car; + while (temp_enemy_car != NULL) { + if (temp_enemy_car->val.life != 0 && world->Main_car.life > 0) { + move_enemy_to_main(temp_enemy_car, world, textures, renderer); + handle_Main_Enemy_collision(world, &world->Main_car, &temp_enemy_car->val); + } + temp_enemy_car = temp_enemy_car->nxt; + } +} + + +void move_enemy_to_main(list_t enemy_car, world_t *world, resources_t *textures, SDL_Renderer *renderer) { + if (enemy_car->val.position.x < world->Main_car.position.x) { + if (enemy_car->val.position.y < world->Main_car.position.y) { + if (enemy_car->val.direction != 1) { + enemy_car->val.direction = 1; + } else { + enemy_car->val.position.x += enemy_car->val.speed; + enemy_car->val.position.y += enemy_car->val.speed; + } + } else if (enemy_car->val.position.y > world->Main_car.position.y) { + if (enemy_car->val.direction != 1) { + enemy_car->val.direction = 1; + } else { + enemy_car->val.position.x += enemy_car->val.speed; + enemy_car->val.position.y -= enemy_car->val.speed; + } + } else if (enemy_car->val.position.y == world->Main_car.position.y) { + if (enemy_car->val.direction != 1) { + enemy_car->val.direction = 1; + } else { + enemy_car->val.position.x += enemy_car->val.speed; + } + } + } else if (enemy_car->val.position.x > world->Main_car.position.x) { + if (enemy_car->val.position.y < world->Main_car.position.y) { + if (enemy_car->val.direction != 3) { + enemy_car->val.direction = 3; + } else { + enemy_car->val.position.x -= enemy_car->val.speed; + enemy_car->val.position.y += enemy_car->val.speed; + } + } else if (enemy_car->val.position.y > world->Main_car.position.y) { + if (enemy_car->val.direction != 3) { + enemy_car->val.direction = 3; + } else { + enemy_car->val.position.x -= enemy_car->val.speed; + enemy_car->val.position.y -= enemy_car->val.speed; + } + + } else if (enemy_car->val.position.y == world->Main_car.position.y) { + if (enemy_car->val.direction != 3) { + enemy_car->val.direction = 3; + } else { + enemy_car->val.position.x -= enemy_car->val.speed; + } + } + } else if (enemy_car->val.position.x == world->Main_car.position.x) { + if (enemy_car->val.position.y < world->Main_car.position.y) { + enemy_car->val.position.y += enemy_car->val.speed; + } else if (enemy_car->val.position.y > world->Main_car.position.y) { + enemy_car->val.position.y -= enemy_car->val.speed; + } + } +} + + +void move_sprite_randomly(list_t sprite, resources_t *textures, SDL_Renderer *renderer) { + int count_max = (rand() % 50) + 50; + if (sprite->val.count < count_max) { + switch (sprite->val.direction) { + case 0: + sprite->val.position.y -= sprite->val.speed; + sprite->val.count++; + break; + case 1: + sprite->val.position.x += sprite->val.speed; + sprite->val.count++; + break; + case 2: + sprite->val.position.y += sprite->val.speed; + sprite->val.count++; + break; + case 3: + sprite->val.position.x -= sprite->val.speed; + sprite->val.count++; + break; + + } + } else { + sprite->val.count = 0; + sprite->val.direction = (rand() % (4)); + switch (sprite->val.direction) { + case 0: + sprite->val.position.y -= sprite->val.speed; + sprite->val.count++; + break; + case 1: + sprite->val.position.x += sprite->val.speed; + sprite->val.count++; + break; + case 2: + sprite->val.position.y += sprite->val.speed; + sprite->val.count++; + break; + case 3: + sprite->val.position.x -= sprite->val.speed; + sprite->val.count++; + break; + + } + } +} + + +void clean_data(world_t *world) { + for (int i = 0; i < NUMBER_ENEMY_CAR - 1; i++) { + supprimerElementEnFin(world->Enemy_car); + } + for (int i = 0; i < NUMBER_BARRAGE - 1; i++) { + supprimerElementEnFin(world->Barrage); + } + for (int i = 0; i < NUMBER_ROADS - 1; i++) { + supprimerElementEnFin(world->Road); + } +} + + +void move_bullets(world_t *world, resources_t *textures, SDL_Renderer *renderer) { + list_t temp_bullet = world->bullet; + while (temp_bullet != NULL) { + if (distance(temp_bullet->val, world->Main_car) < 3 * SCREEN_HEIGHT) { + if (temp_bullet->val.direction == 3) { + temp_bullet->val.position.x -= temp_bullet->val.speed; + list_t temp_enemy_car = world->Enemy_car; + while (temp_enemy_car != NULL) { + if (temp_enemy_car->val.life != 0) { + handle_Bullet_Enemy_collision(world, &temp_bullet->val, &temp_enemy_car->val); + } + temp_enemy_car = temp_enemy_car->nxt; + } + } else if (temp_bullet->val.direction == 1) { + temp_bullet->val.position.x += temp_bullet->val.speed; + list_t temp = world->Enemy_car; + while (temp != NULL) { + if (temp->val.life != 0) { + handle_Bullet_Enemy_collision(world, &temp_bullet->val, &temp->val); + } + temp = temp->nxt; + } + } else if (temp_bullet->val.direction == 2) { + temp_bullet->val.position.y += temp_bullet->val.speed; + list_t temp_enemy_car = world->Enemy_car; + while (temp_enemy_car != NULL) { + if (temp_enemy_car->val.life != 0) { + handle_Bullet_Enemy_collision(world, &temp_bullet->val, &temp_enemy_car->val); + } + temp_enemy_car = temp_enemy_car->nxt; + } + } else if (temp_bullet->val.direction == 0) { + temp_bullet->val.position.y -= temp_bullet->val.speed; + list_t temp_enemy_car = world->Enemy_car; + while (temp_enemy_car != NULL) { + if (temp_enemy_car->val.life != 0) { + handle_Bullet_Enemy_collision(world, &temp_bullet->val, &temp_enemy_car->val); + } + temp_enemy_car = temp_enemy_car->nxt; + } + } + } + + temp_bullet = temp_bullet->nxt; + + } +} diff --git a/V4 - version final/data.h b/V4 - version final/data.h new file mode 100755 index 0000000000000000000000000000000000000000..2bb467ba14a3d7227b02725a2c41592f7da649ae --- /dev/null +++ b/V4 - version final/data.h @@ -0,0 +1,103 @@ +/** + * \file data.h + * \brief Gestion des données du jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#ifndef V1_DATA_H +#define V1_DATA_H + +#include "constants.h" + + + +struct position_s { + int x; + int y; +}; +typedef struct position_s position_t; + +typedef enum { + Main_car, Enemy_car, Road, Bullet, Car, Barrage, Barre, Menu +} nature_t; + +struct sprite_s { + position_t position; + int h; + int w; + int disappear; + int direction; + int dir_texture; + int count; + int speed; + int life; + nature_t nature; +}; +typedef struct sprite_s sprite_t; + + +typedef struct element element; +struct element { + sprite_t val; + struct element *nxt; +}; + +typedef element *list_t; + + +struct world_s { + sprite_t Menu; + sprite_t new_game_menu; + sprite_t settings_menu; + sprite_t exit_menu; + sprite_t Main_car; + list_t Barrage; + int gameover; /*!< Champ indiquant si l'on est à la fin du jeu */ + list_t Enemy_car; + list_t Road; + list_t bullet; + int nb_bullets; + bool stop_menu; + sprite_t mouse; + int time_debut_jeu; + int time_mort; + int dead; +}; +typedef struct world_s world_t; + + +void init_game(SDL_Window **window, SDL_Renderer **renderer, resources_t *textures, world_t *world); + +void init_sprite_ptr(sprite_t *sprite, int x, int y, int w, int h, int v, int life, nature_t nature); + +sprite_t init_sprite(sprite_t sprite, int x, int y, int w, int h, int v, int life, nature_t nature); + +void init_data(world_t *world); + +void update_menu(world_t *world, resources_t *textures, SDL_Renderer *renderer); + +void update_data(world_t *world, resources_t *textures, SDL_Renderer *renderer); + +int is_game_over(world_t *world); + +int sprites_collide(sprite_t *sp1, sprite_t *sp2); + +void move_all_except_rick(world_t *world, SDL_Renderer *renderer, resources_t *textures); + +void move_enemy_car(world_t *world, resources_t *textures, SDL_Renderer *renderer); + +void move_sprite_randomly(list_t enemy_car, resources_t *textures, SDL_Renderer *renderer); + +void move_enemy_to_main(list_t enemy_car, world_t *world, resources_t *textures, SDL_Renderer *renderer); + +double distance(sprite_t s1, sprite_t s2); + +void clean_data(world_t *world); + +void move_bullets(world_t *world, resources_t *textures, SDL_Renderer *renderer); + +void handle_Bullet_Zombie_collision(world_t *world, sprite_t *sp1, sprite_t *sp2); + + +#endif //V1_DATA_H diff --git a/V4 - version final/data.o b/V4 - version final/data.o new file mode 100644 index 0000000000000000000000000000000000000000..4032398754b76c5b77139b4b72f73cf732c78c4d Binary files /dev/null and b/V4 - version final/data.o differ diff --git a/V4 - version final/events.c b/V4 - version final/events.c new file mode 100755 index 0000000000000000000000000000000000000000..6c33e00b7ef39da0d624e67815bb1cc8349ba4ed --- /dev/null +++ b/V4 - version final/events.c @@ -0,0 +1,95 @@ +/** + * \file events.c + * \brief Gestion des entrées claviers du joueur + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#include "events.h" +#include "constants.h" +#include "data.h" +#include "colision.h" +#include "liste.h" + + +void handle_events(SDL_Event *event, SDL_Renderer *renderer, world_t *world, resources_t *textures) { + + while (SDL_PollEvent(event)) { + + if (world->stop_menu == 0) { + if (event->type == SDL_MOUSEMOTION) { + world->mouse.position.x = event->button.x; + world->mouse.position.y = event->button.y; + } + if (event->type == SDL_MOUSEBUTTONDOWN) { + if (sprites_collide(&world->mouse, &world->new_game_menu)) { + world->stop_menu = 1; + } + } + if (event->type == SDL_MOUSEBUTTONDOWN) { + if (sprites_collide(&world->mouse, &world->exit_menu)) { + world->gameover = 1; + } + } + } else if (world->Main_car.life > 0 && world->dead != 1) { + if (event->type == SDL_MOUSEBUTTONDOWN) { + if (event->button.button == SDL_BUTTON_LEFT) { + sprite_t temp_sprite; + int x, y; + int direction; + if (world->Main_car.dir_texture == 3) { + x = world->Main_car.position.x - world->Main_car.w; + y = world->Main_car.position.y + 0.07 * world->Main_car.h; + direction = 3; + } else if (world->Main_car.dir_texture == 1) { + x = world->Main_car.position.x + world->Main_car.w; + y = world->Main_car.position.y + 0.07 * world->Main_car.h; + direction = 1; + } else if (world->Main_car.dir_texture == 2) { + x = world->Main_car.position.x + 20; + y = world->Main_car.position.y + 30; + direction = 2; + } else if (world->Main_car.dir_texture == 0) { + x = world->Main_car.position.x; + y = world->Main_car.position.y - 100; + direction = 0; + } + + temp_sprite = init_sprite(temp_sprite, x, y, 16, 16, 50, 1, Bullet); + temp_sprite.direction = direction; + world->nb_bullets++; + world->bullet = ajouter(world->bullet, temp_sprite); + } + + } + + if (event->type == SDL_KEYDOWN) { + if (event->key.keysym.sym == SDLK_UP) { + world->Main_car.direction = 0; + world->Main_car.dir_texture = 0; + world->Main_car.direction = 0; + if (world->Main_car.speed < SPEED_LIIMIT) { + world->Main_car.speed++; + } + } else if (event->key.keysym.sym == SDLK_RIGHT) { + world->Main_car.direction = 0; + if (world->Main_car.position.x < SCREEN_WIDTH - world->Main_car.w) { + world->Main_car.position.x += 15; + } + } else if (event->key.keysym.sym == SDLK_DOWN) { + + if (world->Main_car.speed > 0) { + world->Main_car.speed--; + } + } else if (event->key.keysym.sym == SDLK_LEFT) { + world->Main_car.direction = 0; + if (world->Main_car.position.x > world->Main_car.w) { + world->Main_car.position.x -= 15; + } + } else if (event->key.keysym.sym == SDLK_ESCAPE) { + world->stop_menu = 0; + } + } + } + } +} \ No newline at end of file diff --git a/V4 - version final/events.h b/V4 - version final/events.h new file mode 100755 index 0000000000000000000000000000000000000000..3b856cf368ea81ec095ceb0c9a6154d11900e12c --- /dev/null +++ b/V4 - version final/events.h @@ -0,0 +1,17 @@ +/** + * \file event.h + * \brief Gestion des entrées claviers du joueur + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#ifndef V1_EVENTS_H +#define V1_EVENTS_H + +#include <SDL2/SDL_mixer.h> +#include "constants.h" +#include "data.h" + +void handle_events(SDL_Event *event, SDL_Renderer *renderer, world_t *world, resources_t *textures); + +#endif //V1_EVENTS_H diff --git a/V4 - version final/events.o b/V4 - version final/events.o new file mode 100644 index 0000000000000000000000000000000000000000..a8a289784aa69a7199f07806695c7bec34eec028 Binary files /dev/null and b/V4 - version final/events.o differ diff --git a/V4 - version final/fastcar b/V4 - version final/fastcar new file mode 100755 index 0000000000000000000000000000000000000000..841963cc27744312ee2d5f6e891a93d014752bbe Binary files /dev/null and b/V4 - version final/fastcar differ diff --git a/V4 - version final/fonctions_SDL.c b/V4 - version final/fonctions_SDL.c new file mode 100755 index 0000000000000000000000000000000000000000..3cce92c1b96a4ed1c737334c05306cf236efd7d7 --- /dev/null +++ b/V4 - version final/fonctions_SDL.c @@ -0,0 +1,123 @@ +/** + * \file fonctions_SDL.c + * \brief sur-couche de SDL2 pour simplifier son utilisation pour le projet + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#include "fonctions_SDL.h" + +int init_sdl(SDL_Window **window, SDL_Renderer **renderer, int width, int height) +{ + if(0 != SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)) + { + fprintf(stderr, "Erreur initialisation de la SDL : %s", SDL_GetError()); + return -1; + } + if(0 != SDL_CreateWindowAndRenderer(width, height, SDL_WINDOW_SHOWN, window, renderer)) + { + fprintf(stderr, "Erreur lors de la creation de l'image et du renderer : %s", SDL_GetError()); + return -1; + } + return 0; +} + +SDL_Texture* charger_image(const char* nomfichier, SDL_Renderer* renderer) +{ + + SDL_Surface* surface = SDL_LoadBMP(nomfichier); + + return SDL_CreateTextureFromSurface(renderer, surface); +} + +SDL_Texture* charger_image_transparente(const char path[], SDL_Renderer *renderer) +{ + SDL_Surface *temp = NULL; + SDL_Texture *texture = NULL; + temp = SDL_LoadBMP(path); + + if(NULL == temp) + { + fprintf(stderr, "Erreur pendant chargement image BMP: %s", SDL_GetError()); + return NULL; + } + SDL_SetColorKey(temp, SDL_TRUE, SDL_MapRGB(temp->format, 255, 0, 255)); + texture = SDL_CreateTextureFromSurface(renderer, temp); + SDL_FreeSurface(temp); + if(NULL == texture) + { + fprintf(stderr, "Erreur pendant creation de la texture liee a l'image chargee: %s", SDL_GetError()); + return NULL; + } + return texture; +} + + +void clear_renderer(SDL_Renderer *renderer){ + SDL_RenderClear(renderer); +} + +void apply_texture(SDL_Texture *texture,SDL_Renderer *renderer,int x, int y){ + SDL_Rect dst = {0, 0, 0, 0}; + + SDL_QueryTexture(texture, NULL, NULL, &dst.w, &dst.h); + dst.x = x; dst.y = y; + + SDL_RenderCopy(renderer, texture, NULL, &dst); +} + +void update_screen(SDL_Renderer *renderer){ + SDL_RenderPresent(renderer); +} + +void clean_texture(SDL_Texture *texture){ + if(NULL != texture){ + SDL_DestroyTexture(texture); + } +} + +void clean_sdl(SDL_Renderer *renderer,SDL_Window *window){ + if(NULL != renderer) + SDL_DestroyRenderer(renderer); + if(NULL != window) + SDL_DestroyWindow(window); + SDL_Quit(); +} + +void init_audio(){ + SDL_Init(SDL_INIT_AUDIO); +} + + +void init_ttf(){ + if(TTF_Init()==-1) { + printf("TTF_Init: %s\n", TTF_GetError()); + } +} + +TTF_Font * load_font(const char *path, int font_size){ + TTF_Font *font = TTF_OpenFont(path, font_size); + if(font == NULL){ + fprintf(stderr, "Erreur pendant chargement font: %s\n", SDL_GetError()); + } + return font; +} + +void apply_text(SDL_Renderer *renderer,int x, int y, int w, int h, const char *text, TTF_Font *font, SDL_Color color){ + + SDL_Surface* surface = TTF_RenderText_Solid(font, text, color); + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_Rect dstrect2 = {x, y, w, h}; + SDL_RenderCopy(renderer, texture, NULL, &dstrect2); + SDL_FreeSurface(surface); + clean_texture(texture); + +} + +void clean_font(TTF_Font * font){ + TTF_CloseFont(font); +} + + + + diff --git a/V4 - version final/fonctions_SDL.h b/V4 - version final/fonctions_SDL.h new file mode 100755 index 0000000000000000000000000000000000000000..53afc8365fa25c40435372ffd8435060aa7bad9a --- /dev/null +++ b/V4 - version final/fonctions_SDL.h @@ -0,0 +1,40 @@ +/** + * \file fonctions_SDL.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 27 decembre 2021 + */ + +#include <SDL2/SDL.h> +#include <SDL2/SDL_ttf.h> +#include <SDL2/SDL_mixer.h> +#include <SDL2/SDL2_rotozoom.h> +#include <stdio.h> + +int init_sdl(SDL_Window **window, SDL_Renderer **renderer, int width, int height); + +SDL_Texture* charger_image(const char* nomfichier, SDL_Renderer* renderer); + +SDL_Texture* charger_image_transparente(const char path[], SDL_Renderer *renderer); + +void clear_renderer(SDL_Renderer *renderer); + +void apply_texture(SDL_Texture *texture,SDL_Renderer *renderer,int x, int y); + +void update_screen(SDL_Renderer *renderer); + +void clean_texture(SDL_Texture *texture); + +void clean_sdl(SDL_Renderer *renderer,SDL_Window *window); + +void init_ttf(); + +TTF_Font * load_font(const char *path, int font_size); + +void apply_text(SDL_Renderer *renderer,int x, int y, int w, int h, const char *text, TTF_Font *font, SDL_Color color); + +void clean_font(TTF_Font * font); + +void init_audio(); + + diff --git a/V4 - version final/fonctions_SDL.o b/V4 - version final/fonctions_SDL.o new file mode 100644 index 0000000000000000000000000000000000000000..b5905e2e1ecb2340bb41926489aa52ef0bb45ea4 Binary files /dev/null and b/V4 - version final/fonctions_SDL.o differ diff --git a/V4 - version final/font/arial.ttf b/V4 - version final/font/arial.ttf new file mode 100755 index 0000000000000000000000000000000000000000..ab68fb197d4479b3b6dec6e85bd5cbaf433a87c5 Binary files /dev/null and b/V4 - version final/font/arial.ttf differ diff --git a/V4 - version final/graphics.c b/V4 - version final/graphics.c new file mode 100755 index 0000000000000000000000000000000000000000..5eca0868fd53da0e2578a2fc83aa301640006958 --- /dev/null +++ b/V4 - version final/graphics.c @@ -0,0 +1,155 @@ +/** + * \file graphics.c + * \brief Gestion de l'affichage du jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#include "graphics.h" + + +void init_textures(SDL_Renderer *renderer, resources_t *textures, world_t *world) { + + textures->font = load_font("font/arial.ttf", 200); + + textures->main_car = charger_image_transparente("IMG/main_car.bmp", renderer); + + textures->enemy_car = charger_image_transparente("IMG/enemy_car.bmp", renderer); + + textures->barrage = charger_image_transparente("IMG/barrage.bmp", renderer); + + textures->road = charger_image_transparente("IMG/road.bmp", renderer); + + textures->bullet = charger_image_transparente("IMG/bullet.bmp", renderer); + + textures->menu = charger_image_transparente("IMG/menu.bmp", renderer); + + textures->new_game_button = charger_image_transparente("IMG/boutton.bmp", renderer); + + textures->settings_button = charger_image_transparente("IMG/boutton.bmp", renderer); + + textures->exit_button = charger_image_transparente("IMG/boutton.bmp", renderer); + +} + + +void refresh_menu(SDL_Renderer *renderer, world_t *world, resources_t *textures) { + clear_renderer(renderer); + apply_sprite(renderer, textures->menu, &world->Menu); + apply_sprite(renderer, textures->new_game_button, &world->new_game_menu); + apply_sprite(renderer, textures->settings_button, &world->settings_menu); + apply_sprite(renderer, textures->exit_button, &world->exit_menu); + apply_text(renderer, (60), 50, 180, 90, "New Game", textures->font,(SDL_Color){243, 89, 0}); + apply_text(renderer, (310), 50, 180, 90, "Settings", textures->font,(SDL_Color){243, 89, 0}); + apply_text(renderer, (560), 50, 180, 90, "Exit", textures->font,(SDL_Color){243, 89, 0}); + + apply_text(renderer, (SCREEN_WIDTH-610), 200, 400, 14*4, "Bienvenue", textures->font,(SDL_Color){243, 89, 0}); + apply_text(renderer, (SCREEN_WIDTH-620), 340, 400, 14*4, "Appuyer sur ", textures->font,(SDL_Color){243, 89, 0}); + apply_text(renderer, (SCREEN_WIDTH-620), 410, 400, 14*4, "'NEW GAME'", textures->font,(SDL_Color){240, 248, 255, 0.993}); + apply_text(renderer, (SCREEN_WIDTH-620), 460, 400, 14*4, "pour commencer", textures->font,(SDL_Color){243, 89, 0}); + apply_text(renderer, (SCREEN_WIDTH-800), 600, 200, 14*3, "YATIME MAROUANE", textures->font,(SDL_Color){253, 217, 13}); + apply_text(renderer, (SCREEN_WIDTH-250), 600, 200, 14*3, "AIT OUALI MAROUANE", textures->font,(SDL_Color){253, 217, 13}); + update_screen(renderer); +} + +void refresh_graphics(SDL_Renderer *renderer, world_t *world, resources_t *textures) { + + clear_renderer(renderer); + + list_t temp_road = world->Road; + while (temp_road != NULL) { + if (distance(temp_road->val, world->Main_car) < 2 * SCREEN_HEIGHT) { + apply_sprite(renderer, textures->road, &temp_road->val); + } + temp_road = temp_road->nxt; + } + + list_t temp_barrage = world->Barrage; + while (temp_barrage != NULL) { + if (temp_barrage->val.disappear == 0) { + if (distance(temp_barrage->val, world->Main_car) < 2 * SCREEN_HEIGHT) { + apply_sprite(renderer, textures->barrage, &temp_barrage->val); + } + } + temp_barrage = temp_barrage->nxt; + } + + + list_t temp_enemy = world->Enemy_car; + + while (temp_enemy != NULL) { + if (distance(temp_enemy->val, world->Main_car) < 2 * SCREEN_HEIGHT) { + if (temp_enemy->val.life >= 0) { + apply_sprite(renderer, textures->enemy_car, &temp_enemy->val); + } + } + + temp_enemy = temp_enemy->nxt; + } + + apply_sprite(renderer, textures->main_car, &world->Main_car); + + + if (world->nb_bullets != 0) { + list_t temp_bullet = world->bullet; + for (int i = 0; i < world->nb_bullets; i++) { + apply_sprite(renderer, textures->bullet, &temp_bullet->val); + temp_bullet = temp_bullet->nxt; + } + } + + + if (world->Main_car.life == 0) { + SDL_Color color = {255, 50, 50}; + char fin_jeu[20] = "GAME OVER"; + int W = 800; + int H = 200; + int X = SCREEN_WIDTH / 2 - W / 2; + int Y = SCREEN_HEIGHT / 4; + apply_text(renderer, X, Y, W, H, fin_jeu, textures->font, color); + } + + + update_screen(renderer); +} + +void apply_sprite(SDL_Renderer *renderer, SDL_Texture *texture, sprite_t *sprite) { + if (texture != NULL) { + apply_texture(texture, renderer, + (sprite->position.x) - ((sprite->w) / 2), + (sprite->position.y) - ((sprite->h) / 2) + ); + } +} + + +void clean(SDL_Window *window, SDL_Renderer *renderer, resources_t *textures, world_t *world) { + clean_data(world); + clean_textures(textures); + clean_sdl(renderer, window); + TTF_Quit(); +} + +void clean_textures(resources_t *textures) { + + clean_texture(textures->main_car); + + clean_texture(textures->enemy_car); + + clean_texture(textures->barrage); + + clean_texture(textures->road); + + clean_texture(textures->bullet); + + clean_texture(textures->menu); + + clean_texture(textures->new_game_button); + + clean_texture(textures->settings_button); + + clean_texture(textures->exit_button); + + clean_font(textures->font); + +} \ No newline at end of file diff --git a/V4 - version final/graphics.h b/V4 - version final/graphics.h new file mode 100755 index 0000000000000000000000000000000000000000..06577aa3cb2fe2d20f68392941c1c7a7756b3d91 --- /dev/null +++ b/V4 - version final/graphics.h @@ -0,0 +1,32 @@ +/** + * \file graphics.h + * \brief Gestion de l'affichage du jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#ifndef V1_GRAPHICS_H +#define V1_GRAPHICS_H + + +#include "constants.h" +#include "data.h" +#include "liste.h" +#include "fonctions_SDL.h" + + + +void init_textures(SDL_Renderer *renderer, resources_t *textures, world_t *world); + +void refresh_menu(SDL_Renderer *renderer, world_t *world, resources_t *textures); + +void refresh_graphics(SDL_Renderer *renderer, world_t *world, resources_t *textures); + +void apply_sprite(SDL_Renderer *renderer, SDL_Texture *texture, sprite_t *sprite); + +void clean(SDL_Window *window, SDL_Renderer *renderer, resources_t *textures, world_t *world); + +void clean_textures(resources_t *textures); + + +#endif //V1_GRAPHICS_H diff --git a/V4 - version final/graphics.o b/V4 - version final/graphics.o new file mode 100644 index 0000000000000000000000000000000000000000..e08c7cb8cca3e4a7e06233498fe4cdf7692c0341 Binary files /dev/null and b/V4 - version final/graphics.o differ diff --git a/V4 - version final/liste.c b/V4 - version final/liste.c new file mode 100755 index 0000000000000000000000000000000000000000..5e7e640c399ec670e79eb2e25fec145407fe6f0f --- /dev/null +++ b/V4 - version final/liste.c @@ -0,0 +1,76 @@ +/** + * \file liste.c + * \brief Gestion des listes + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#include "liste.h" + + + +list_t ajouter(list_t liste, sprite_t valeur) { + element *nouvelElement = malloc(sizeof(element)); + nouvelElement->val = valeur; + nouvelElement->nxt = NULL; + if (liste == NULL) { + return nouvelElement; + } else { + element *temp = liste; + while (temp->nxt != NULL) { + temp = temp->nxt; + } + temp->nxt = nouvelElement; + return liste; + } +} + +bool estVide(list_t liste) { + return (liste == NULL) ? 1 : 0; +} + +list_t supprimerElementEnTete(list_t liste) { + if (liste != NULL) { + element *aRenvoyer = liste->nxt; + free(liste); + return aRenvoyer; + } else { + return NULL; + } +} + +list_t supprimerElementEnFin(list_t liste) { + if (liste == NULL) + return NULL; + + if (liste->nxt == NULL) { + free(liste); + return NULL; + } + + element *tmp = liste; + element *ptmp = liste; + while (tmp->nxt != NULL) { + ptmp = tmp; + tmp = tmp->nxt; + } + + ptmp->nxt = NULL; + free(tmp); + return liste; +} + + +list_t l_vide() { + return NULL; +} + +int tailleListe(list_t liste) { + list_t liste_temp = liste; + int i = 0; + while (liste_temp != NULL) { + i++; + liste_temp = liste_temp->nxt; + } + return i; +} \ No newline at end of file diff --git a/V4 - version final/liste.h b/V4 - version final/liste.h new file mode 100755 index 0000000000000000000000000000000000000000..352263a436f3556bda084c4c9302269518d4e20f --- /dev/null +++ b/V4 - version final/liste.h @@ -0,0 +1,27 @@ +/** + * \file liste.h + * \brief Gestion des listes + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#ifndef V1_LISTE_H +#define V1_LISTE_H + + +#include "constants.h" +#include "data.h" + +list_t ajouter(list_t liste, sprite_t valeur); + +bool estVide(list_t liste); + +list_t supprimerElementEnTete(list_t liste); + +list_t supprimerElementEnFin(list_t liste); + +list_t l_vide(); + +int tailleListe(list_t liste); + +#endif //V1_LISTE_H diff --git a/V4 - version final/liste.o b/V4 - version final/liste.o new file mode 100644 index 0000000000000000000000000000000000000000..0dfd738a2ce095461ca5a5401449ffdc2cfa9c16 Binary files /dev/null and b/V4 - version final/liste.o differ diff --git a/V4 - version final/logic.c b/V4 - version final/logic.c new file mode 100755 index 0000000000000000000000000000000000000000..7749b1074a0376ab84a36920140a85befeb3863a --- /dev/null +++ b/V4 - version final/logic.c @@ -0,0 +1,40 @@ +/** + * \file logic.c + * \brief Gestion de la logique du jeu (physique) + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#include "logic.h" + + +double distance(sprite_t s1, sprite_t s2) { + double s1x = s1.position.x; + double s1y = s1.position.y; + double s2x = s2.position.x; + double s2y = s2.position.y; + return (sqrt(pow(s1x - s2x, 2) + pow(s1y - s2y, 2))); +} + +int sprites_collide(sprite_t *sp1, sprite_t *sp2) { + + int gauche1, gauche2, droite1, droite2, haut1, haut2, bas1, bas2; + + + haut1 = sp1->position.y - (sp1->h) / 2; + bas1 = sp1->position.y + (sp1->h) / 2; + haut2 = sp2->position.y - (sp2->h) / 2; + bas2 = sp2->position.y + (sp2->h) / 2; + gauche1 = sp1->position.x - (sp1->w) / 2; + droite1 = sp1->position.x + (sp1->w) / 2; + gauche2 = sp2->position.x - (sp2->w) / 2; + droite2 = sp2->position.x + (sp2->w) / 2; + + + if (bas1 <= haut2 || haut1 >= bas2 || droite1 <= gauche2 || gauche1 >= droite2) { + return false; + } else { + return true; + } +} + diff --git a/V4 - version final/logic.h b/V4 - version final/logic.h new file mode 100755 index 0000000000000000000000000000000000000000..5a6b07f70aa8b7d105514dac2c76f3b32d9753d5 --- /dev/null +++ b/V4 - version final/logic.h @@ -0,0 +1,18 @@ +/** + * \file logic.h + * \brief Gestion de la logique du jeu (physique) + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#ifndef V1_LOGIC_H +#define V1_LOGIC_H + +#include "data.h" + +double distance(sprite_t s1, sprite_t s2); + +int sprites_collide(sprite_t* sp1, sprite_t* sp2); + + +#endif //V1_LOGIC_H diff --git a/V4 - version final/logic.o b/V4 - version final/logic.o new file mode 100644 index 0000000000000000000000000000000000000000..aa2bae5ed195f6b416498a56f2431f2b78868cca Binary files /dev/null and b/V4 - version final/logic.o differ diff --git a/V4 - version final/main b/V4 - version final/main new file mode 100755 index 0000000000000000000000000000000000000000..f404b91729641c3dc1e3fe907f064f6b0387751c Binary files /dev/null and b/V4 - version final/main differ diff --git a/V4 - version final/main.c b/V4 - version final/main.c new file mode 100755 index 0000000000000000000000000000000000000000..ee85d56fa9cdb8cf5c8528c891fa448a903f04ec --- /dev/null +++ b/V4 - version final/main.c @@ -0,0 +1,45 @@ +/** + * \file main.c + * \brief Boucle de jeu + * \author YATIME Marouane - AIT OUALI Marouane + * \date 27 decembre 2021 + */ + +#include "constants.h" +#include "data.h" +#include "graphics.h" +#include "events.h" + +int main() { + + SDL_Event event; + world_t world; + resources_t textures; + SDL_Renderer *renderer; + SDL_Window *fenetre; + + time_t t; + srand((unsigned) time(&t)); + world.time_debut_jeu = t; + + init_game(&fenetre, &renderer, &textures, &world); + + while (!is_game_over(&world)) { + if (world.stop_menu == 0) { + handle_events(&event, renderer, &world, &textures); + update_menu(&world, &textures, renderer); + refresh_menu(renderer, &world, &textures); + } else { + refresh_graphics(renderer, &world, &textures); + update_data(&world, &textures, renderer); + handle_events(&event, renderer, &world, &textures); + } + SDL_Delay(4); + } + + + clean(fenetre, renderer, &textures, &world); + + SDL_Quit(); + return 0; +} diff --git a/V4 - version final/main.o b/V4 - version final/main.o new file mode 100644 index 0000000000000000000000000000000000000000..9af21e848fea2b6c821e04b70c835baba47d42ef Binary files /dev/null and b/V4 - version final/main.o differ