-
Louis MALTERRE authoredLouis MALTERRE authored
Character.java 6.40 KiB
package entity;
import java.util.HashMap;
import java.util.Map;
import environnement.Coordonnees;
import environnement.HitBox;
import map.Obstacle;
import environnement.Physique;
import jeu.Jeu;
public class Character extends Entity{
private double vitesseActuX = 0; // vitesse actuelle supposée nulle au départ
private double vitesseActuZ = 0;
private final double impulsionSaut;
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();
this.impulsionSaut = impSaut;
this.setHitBox(new HitBox(c,entityHEIGHT,entityWIDTH));
this.tableCommande = new HashMap<>();
tableCommande.put("CommandX",(double)0);
tableCommande.put("CommandZ",(double)0);
//sprite = CharacterLoader.getImageCharacter();
}
@Override
public void deplacements(){ // alpha indique si il est au sol ou non, il vaut 0 ou 1 en fonction
double delta = Math.pow(10, -3); // pas de temps remis en secondes
//on actualise les positions
double newX,newZ;
//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 ))
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;
//alpha = 1;
}
//(tableCommande.get("CommandZ") == 0) this.getCoord().getZ()(tableCommande.get("CommandZ") == 0) &&
this.setCoord(new Coordonnees(newX, newZ)); // on set les nouvelles coordonnees
//on actualise les vitesses
vitesseActuX = beta*tableCommande.get("CommandX");
if (alpha == 1) vitesseActuZ = 0;
/*else*/ vitesseActuZ = vitesseActuZ + 7*((1-alpha)*Physique.g - tableCommande.get("CommandZ"))*delta;
}
@Override
public void attaque(){
}
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);
else if (commandeJeu.get("Left")) tableCommande.replace("CommandX", -vitesseMax);
if (commandeJeu.get("Jump")) {
if ((alpha == 1) && (this.getVitesseActuZ() == 0)){
tableCommande.replace("CommandZ", impulsionSaut);
}
}
}
public void checkIfOnGround(){ // faut modifier la condition pour la gestion de colisions avec le sol
obstacleBeneathCharacter(); // cherche l'obstacle en-dessous du personnage
if (!Obstacle.collisionBas(this)){
alpha = 0;
}
else alpha = 1;
}
public void obstacleBeneathCharacter(){
Obstacle obsMin = Jeu.getSol();
for (Obstacle obs : Jeu.getObstacleTable()){
if (obs != Jeu.getSol() && obs.getHitbox().getExtremites().get("HautDroite").getZ() >= this.getCoord().getZ() && HitBox.collisionDroite(hitBox, obs.getHitbox()) && HitBox.collisionGauche(hitBox, obs.getHitbox())){
if (obs.getHitbox().getExtremites().get("HautDroite").getZ() < obsMin.getHitbox().getExtremites().get("HautDroite").getZ()){
obsMin = obs;
}
}
}obstacleBeneath = obsMin;
}
public void checkIfNextToWall(){
if ((Obstacle.collisionDroite(this, Jeu.getObstacleTable()) && tableCommande.get("CommandX") == -vitesseMax) || (Obstacle.collisionGauche(this, Jeu.getObstacleTable()) && tableCommande.get("CommandX") == vitesseMax)){
beta = 0;
}else {
beta = 1;
}
if (obstacleNextTo != null){
if (tableCommande.get("CommandX") > 0){
if (this.getCoord().getX()+entityWIDTH/2 >= obstacleNextTo.getHitbox().getExtremites().get("HautGauche").getX()){
this.setCoord(new Coordonnees(obstacleNextTo.getHitbox().getExtremites().get("HautGauche").getX()-entityWIDTH/2, this.getCoord().getZ()));
}
}
else if (tableCommande.get("CommandX") < 0){
if (this.getCoord().getX()-entityWIDTH/2 <= obstacleNextTo.getHitbox().getExtremites().get("HautDroite").getX()){
this.setCoord(new Coordonnees(obstacleNextTo.getHitbox().getExtremites().get("HautDroite").getX()+entityWIDTH/2, this.getCoord().getZ()));
}
}
}
}
public void resetCommand(){
for (String key : tableCommande.keySet()){
tableCommande.replace(key, (double)0);
}
}
public void evolveCharacter(){
System.out.println(beta);
getGameCommand();
checkIfOnGround();
//checkIfNextToWall();
deplacements();
checkIfNextToWall();
resetCommand();
this.setHitBox(new HitBox(this.getCoord(),entityHEIGHT,entityWIDTH)); // mise à jour moins crade pour l'instant
}
public double getVitesseMax() {
return vitesseMax;
}
public double getVitesseActuX() {
return vitesseActuX;
}
public double getVitesseActuZ() {
return vitesseActuZ;
}
public double getM() {
return masse;
}
public double getImpulsionSaut() {
return impulsionSaut;
}
@Override
public double getEntityWIDTH() {
return this.entityWIDTH;
}
@Override
public double getEntityHEIGHT() {
return this.entityHEIGHT;
}
public int getAlpha() {
return alpha;
}
}