From 9d48668288c3baad7e4e63cb32ccb62df7d729dc Mon Sep 17 00:00:00 2001
From: bosskkev <kossivikevin29@gmail.com>
Date: Sun, 26 Nov 2023 23:43:49 +0100
Subject: [PATCH] Rajout de l'interface Game2D

---
 build.gradle                                  |   2 +-
 src/main/java/engine/Engine.java              |  12 +++
 src/main/java/engine/Kernel.java              |  48 +++++------
 .../java/engine/graphic/GraphicEngine.java    |  67 ++++++++++-----
 .../java/engine/graphic/ImageComponent.java   |  29 +++----
 .../engine/graphic/RectangleComponent.java    |   4 +
 .../java/engine/graphic/ScoreComponent.java   |   4 +
 .../java/engine/physic/CartesianVector.java   |  29 +++++--
 src/main/java/engine/physic/Entity.java       |  10 +++
 src/main/java/engine/physic/Movable.java      |  75 ++++++++++++++---
 src/main/java/engine/physic/NotMovable.java   |  78 ------------------
 src/main/java/engine/physic/PhysicEngine.java |  64 +++++++++-----
 src/main/java/engine/sound/SoundEngine.java   |  32 +++++--
 src/main/java/pong/Game2D.java                |   4 +
 src/main/java/pong/GameObject2D.java          |  26 ++++++
 src/main/java/pong/PongApp.java               |   7 +-
 src/main/java/pong/PongBall.java              |   7 +-
 src/main/java/pong/PongObject.java            |  23 +-----
 src/main/java/pong/PongRacket.java            |   2 +-
 src/main/resources/heroIDLE/bas-50px.png      | Bin 2688 -> 0 bytes
 src/main/resources/heroIDLE/droite-50px.png   | Bin 2513 -> 0 bytes
 src/main/resources/heroIDLE/gauche-50px.png   | Bin 2478 -> 0 bytes
 src/main/resources/heroIDLE/haut-50px.png     | Bin 2595 -> 0 bytes
 23 files changed, 306 insertions(+), 217 deletions(-)
 delete mode 100644 src/main/java/engine/physic/NotMovable.java
 create mode 100644 src/main/java/pong/Game2D.java
 create mode 100644 src/main/java/pong/GameObject2D.java
 delete mode 100644 src/main/resources/heroIDLE/bas-50px.png
 delete mode 100644 src/main/resources/heroIDLE/droite-50px.png
 delete mode 100644 src/main/resources/heroIDLE/gauche-50px.png
 delete mode 100644 src/main/resources/heroIDLE/haut-50px.png

diff --git a/build.gradle b/build.gradle
index 2231cf1..06fb1fe 100644
--- a/build.gradle
+++ b/build.gradle
@@ -46,7 +46,7 @@ test {
 }
 
 application {
-    mainClass = 'sprint2_demo.Grid'
+    mainClass = 'pong.PongApp'
 }
 
 spotbugs {
diff --git a/src/main/java/engine/Engine.java b/src/main/java/engine/Engine.java
index b01463f..78c16c4 100644
--- a/src/main/java/engine/Engine.java
+++ b/src/main/java/engine/Engine.java
@@ -1,6 +1,18 @@
 package engine;
 
+/**
+ * Interface for the engine which will be used to run the game.
+ * The core-kernel of the game will use implemented objects of this interface to run the game.
+ */
 public interface Engine {
+
+    /**
+     * Method that update the state of an engine
+     */
     void update();
+
+    /**
+     * Method that restart the state of an engine
+     */
     void restart();
 }
diff --git a/src/main/java/engine/Kernel.java b/src/main/java/engine/Kernel.java
index 1d6d684..7a4ca42 100644
--- a/src/main/java/engine/Kernel.java
+++ b/src/main/java/engine/Kernel.java
@@ -5,7 +5,7 @@ import engine.physic.CartesianVector;
 import engine.physic.Entity;
 import engine.sound.SoundEngine;
 import engine.physic.PhysicEngine;
-import pong.PongObject;
+import pong.GameObject2D;
 
 import javax.swing.*;
 import java.awt.event.ActionEvent;
@@ -22,10 +22,10 @@ public class Kernel {
 
     public int isFirstUpdate = 0;
 
-    public static ArrayList<PongObject> gameObjects;
-    public HashMap<PongObject, Entity> pongObjectEntityHashMap;
+    public static ArrayList<GameObject2D> gameObjects;
+    public HashMap<GameObject2D, Entity> gameObject2DEntityHashMap;
 
-    public Kernel(String gameName, int width, int height, ArrayList<PongObject> gameObjects) throws IOException {
+    public Kernel(String gameName, int width, int height, ArrayList<GameObject2D> gameObjects) throws IOException {
 
         this.setGameObject(gameObjects);
         System.out.println("Model created");
@@ -41,7 +41,7 @@ public class Kernel {
         engines.add(this.graphicEngine);//
         this.physicEngine = new PhysicEngine(soundEngine);
         engines.add(physicEngine);
-        pongObjectEntityHashMap = physicEngine.pongObjectEntityHashMap;
+        gameObject2DEntityHashMap = physicEngine.gameObject2DEntityHashMap;
 
         this.update();
         this.setKeysAndKeyReleasedListeners((JPanel) this.graphicEngine.getContentPane());
@@ -50,7 +50,7 @@ public class Kernel {
     }
 
     /**
-     * Start the game. Associate a Movable to each GameObject and draw them.
+     * Start the game. Associate a Movable to each pong.GameObject2D and draw them.
      *
      * @throws IOException
      */
@@ -66,7 +66,7 @@ public class Kernel {
             engine.restart();
         }
         isFirstUpdate = 0;
-        //pongObjectEntityHashMap = physicEngine.pongObjectEntityHashMap;
+        //GameObject2DEntityHashMap = physicEngine.GameObject2DEntityHashMap;
     }
 
 
@@ -102,28 +102,28 @@ public class Kernel {
         Action upAction = new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                physicEngine.pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new CartesianVector(0, -3));
+                physicEngine.gameObject2DEntityHashMap.get(gameObjects.get(1)).setSpeed(new CartesianVector(0, -3));
             }
         };
 
         Action downAction = new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                physicEngine.pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new CartesianVector(0, 3));
+                physicEngine.gameObject2DEntityHashMap.get(gameObjects.get(1)).setSpeed(new CartesianVector(0, 3));
             }
         };
 
         Action zAction = new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                physicEngine.pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new CartesianVector(0, -3));
+                physicEngine.gameObject2DEntityHashMap.get(gameObjects.get(0)).setSpeed(new CartesianVector(0, -3));
             }
         };
 
         Action sAction = new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                physicEngine.pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new CartesianVector(0, 3));
+                physicEngine.gameObject2DEntityHashMap.get(gameObjects.get(0)).setSpeed(new CartesianVector(0, 3));
             }
         };
 
@@ -143,28 +143,28 @@ public class Kernel {
         Action upReleaseAction = new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                physicEngine.pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new CartesianVector(0, 0));
+                physicEngine.gameObject2DEntityHashMap.get(gameObjects.get(1)).setSpeed(new CartesianVector(0, 0));
             }
         };
 
         Action downReleaseAction = new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                physicEngine.pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new CartesianVector(0, 0));
+                physicEngine.gameObject2DEntityHashMap.get(gameObjects.get(1)).setSpeed(new CartesianVector(0, 0));
             }
         };
 
         Action zReleaseAction = new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                physicEngine.pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new CartesianVector(0, 0));
+                physicEngine.gameObject2DEntityHashMap.get(gameObjects.get(0)).setSpeed(new CartesianVector(0, 0));
             }
         };
 
         Action sReleaseAction = new AbstractAction() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                physicEngine.pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new CartesianVector(0, 0));
+                physicEngine.gameObject2DEntityHashMap.get(gameObjects.get(0)).setSpeed(new CartesianVector(0, 0));
             }
         };
 
@@ -183,23 +183,19 @@ public class Kernel {
         mainPanel.setFocusable(true);
     }
 
-    public void setGameObject(ArrayList<PongObject> gameObject) {
+    public void setGameObject(ArrayList<GameObject2D> gameObject) {
         gameObjects = gameObject;
     }
 
+    /**
+     * Add a new button to the game.
+     * @param button the JButton to add
+     */
     public void addButton(JButton button){
         button.setSize(50, 30);
         graphicEngine.addButton(button);
     }
 
-    /**
-     * Add a new sound to the game.
-     * @param soundPath
-     * @param isPlaying
-     */
-    public void addSound(String soundPath, boolean isPlaying){
-        soundEngine.addSound(soundPath, isPlaying);
-    }
 
     /**
      * Play a sound
@@ -208,10 +204,6 @@ public class Kernel {
         soundEngine.playMusic(soundPath);
     }
 
-    public boolean isItACollision(){
-        return physicEngine.isCollision;
-    }
-
     public void muteSoundEngine(){
         soundEngine.mute();
     }
diff --git a/src/main/java/engine/graphic/GraphicEngine.java b/src/main/java/engine/graphic/GraphicEngine.java
index 9dda229..d801024 100644
--- a/src/main/java/engine/graphic/GraphicEngine.java
+++ b/src/main/java/engine/graphic/GraphicEngine.java
@@ -3,6 +3,7 @@ package engine.graphic;
 import engine.Engine;
 import engine.Kernel;
 import engine.physic.CartesianVector;
+import pong.GameObject2D;
 import pong.PongApp;
 import pong.PongObject;
 
@@ -10,33 +11,37 @@ import javax.swing.*;
 import java.awt.*;
 import java.io.IOException;
 
+/**
+ * Class which implements the Engine interface and allows to create a graphic engine.
+ * A graphic engine is a window which displays the game, and allows to interact with it, adding buttons, etc.
+ * @see Engine
+ */
 public class GraphicEngine extends JFrame implements Engine {
-    JPanel controlPanel = new JPanel();
-    JPanel gamePanel = new JPanel();
-    public GraphicEngine() throws IOException {
+    JPanel controlPanel = new JPanel(); // Panel which contains the control buttons
+
+    public GraphicEngine(){
     }
 
-    public void init(String windowTitle, int width, int height) throws IOException {
-        // mainPanel.setBounds(850,500,122,124);
+    /**
+     * Method which initializes the graphic engine.
+     * @param windowTitle The title of the window.
+     * @param width The width of the window.
+     * @param height The height of the window.
+     */
+    public void init(String windowTitle, int width, int height){
+
         this.setTitle(windowTitle);
-        // this.setContentPane(mainPanel);
+
         this.setMinimumSize(new Dimension(width, height));
-        // this.setContentPane(mainPanel);
+
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
         controlPanel.setPreferredSize(new Dimension(width, 30));
 
         controlPanel.setBackground(Color.BLACK);
 
-        // Ajoutez controlPanel au nord et gamePanel au centre du mainPanel
         this.getContentPane().add(controlPanel, BorderLayout.NORTH);
         this.getContentPane().setBackground(Color.BLACK);
-        //mainPanel.add(gamePanel, BorderLayout.CENTER);
-
-
-        // Ajoutez mainPanel comme contenu principal
-        //this.setContentPane(mainPanel);
-        //this.setContentPane(mainPanel);
 
         this.setLocationRelativeTo(null);
         this.pack();
@@ -44,18 +49,28 @@ public class GraphicEngine extends JFrame implements Engine {
         this.setVisible(true);
         this.setLayout(this.getLayout());
     }
+
+    /**
+     * Method which draws an image on the window.
+     * @param ic The ImageComponent to draw.
+     * @see ImageComponent
+     * @throws IOException
+     */
     public void draw(ImageComponent ic) throws IOException {
         this.getContentPane().add(ic);
         repaint();
         revalidate();
     }
 
+    /**
+     * Method which starts the graphic engine.
+     * Associates the ImageComponents to the PongObjects and draws them on the window.
+     */
     public void start(){
-
-        for (PongObject po : Kernel.gameObjects
+        for (GameObject2D go : Kernel.gameObjects
         ) {
             try {
-                this.draw(new ImageComponent(po.getImage(), po.getPosition(), po.getWidth(), po.getHeight()));
+                this.draw(new ImageComponent(go.getImage(), go.getPosition(), go.getWidth(), go.getHeight()));
             } catch (IOException e) {
                 throw new RuntimeException(e);
             }
@@ -67,13 +82,19 @@ public class GraphicEngine extends JFrame implements Engine {
 
     }
 
+    /**
+     * Method which updates the graphic engine.
+     * @see Engine
+     */
     @Override
     public void update(){
-        //System.out.println(gamePanel.isVisible());
         repaint();
         revalidate();
     }
 
+    /**
+     * Method which restarts the graphic engine.
+     */
     @Override
     public void restart() {
         for(Component c : this.getContentPane().getComponents()){
@@ -82,9 +103,11 @@ public class GraphicEngine extends JFrame implements Engine {
             }
         }
         start();
-        //TODO: Trouver un moyen de ne pas avoir à redessiner le rectangle à chaque restart et rendre le restart plus générique
     }
 
+    /**
+     * Method which draws a rectangle on the window.
+     */
     public void drawRect(){
         this.getContentPane().add(new RectangleComponent(100, 100, PongApp.rectWidth, PongApp.rectHeight));
         repaint();
@@ -95,10 +118,10 @@ public class GraphicEngine extends JFrame implements Engine {
         this.getContentPane().add(new ScoreComponent(new CartesianVector(100, 100), new CartesianVector(500, 100), score1, score2));
     }
 
+    /**
+     *Method which add a button to the control panel.
+     */
     public void addButton(JButton button){
-        //TODO: add button action
-
-
         controlPanel.add(button);
         repaint();
         revalidate();
diff --git a/src/main/java/engine/graphic/ImageComponent.java b/src/main/java/engine/graphic/ImageComponent.java
index 310360f..08b615a 100644
--- a/src/main/java/engine/graphic/ImageComponent.java
+++ b/src/main/java/engine/graphic/ImageComponent.java
@@ -6,43 +6,38 @@ import pong.PongApp;
 import javax.swing.*;
 import java.awt.*;
 
+/**
+ * ImageComponent class which extends JComponent and allows to draw an image on the window.
+ * @see JComponent
+ */
 public class ImageComponent extends JComponent {
     private Image image;
     private CartesianVector position;
-
     private int width;
     private int height;
 
+    /**
+     * Constructor of the ImageComponent class.
+     * @param image The image to draw.
+     * @param position The position of the image.
+     * @param width The width of the image.
+     * @param height The height of the image.
+     */
     public ImageComponent(Image image, CartesianVector position, int width, int height) {
         this.width = width;
         this.height = height;
         this.image = image;
         this.position = position;
-        //this.setBorder(BorderFactory.createLineBorder(Color.black));
-        this.setSize(PongApp.width + 20, PongApp.height + 100);
+        this.setSize(PongApp.width + 20, PongApp.height + 100); //IMPORTANT ! setting the size of the frame
         this.setVisible(true);
         this.setLayout(null);
         //repaint();
     }
 
-    public Image getImage() {
-        return image;
-    }
-
-    public CartesianVector getPosition() {
-        return position;
-    }
-
-    public void setPosition(CartesianVector position) {
-        this.position = position;
-    }
-
     @Override
     protected void paintComponent(Graphics g) {
         super.paintComponent(g);
-
         g.drawImage(image, position.getX(), position.getY(), this.width, this.height, this);
-        //setOpaque(false);
     }
 
 }
\ No newline at end of file
diff --git a/src/main/java/engine/graphic/RectangleComponent.java b/src/main/java/engine/graphic/RectangleComponent.java
index 5a82310..6e7ecf4 100644
--- a/src/main/java/engine/graphic/RectangleComponent.java
+++ b/src/main/java/engine/graphic/RectangleComponent.java
@@ -4,6 +4,10 @@ import pong.PongApp;
 
 import javax.swing.*;
 
+/**
+ * RectangleComponent class which extends JComponent and allows to draw a rectangle on the window.
+ * @see JComponent
+ */
 public class RectangleComponent extends JComponent {
     private int width;
     private int height;
diff --git a/src/main/java/engine/graphic/ScoreComponent.java b/src/main/java/engine/graphic/ScoreComponent.java
index e1640f2..27b068f 100644
--- a/src/main/java/engine/graphic/ScoreComponent.java
+++ b/src/main/java/engine/graphic/ScoreComponent.java
@@ -6,6 +6,10 @@ import pong.PongApp;
 import javax.swing.*;
 import java.awt.*;
 
+/**
+ * ScoreComponent class which extends JComponent and allows to draw the score on the window.
+ * @see JComponent
+ */
 public class ScoreComponent extends JComponent {
     private int score1;
     private int score2;
diff --git a/src/main/java/engine/physic/CartesianVector.java b/src/main/java/engine/physic/CartesianVector.java
index d2a6089..2344be5 100644
--- a/src/main/java/engine/physic/CartesianVector.java
+++ b/src/main/java/engine/physic/CartesianVector.java
@@ -1,27 +1,37 @@
 package engine.physic;
 
+/**
+ * CartesianVector class which represents a vector in a Cartesian space.
+ */
 public class CartesianVector {
-    private int x;
-    private int y;
+    private int x; // x coordinate
+    private int y; // y coordinate
     public CartesianVector(int x, int y){
         this.x = x;
         this.y = y;
     }
+    /**
+     * Add a vector to the current vector.
+     * @param otherCartesianVector The vector to add.
+     */
     public void add(CartesianVector otherCartesianVector){
         this.x += otherCartesianVector.getX();
         this.y += otherCartesianVector.getY();
     }
 
-    public void sub(CartesianVector otherCartesianVector){
-        this.x -= otherCartesianVector.getX();
-        this.y -= otherCartesianVector.getY();
-    }
 
+    /**
+     * Multiply the vector by a scalar.
+     * @param scalar The scalar to multiply the vector by.
+     */
     public void mul(int scalar){
     this.x *= scalar;
         this.y *= scalar;
     }
 
+    /**
+     * Increment positively or negatively the vector.
+     */
     public void increment(){
         if(this.x < 0){
             this.x--;
@@ -51,8 +61,13 @@ public class CartesianVector {
         this.x = x;
     }
 
+    /**
+     * Compare two vectors with their coordinates.
+     * @param otherCartesianVector The vector to compare with.
+     * @return True if the vectors are equals, false otherwise.
+     */
     public boolean equals(CartesianVector otherCartesianVector){
-        System.out.println("Comparing " + this.x + " " + this.y + " with " + otherCartesianVector.getX() + " " + otherCartesianVector.getY());
+        //System.out.println("Comparing " + this.x + " " + this.y + " with " + otherCartesianVector.getX() + " " + otherCartesianVector.getY());
         return this.x == otherCartesianVector.getX() && this.y == otherCartesianVector.getY();
     }
 }
\ No newline at end of file
diff --git a/src/main/java/engine/physic/Entity.java b/src/main/java/engine/physic/Entity.java
index d159b30..298cadc 100644
--- a/src/main/java/engine/physic/Entity.java
+++ b/src/main/java/engine/physic/Entity.java
@@ -76,7 +76,17 @@ public interface Entity {
      */
     public void halt();
 
+    /**
+     * Return the width of the entity
+     *
+     * @return width
+     */
     int getWidth();
 
+    /**
+     * Return the height of the entity
+     *
+     * @return height
+     */
     int getHeight();
 }
diff --git a/src/main/java/engine/physic/Movable.java b/src/main/java/engine/physic/Movable.java
index b2a9c46..538789f 100644
--- a/src/main/java/engine/physic/Movable.java
+++ b/src/main/java/engine/physic/Movable.java
@@ -2,6 +2,10 @@ package engine.physic;
 
 import pong.PongApp;
 
+/**
+ * A Movable class which implements the Entity interface and allows to create a movable object.
+ * @see Entity
+ */
 public class Movable implements Entity {
     private int weight;
 
@@ -12,7 +16,15 @@ public class Movable implements Entity {
 
     private CartesianVector acceleration;
 
-
+    /**
+     * Constructor of the Movable class.
+     * @param weight The weight of the object.
+     * @param position The position of the object.
+     * @param speed The speed of the object.
+     * @param acceleration The acceleration of the object.
+     * @param width The width of the object.
+     * @param height The height of the object.
+     */
     public Movable(int weight, CartesianVector position, CartesianVector speed, CartesianVector acceleration, int width, int height) {
         this.weight = weight;
         this.speed = speed;
@@ -22,41 +34,72 @@ public class Movable implements Entity {
         this.height = height;
     }
 
+    /**
+     * get the weight of the object
+     * @return weight
+     */
     @Override
     public int getWeight() {
         return weight;
     }
 
+    /**
+     * get the speed of the object
+     * @return speed
+     */
     @Override
     public CartesianVector getSpeed() {
         return speed;
     }
 
+    /**
+     * get the position of the object
+     * @return position
+     */
     @Override
     public CartesianVector getPosition() {
         return position;
     }
 
+    /**
+     * get the acceleration of the object
+     * @return acceleration
+     */
     @Override
     public CartesianVector getAcceleration() {
         return acceleration;
     }
 
+    /**
+     * set the speed of the object
+     * @param speed the new speed of the object
+     */
     @Override
     public void setSpeed(CartesianVector speed) {
         this.speed = speed;
     }
 
+    /**
+     * set the position of the object
+     * @param position the new position of the object
+     */
     @Override
     public void setPosition(CartesianVector position) {
         this.position = position;
     }
 
+    /**
+     * set the acceleration of the object
+     * @param acceleration the new acceleration of the object
+     */
     @Override
     public void setAcceleration(CartesianVector acceleration) {
 
     }
 
+    /**
+     * update the position of the object
+     */
     @Override
     public void updatePosition() {
         CartesianVector newPosition = new CartesianVector(this.position.getX(), this.position.getY());
@@ -76,38 +119,48 @@ public class Movable implements Entity {
         this.position.add(this.speed); // Modifying the position (x = x + vx ; y = y + vy)
     }
 
+    /**
+     * get the left resistance of the object
+     * @return left resistance
+     */
     @Override
     public int getLeftResistance() {
         return 0;
     }
 
+    /**
+     * set the left resistance of the object
+     * @param leftLife the new left resistance of the object
+     */
     @Override
     public void setResistance(int leftLife) {
 
     }
 
+    /**
+     * get the right resistance of the object
+     * @return right resistance
+     */
     @Override
     public void halt() {
         this.speed = new CartesianVector(0, 0); // Making the speed null
         updatePosition(); // Updating the position with a null acceleration
     }
 
-    public void setDirection(Movable movable, CartesianVector direction) throws InterruptedException {
-        while (true) {
-            this.speed = direction;
-            this.position.add(this.speed);
-            if (movable.getSpeed() != direction) {
-                break;
-            }
-        }
-
-    }
 
+    /**
+     * get the width of the object
+     * @return width
+     */
     @Override
     public int getWidth() {
         return width;
     }
 
+    /**
+     * get the height of the object
+     * @return height
+     */
     @Override
     public int getHeight() {
         return height;
diff --git a/src/main/java/engine/physic/NotMovable.java b/src/main/java/engine/physic/NotMovable.java
deleted file mode 100644
index 35d79da..0000000
--- a/src/main/java/engine/physic/NotMovable.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package engine.physic;
-
-/**
- * Class for all obstacles in the game.
- * Obstacles are static entities.
- */
-public class NotMovable implements Entity {
-
-    private int weight;
-    private final CartesianVector speed = new CartesianVector(0, 0); // Our obstacle is static
-    private CartesianVector position;
-
-    @Override
-    public int getWeight() {
-        return 0;
-    }
-
-    @Override
-    public CartesianVector getSpeed() {
-        return null;
-    }
-
-    @Override
-    public CartesianVector getPosition() {
-        return null;
-    }
-
-    @Override
-    public CartesianVector getAcceleration() {
-        return null;
-    }
-
-    @Override
-    public void setSpeed(CartesianVector speed) {
-
-    }
-
-    @Override
-    public void setPosition(CartesianVector position) {
-
-    }
-
-    @Override
-    public void setAcceleration(CartesianVector acceleration) {
-
-    }
-
-    @Override
-    public void updatePosition() {
-
-    }
-
-    @Override
-    public int getLeftResistance() {
-        return 0;
-    }
-
-    @Override
-    public void setResistance(int leftLife) {
-
-    }
-
-    @Override
-    public void halt() {
-
-    }
-
-    @Override
-    public int getWidth() {
-        return 0;
-    }
-
-    @Override
-    public int getHeight() {
-        return 0;
-    }
-
-}
diff --git a/src/main/java/engine/physic/PhysicEngine.java b/src/main/java/engine/physic/PhysicEngine.java
index 329d8cf..cdd4bd2 100644
--- a/src/main/java/engine/physic/PhysicEngine.java
+++ b/src/main/java/engine/physic/PhysicEngine.java
@@ -3,67 +3,91 @@ package engine.physic;
 import engine.Engine;
 import engine.Kernel;
 import engine.sound.SoundEngine;
+import pong.GameObject2D;
 import pong.PongObject;
 
 import java.util.HashMap;
 
+/**
+ * PhysicEngine is the class that will manage the physic of the game.
+ * It will be used by Kernel.
+ */
 public class PhysicEngine implements Engine {
 
     int i = 0;
-    public HashMap<PongObject, Entity> pongObjectEntityHashMap; // Map of the pong objects and their associated entity
+    public HashMap<GameObject2D, Entity> gameObject2DEntityHashMap; // Map of the pong objects and their associated entity
 
     public boolean isCollision = false;
     SoundEngine soundEngine;
-    //private HashMap<CartesianVector, PongObject> positions; // Map of the positions and the associated pong object
+
+    /**
+     * Constructor of the PhysicEngine.
+     *
+     * @param soundEngine the sound engine of the game which will be used to play some sounds
+     */
     public PhysicEngine(SoundEngine soundEngine) {
         this.soundEngine = soundEngine;
         restart();
     }
+
+    /**
+     * Update the physic engine.
+     * It will update the position of all the movable objects and check if there is a collision.
+     */
     @Override
     public void update(){ //TODO: we cannot have the mention of "Ball" here so we need to find a way to do it without mentioning "Ball"
-        for (PongObject pongObject: Kernel.gameObjects) {
-            CartesianVector previousPosition = pongObjectEntityHashMap.get(pongObject).getPosition();
-            pongObjectEntityHashMap.get(pongObject).updatePosition();// Updating of the associated movable position
-            if(pongObject.getName().equals("Ball")){
-                for (PongObject po2: pongObjectEntityHashMap.keySet()
+        for (GameObject2D gameObject2D: Kernel.gameObjects) {
+            CartesianVector previousPosition = gameObject2DEntityHashMap.get(gameObject2D).getPosition();
+            gameObject2DEntityHashMap.get(gameObject2D).updatePosition();// Updating of the associated movable position
+            if(gameObject2D.getName().equals("Ball")){
+                for (GameObject2D po2: gameObject2DEntityHashMap.keySet()
                 ) {
                     if(!po2.getName().equals("Ball")){
-                        if(checkCollision(pongObjectEntityHashMap.get(pongObject), pongObjectEntityHashMap.get(po2))){
+                        if(checkCollision(gameObject2DEntityHashMap.get(gameObject2D), gameObject2DEntityHashMap.get(po2))){
                             i++;
-                            //String collisionPath = "src/main/resources/Sound/collision.wav";
-                            //Sound.playMusic(collisionPath);
                             soundEngine.playMusic("src/main/resources/Sound/hit_racket.wav");
                             System.out.println("Collision " + i);
-                            pongObjectEntityHashMap.get(pongObject).setPosition(previousPosition);
+                            gameObject2DEntityHashMap.get(gameObject2D).setPosition(previousPosition);
                             //TODO: add a method to Entity to increment the speed
                             if(i % 10 == 0){
-                                pongObjectEntityHashMap.get(pongObject).getSpeed().increment();
+                                gameObject2DEntityHashMap.get(gameObject2D).getSpeed().increment();
                             }
-                            pongObject.setSpeed(pongObjectEntityHashMap.get(pongObject).getSpeed()); // Updating of the pong object speed with the latest speed of the entity
+                            gameObject2D.setSpeed(gameObject2DEntityHashMap.get(gameObject2D).getSpeed()); // Updating of the pong object speed with the latest speed of the entity
 
                             //po2 a racket will process the collision with the ball
-                            po2.processCollision(pongObject);
+                            po2.processCollision(gameObject2D);
 
                             //Updating the Entity speed with the new speed of the pong object Ball
-                            pongObjectEntityHashMap.get(pongObject).setSpeed(pongObject.getSpeed());
+                            gameObject2DEntityHashMap.get(gameObject2D).setSpeed(gameObject2D.getSpeed());
 
-                            pongObjectEntityHashMap.get(pongObject).updatePosition();
+                            gameObject2DEntityHashMap.get(gameObject2D).updatePosition();
                         }
                     }
                 }
             }
-            pongObject.setPosition(pongObjectEntityHashMap.get(pongObject).getPosition()); // Updating of the pong object position
+            gameObject2D.setPosition(gameObject2DEntityHashMap.get(gameObject2D).getPosition()); // Updating of the pong object position
         }
     }
 
+    /**
+     * Restart the physic engine.
+     * It will reset the position and the speed of all the movable objects.
+     */
     @Override
     public void restart() {
-        pongObjectEntityHashMap = new HashMap<>();
-        for (PongObject pongObject: Kernel.gameObjects) {
-            pongObjectEntityHashMap.put(pongObject, new Movable(1, pongObject.getPosition(), pongObject.getInitSpeed(), new CartesianVector(0, 0), pongObject.getWidth(), pongObject.getHeight()));
+        gameObject2DEntityHashMap = new HashMap<>();
+        for (GameObject2D gameObject2D: Kernel.gameObjects) {
+            gameObject2DEntityHashMap.put(gameObject2D, new Movable(1, gameObject2D.getPosition(), gameObject2D.getInitSpeed(), new CartesianVector(0, 0), gameObject2D.getWidth(), gameObject2D.getHeight()));
         }
     }
 
+    /**
+     * Check if there is a collision between two entities.
+     *
+     * @param firstObject the first entity
+     * @param secondObject the second entity
+     * @return true if there is a collision, false otherwise
+     */
     public boolean checkCollision(Entity firstObject, Entity secondObject){
         CartesianVector pos1 = firstObject.getPosition();
         CartesianVector pos2 = secondObject.getPosition();
diff --git a/src/main/java/engine/sound/SoundEngine.java b/src/main/java/engine/sound/SoundEngine.java
index 2594791..db67471 100644
--- a/src/main/java/engine/sound/SoundEngine.java
+++ b/src/main/java/engine/sound/SoundEngine.java
@@ -10,6 +10,10 @@ import javax.sound.sampled.AudioSystem;
 import javax.sound.sampled.Clip;
 import javax.swing.*;
 
+/**
+ * SoundEngine is the class that will play the sound of the game.
+ * It will be used by Kernel and sometimes by PhysicEngine.
+ */
 public class SoundEngine implements Engine {
     private static Clip clip; // Ajout de cette variable pour stocker le clip en cours de lecture
 
@@ -18,6 +22,11 @@ public class SoundEngine implements Engine {
     private boolean isMuted = false;
     public SoundEngine() {
     }
+
+    /**
+     * Play a music from a location.
+     * @param location the path to the music
+     */
     public void playMusic(String location){
         if(isMuted) return;
         try {
@@ -37,12 +46,9 @@ public class SoundEngine implements Engine {
         }
     }
 
-    public static void stopMusic() {
-        if (clip != null && clip.isRunning()) {
-            clip.stop();
-        }
-    }
-
+    /**
+     * Update the sound engine.
+     */
     @Override
     public void update() {
         if(isMuted) return;
@@ -54,17 +60,27 @@ public class SoundEngine implements Engine {
         }
     }
 
+    /**
+     * Add a sound to the sound engine.
+     * @param soundPath the path to the sound
+     * @param isPlaying if the sound will be played
+     */
     public void addSound(String soundPath, boolean isPlaying) {
         System.out.println("SoundEngine addSound " + isPlaying);
         soundMap.put(soundPath, isPlaying);
     }
 
+    /**
+     * Mute or unmute the sound engine.
+     */
     public void mute(){
         isMuted = !isMuted;
     }
 
-
-
+    /**
+     * Restart the sound engine.
+     * TODO: implement this method
+     */
     @Override
     public void restart() {
 
diff --git a/src/main/java/pong/Game2D.java b/src/main/java/pong/Game2D.java
new file mode 100644
index 0000000..158c5a9
--- /dev/null
+++ b/src/main/java/pong/Game2D.java
@@ -0,0 +1,4 @@
+package pong;
+
+public interface Game2D {
+}
diff --git a/src/main/java/pong/GameObject2D.java b/src/main/java/pong/GameObject2D.java
new file mode 100644
index 0000000..c45651f
--- /dev/null
+++ b/src/main/java/pong/GameObject2D.java
@@ -0,0 +1,26 @@
+package pong;
+
+import engine.physic.CartesianVector;
+
+import java.awt.*;
+
+public interface GameObject2D {
+    public CartesianVector getPosition();
+
+    public CartesianVector getSpeed();
+    public Image getImage();
+    public int getWidth();
+    public int getHeight();
+    public int getResistance();
+    public void setPosition(CartesianVector position);
+
+    public void setSpeed(CartesianVector speed);
+
+    public CartesianVector getInitSpeed();
+    public String getName();
+
+    CartesianVector getInitPosition();
+
+    boolean isLeftRacket();
+    void processCollision(GameObject2D po);
+}
diff --git a/src/main/java/pong/PongApp.java b/src/main/java/pong/PongApp.java
index 3e3fa3b..feabf79 100644
--- a/src/main/java/pong/PongApp.java
+++ b/src/main/java/pong/PongApp.java
@@ -9,7 +9,7 @@ import javax.swing.*;
 import java.io.IOException;
 import java.util.ArrayList;
 
-public class PongApp {
+public class PongApp implements Game2D {
 
     public static int numberOfMatchs = 5;
     public static int score1 = 0;
@@ -17,7 +17,7 @@ public class PongApp {
 
     public static boolean isGoal = false;
 
-    public static ArrayList<PongObject> components = new ArrayList<>();
+    public static ArrayList<GameObject2D> components = new ArrayList<>();
     public static int width = 800;
     public static int height = 600;
 
@@ -46,8 +46,7 @@ public class PongApp {
         components.add(pongBall);
 
         Kernel kernel = new Kernel("Pong", width, height, components);
-        kernel.playSound("src/main/resources/Sound/minecraft.wav");
-        kernel.addSound("src/main/resources/Sound/hit_racket.wav", kernel.isItACollision());
+        //kernel.playSound("src/main/resources/Sound/minecraft.wav");
         JButton button = new JButton("Restart");
         JButton button2 = new JButton("Mute");
 
diff --git a/src/main/java/pong/PongBall.java b/src/main/java/pong/PongBall.java
index 60d186e..8f84f1e 100644
--- a/src/main/java/pong/PongBall.java
+++ b/src/main/java/pong/PongBall.java
@@ -4,6 +4,10 @@ import engine.physic.CartesianVector;
 
 import java.awt.*;
 
+/**
+ * Class which implements the pong ball
+ * @see PongObject
+ */
 public class PongBall implements PongObject {
 
     public String name;
@@ -89,10 +93,11 @@ public class PongBall implements PongObject {
     }
 
     @Override
-    public void processCollision(PongObject po2) {
+    public void processCollision(GameObject2D po) {
 
     }
 
+
     @Override
     public CartesianVector getInitSpeed(){
         return this.initSpeed;
diff --git a/src/main/java/pong/PongObject.java b/src/main/java/pong/PongObject.java
index 3011cf7..60e609f 100644
--- a/src/main/java/pong/PongObject.java
+++ b/src/main/java/pong/PongObject.java
@@ -4,24 +4,9 @@ import engine.physic.CartesianVector;
 
 import java.awt.*;
 
-public interface PongObject {
-    public CartesianVector getPosition();
+/**
+ * Interface which implements the pong objects
+ */
+public interface PongObject extends GameObject2D {
 
-    public CartesianVector getSpeed();
-    public Image getImage();
-    public int getWidth();
-    public int getHeight();
-    public int getResistance();
-    public void setPosition(CartesianVector position);
-
-    public void setSpeed(CartesianVector speed);
-
-    public CartesianVector getInitSpeed();
-    public String getName();
-
-    CartesianVector getInitPosition();
-
-
-    boolean isLeftRacket();
-    void processCollision(PongObject po);
 }
diff --git a/src/main/java/pong/PongRacket.java b/src/main/java/pong/PongRacket.java
index b519044..4a3484f 100644
--- a/src/main/java/pong/PongRacket.java
+++ b/src/main/java/pong/PongRacket.java
@@ -94,7 +94,7 @@ public class PongRacket implements PongObject {
      *
      */
     @Override
-    public void processCollision(PongObject po2) {
+    public void processCollision(GameObject2D po2) {
         boolean isUpperHalf = po2.getPosition().getY() < this.position.getY() + this.height / 2;
         if(!isLeftRacket){
             System.out.println("isLeftRacket");
diff --git a/src/main/resources/heroIDLE/bas-50px.png b/src/main/resources/heroIDLE/bas-50px.png
deleted file mode 100644
index 46eb476dde892503ee6d92a1d039b0b795470d42..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2688
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
XXmx6G>8=b01_lOCS3j3^P6<r_OoSyC

diff --git a/src/main/resources/heroIDLE/droite-50px.png b/src/main/resources/heroIDLE/droite-50px.png
deleted file mode 100644
index 0229a64b1c31e152a56950052166ff0f9e17aa48..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2513
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

diff --git a/src/main/resources/heroIDLE/gauche-50px.png b/src/main/resources/heroIDLE/gauche-50px.png
deleted file mode 100644
index 18f800ea03951a7b0bfff75b56958e813c7792e0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2478
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
P0|SGntDnm{r-UW|hzGSU

diff --git a/src/main/resources/heroIDLE/haut-50px.png b/src/main/resources/heroIDLE/haut-50px.png
deleted file mode 100644
index 3cddbc7c4a0b034271e8cd696ca51c2d645c06d7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2595
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

-- 
GitLab