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