From f295e50d4eb78c08df697ec855239d82d4158cb5 Mon Sep 17 00:00:00 2001
From: suck5u <suck5u@etu.univ-lorraine.fr>
Date: Tue, 29 Dec 2020 23:20:38 +0100
Subject: [PATCH] =?UTF-8?q?Correction=20de=20probl=C3=A8me=20m=C3=A9moire.?=
 =?UTF-8?q?=20Erreur=20de=20segmentation=20toujours=20pr=C3=A9sente=20lors?=
 =?UTF-8?q?=20de=20la=20fermeture=20et=20al=C3=A9atoirement?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 code/display.c          | 40 ++++++++++++++++++++++++++--------------
 code/display.h          |  4 +++-
 code/enemy.c            |  2 +-
 code/file_management.c  |  2 +-
 code/round_management.c | 24 ++++++++++++++++++++----
 code/world_data.c       | 16 ++++++++++------
 data/save.txt           |  4 ++--
 7 files changed, 63 insertions(+), 29 deletions(-)

diff --git a/code/display.c b/code/display.c
index 0f4b22b..9a500a1 100644
--- a/code/display.c
+++ b/code/display.c
@@ -20,6 +20,13 @@ void refresh_graphics(SDL_Renderer *renderer, world_t *world,resources_t *resour
     
     //Fond
     SDL_RenderCopy(renderer, resources->background, NULL, NULL);
+
+    //Aloocation des ressources ennemis lors d'une nouvelle manche
+    if(world->rounds.is_new_round == 1)
+    {
+        realloc_enemies_ressources(renderer,resources,world);
+        world->rounds.is_new_round = 0;
+    }
     
     //Regarder vers le haut
     if (world->soldier.sprite.is_visible == 1){
@@ -85,13 +92,6 @@ void refresh_graphics(SDL_Renderer *renderer, world_t *world,resources_t *resour
     {
         SDL_RenderCopy(renderer, resources->bullet, NULL, &world->soldier.DestBullet[i]);
     }
-    
-    if(world->rounds.is_new_round == 1)
-    {
-        clear_enemies_ressources(resources);
-        init_enemies_ressources(renderer,resources,world);
-        world->rounds.is_new_round = 0;
-    }
 
     //Les ennemis
     for (int i = 0; i < world->rounds.number_enemies; i++)
@@ -192,16 +192,30 @@ void init_ressources(SDL_Renderer *renderer, resources_t *resources, world_t *wo
 
 void init_enemies_ressources(SDL_Renderer *renderer, resources_t *resources, world_t *world)
 {
-    resources->enemies = malloc(sizeof(SDL_Texture*)*world->rounds.number_enemies);
+    resources->enemies = (SDL_Texture**) malloc(sizeof(SDL_Texture*)*world->rounds.number_enemies);
     for (int i = 0; i < world->rounds.number_enemies; i++)
     {
         resources->enemies[i] = charger_image_transparente("../resources/Player/Right/IdleRight.bmp", renderer, 255,0,255);
     }
 }
 
-void clear_enemies_ressources(resources_t *resources)
+void realloc_enemies_ressources(SDL_Renderer *renderer, resources_t *resources, world_t *world)
 {
+    resources->enemies = (SDL_Texture**) realloc(resources->enemies,sizeof(SDL_Texture*)*world->rounds.number_enemies);
+    for (int i = 0; i < world->rounds.number_enemies; i++)
+    {
+        resources->enemies[i] = charger_image_transparente("../resources/Player/Right/IdleRight.bmp", renderer, 255,0,255);
+    }
+}
+
+void clear_enemies_ressources(resources_t *resources,int nbEnemies)
+{
+    for (int i = 0; i < nbEnemies; i++)
+    {
+        SDL_DestroyTexture(resources->enemies[i]);
+    }
     free(resources->enemies);
+    resources->enemies = NULL;
 }
 
 void destroy_textures(resources_t *resources, world_t *world)
@@ -224,11 +238,9 @@ void destroy_textures(resources_t *resources, world_t *world)
         SDL_DestroyTexture(resources->soldier_jump_right[i]);
     }
     
-    for (int i = 0; i < world->rounds.number_enemies; ++i)
-    {
-        SDL_DestroyTexture(resources->enemies[i]);
-    }
-    
+    printf("nbenemis %d\n",world->rounds.number_enemies);
+    clear_enemies_ressources(resources,world->rounds.number_enemies);
+
     SDL_DestroyTexture(resources->bullet);
     SDL_DestroyTexture(resources->enemy);
     SDL_DestroyTexture(resources->plane);
diff --git a/code/display.h b/code/display.h
index 8a23c75..d637dac 100644
--- a/code/display.h
+++ b/code/display.h
@@ -46,7 +46,9 @@ void init_ressources(SDL_Renderer *renderer, resources_t *resources, world_t *wo
 
 void init_enemies_ressources(SDL_Renderer *renderer, resources_t *resources, world_t *world);
 
-void clear_enemies_ressources(resources_t *resources);
+void realloc_enemies_ressources(SDL_Renderer *renderer, resources_t *resources, world_t *world);
+
+void clear_enemies_ressources(resources_t *resources,int nbEnemies);
 
 void destroy_textures(resources_t *resources, world_t *world);
 
diff --git a/code/enemy.c b/code/enemy.c
index e777187..8961cdc 100644
--- a/code/enemy.c
+++ b/code/enemy.c
@@ -48,7 +48,7 @@ void init_enemyType2(enemy_t *enemy)
     {
       init_sprite(&enemy->sprite, SCREEN_WIDTH+75, SCREEN_HEIGHT-ENEMY_HEIGHT*2-20, ENEMY_WIDTH, ENEMY_HEIGHT, ENEMY_T2_SPEED, 10);
     }else{
-      init_sprite(&enemy->sprite, -75, SCREEN_HEIGHT-ENEMY_HEIGHT*2-20, ENEMY_WIDTH, ENEMY_HEIGHT,ENEMY_T2_SPEED, 10);
+      init_sprite(&enemy->sprite, -75, SCREEN_HEIGHT-ENEMY_HEIGHT*2-20, ENEMY_WIDTH, ENEMY_HEIGHT,ENEMY_T2_SPEED, 5);
     }   
     enemy->type = 2;
     enemy->DestEnemy.x = enemy->sprite.x;
diff --git a/code/file_management.c b/code/file_management.c
index 18770b7..fe978e3 100644
--- a/code/file_management.c
+++ b/code/file_management.c
@@ -15,7 +15,7 @@ int* getDataSave(const char *name)
     
     //Deplacement : nombre de caractere du commentaire +2 (Sauf premier +1)
     int deplacement[4] = {24,28,43,19};
-    int *data = malloc(sizeof(int));
+    int *data = malloc(sizeof(int)*4);
     //int data[4];
     for(int i = 0; i < nb_lines/2; i++)
     {
diff --git a/code/round_management.c b/code/round_management.c
index be2e185..d8eb24a 100644
--- a/code/round_management.c
+++ b/code/round_management.c
@@ -4,7 +4,7 @@
 
 int isRoundEnded(round_t *round)
 {
-	for (int i = 0; i < round->number_enemies; ++i)
+	for (int i = 0; i < round->number_enemies; i++)
 	{
 		if(round->enemies[i].sprite.is_visible == 1)
 		{
@@ -23,7 +23,13 @@ void initFirstRound(round_t *round, int nbEnemies, int incrementation)
 	round->counter = 0;
 	round->index_to_spawn = 0;
 	round->is_new_round = 0;
-	createEnemies(round);
+
+	round->enemies = (enemy_t*) malloc(sizeof(enemy_t)*round->number_enemies);
+	for (int i = 0; i < round->number_enemies; i++)
+	{
+		init_enemy(&round->enemies[i]);
+	}
+
 	printf("Ennemis : %d Incrementation : %d\n",round->number_enemies,round->incrementation);
 }
 
@@ -44,20 +50,29 @@ void updateRound(round_t *round)
 
 void nextRound(round_t *round)
 {
-	clearEnemies(round);
 	round->round_number++;
 	printf("Manche %d\n",round->round_number);
 	round->number_enemies = round->number_enemies + round->incrementation;
 	round->index_to_spawn = 0;
 	round->counter = 0;
 	round->is_new_round = 1;
+	printf("nb enemies %d\n",round->number_enemies);
+	for (int i = 0; i < round->number_enemies; i++)
+	{
+		printf("avant %f i : %d\n",round->enemies[i].sprite.x,i);
+	}
+
 	createEnemies(round);
+	for (int i = 0; i < round->number_enemies; i++)
+	{
+		printf("apres %f i : %d\n",round->enemies[i].sprite.x,i);
+	}
 }
 
 //Créer nbEnemies
 void createEnemies(round_t *round)
 {
-	round->enemies = malloc(sizeof(enemy_t)*round->number_enemies);
+	round->enemies = (enemy_t*) realloc(round->enemies,sizeof(enemy_t)*round->number_enemies);
 	for (int i = 0; i < round->number_enemies; i++)
 	{
 		init_enemy(&round->enemies[i]);
@@ -67,4 +82,5 @@ void createEnemies(round_t *round)
 void clearEnemies(round_t *round)
 {
 	free(round->enemies);
+	round->enemies = NULL;
 }
\ No newline at end of file
diff --git a/code/world_data.c b/code/world_data.c
index 075b076..c1dbfa4 100644
--- a/code/world_data.c
+++ b/code/world_data.c
@@ -25,7 +25,7 @@ int* load_save()
   int* dataSave;
   dataSave = getDataSave("../data/save.txt");
 
-  int *dataToAdd = malloc(sizeof(int));
+  int *dataToAdd = malloc(sizeof(int)*3);
   //Initialiser les valeurs par défaut
   dataToAdd[0] = SOLDIER_HP;
   dataToAdd[1] = NUMBER_ENEMIES_START;
@@ -48,6 +48,7 @@ int* load_save()
   {
     dataToAdd[2] = dataSave[2];
   }
+  free(dataSave);
   return dataToAdd;
 }
 
@@ -73,6 +74,9 @@ void init_data(world_t *world)
   //Initialisation du soldat
   init_soldier(&world->soldier,data[0]);
   setBulletD(&world->soldier);
+
+  //Libérer data
+  free(data);
   
   init_supplying(&world->supplying,1);
   
@@ -164,8 +168,6 @@ void refresh_data(world_t *world)
 
     apply_effect(&world->supplying.powerUP,&world->soldier,&world->supplying.plane);
     
-
-
     
     //Position de l'affichage
     if(world->soldier.is_crouching == 1)
@@ -206,14 +208,16 @@ void handle_events(SDL_Event *event,world_t *world)
   //Uint8 *keystates;
   while(SDL_PollEvent(event))
   {
-    //Si l'utilisateur a cliqué sur le X de la fenêtre
-    if( event->type == SDL_QUIT || event->key.keysym.sym == SDLK_ESCAPE)
+    //Si l'utilisateur a cliqué sur le X de la fenêtre ou Echap
+    if(event->type == SDL_QUIT || event->key.keysym.sym == SDLK_ESCAPE)
     {
       //On indique la fin du jeu
+      //Sauvegarde la partie
       save_game(world);
       //Libère la mémoire du tableau DestBullet pour l'affichage
       free(world->soldier.DestBullet);
-      //clearEnemies(&world->rounds);
+      //Libère le tableau d'ennemis
+      clearEnemies(&world->rounds);
       world->gameover = 1;
     }
    
diff --git a/data/save.txt b/data/save.txt
index f24eb31..6056dd5 100644
--- a/data/save.txt
+++ b/data/save.txt
@@ -1,8 +1,8 @@
 /Vie du joueur au début
 10
 /Nombre d'ennemis au début
-11
+4
 /Nombre d'ennemis en plus à chaque manche
-3
+1
 /Nombre de balles
 30
-- 
GitLab