From 3d13bea7947c311023ac2998f2d57deda45da167 Mon Sep 17 00:00:00 2001
From: Louis <malterre.louis@laposte.net>
Date: Sat, 10 Dec 2022 19:23:28 +0100
Subject: [PATCH] perso qui attaque a distance implemente LM

---
 Backlog sprint 3                              | 10 +--
 .../src/main/java/entity/Character.java       |  6 ++
 MAVENProject/src/main/java/entity/Kunai.java  | 81 +++++++++++++++++++
 .../main/java/entity/ShootingCharacter.java   | 32 ++++++++
 MAVENProject/src/main/java/jeu/Jeu.java       | 17 +++-
 MAVENProject/src/main/java/jeu/Painter.java   | 16 ++++
 6 files changed, 155 insertions(+), 7 deletions(-)
 create mode 100644 MAVENProject/src/main/java/entity/Kunai.java
 create mode 100644 MAVENProject/src/main/java/entity/ShootingCharacter.java

diff --git a/Backlog sprint 3 b/Backlog sprint 3
index 5b4896b..789130f 100644
--- a/Backlog sprint 3	
+++ b/Backlog sprint 3	
@@ -1,10 +1,10 @@
--Avoir des collisions fonctionnelles
--Création des monstres
+-Avoir des collisions fonctionnelles +
+-Création des monstres +
 -Création des coffres et des clés
--Création des vies
--Création de la caméra
+-Création des vies +
+-Création de la caméra +
 -Création du niveau
--Implémenter une musique
+-Implémenter une musique +
 
 
 
diff --git a/MAVENProject/src/main/java/entity/Character.java b/MAVENProject/src/main/java/entity/Character.java
index de78864..dd3c9ac 100644
--- a/MAVENProject/src/main/java/entity/Character.java
+++ b/MAVENProject/src/main/java/entity/Character.java
@@ -208,4 +208,10 @@ public class Character extends Entity{
     public Boolean death(){
         return nbLifePoints == 0;
     }
+
+    public Map<String, Double> getTableCommande() {
+        return tableCommande;
+    }
+
+    
 }
diff --git a/MAVENProject/src/main/java/entity/Kunai.java b/MAVENProject/src/main/java/entity/Kunai.java
new file mode 100644
index 0000000..6035ee8
--- /dev/null
+++ b/MAVENProject/src/main/java/entity/Kunai.java
@@ -0,0 +1,81 @@
+package entity;
+
+import java.util.List;
+
+import environnement.Coordonnees;
+import environnement.HitBox;
+import static jeu.Jeu.getMonsterList;
+
+public class Kunai {
+    private final int direction; //1 si vers la droite, -1 si vers la gauche
+    private final int damage;
+    private final double vitesse = 5;
+    private HitBox hitBox;
+    private Coordonnees coord;
+    private final Coordonnees coordInit; //coordonnees initiales
+    private boolean disappear = false; //variable disant si le kunai doit disparaitre ou non
+    private static final int sideLength = 16;
+
+    public Kunai(int dir,int dmg,Coordonnees c){
+        coord = c;
+        coordInit = coord;
+        damage = dmg;
+        direction = dir;
+        hitBox = new HitBox(coord,sideLength,sideLength);
+    }
+
+    public void deplacement(){ //deplacement du kunai
+        double newX = coord.getX() + direction*vitesse;
+        this.coord = new Coordonnees(newX, this.coord.getZ());
+    }
+
+    public void updateHitBox(){ //on update la hitbox du kunai
+        hitBox = new HitBox(coord,sideLength,sideLength);
+    }
+
+    public void dealsDamage(Entity entity){
+        if (HitBox.collision(hitBox, entity.getHitBox())){
+            if (entity.nbFramesInvincible == 0){
+                entity.setNbLifePoints(Math.max(entity.getNbLifePoints()-damage,0));
+                entity.nbFramesInvincible = entity.nbMaxFramesInvicible;//l'entity devient invincible qq frames
+            }
+            disappear = true; //disparait apres choc avec un monstre
+        }
+    }
+
+    private void evolveKunai(){
+        deplacement();
+        updateHitBox();
+        for (Monster monster : getMonsterList()){
+            dealsDamage(monster);
+            if (disappear)break; //si le kunai a disparu on arrete de regarder les autres monstres
+
+        }
+        if (Math.abs(coordInit.getX()-coord.getX()) >= 500) disappear = true; //au bout d'une certaine distance parcourue, il disparait
+    }
+
+    public static void evolveAllKunais(List<Kunai> liste){
+        for (Kunai kunai : liste){
+            kunai.evolveKunai();
+        }
+        int k = 0;
+        while (k < liste.size()){
+            if (liste.get(k).disappear) liste.remove(liste.get(k));
+            else k++;
+        }
+    }
+
+    public Coordonnees getCoord() {
+        return coord;
+    }
+
+    public HitBox getHitBox() {
+        return hitBox;
+    }
+
+    public static int getSideLength() {
+        return sideLength;
+    }
+    
+
+}
diff --git a/MAVENProject/src/main/java/entity/ShootingCharacter.java b/MAVENProject/src/main/java/entity/ShootingCharacter.java
new file mode 100644
index 0000000..f46ba8c
--- /dev/null
+++ b/MAVENProject/src/main/java/entity/ShootingCharacter.java
@@ -0,0 +1,32 @@
+package entity;
+
+import java.util.List;
+
+import environnement.Coordonnees;
+import jeu.Jeu;
+
+public class ShootingCharacter extends Character{
+
+    private int hasAttacked = 0; //varialbe disant si il a deja attaque, il ne peut attaque que toutes les deux frames, ainsi il ne peut attaquer que si = 0
+    public ShootingCharacter(Coordonnees c, double vitesseMax, double m, double impSaut){
+        super(c, vitesseMax, m, impSaut);
+    }
+
+    public void attaque(){
+        if (this.getTableCommande().get("CommandAttack") != 0 && hasAttacked == 0){ //on ajoute un kunai dans la liste
+            List<Kunai> temp = Jeu.getKunaiList();
+            Coordonnees coordKunai = new Coordonnees(coord.getX()+direction*Kunai.getSideLength()/2+direction*this.getEntityWIDTH()/2, coord.getZ());
+            temp.add(new Kunai(direction, attackStat, coordKunai));
+            Jeu.setKunaiList(temp);
+            hasAttacked++;
+        }
+    }
+
+    public void evolveCharacter(){
+        super.evolveCharacter();
+        if (hasAttacked > 0){
+            hasAttacked++;
+            if (hasAttacked > 50)hasAttacked = 0; 
+        }
+    }
+}
diff --git a/MAVENProject/src/main/java/jeu/Jeu.java b/MAVENProject/src/main/java/jeu/Jeu.java
index 1e6a2df..ab5301c 100644
--- a/MAVENProject/src/main/java/jeu/Jeu.java
+++ b/MAVENProject/src/main/java/jeu/Jeu.java
@@ -10,7 +10,9 @@ import java.util.List;
 import java.util.Map;
 
 import entity.Character;
+import entity.Kunai;
 import entity.Monster;
+import entity.ShootingCharacter;
 import engine.Game;
 import environnement.Coordonnees;
 import environnement.HitBox;
@@ -58,6 +60,7 @@ public class Jeu implements Game{
 
     private static List<Obstacle> obstacleTable = new ArrayList<>();
     private static List<Monster> monsterList = new ArrayList<>();
+    private static List<Kunai> kunaiList = new ArrayList<>();
     //private static List<Coffre> coffreTable = new ArrayList<>();
 
     
@@ -111,8 +114,8 @@ public class Jeu implements Game{
         monsterList.add(new Monster(new Coordonnees(300, sol.getHitbox().getExtremites().get("HautGauche").getZ()-500), 1000, 30, 60, 1,5));
 
         //on charge le perso (a la fin du constructeur, cest important par rapport a obstacleTable, sinon y'a des pbs de "causalite")
-        gameCharacterLoader = new CharacterLoader(characterSkinPath,new Character(new Coordonnees(300, 300), 1500, 1,600000));
-        gameCharacter = new Character(new Coordonnees(xdebut, zdebut), 1500, 1,600000);
+        gameCharacterLoader = new CharacterLoader(characterSkinPath,new ShootingCharacter(new Coordonnees(300, 300), 1500, 1,600000));
+        gameCharacter = new ShootingCharacter(new Coordonnees(xdebut, zdebut), 1500, 1,600000);
 
         //on remplit la map des frames
         Map<String,Integer> tempMap = gameCharacterLoader.getPathTable();
@@ -149,6 +152,8 @@ public class Jeu implements Game{
         gameCharacter.evolveCharacter();
         //monstres evoluent dans le jeu
         Monster.evolveAllMonsters(monsterList);
+        //kunais evoluent dans le jeu
+        Kunai.evolveAllKunais(kunaiList);
 
         //animation du perso dans le jeu (definir la bonne frame a cet instant)
         animation(Attack, Right, Left);
@@ -231,6 +236,14 @@ public class Jeu implements Game{
         return monsterList;
     }
 
+    public static List<Kunai> getKunaiList() {
+        return kunaiList;
+    }
+
+    public static void setKunaiList(List<Kunai> kunaiList) {
+        Jeu.kunaiList = kunaiList;
+    }
+
     
     
 }
\ 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 f07b223..605b289 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.Kunai;
 import entity.Monster;
 import environnement.Coordonnees;
 import environnement.HitBox;
@@ -49,6 +50,7 @@ public class Painter implements GamePainter{
         drawObstacleBis(crayon,test,"plateforme.png"); // A changer
         drawLifePoints(crayon);
         drawMonsters(crayon);
+        drawKunais(crayon);
     }
 
 
@@ -170,6 +172,20 @@ public class Painter implements GamePainter{
         }
     }
 
+    private void drawKunais(Graphics2D crayon){
+        int x;
+        int z;
+        crayon.setColor(Color.blue);
+        for (Kunai kunai : getKunaiList()){
+            crayon.setColor(Color.blue);
+            
+            x = (int)kunai.getCoord().getX();
+            z = (int)kunai.getCoord().getZ();
+            if (HitBox.collision(gameCharacter.getHitBox(),kunai.getHitBox()))crayon.setColor(Color.red);
+            crayon.fillRect(x-Kunai.getSideLength()/2 - xCam, z-Kunai.getSideLength()/2 - zCam, Kunai.getSideLength(), Kunai.getSideLength());
+        }
+    }
+
     @Override
     public int getWidth() {
         return WIDTH;
-- 
GitLab