diff --git a/MAVENProject/PlanUML.puml b/MAVENProject/PlanUML.puml index 4bde9d3363365288fdefe841dfe5729bbba01ae9..42c30d5f9872ac8843b34629668ed0dd12098408 100644 --- a/MAVENProject/PlanUML.puml +++ b/MAVENProject/PlanUML.puml @@ -90,9 +90,13 @@ class environment.Object { class environment.Obstacle{ } class environment.Coordonnees{ -+ int x -+ int z +- int x +- int z + {static} int distance(Object,Object) ++ double getX() ++ double getZ() ++ void evolveX(double var) ++ void evolveZ(double var) } @@ -117,5 +121,14 @@ class jeu.Jeu{ + void evolve(Cmd) + boolean isFinished() } +<<<<<<< HEAD +class environment.Physique{ +- double g +- double lambda +} +======= + + +>>>>>>> b21761b421591b5fad482fd94972d5eb53ff8a31 @enduml \ No newline at end of file diff --git a/MAVENProject/pom.xml b/MAVENProject/pom.xml index 5ec1364affc745197437648a5faa2d415c752c68..60902a9c62ec07ceb2737e97ffaaea713a635eac 100644 --- a/MAVENProject/pom.xml +++ b/MAVENProject/pom.xml @@ -8,6 +8,7 @@ <artifactId>MAVENProject</artifactId> <version>1.0-SNAPSHOT</version> + <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> diff --git a/MAVENProject/src/main/java/engine/Cmd.java b/MAVENProject/src/main/java/engine/Cmd.java deleted file mode 100644 index c4554b05b9737cabdafadd96efd3b453609a93a8..0000000000000000000000000000000000000000 --- a/MAVENProject/src/main/java/engine/Cmd.java +++ /dev/null @@ -1,9 +0,0 @@ -package engine; - -/** - * @author Horatiu Cirstea - * - */ -public enum Cmd { - LEFT,RIGHT,JUMP,IDLE; -} diff --git a/MAVENProject/src/main/java/engine/Game.java b/MAVENProject/src/main/java/engine/Game.java index 12005596b711bcf72fcc217fd91a57fe0b3998db..bfb72c772c080d8c7aae675cfa296e3a6ba4c060 100644 --- a/MAVENProject/src/main/java/engine/Game.java +++ b/MAVENProject/src/main/java/engine/Game.java @@ -1,5 +1,7 @@ package engine; +import java.util.ArrayList; + /** * @author Horatiu Cirstea, Vincent Thomas * @@ -14,7 +16,7 @@ public interface Game { * @param userCmd * commande utilisateur */ - public void evolve(Cmd userCmd); + public void evolve(ArrayList userCmd); /** * @return true si et seulement si le jeu est fini diff --git a/MAVENProject/src/main/java/engine/GameController.java b/MAVENProject/src/main/java/engine/GameController.java index 461a610c19b38db3408f0f2de88470771e19a300..915c9ad9b72cae4795d854f3d6deac21cc8256f6 100644 --- a/MAVENProject/src/main/java/engine/GameController.java +++ b/MAVENProject/src/main/java/engine/GameController.java @@ -1,6 +1,7 @@ package engine; import java.awt.event.KeyListener; +import java.util.ArrayList; /** * @author Horatiu Cirstea @@ -13,9 +14,9 @@ public interface GameController extends KeyListener { /** * quand on demande les commandes, le controleur retourne la commande en * cours - * + * * @return commande faite par le joueur */ - public Cmd getCommand(); + public ArrayList getCommand(); } diff --git a/MAVENProject/src/main/java/engine/GameEngineGraphical.java b/MAVENProject/src/main/java/engine/GameEngineGraphical.java index c2d643da69e7822bd42e23e094fd9bf83454cfd9..6525e8a7123bcb5722f7daa14903341228ebfcf4 100644 --- a/MAVENProject/src/main/java/engine/GameEngineGraphical.java +++ b/MAVENProject/src/main/java/engine/GameEngineGraphical.java @@ -1,5 +1,7 @@ package engine; +import java.util.ArrayList; + /** * @author Horatiu Cirstea, Vincent Thomas * @@ -28,6 +30,8 @@ public class GameEngineGraphical { */ private GraphicalInterface gui; + private final static int deltaT = 1; + /** * construit un moteur * @@ -57,14 +61,19 @@ public class GameEngineGraphical { // boucle de game while (!this.game.isFinished()) { // demande controle utilisateur - Cmd c = this.gameController.getCommand(); + ArrayList a = this.gameController.getCommand(); // // fait evoluer le game - this.game.evolve(c); + this.game.evolve(a); // affiche le game this.gui.paint(); // met en attente - Thread.sleep(100); + Thread.sleep(deltaT); } } + public static int getDeltaT() { // pour modifier le pas de temps librement + return deltaT; + } + + } diff --git a/MAVENProject/src/main/java/entity/Character.java b/MAVENProject/src/main/java/entity/Character.java index c08c88553340fb3b12b0918c5949451dce350c30..0da5174f072484eb5d831f019792cd1abe70d5c7 100644 --- a/MAVENProject/src/main/java/entity/Character.java +++ b/MAVENProject/src/main/java/entity/Character.java @@ -1,21 +1,68 @@ package entity; +import engine.GameEngineGraphical; import environnement.Coordonnees; +import environnement.Physique; public class Character extends Entity{ - Coordonnees coord; - int vitesseMax; // vitesse max + //Coordonnees coord; + //double vitesseMax; // vitesse max + double vitesseActuX = 0; // vitesse actuelle supposée nulle au départ + double vitesseActuZ = 0; + double m; - public Character(Coordonnees c,int vitesseMax){ + public Character(Coordonnees c,int vitesseMax,double m){ super(c,vitesseMax); + this.m = m; } + @Override + public void deplacements(double commandX,double commandZ,int alpha){ // alpha indique si il est au sol ou non, il vaut 0 ou 1 en fonction + double delta = GameEngineGraphical.getDeltaT()*Math.pow(10, -3); // pas de temps remis en secondes - public void deplacements(){ + //on actualise les positions + double newX,newZ; + if (commandX != 0){ + newX = -m/Physique.lambda*(vitesseActuX - commandX/Physique.lambda)*Math.exp(-Physique.lambda*delta/m) + commandX*delta + this.getCoord().getX(); + } + else newX = this.getCoord().getX(); + newZ = ((1-alpha)*Physique.g - commandZ/m)/2*delta*delta + vitesseActuZ*delta + this.getCoord().getZ(); + System.out.println("écart de hauteur: "+(this.getCoord().getZ()-newZ)); + this.setCoord(new Coordonnees(newX, newZ)); // repere ou la hauteur augmente vers le bas, a revoir + + //on actualise les vitesses + if (commandX != 0){ + vitesseActuX = (vitesseActuX - commandX/Physique.lambda)*Math.exp(-delta*Physique.lambda/m); + vitesseActuX += commandX/Physique.lambda; + } + else vitesseActuX = 0; + vitesseActuZ = vitesseActuZ + ((1-alpha)*Physique.g - commandZ/m)*delta; + System.out.println("vitesse z: "+vitesseActuZ); + //vitesseActuZ = -vitesseActuZ; - } + + } + @Override public void attaque(){ } + + public double getVitesseMax() { + return vitesseMax; + } + + public double getVitesseActuX() { + return vitesseActuX; + } + + public double getVitesseActuZ() { + return vitesseActuZ; + } + + public double getM() { + return m; + } + + } diff --git a/MAVENProject/src/main/java/entity/Entity.java b/MAVENProject/src/main/java/entity/Entity.java index d0c9da22087bb567c35a0d221a1b8fbfab22a6b6..a347f8dcdb90dd4ab97a853cfd1a04862ef0e587 100644 --- a/MAVENProject/src/main/java/entity/Entity.java +++ b/MAVENProject/src/main/java/entity/Entity.java @@ -3,13 +3,20 @@ package entity; import environnement.Coordonnees; public abstract class Entity { - Coordonnees coord; + private Coordonnees coord; int vitesseMax; public Entity(Coordonnees c,int vitesseMax){ this.coord = c; this.vitesseMax = vitesseMax; } - public void deplacements(){} + public void deplacements(double commandX, double commandZ, int alpha){} public void attaque(){} + public Coordonnees getCoord(){ + return this.coord; + } // Pour retourner les coordonées + public void setCoord(Coordonnees coord) { + this.coord = coord; + } + } diff --git a/MAVENProject/src/main/java/environnement/Coordonnees.java b/MAVENProject/src/main/java/environnement/Coordonnees.java index 11ca66d0d930c4c5eb4dda4bf6ff02a82d558d1c..9ae4f99c978c169741d0414b565d5293bc32df66 100644 --- a/MAVENProject/src/main/java/environnement/Coordonnees.java +++ b/MAVENProject/src/main/java/environnement/Coordonnees.java @@ -1,19 +1,36 @@ package environnement; -import java.lang.ProcessBuilder.Redirect.Type; - -import entity.Entity; public class Coordonnees { - int x; - int z; + private double x; + private double z; - public Coordonnees(int x,int z){ - this.x = x; - this.z = z; + public Coordonnees(double newX,double newZ){ + this.x = newX; + this.z = newZ; } public static int distance(Object o1,Object o2){ - if ((o1 instanceof Entity) || (o2 instanceof Entity))return Math.sqrt(Math.pow(o1.coord.x - o2.coord.x, 2) + Math.pow(o1.coord.y - o2.coord.y,2)); + //if (((o1 instanceof Entity) || (o1 instanceof Bloc)) && ((o2 instanceof Entity) || (o2 instanceof Bloc)))return Math.sqrt(Math.pow(o1.coord.x - o2.coord.x, 2) + Math.pow(o1.coord.y - o2.coord.y,2)); + //a retoucher selon le reste du programme + return 0; + } + + public double getX() { + return x; + } + + public double getZ() { + return z; + } + + public void evolveX(double var){ + // evolution des coordonnees en x + this.x += var; + } + + public void evolveZ(double var){ + // evolution des coordonnees en z + this.z += var; } } diff --git a/MAVENProject/src/main/java/environnement/Physique.java b/MAVENProject/src/main/java/environnement/Physique.java new file mode 100644 index 0000000000000000000000000000000000000000..6b8605459ad062a2fb9bcaeed4342e270080381a --- /dev/null +++ b/MAVENProject/src/main/java/environnement/Physique.java @@ -0,0 +1,6 @@ +package environnement; + +public class Physique { + public static final double g = 10000; // pesanteur + public static final double lambda = 0.05; // coefficient de frottements +} diff --git a/MAVENProject/src/main/java/jeu/Controller.java b/MAVENProject/src/main/java/jeu/Controller.java new file mode 100644 index 0000000000000000000000000000000000000000..9626558cd2dea6277044bf3f7a8a503cc53f9cb2 --- /dev/null +++ b/MAVENProject/src/main/java/jeu/Controller.java @@ -0,0 +1,64 @@ +package jeu; + +import engine.GameController; + +import java.awt.event.KeyEvent; +import java.util.ArrayList; + +public class Controller implements GameController{ + + private boolean isRightPressed, isLeftPressed, isSpacePressed; + /* + * commande en cours + */ + + /* + * construction du controleur par defaut le controleur n'a pas de commande + */ + + public Controller() { + isRightPressed = false; isLeftPressed = false; isSpacePressed = false; + } + /** + * getCommand retourne une list de booleans sous la forme [isRightPressed, isLeftPressed, isSpacePressed] + */ + @Override + public ArrayList getCommand() { + ArrayList a = new ArrayList<Boolean>(); + a.add(isRightPressed); + a.add(isLeftPressed); + a.add(isSpacePressed); + return a; + } + @Override + + public void keyPressed(KeyEvent e) { + + switch (e.getKeyCode()) { + // si on appuie sur une touche ci dessous le boolean devient vraie. + case KeyEvent.VK_RIGHT: isRightPressed = true; break; + case KeyEvent.VK_LEFT: isLeftPressed = true; break; + case KeyEvent.VK_SPACE: isSpacePressed = true; break; + } + } + @Override + public void keyReleased(KeyEvent e) { + switch(e.getKeyCode()) { + case KeyEvent.VK_RIGHT: + isRightPressed = false; + break; + case KeyEvent.VK_LEFT: + isLeftPressed = false; + break; + case KeyEvent.VK_SPACE: + isSpacePressed = false; + break; + } + } + @Override + + public void keyTyped(KeyEvent e) { + + } + +} \ No newline at end of file diff --git a/MAVENProject/src/main/java/jeu/Jeu.java b/MAVENProject/src/main/java/jeu/Jeu.java new file mode 100644 index 0000000000000000000000000000000000000000..075979e2dca083787693f43eed5cae80b2bb8e90 --- /dev/null +++ b/MAVENProject/src/main/java/jeu/Jeu.java @@ -0,0 +1,78 @@ +package jeu; + +import engine.Game; +import environnement.Physique; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; + +import static jeu.Painter.charac; +public class Jeu implements Game{ + + + + public static double commandX; // pour la commande deplacements + + public static double commandZ; // pour la commande deplacements + + public Jeu(String source) { + BufferedReader helpReader; + try { + helpReader = new BufferedReader(new FileReader(source)); + String line; + while ((line = helpReader.readLine()) != null) { + System.out.println(line); + } + helpReader.close(); + } catch (IOException e) { + System.out.println("Help not available"); + } + } + + @Override + public void evolve(ArrayList command) { // command est sous la forme list de Boolean qui représente les touches préssées. Voir Controller pour la compositions de cet list. + System.out.println("Execute "+command); + System.out.println(charac.getCoord().getX()); + System.out.println(charac.getCoord().getZ()); + double comX,comZ; + int a = 1; + comX = 0; + comZ = 0; + + boolean Right = (boolean) command.get(0); + boolean Left = (boolean) command.get(0); + boolean Jump = (boolean) command.get(0); + + + if (Right) { + comX = -charac.getVitesseMax()*Physique.lambda; + } + if (Left) { + comX = charac.getVitesseMax() * Physique.lambda; + } + if (Jump) { + if (charac.getCoord().getZ() < 80) a = 0; + else comZ = 30000 * charac.getVitesseMax() * charac.getM(); + } + else { + if (charac.getCoord().getZ() >= 80) { //a retoucher, j'ai besoin d'autres choses pour avancer + a = 1; + } + + /*else{ + a = 1; + }*/ + + } + charac.deplacements(comX, comZ, a); + } + + @Override + public boolean isFinished() { + // le jeu n'est jamais fini + return false; + } + +} \ No newline at end of file diff --git a/MAVENProject/src/main/java/jeu/Painter.java b/MAVENProject/src/main/java/jeu/Painter.java new file mode 100644 index 0000000000000000000000000000000000000000..4b70699d139e0b6114af8f34e467acfab88cce45 --- /dev/null +++ b/MAVENProject/src/main/java/jeu/Painter.java @@ -0,0 +1,39 @@ +package jeu; + +import engine.GamePainter; +import java.awt.*; +import java.awt.image.BufferedImage; +import entity.Character; +import environnement.Coordonnees; + +public class Painter implements GamePainter{ + + protected static final int WIDTH = 1000; + protected static final int HEIGHT = 1000; + public static Character charac; + + public Painter() { + Coordonnees coordonnees = new Coordonnees(20,80); + + charac = new Character(coordonnees, 2, 0.09); // pour simplifier les tests ce n'est pas de cette façon que le personnage sera cree à la fin + } + + @Override + public void draw(BufferedImage im) { + Graphics2D crayon = (Graphics2D) im.getGraphics(); + crayon.setColor(Color.blue); + int x = (int) charac.getCoord().getX(); + int y = (int) charac.getCoord().getZ(); + crayon.fillOval(x,y,10,10); + } + + @Override + public int getWidth() { + return WIDTH; + } + + @Override + public int getHeight() { + return HEIGHT; + } +} diff --git a/MAVENProject/src/main/java/model/PacmanController.java b/MAVENProject/src/main/java/model/PacmanController.java deleted file mode 100644 index 15f50bbfebd08fc0b6dc2cee6047d774f8b0fdc6..0000000000000000000000000000000000000000 --- a/MAVENProject/src/main/java/model/PacmanController.java +++ /dev/null @@ -1,78 +0,0 @@ -package model; - -import java.awt.event.KeyEvent; - -import engine.Cmd; -import engine.GameController; - - -/** - * @author Horatiu Cirstea, Vincent Thomas - * - * controleur de type KeyListener - * - */ -public class PacmanController implements GameController { - - /** - * commande en cours - */ - private Cmd commandeEnCours; - - /** - * construction du controleur par defaut le controleur n'a pas de commande - */ - public PacmanController() { - this.commandeEnCours = Cmd.IDLE; - } - - /** - * quand on demande les commandes, le controleur retourne la commande en - * cours - * - * @return commande faite par le joueur - */ - public Cmd getCommand() { - return this.commandeEnCours; - } - - @Override - /** - * met a jour les commandes en fonctions des touches appuyees - */ - public void keyPressed(KeyEvent e) { - - switch (e.getKeyChar()) { - // si on appuie sur 'q',commande joueur est gauche - case 'q': - case 'Q': - this.commandeEnCours = Cmd.LEFT; - break; - case 'd': - case 'D': - this.commandeEnCours = Cmd.RIGHT; - break; - case ' ': - this.commandeEnCours = Cmd.JUMP; - break; - } - - } - - @Override - /** - * met a jour les commandes quand le joueur relache une touche - */ - public void keyReleased(KeyEvent e) { - this.commandeEnCours = Cmd.IDLE; - } - - @Override - /** - * ne fait rien - */ - public void keyTyped(KeyEvent e) { - - } - -} diff --git a/MAVENProject/src/main/java/model/PacmanGame.java b/MAVENProject/src/main/java/model/PacmanGame.java deleted file mode 100644 index af4065ac8a97cfb5195e23af58e9f6baeb990fff..0000000000000000000000000000000000000000 --- a/MAVENProject/src/main/java/model/PacmanGame.java +++ /dev/null @@ -1,59 +0,0 @@ -package model; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - -import engine.Cmd; -import engine.Game; - -/** - * @author Horatiu Cirstea, Vincent Thomas - * - * Version avec personnage qui peut se deplacer. A completer dans les - * versions suivantes. - * - */ -public class PacmanGame implements Game { - - /** - * constructeur avec fichier source pour le help - * - */ - public PacmanGame(String source) { - BufferedReader helpReader; - try { - helpReader = new BufferedReader(new FileReader(source)); - String ligne; - while ((ligne = helpReader.readLine()) != null) { - System.out.println(ligne); - } - helpReader.close(); - } catch (IOException e) { - System.out.println("Help not available"); - } - } - - /** - * faire evoluer le jeu suite a une commande - * - * @param commande - */ - @Override - public void evolve(Cmd commande) { - System.out.println("Execute "+commande); - if (commande == Cmd.LEFT) { - - } - } - - /** - * verifier si le jeu est fini - */ - @Override - public boolean isFinished() { - // le jeu n'est jamais fini - return false; - } - -} diff --git a/MAVENProject/src/main/java/model/PacmanPainter.java b/MAVENProject/src/main/java/model/PacmanPainter.java deleted file mode 100644 index 8052e6cc077ff8ae505be79a1ffd1f622fccaccf..0000000000000000000000000000000000000000 --- a/MAVENProject/src/main/java/model/PacmanPainter.java +++ /dev/null @@ -1,52 +0,0 @@ -package model; - -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.image.BufferedImage; - -import engine.GamePainter; - -/** - * @author Horatiu Cirstea, Vincent Thomas - * - * afficheur graphique pour le game - * - */ -public class PacmanPainter implements GamePainter { - - /** - * la taille des cases - */ - protected static final int WIDTH = 1000; - protected static final int HEIGHT = 100; - - /** - * appelle constructeur parent - * - * @param game - * le jeutest a afficher - */ - public PacmanPainter() { - } - - /** - * methode redefinie de Afficheur retourne une image du jeu - */ - @Override - public void draw(BufferedImage im) { - Graphics2D crayon = (Graphics2D) im.getGraphics(); - crayon.setColor(Color.blue); - crayon.fillOval(20,20,10,10); - } - - @Override - public int getWidth() { - return WIDTH; - } - - @Override - public int getHeight() { - return HEIGHT; - } - -} diff --git a/MAVENProject/src/main/java/start/Main.java b/MAVENProject/src/main/java/start/Main.java index f75076d011d5a8c067277ccf675dc1be66fd5e64..2f32ec436e408e915fe62c6e5cbf1bed1b0da739 100644 --- a/MAVENProject/src/main/java/start/Main.java +++ b/MAVENProject/src/main/java/start/Main.java @@ -1,9 +1,9 @@ package start; -import model.PacmanPainter; +import jeu.Painter; import engine.GameEngineGraphical; -import model.PacmanController; -import model.PacmanGame; +import jeu.Controller; +import jeu.Jeu; /** * lancement du moteur avec le jeu @@ -13,9 +13,9 @@ public class Main { public static void main(String[] args) throws InterruptedException { // creation du jeu particulier et de son afficheur - PacmanGame game = new PacmanGame("helpFilePacman.txt"); - PacmanPainter painter = new PacmanPainter(); - PacmanController controller = new PacmanController(); + Jeu game = new Jeu("helpFilePacman.txt"); + Painter painter = new Painter(); + Controller controller = new Controller(); // classe qui lance le moteur de jeu generique GameEngineGraphical engine = new GameEngineGraphical(game, painter, controller);