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