From 86f72cb5f8868a656be149ec16b1a97755e03e62 Mon Sep 17 00:00:00 2001
From: Louis MALTERRE <malterre.louis@laposte.net>
Date: Wed, 30 Nov 2022 18:30:58 +0100
Subject: [PATCH] collisions implementees
 (OUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUAAAAAAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIS)
 LM

---
 .../src/main/java/entity/Character.java       | 80 ++++++++++++++-----
 1 file changed, 58 insertions(+), 22 deletions(-)

diff --git a/MAVENProject/src/main/java/entity/Character.java b/MAVENProject/src/main/java/entity/Character.java
index 7e019e7..e0fc50d 100644
--- a/MAVENProject/src/main/java/entity/Character.java
+++ b/MAVENProject/src/main/java/entity/Character.java
@@ -7,12 +7,13 @@ import java.util.Map;
 import environnement.Coordonnees;
 import environnement.HitBox;
 import environnement.Physique;
+import static environnement.PositionCollision.*;
+import environnement.PositionCollision;
 import jeu.Jeu;
+import map.Obstacle;
 
 import static environnement.HitBox.collisionObstacle;
 import static jeu.Jeu.getObstacleTable;
-import static jeu.Jeu.getObstacleTableCollisionCharac;
-
 
 public class Character extends Entity{
 
@@ -22,15 +23,17 @@ public class Character extends Entity{
     private int nbLifePoints = 3;
     private double masse;
     private int alpha = 1; // gere les collisions avec le sol
-    private int beta = 1; // gere les collisions avec les murs
+
     private final double entityWIDTH = 30; // pour l'instant je les ai renommes, ca peut changer
     private final double entityHEIGHT = 60;
     private Map<String,Double> tableCommande; //table des commandes du perso
+
     //private BufferedImage sprite;
     
 
 
     public Character(Coordonnees c, double vitesseMax, double m, double impSaut){
+
         super(c,vitesseMax); // comme tous les entities ont une hitbox, j'ai factorise
         this.masse = m;
         this.oldCoord = this.getCoord();
@@ -38,16 +41,12 @@ public class Character extends Entity{
         this.setHitBox(new HitBox(c,entityHEIGHT,entityWIDTH));
         this.tableCommande = new HashMap<>();
         tableCommande.put("CommandX",(double)0);
-        tableCommande.put("CommandZ",(double)0);
-        //sprite = CharacterLoader.getImageCharacter();
-        
+        tableCommande.put("CommandZ",(double)0);       
     }
+
     @Override
     public void deplacements(){ // alpha indique si il est au sol ou non, il vaut 0 (en l'air) ou 1 (au sol) en fonction
-        if (this.getCoord().getZ()>= 700 ) {
-            alpha = 1;
-        }
-        else { alpha = 0;}
+        
         double delta = Math.pow(10, -3); // pas de temps remis en secondes
 
         //on actualise les positions
@@ -55,33 +54,67 @@ public class Character extends Entity{
         //on se souvient de ses anciennes positions
         this.oldCoord = this.getCoord();
 
-        newX =  beta*tableCommande.get("CommandX")*delta + this.getCoord().getX();
-        //if (newX + Math.signum(tableCommande.get("CommandX")*entityWIDTH/2 ))
+        newX = tableCommande.get("CommandX")*delta + this.getCoord().getX();
 
         
         newZ = ((1-alpha)*Physique.g - tableCommande.get("CommandZ"))/2*delta*delta + vitesseActuZ*delta + this.getCoord().getZ();
-        if (newZ+entityHEIGHT/2 >= obstacleBeneath.getHitbox().getExtremites().get("HautGauche").getZ()){
-            newZ = obstacleBeneath.getHitbox().getExtremites().get("HautGauche").getZ()-entityHEIGHT/2;
+        
+        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;
         }
 
-        //(tableCommande.get("CommandZ") == 0) this.getCoord().getZ()(tableCommande.get("CommandZ") == 0) && 
+        System.out.println(newZ-this.getCoord().getZ());
 
-        this.setCoord(new Coordonnees(newX, newZ)); // on set les nouvelles coordonnees
- 
+        this.setCoord(new Coordonnees(newX, newZ)); // on set les nouvelles coordonnees 
  
         //on actualise les vitesses
-        vitesseActuX = beta*tableCommande.get("CommandX");
+        vitesseActuX = tableCommande.get("CommandX");
 
-        if (alpha == 1) vitesseActuZ = 0;
-        /*else*/ vitesseActuZ = vitesseActuZ + 7*((1-alpha)*Physique.g - tableCommande.get("CommandZ"))*delta;
+        vitesseActuZ = vitesseActuZ + 7*((1-alpha)*Physique.g - tableCommande.get("CommandZ"))*delta;
     }
 
     public void collisionGestion(){
+        //stocke l'obstacle avec lequel il y a eu collision
+        HashMap<Obstacle,PositionCollision> collisionsPresentes = new HashMap<Obstacle,PositionCollision>();
+        
+        //recupere les collisions
         for (int i=0;i<getObstacleTable().size();i++) {
-            collisionObstacle(this.getHitBox(), getObstacleTable().get(i).getHitbox(), i);
-            System.out.println(collisionObstacle(this.getHitBox(), getObstacleTable().get(i).getHitbox(),i).toString());
+            collisionsPresentes.put(getObstacleTable().get(i),collisionObstacle(this.getHitBox(), getObstacleTable().get(i).getHitbox(), i));
         }
+
+        //on set alpha a 0 (on suppose qu'il est en l'air)
+        alpha = 0;
+
+        //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), on n'étudie qui si on ne donne pas de commande
+            if (tableCommande.get("CommandZ") != 0){
+                break;
+            }
+            if (collisionsPresentes.get(getObstacleTable().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;
+                break;
+            }
+        }
+
+        //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()));
+            }
+            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(getObstacleTable().get(i)) == HAUT){
+                this.vitesseActuZ = 0;
+                this.setCoord(new Coordonnees(this.getCoord().getX(), getObstacleTable().get(i).getHitbox().getExtremites().get("BasGauche").getZ()+entityHEIGHT/2+1));
+            }
+        }
+
+        
     }
     @Override
     public void attaque(){
@@ -89,6 +122,7 @@ public class Character extends Entity{
     }
 
     public void getGameCommand(){
+
         Map<String,Boolean> commandeJeu = Jeu.getDirectionJeu();
         if (commandeJeu.get("Right") && commandeJeu.get("Left")){tableCommande.replace("CommandX", (double)0);}
         else if (commandeJeu.get("Right")) tableCommande.replace("CommandX", vitesseMax);
@@ -97,7 +131,9 @@ public class Character extends Entity{
         
         if (commandeJeu.get("Jump")) {
             if ((alpha == 1) && (this.getVitesseActuZ() == 0)){
+                
                 tableCommande.replace("CommandZ", impulsionSaut);
+                System.out.println(tableCommande.get("CommandZ"));
             }      
         }
     }
-- 
GitLab