Skip to content
Snippets Groups Projects
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;
    }
    
}