From 62255d2954baea8fdf6bbcd700c05ad5260332b8 Mon Sep 17 00:00:00 2001
From: Louis MALTERRE <malterre.louis@laposte.net>
Date: Mon, 5 Dec 2022 23:02:15 +0100
Subject: [PATCH] le systeme dee voisinage n'est tjr pas 100% opti, lorsqu'il
 est trop petit y' a des pbs dans les collisions ca reste un mystere pour moi
 atm. Mais sinon la le voisinage est normalement assez grand pour que ca
 marche. LM

---
 .../src/main/java/entity/Character.java       | 40 ++++++++++++-------
 MAVENProject/src/main/java/entity/Entity.java | 11 +++--
 .../src/main/java/entity/Monster.java         | 16 ++++----
 MAVENProject/src/main/java/jeu/Jeu.java       | 32 +++++++++------
 MAVENProject/src/main/java/jeu/Painter.java   |  4 ++
 5 files changed, 65 insertions(+), 38 deletions(-)

diff --git a/MAVENProject/src/main/java/entity/Character.java b/MAVENProject/src/main/java/entity/Character.java
index c30a993..38b0e86 100644
--- a/MAVENProject/src/main/java/entity/Character.java
+++ b/MAVENProject/src/main/java/entity/Character.java
@@ -56,18 +56,18 @@ public class Character extends Entity{
         
         newZ = ((1-alpha)*Physique.g - tableCommande.get("CommandZ"))/2*delta*delta + vitesseActuZ*delta + this.getCoord().getZ();
         
-        if (newZ+entityHEIGHT/2 >= Jeu.getSol().getHitbox().getExtremites().get("HautGauche").getZ()){
+        /*if (newZ+entityHEIGHT/2 >= Jeu.getSol().getHitbox().getExtremites().get("HautGauche").getZ()){
             newZ = Jeu.getSol().getHitbox().getExtremites().get("HautGauche").getZ()-entityHEIGHT/2; //on remet sur le sol
             alpha = 1;
-        }
+        }*/
 
         this.setCoord(new Coordonnees(newX, newZ)); // on set les nouvelles coordonnees 
  
         //on actualise les vitesses
         vitesseActuX = tableCommande.get("CommandX");
-
-        direction = (int) Math.signum(vitesseActuX);
-        System.out.println(direction);
+        if (vitesseActuX != 0){
+            direction = (int) Math.signum(vitesseActuX);
+        }
 
         vitesseActuZ = vitesseActuZ + 7*((1-alpha)*Physique.g - tableCommande.get("CommandZ"))*delta;
     }
@@ -79,7 +79,9 @@ public class Character extends Entity{
         
         //recupere les collisions
         for (int i=0;i<listeObstaclesInVoisinage.size();i++) {
-            collisionsPresentes.put(listeObstaclesInVoisinage.get(i),Obstacle.collision(this, listeObstaclesInVoisinage.get(i), i));
+            PositionCollision posCol = Obstacle.collision(this, listeObstaclesInVoisinage.get(i), i);
+            
+            collisionsPresentes.put(listeObstaclesInVoisinage.get(i),posCol);
         }
 
         //on set alpha a 0 (on suppose qu'il est en l'air)
@@ -91,7 +93,7 @@ public class Character extends Entity{
             if (tableCommande.get("CommandZ") != 0){
                 break;
             }
-            if (collisionsPresentes.get(getObstacleTable().get(i)) == BAS){           
+            if (collisionsPresentes.get(listeObstaclesInVoisinage.get(i)) == BAS){           
                 this.vitesseActuZ = 0;
                 this.setCoord(new Coordonnees(this.getCoord().getX(), getObstacleTable().get(i).getHitbox().getExtremites().get("HautGauche").getZ()-entityHEIGHT/2));
                 alpha = 1;
@@ -101,20 +103,27 @@ public class Character extends Entity{
 
         //on gere les collisions laterales et celle du haut
         for (int i=0;i<collisionsPresentes.size();i++){
-            if (collisionsPresentes.get(getObstacleTable().get(i)) == DROITE && this.vitesseActuX < 0){
-                this.setCoord(new Coordonnees(getObstacleTable().get(i).getHitbox().getExtremites().get("HautDroite").getX()+entityWIDTH/2, this.getCoord().getZ()));
+
+            if (collisionsPresentes.get(listeObstaclesInVoisinage.get(i)) == DROITE && this.vitesseActuX < 0){
+                this.setCoord(new Coordonnees(listeObstaclesInVoisinage.get(i).getHitbox().getExtremites().get("HautDroite").getX()+entityWIDTH/2, this.getCoord().getZ()));
+                break;
             }
-            else if (collisionsPresentes.get(getObstacleTable().get(i)) == GAUCHE && this.vitesseActuX > 0){
-                this.setCoord(new Coordonnees(getObstacleTable().get(i).getHitbox().getExtremites().get("HautGauche").getX()-entityWIDTH/2, this.getCoord().getZ()));
+            else if (collisionsPresentes.get(listeObstaclesInVoisinage.get(i)) == GAUCHE && this.vitesseActuX > 0){
+                this.setCoord(new Coordonnees(listeObstaclesInVoisinage.get(i).getHitbox().getExtremites().get("HautGauche").getX()-entityWIDTH/2, this.getCoord().getZ()));
+                break;
             }
-            else if (collisionsPresentes.get(getObstacleTable().get(i)) == HAUT){
+
+        }
+        for (int i=0;i<collisionsPresentes.size();i++){
+            if (collisionsPresentes.get(listeObstaclesInVoisinage.get(i)) == HAUT){
                 this.vitesseActuZ = 0;
-                this.setCoord(new Coordonnees(this.getCoord().getX(), getObstacleTable().get(i).getHitbox().getExtremites().get("BasGauche").getZ()+entityHEIGHT/2+1));
+                this.setCoord(new Coordonnees(this.getCoord().getX(), listeObstaclesInVoisinage.get(i).getHitbox().getExtremites().get("BasGauche").getZ()+entityHEIGHT/2+1));
+                break;
             }
         }    
     }
 
-    public List<Obstacle> obstacleInVoisinage(){
+    public List<Obstacle> obstacleInVoisinage(){ //recupere la liste des obstacles presents dans le voisinage
         List<Obstacle> liste = new ArrayList<>();
         for (Obstacle obs : getObstacleTable()){
             if (HitBox.collision(voisinage, obs.getHitbox())){
@@ -124,6 +133,7 @@ public class Character extends Entity{
         return liste;
     }
 
+
     @Override
     public void attaque(){
         for (Monster monster : Jeu.getMonsterList()){
@@ -187,7 +197,7 @@ public class Character extends Entity{
     }
 
     public void updateVoisinage(){
-        voisinage = new HitBox(coord, 600, 600);
+        voisinage = new HitBox(coord, 1000, 1000);
     }
 
     public Boolean death(){
diff --git a/MAVENProject/src/main/java/entity/Entity.java b/MAVENProject/src/main/java/entity/Entity.java
index cf83ac5..1a14d61 100644
--- a/MAVENProject/src/main/java/entity/Entity.java
+++ b/MAVENProject/src/main/java/entity/Entity.java
@@ -6,6 +6,7 @@ import java.util.List;
 import environnement.Coordonnees;
 import environnement.HitBox;
 import environnement.PositionCollision;
+import static jeu.Jeu.getObstacleTable;
 import static environnement.PositionCollision.NONE;
 import map.Obstacle;
 
@@ -37,10 +38,9 @@ public abstract class Entity {
         this.entityWIDTH = width;
         this.hitBox = new HitBox(c, entityHEIGHT, entityWIDTH);
         this.voisinage = new HitBox(c, 600, 600);
-        obstacleTableCollision.add(NONE);
-        obstacleTableCollision.add(NONE);
-        obstacleTableCollision.add(NONE);
-        obstacleTableCollision.add(NONE);
+        for (int i = 0;i<getObstacleTable().size();i++){
+            obstacleTableCollision.add(NONE);
+        }
     }
     public void deplacements(){}
 
@@ -114,6 +114,9 @@ public abstract class Entity {
 
     public int getDirection() {
         return direction;
+    }
+    public HitBox getVoisinage() {
+        return voisinage;
     }   
     
 }
diff --git a/MAVENProject/src/main/java/entity/Monster.java b/MAVENProject/src/main/java/entity/Monster.java
index c84f544..cfbaa0d 100644
--- a/MAVENProject/src/main/java/entity/Monster.java
+++ b/MAVENProject/src/main/java/entity/Monster.java
@@ -44,6 +44,7 @@ public class Monster extends Entity{
     }
 
     public void collisionGestion(){
+        //recupere la liste des obstacles dans le voisinage
         List<Obstacle> listeObstaclesInVoisinage = obstacleInVoisinage();
         //stocke l'obstacle avec lequel il y a eu collision
         HashMap<Obstacle,PositionCollision> collisionsPresentes = new HashMap<Obstacle,PositionCollision>();
@@ -59,9 +60,9 @@ public class Monster extends Entity{
         //on parcourt pour tester si il est sur un block
         for (int i=0;i<collisionsPresentes.size();i++){
             //si on trouve on sort de la boucle (pas besoin d'aller plus loin)
-            if (collisionsPresentes.get(getObstacleTable().get(i)) == BAS){           
+            if (collisionsPresentes.get(listeObstaclesInVoisinage.get(i)) == BAS){           
                 this.vitesseActuZ = 0;
-                this.setCoord(new Coordonnees(this.getCoord().getX(), getObstacleTable().get(i).getHitbox().getExtremites().get("HautGauche").getZ()-entityHEIGHT/2));
+                this.setCoord(new Coordonnees(this.getCoord().getX(), listeObstaclesInVoisinage.get(i).getHitbox().getExtremites().get("HautGauche").getZ()-entityHEIGHT/2));
                 alpha = 1;
                 break;
             }
@@ -69,18 +70,19 @@ public class Monster extends Entity{
         
         //on gere les collisions laterales
         for (int i=0;i<collisionsPresentes.size();i++){
-            if (collisionsPresentes.get(getObstacleTable().get(i)) == DROITE && this.direction == -1){
-                this.setCoord(new Coordonnees(getObstacleTable().get(i).getHitbox().getExtremites().get("HautDroite").getX()+entityWIDTH/2, this.getCoord().getZ()));
+            if (collisionsPresentes.get(listeObstaclesInVoisinage.get(i)) == DROITE && this.direction == -1){
+                this.setCoord(new Coordonnees(listeObstaclesInVoisinage.get(i).getHitbox().getExtremites().get("HautDroite").getX()+entityWIDTH/2, this.getCoord().getZ()));
                 this.direction = 1;
                 break;
             }
-            else if (collisionsPresentes.get(getObstacleTable().get(i)) == GAUCHE && this.direction == 1){
-                this.setCoord(new Coordonnees(getObstacleTable().get(i).getHitbox().getExtremites().get("HautGauche").getX()-entityWIDTH/2, this.getCoord().getZ()));
+            else if (collisionsPresentes.get(listeObstaclesInVoisinage.get(i)) == GAUCHE && this.direction == 1){
+                this.setCoord(new Coordonnees(listeObstaclesInVoisinage.get(i).getHitbox().getExtremites().get("HautGauche").getX()-entityWIDTH/2, this.getCoord().getZ()));
                 this.direction = -1;
                 break;
             }
         }
     }
+
     
     public void attaque(){
         if (HitBox.collision(this.hitBox, getGameCharacter().getHitBox())){
@@ -111,7 +113,7 @@ public class Monster extends Entity{
 
     }
 
-    public List<Obstacle> obstacleInVoisinage(){
+    public List<Obstacle> obstacleInVoisinage(){ //recupere la liste des obstacles presents dans le voisinage
         List<Obstacle> liste = new ArrayList<>();
         for (Obstacle obs : Jeu.getObstacleTable()){
             if (HitBox.collision(voisinage, obs.getHitbox())){
diff --git a/MAVENProject/src/main/java/jeu/Jeu.java b/MAVENProject/src/main/java/jeu/Jeu.java
index 7098eb2..fca7b67 100644
--- a/MAVENProject/src/main/java/jeu/Jeu.java
+++ b/MAVENProject/src/main/java/jeu/Jeu.java
@@ -70,8 +70,7 @@ public class Jeu implements Game{
         characterSkinPath = beginPath + movement + numberOfMovement + ".png"; // path premiere frame
         /*A = new ArrayList<Double>();
         n = 0;*/
-        gameCharacterLoader = new CharacterLoader(characterSkinPath,new Character(new Coordonnees(300, 300), 2000, 1,600000));
-        gameCharacter = gameCharacterLoader.getGameCharacter();
+        
         try {
             helpReader = new BufferedReader(new FileReader(source));
             String line;
@@ -90,6 +89,25 @@ public class Jeu implements Game{
         directionJeu.put("Jump", false);
         directionJeu.put("Attack",false);
         
+        
+
+        obstacleTable.add(sol);
+        obstacleTable.add(new Obstacle(new HitBox(new Coordonnees(300,550),32,128)));
+        obstacleTable.add(new Obstacle(new HitBox(new Coordonnees(800, 625),150,50)));
+        obstacleTable.add(new Obstacle(new HitBox(new Coordonnees(600, 662.5),75,50)));
+        obstacleTable.add(new Obstacle(new HitBox(new Coordonnees(450, 400),32,128)));
+
+        //coffreTable.add(new Coffre(new HitBox(new Coordonnees(900, 685),30,30)));
+
+        //on met des monstres
+        monsterList.add(new Monster(new Coordonnees(1000, sol.getHitbox().getExtremites().get("HautGauche").getZ()-500), 1000, 30, 60, 1,10));
+        monsterList.add(new Monster(new Coordonnees(500, sol.getHitbox().getExtremites().get("HautGauche").getZ()-500), 1000, 30, 60, 1,10));
+        monsterList.add(new Monster(new Coordonnees(100, sol.getHitbox().getExtremites().get("HautGauche").getZ()-500), 1000, 30, 60, 1,10));
+
+        //on charge le perso (a la fin du constructeur, cest important par rapport a obstacleTable, sinon y'a des pbs de "causalite")
+        gameCharacterLoader = new CharacterLoader(characterSkinPath,new Character(new Coordonnees(300, 300), 2000, 1,600000));
+        gameCharacter = new Character(new Coordonnees(300, 300), 2000, 1,600000);
+
         //on remplit la map des frames
         Map<String,Integer> tempMap = gameCharacterLoader.getPathTable();
 
@@ -100,16 +118,6 @@ public class Jeu implements Game{
         tempMap.put("character_jump",1);
 
         gameCharacterLoader.setPathTable(tempMap);
-
-        obstacleTable.add(sol);
-        obstacleTable.add(new Obstacle(new HitBox(new Coordonnees(300,550),32,128)));
-        obstacleTable.add(new Obstacle(new HitBox(new Coordonnees(800, 625),150,50)));
-        obstacleTable.add(new Obstacle(new HitBox(new Coordonnees(600, 662.5),75,50)));
-        //coffreTable.add(new Coffre(new HitBox(new Coordonnees(900, 685),30,30)));
-
-
-        monsterList.add(new Monster(new Coordonnees(1000, sol.getHitbox().getExtremites().get("HautGauche").getZ()-500), 1000, 30, 60, 1,10));
-
     }
 
     @Override
diff --git a/MAVENProject/src/main/java/jeu/Painter.java b/MAVENProject/src/main/java/jeu/Painter.java
index 62cf336..04558e9 100644
--- a/MAVENProject/src/main/java/jeu/Painter.java
+++ b/MAVENProject/src/main/java/jeu/Painter.java
@@ -48,6 +48,7 @@ public class Painter implements GamePainter{
         int x = (int) gameCharacter.getCoord().getX();
         int y = (int) gameCharacter.getCoord().getZ();
         crayon.fillRect(x-(int) gameCharacter.getEntityWIDTH()/2,y-(int) gameCharacter.getEntityHEIGHT()/2, (int) gameCharacter.getEntityWIDTH(),(int) gameCharacter.getEntityHEIGHT());
+        crayon.drawRect(x-500,y-500, 1000,1000);
         crayon.drawImage(imageCharac, x-(int) gameCharacter.getEntityWIDTH()/2-10, y- (int) gameCharacter.getEntityHEIGHT()/2-3, null, null);
 
     }
@@ -76,6 +77,7 @@ public class Painter implements GamePainter{
         Coordonnees bd = extremites.get("BasDroite");
         Coordonnees hg = extremites.get("HautGauche");
         Coordonnees bg = extremites.get("BasGauche");
+        if (HitBox.collision(gameCharacter.getVoisinage(), obstacle.getHitbox()))crayon.setColor(Color.green);
         crayon.drawLine((int)hd.getX(),(int)hd.getZ(),(int)bd.getX(),(int)bd.getZ());
         crayon.drawLine((int)bd.getX(),(int)bd.getZ(),(int)bg.getX(),(int)bg.getZ());
         crayon.drawLine((int)bg.getX(),(int)bg.getZ(),(int)hg.getX(),(int)hg.getZ());
@@ -147,8 +149,10 @@ public class Painter implements GamePainter{
         crayon.setColor(Color.blue);
         for (Monster monster : getMonsterList()){
             crayon.setColor(Color.blue);
+            
             x = (int)monster.getCoord().getX();
             z = (int)monster.getCoord().getZ();
+            crayon.drawRect(x-300, z-300, 600, 600);
             if (HitBox.collision(gameCharacter.getHitBox(),monster.getHitBox()))crayon.setColor(Color.red);
             crayon.fillRect(x-(int)monster.getEntityWIDTH()/2, z-(int)monster.getEntityHEIGHT()/2, (int)monster.getEntityWIDTH(), (int)monster.getEntityHEIGHT());
         }
-- 
GitLab