diff --git a/MAVENProject/pom.xml b/MAVENProject/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..5ec1364affc745197437648a5faa2d415c752c68 --- /dev/null +++ b/MAVENProject/pom.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>ACLISN2022.cyberpac2077</groupId> + <artifactId>MAVENProject</artifactId> + <version>1.0-SNAPSHOT</version> + + <properties> + <maven.compiler.source>17</maven.compiler.source> + <maven.compiler.target>17</maven.compiler.target> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + +</project> \ No newline at end of file diff --git a/MAVENProject/src/main/java/engine/Cmd.java b/MAVENProject/src/main/java/engine/Cmd.java new file mode 100644 index 0000000000000000000000000000000000000000..5dac240f1f1bba481bded682140b348cfaf65ba6 --- /dev/null +++ b/MAVENProject/src/main/java/engine/Cmd.java @@ -0,0 +1,9 @@ +package engine; + +/** + * @author Horatiu Cirstea + * + */ +public enum Cmd { + LEFT,RIGHT,UP,DOWN,IDLE; +} diff --git a/MAVENProject/src/main/java/engine/DrawingPanel.java b/MAVENProject/src/main/java/engine/DrawingPanel.java new file mode 100644 index 0000000000000000000000000000000000000000..9586bce41c8b8c519d0a4c541a0f1df1d3f2950c --- /dev/null +++ b/MAVENProject/src/main/java/engine/DrawingPanel.java @@ -0,0 +1,96 @@ +package engine; + +/** + * @author Horatiu Cirstea, Vincent Thomas + * + */ +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.image.BufferedImage; + +import javax.swing.JPanel; + +public class DrawingPanel extends JPanel { + + /** + * + */ + private static final long serialVersionUID = 1L; + + /** + * la clase chargee de Dessiner + */ + private GamePainter painter; + + /** + * image suivante est l'image cachee sur laquelle dessiner + */ + private BufferedImage nextImage; + + /** + * image en cours est l'image entrain d'etre affichee + */ + private BufferedImage currentImage; + + /** + * la taille des images + */ + private int width, height; + + /** + * constructeur Il construit les images pour doublebuffering ainsi que le + * Panel associe. Les images stockent le painter et on demande au panel la + * mise a jour quand le painter est fini + * + * @param width + * largeur de l'image + * @param height + * hauteur de l'image + */ + public DrawingPanel(GamePainter painter) { + super(); + this.width = painter.getWidth(); + this.height = painter.getHeight(); + this.setPreferredSize(new Dimension(this.width, this.height)); + this.painter=painter; + + // cree l'image buffer et son graphics + this.nextImage = new BufferedImage(width, height, + BufferedImage.TYPE_INT_RGB); + this.currentImage = new BufferedImage(width, height, + BufferedImage.TYPE_INT_RGB); + } + + /** + * demande de mettre a jour le rendu de l'image sur le Panel. Creer une + * nouvelle image vide sur laquelle dessiner + */ + public void drawGame() { + // generer la nouvelle image + this.painter.draw(this.nextImage); + + // inverses les images doublebuffereing + BufferedImage temp = this.currentImage; + // l'image a dessiner est celle qu'on a construite + this.currentImage = this.nextImage; + // l'ancienne image est videe + this.nextImage = temp; + this.nextImage.getGraphics() + .fillRect(0, 0, this.width, this.height); + // met a jour l'image a afficher sur le panel + this.repaint(); + } + + /** + * redefinit la methode paint consiste a dessiner l'image en cours + * + * @param g + * graphics pour dessiner + */ + public void paint(Graphics g) { + super.paint(g); + g.drawImage(this.currentImage, 0, 0, getWidth(), getHeight(), 0, 0, + getWidth(), getHeight(), null); + } + +} diff --git a/MAVENProject/src/main/java/engine/Game.java b/MAVENProject/src/main/java/engine/Game.java new file mode 100644 index 0000000000000000000000000000000000000000..12005596b711bcf72fcc217fd91a57fe0b3998db --- /dev/null +++ b/MAVENProject/src/main/java/engine/Game.java @@ -0,0 +1,24 @@ +package engine; + +/** + * @author Horatiu Cirstea, Vincent Thomas + * + * un jeu qui peut evoluer (avant de se terminer) sur un plateau width x + * height + */ +public interface Game { + + /** + * methode qui contient l'evolution du jeu en fonction de la commande + * + * @param userCmd + * commande utilisateur + */ + public void evolve(Cmd userCmd); + + /** + * @return true si et seulement si le jeu est fini + */ + public boolean isFinished(); + +} diff --git a/MAVENProject/src/main/java/engine/GameController.java b/MAVENProject/src/main/java/engine/GameController.java new file mode 100644 index 0000000000000000000000000000000000000000..461a610c19b38db3408f0f2de88470771e19a300 --- /dev/null +++ b/MAVENProject/src/main/java/engine/GameController.java @@ -0,0 +1,21 @@ +package engine; + +import java.awt.event.KeyListener; + +/** + * @author Horatiu Cirstea + * + * controleur qui envoie des commandes au jeu + * + */ +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(); + +} diff --git a/MAVENProject/src/main/java/engine/GameEngineGraphical.java b/MAVENProject/src/main/java/engine/GameEngineGraphical.java new file mode 100644 index 0000000000000000000000000000000000000000..c2d643da69e7822bd42e23e094fd9bf83454cfd9 --- /dev/null +++ b/MAVENProject/src/main/java/engine/GameEngineGraphical.java @@ -0,0 +1,70 @@ +package engine; + +/** + * @author Horatiu Cirstea, Vincent Thomas + * + * moteur de game generique. + * On lui passe un game et un afficheur et il permet d'executer un game. + */ +public class GameEngineGraphical { + + /** + * le game a executer + */ + private Game game; + + /** + * l'afficheur a utiliser pour le rendu + */ + private GamePainter gamePainter; + + /** + * le controlleur a utiliser pour recuperer les commandes + */ + private GameController gameController; + + /** + * l'interface graphique + */ + private GraphicalInterface gui; + + /** + * construit un moteur + * + * @param game + * game a lancer + * @param gamePainter + * afficheur a utiliser + * @param gameController + * controlleur a utiliser + * + */ + public GameEngineGraphical(Game game, GamePainter gamePainter, GameController gameController) { + // creation du game + this.game = game; + this.gamePainter = gamePainter; + this.gameController = gameController; + } + + /** + * permet de lancer le game + */ + public void run() throws InterruptedException { + + // creation de l'interface graphique + this.gui = new GraphicalInterface(this.gamePainter,this.gameController); + + // boucle de game + while (!this.game.isFinished()) { + // demande controle utilisateur + Cmd c = this.gameController.getCommand(); + // fait evoluer le game + this.game.evolve(c); + // affiche le game + this.gui.paint(); + // met en attente + Thread.sleep(100); + } + } + +} diff --git a/MAVENProject/src/main/java/engine/GamePainter.java b/MAVENProject/src/main/java/engine/GamePainter.java new file mode 100644 index 0000000000000000000000000000000000000000..790d64fa73c1108a3f7535bad11f49392c32ab46 --- /dev/null +++ b/MAVENProject/src/main/java/engine/GamePainter.java @@ -0,0 +1,26 @@ +package engine; + +import java.awt.image.BufferedImage; + +/** + * @author Horatiu Cirstea, Vincent Thomas + * + * represente la maniere de dessiner sur un JPanel + * + */ +public interface GamePainter { + + /** + * methode dessiner a completer. Elle construit une image correspondant au + * jeu. Game est un attribut de l'afficheur + * + * @param image + * image sur laquelle dessiner + */ + public abstract void draw(BufferedImage image); + + public abstract int getWidth(); + + public abstract int getHeight(); + +} diff --git a/MAVENProject/src/main/java/engine/GraphicalInterface.java b/MAVENProject/src/main/java/engine/GraphicalInterface.java new file mode 100644 index 0000000000000000000000000000000000000000..19d20bdbefba47579a4f99e24eb200d5cc426b43 --- /dev/null +++ b/MAVENProject/src/main/java/engine/GraphicalInterface.java @@ -0,0 +1,50 @@ +package engine; + +import javax.swing.JFrame; + + +/** + * @author Horatiu Cirstea, Vincent Thomas + * + * interface graphique avec son controller et son afficheur + * + */ +public class GraphicalInterface { + + /** + * le Panel pour l'afficheur + */ + private DrawingPanel panel; + + /** + * la construction de l'interface graphique: JFrame avec panel pour le game + * + * @param gamePainter l'afficheur a utiliser dans le moteur + * @param gameController l'afficheur a utiliser dans le moteur + * + */ + public GraphicalInterface(GamePainter gamePainter, GameController gameController){ + JFrame f=new JFrame(); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + // attacher le panel contenant l'afficheur du game + this.panel=new DrawingPanel(gamePainter); + f.setContentPane(this.panel); + + // attacher controller au panel du game + this.panel.addKeyListener(gameController); + + f.pack(); + f.setVisible(true); + f.getContentPane().setFocusable(true); + f.getContentPane().requestFocus(); + } + + /** + * mise a jour du dessin + */ + public void paint() { + this.panel.drawGame(); + } + +} diff --git a/MAVENProject/src/main/java/model/PacmanController.java b/MAVENProject/src/main/java/model/PacmanController.java new file mode 100644 index 0000000000000000000000000000000000000000..a69318e28e39f08f0f0fa7730dcd2dbdd2dca681 --- /dev/null +++ b/MAVENProject/src/main/java/model/PacmanController.java @@ -0,0 +1,71 @@ +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 'l': + case 'L': + this.commandeEnCours = Cmd.LEFT; + 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 new file mode 100644 index 0000000000000000000000000000000000000000..ba44c56d53467fd7cc9931bb3b62785dab1ba7fc --- /dev/null +++ b/MAVENProject/src/main/java/model/PacmanGame.java @@ -0,0 +1,56 @@ +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); + } + + /** + * 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 new file mode 100644 index 0000000000000000000000000000000000000000..9f33ee42e6954c893e3971105e18bc59c52e7870 --- /dev/null +++ b/MAVENProject/src/main/java/model/PacmanPainter.java @@ -0,0 +1,52 @@ +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 = 100; + 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(0,0,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 new file mode 100644 index 0000000000000000000000000000000000000000..f75076d011d5a8c067277ccf675dc1be66fd5e64 --- /dev/null +++ b/MAVENProject/src/main/java/start/Main.java @@ -0,0 +1,25 @@ +package start; + +import model.PacmanPainter; +import engine.GameEngineGraphical; +import model.PacmanController; +import model.PacmanGame; + +/** + * lancement du moteur avec le jeu + */ +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(); + + // classe qui lance le moteur de jeu generique + GameEngineGraphical engine = new GameEngineGraphical(game, painter, controller); + engine.run(); + } + +} diff --git a/acl-project.iml b/acl-project.iml deleted file mode 100644 index 48426fcce918b28a721230cc9a22a71d40ba14f5..0000000000000000000000000000000000000000 --- a/acl-project.iml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module type="JAVA_MODULE" version="4"> - <component name="NewModuleRootManager"> - <output url="file://$MODULE_DIR$/bin" /> - <exclude-output /> - <content url="file://$MODULE_DIR$" /> - <orderEntry type="sourceFolder" forTests="false" /> - </component> -</module> \ No newline at end of file