From ff48d468efa99f115c8c42dc3ad21c50997d48c0 Mon Sep 17 00:00:00 2001
From: Louis MALTERRE <malterre.louis@laposte.net>
Date: Mon, 28 Nov 2022 18:49:09 +0100
Subject: [PATCH] collision update

---
 .../src/main/java/entity/Character.java       | 11 ++++++++--
 .../src/main/java/environnement/HitBox.java   |  8 +++----
 MAVENProject/src/main/java/jeu/Jeu.java       |  2 +-
 MAVENProject/src/main/java/jeu/Painter.java   |  4 ++--
 MAVENProject/src/main/java/map/Obstacle.java  | 22 +++++++++++++++++--
 5 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/MAVENProject/src/main/java/entity/Character.java b/MAVENProject/src/main/java/entity/Character.java
index ed95f57..b1842f3 100644
--- a/MAVENProject/src/main/java/entity/Character.java
+++ b/MAVENProject/src/main/java/entity/Character.java
@@ -21,6 +21,7 @@ public class Character extends Entity{
     private final double characterHEIGHT= 60;
     private Map<String,Double> tableCommande; //table des commandes du perso
     //private BufferedImage sprite;
+    private Obstacle obstacleBeneath = null;
 
 
     public Character(Coordonnees c, double vitesseMax, double m, double impSaut){
@@ -44,7 +45,7 @@ public class Character extends Entity{
 
         newX =  tableCommande.get("CommandX")*delta + this.getCoord().getX(); // frottements enleves (le perso finissait par freiner tout seul donc tant que y'a pas d'interet je les enleve, j'ai tjr les equations de cote)
 
-        if ((tableCommande.get("CommandZ") == 0) && (this.getCoord().getZ() >= Jeu.getCoordSol().getZ()))newZ = Jeu.getCoordSol().getZ();
+        if ((tableCommande.get("CommandZ") == 0) && (this.getCoord().getZ() >= Jeu.getCoordSol().getZ()))newZ = obstacleBeneath.getHitbox().getExtremites().get("HautGauche").getZ();
         else newZ = ((1-alpha)*Physique.g - tableCommande.get("CommandZ"))/2*delta*delta + vitesseActuZ*delta + this.getCoord().getZ();
 
         //System.out.println("écart de hauteur: "+this.getCoord().getZ());
@@ -80,7 +81,7 @@ public class Character extends Entity{
     }
 
     public void checkIfOnGround(){ // faut modifier la condition pour la gestion de colisions avec le sol
-        if (Obstacle.collisionBas(this, Jeu.getObstacleTable()))alpha = 0;
+        if (!Obstacle.collisionBas(this, Jeu.getObstacleTable()))alpha = 0;
         else alpha = 1;
     }
 
@@ -131,5 +132,11 @@ public class Character extends Entity{
     public HitBox getHitBox() {
         return hitBox;
     }
+    public Obstacle getObstacleBeneath() {
+        return obstacleBeneath;
+    }
+    public void setObstacleBeneath(Obstacle obstacleBeneath) {
+        this.obstacleBeneath = obstacleBeneath;
+    }
     
 }
diff --git a/MAVENProject/src/main/java/environnement/HitBox.java b/MAVENProject/src/main/java/environnement/HitBox.java
index cc8983b..28b8dc7 100644
--- a/MAVENProject/src/main/java/environnement/HitBox.java
+++ b/MAVENProject/src/main/java/environnement/HitBox.java
@@ -38,15 +38,15 @@ public class HitBox {
     }
 
     public static Boolean collisionDroite(HitBox A, HitBox B){
-        return !(A.extremites.get("HautGauche").getX() >= B.extremites.get("HautDroite").getX());
+        return !(A.extremites.get("HautGauche").getX() >= B.extremites.get("HautDroite").getX());// A est à droite de B
     }
     public static Boolean collisionGauche(HitBox A, HitBox B){
-        return !(A.extremites.get("HautDroite").getX() <= B.extremites.get("HautGauche").getX());
+        return !(A.extremites.get("HautDroite").getX() <= B.extremites.get("HautGauche").getX());// A est à gauche de B
     }
     public static Boolean collisionBas(HitBox A, HitBox B){
-        return !(A.extremites.get("HautGauche").getZ() >= B.extremites.get("BasGauche").getZ());
+        return !(A.extremites.get("HautGauche").getZ() >= B.extremites.get("BasGauche").getZ());// A est en dessous de B
     }
     public static Boolean collisionHaut(HitBox A, HitBox B){
-        return !(A.extremites.get("BasGauche").getZ() <= B.extremites.get("HautGauche").getZ());
+        return !(A.extremites.get("BasGauche").getZ() <= B.extremites.get("HautGauche").getZ());// A est au dessus de B
     }
 }
\ No newline at end of file
diff --git a/MAVENProject/src/main/java/jeu/Jeu.java b/MAVENProject/src/main/java/jeu/Jeu.java
index 00f08ac..fe19cf9 100644
--- a/MAVENProject/src/main/java/jeu/Jeu.java
+++ b/MAVENProject/src/main/java/jeu/Jeu.java
@@ -96,7 +96,7 @@ public class Jeu implements Game{
         gameCharacterLoader.setPathTable(tempMap);
 
         obstacleTable.add(sol);
-        obstacleTable.add(new Obstacle(new HitBox(new Coordonnees(300,550),100,120)));
+        obstacleTable.add(new Obstacle(new HitBox(new Coordonnees(300,550),32,128)));
 
     }
 
diff --git a/MAVENProject/src/main/java/jeu/Painter.java b/MAVENProject/src/main/java/jeu/Painter.java
index 6908992..697bc22 100644
--- a/MAVENProject/src/main/java/jeu/Painter.java
+++ b/MAVENProject/src/main/java/jeu/Painter.java
@@ -54,8 +54,8 @@ public class Painter implements GamePainter{
     private void drawCharacter(Graphics2D crayon,Image imageCharac){
         int x = (int) gameCharacter.getCoord().getX();
         int y = (int) gameCharacter.getCoord().getZ();
-        //crayon.fillRect(x-15,y-30, (int) gameCharacter.getEntityWIDTH(),(int) gameCharacter.getEntityHEIGHT());
-        crayon.drawImage(imageCharac, x-(int) gameCharacter.getEntityWIDTH(), y- (int) gameCharacter.getEntityHEIGHT(), null, null);
+        crayon.fillRect(x-(int) gameCharacter.getEntityWIDTH()/2,y-(int) gameCharacter.getEntityHEIGHT()/2, (int) gameCharacter.getEntityWIDTH(),(int) gameCharacter.getEntityHEIGHT());
+        crayon.drawImage(imageCharac, x-(int) gameCharacter.getEntityWIDTH()/2, y- (int) gameCharacter.getEntityHEIGHT()/2, null, null);
 
     }
 
diff --git a/MAVENProject/src/main/java/map/Obstacle.java b/MAVENProject/src/main/java/map/Obstacle.java
index dd3fbb9..bb2c884 100644
--- a/MAVENProject/src/main/java/map/Obstacle.java
+++ b/MAVENProject/src/main/java/map/Obstacle.java
@@ -4,6 +4,9 @@ import java.util.List;
 
 import entity.Character;
 import environnement.HitBox;
+import jeu.Jeu;
+
+
 
 public class Obstacle {
 
@@ -18,8 +21,23 @@ public class Obstacle {
     
     public static Boolean collisionBas(Character charac,List<Obstacle> list){
         for (Obstacle obs : list){
-            if (HitBox.collisionBas(obs.getHitbox(),charac.getHitBox()))return true;
-        }
+            if (obs != Jeu.getSol()){
+
+                
+                if (HitBox.collisionDroite(charac.getHitBox(),obs.getHitbox()) && HitBox.collisionGauche(charac.getHitBox(),obs.getHitbox()) && HitBox.collisionBas(obs.getHitbox(),charac.getHitBox())){
+                    
+                    charac.setObstacleBeneath(obs);
+                    return true;
+                }
+
+            }
+            else{
+                if (HitBox.collisionBas(obs.getHitbox(), charac.getHitBox())) {
+                    charac.setObstacleBeneath(obs);
+                    return true;
+                }
+            }
+        }//a revoir
         return false;
     }
 }
-- 
GitLab