diff --git a/MAVENProject/src/main/java/entity/Boss.java b/MAVENProject/src/main/java/entity/Boss.java index 99257fb63ae1f819445cf328041a87adb0fce936..7f9ff086c09b826d2d7d8d5ff0a10a085c3827dc 100644 --- a/MAVENProject/src/main/java/entity/Boss.java +++ b/MAVENProject/src/main/java/entity/Boss.java @@ -2,11 +2,134 @@ package entity; import environnement.Coordonnees; //import environnement.Physique; +import environnement.Physique; +import environnement.PositionCollision; +import static environnement.PositionCollision.*; +import map.Obstacle; + +import static jeu.Jeu.getObstacleTable; + +import java.util.HashMap; +import java.util.List; public class Boss extends Monster{ + private int impulsionSaut = 0; + public Boss(Coordonnees c, double vitesseMax,double width,double height,int atkStt,int nbLP){ super(c, vitesseMax, width, height, atkStt, nbLP); } + + public void deplacements(){ + double delta = Math.pow(10, -3); + int nbRand = (int)(200*(Math.random()));//on cree une loi de bernouilli de parametre 1/200 + if (nbRand == 0 && alpha == 1){ //une chance sur 5 de sauter et ne saute que si au sol (alpha == 1) + impulsionSaut = 700000; + } + //on se souvient de ses anciennes positions + oldCoord = coord; + + //pour faire un deplacement cyclique + if ((coordInit.getX()-coord.getX() >= 500 && direction == -1) || coord.getX() <= obstacleBeneath.getHitbox().getExtremites().get("HautGauche").getX())direction = 1; + else if ((coordInit.getX()-coord.getX() <= -500 && direction == 1) || coord.getX() >= obstacleBeneath.getHitbox().getExtremites().get("HautDroite").getX())direction = -1; + //****************** + + double newX = coord.getX() + (1-Math.min(isAttacking,1))*direction*vitesseMax*delta; + + double newZ = (1-alpha)*Physique.g/2*delta*delta + this.vitesseActuZ*delta + this.getCoord().getZ(); + vitesseActuZ = vitesseActuZ + 8*(1-alpha)*Physique.g*delta; + + if (impulsionSaut != 0){ + + newZ = newZ - impulsionSaut/2*delta*delta; + System.out.println(newZ-coord.getZ()); + vitesseActuZ = vitesseActuZ - 8*impulsionSaut*delta; + } + + + + + + setCoord(new Coordonnees(newX, newZ)); + + } + + public void collisionGestion(){ + List<Obstacle> listeObstaclesInVoisinage = getObstacleTable(); + //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<listeObstaclesInVoisinage.size();i++) { + PositionCollision posCol = Obstacle.collision(this, listeObstaclesInVoisinage.get(i), i); + + collisionsPresentes.put(listeObstaclesInVoisinage.get(i),posCol); + } + + + + //on gere celles du bas + //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 (impulsionSaut != 0){ + System.out.println("coucou"); + break; + } + if (collisionsPresentes.get(listeObstaclesInVoisinage.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; + } + } + /*for (Obstacle obs : listeObstaclesInVoisinage){ //on cherche l'obstacle en-dessous du perso + if (obs.getHitbox().getExtremites().get("HautGauche").getZ() <= obstacleBeneath.getHitbox().getExtremites().get("HautGauche").getZ() && obs.getHitbox().getExtremites().get("HautGauche").getZ() >= hitBox.getExtremites().get("BasDroite").getZ()){ + obstacleBeneath = obs; + } + } + + if (collisionsPresentes.get(obstacleBeneath) == BAS && tableCommande.get("CommandAttack") == 0){ + this.vitesseActuZ = 0; + this.setCoord(new Coordonnees(this.getCoord().getX(), obstacleBeneath.getHitbox().getExtremites().get("HautGauche").getZ()-entityHEIGHT/2-1)); + alpha = 1; + onGround = true; + }*/ + + + //} + //on gere les collisions laterales et celle du haut + for (int i=0;i<collisionsPresentes.size();i++){ + + if (collisionsPresentes.get(listeObstaclesInVoisinage.get(i)) == DROITE && this.direction == -1){ + this.setCoord(new Coordonnees(listeObstaclesInVoisinage.get(i).getHitbox().getExtremites().get("HautDroite").getX()+entityWIDTH/2, this.getCoord().getZ())); + break; + } + + else if (collisionsPresentes.get(listeObstaclesInVoisinage.get(i)) == GAUCHE && this.direction == 1){ + this.setCoord(new Coordonnees(listeObstaclesInVoisinage.get(i).getHitbox().getExtremites().get("HautGauche").getX()-entityWIDTH/2, this.getCoord().getZ())); + break; + } + + } + + //on gere celles du haut + for (int i=0;i<collisionsPresentes.size();i++){ + if (collisionsPresentes.get(listeObstaclesInVoisinage.get(i)) == HAUT){ + this.vitesseActuZ = 0; + this.setCoord(new Coordonnees(this.getCoord().getX(), listeObstaclesInVoisinage.get(i).getHitbox().getExtremites().get("BasGauche").getZ()+entityHEIGHT/2+1)); + break; + } + } + } + + public void evolveMonster(){ + super.evolveMonster(); + impulsionSaut = 0; + } } diff --git a/MAVENProject/src/main/java/entity/Hearth.java b/MAVENProject/src/main/java/entity/Hearth.java new file mode 100644 index 0000000000000000000000000000000000000000..30b13988ae53fbc513f7ff4a75a0fd6367e851d5 --- /dev/null +++ b/MAVENProject/src/main/java/entity/Hearth.java @@ -0,0 +1,58 @@ +package entity; + +import environnement.Coordonnees; +import environnement.HitBox; +import jeu.Jeu; + +import static jeu.Jeu.getGameCharacter; +import static jeu.Jeu.getHearthList; + +import java.util.List; + +public class Hearth { + private HitBox hitBox; + private Coordonnees coord; + private int width = 20; + private int height = 20; + + public Hearth(Coordonnees coordinates){ + coord = coordinates; + hitBox = new HitBox(coord, height, width); + } + + private void heal(){ + if (HitBox.collision(hitBox, getGameCharacter().getHitBox())){ + getGameCharacter().setNbLifePoints(Math.min(getGameCharacter().getNbLifePoints()+1,getGameCharacter().getMaxLifePoints())); + getHearthList().remove(this); + } + } + + public HitBox getHitBox() { + return hitBox; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public static void evolveHearths(){ //on fait heal tous les coeurs + int k = 0; + List<Hearth> testList = getHearthList(); //necessaire pour l evolution de la bouble while + while (k < getHearthList().size()) { + //on sauvegarde la liste des coeurs avant de faire heal (ou non) le coeur a l indice k + testList = getHearthList(); + //on le fait heal (ou non) + getHearthList().get(k).heal(); + //si il a heal, il a alors disparu de la liste, donc les tailles ne sont plus les memes, on ne fait donc rien + if (testList.size() == getHearthList().size()); + //sinon, les tailles sont les memes, on passe donc au coeur suivant + k++; + } + } + + +} diff --git a/MAVENProject/src/main/java/entity/Monster.java b/MAVENProject/src/main/java/entity/Monster.java index 32802a187fe5537ed10dc195fe478a0cc825f9f2..43d5f5805a77f880b3a636417e957aa15602f6f0 100644 --- a/MAVENProject/src/main/java/entity/Monster.java +++ b/MAVENProject/src/main/java/entity/Monster.java @@ -130,9 +130,17 @@ public class Monster extends Entity{ //updateVoisinage(); this.setHitBox(new HitBox(this.getCoord(),entityHEIGHT,entityWIDTH)); updateNbFrameInvincible(); + if (death()) { + int nbRand = (int)(2*Math.random()); //on cree une loi de bernouilli de parametre 1/2 + if (nbRand == 0)dropHearth(); + } } + private void dropHearth(){ + Jeu.getHearthList().add(new Hearth(coord)); + } + public static void evolveAllMonsters(List<Monster> liste){ // evolution de tous les monstres if (!liste.isEmpty()){ for (Monster monster : liste)monster.evolveMonster(); diff --git a/MAVENProject/src/main/java/jeu/Jeu.java b/MAVENProject/src/main/java/jeu/Jeu.java index 1be258748c8be8d17eb1a05b85ae156ebf302180..2b1eae3534e8da575bdc317e0486da1086b6cef5 100644 --- a/MAVENProject/src/main/java/jeu/Jeu.java +++ b/MAVENProject/src/main/java/jeu/Jeu.java @@ -9,7 +9,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import entity.Boss; import entity.Character; +import entity.Hearth; import entity.Kunai; import entity.Monster; import entity.ShootingCharacter; @@ -58,6 +60,9 @@ public class Jeu implements Game{ private boolean characterAttacking = false; //boolean necessaire pour rendre l'animation d'attaque prioritaire + //liste des coeurs drop par les monstres + private static List<Hearth> hearthList = new ArrayList<>(); + //le sol public static Obstacle sol = new Obstacle(new HitBox(new Coordonnees(200,1064),1,1000000)); @@ -139,6 +144,7 @@ public class Jeu implements Game{ //on genere la table des monstres monsterList= levelManager.generateMonsterTable(); + monsterList.add(new Boss(new Coordonnees(5000, -1500), 500, 50, 100, 3, 50)); //on remplit la map des frames Map<String,Integer> tempMap = gameCharacterLoader.getPathTable(); @@ -176,6 +182,8 @@ public class Jeu implements Game{ Monster.evolveAllMonsters(monsterList); //kunais evoluent dans le jeu Kunai.evolveAllKunais(kunaiList); + //coeurs healent + Hearth.evolveHearths(); //animation du perso dans le jeu (definir la bonne frame a cet instant) animation(Attack, Right, Left); @@ -269,6 +277,10 @@ public class Jeu implements Game{ return levelManager; } + public static List<Hearth> getHearthList() { + return hearthList; + } + } \ No newline at end of file diff --git a/MAVENProject/src/main/java/jeu/Painter.java b/MAVENProject/src/main/java/jeu/Painter.java index 3f01b0f8386aeb65175324e4240fd07fb5472313..db4144453510efa6d1a57c1ec1d5c4c0bff978a3 100644 --- a/MAVENProject/src/main/java/jeu/Painter.java +++ b/MAVENProject/src/main/java/jeu/Painter.java @@ -1,6 +1,7 @@ package jeu; import engine.GamePainter; +import entity.Hearth; import entity.Kunai; import entity.Monster; import environnement.Coordonnees; @@ -49,7 +50,7 @@ public class Painter implements GamePainter{ drawKey(crayon); drawMonsters(crayon); drawKunais(crayon); - + drawHearths(crayon); drawCharacter(crayon,gameCharacterLoader.getImageCharacter()); } @@ -90,6 +91,17 @@ public class Painter implements GamePainter{ } } + private void drawHearths(Graphics2D crayon){ + for (Hearth hearth : getHearthList()){ + HashMap<String, Coordonnees> extremites = hearth.getHitBox().getExtremites(); + Coordonnees hd = extremites.get("HautDroite"); + Coordonnees bd = extremites.get("BasDroite"); + Coordonnees hg = extremites.get("HautGauche"); + Coordonnees bg = extremites.get("BasGauche"); + crayon.fillRect((int)hg.getX()-xCam, (int)hg.getZ()-zCam, hearth.getWidth(), hearth.getHeight()); + } + } + private void drawObstacle(Graphics2D crayon, Obstacle obstacle){ HashMap<String, Coordonnees> extremites = obstacle.getHitbox().getExtremites(); Coordonnees hd = extremites.get("HautDroite");