diff --git a/src/VueControleur/VueControleurGyromite.java b/src/VueControleur/VueControleurGyromite.java index e7ee0bc..3703b42 100644 --- a/src/VueControleur/VueControleurGyromite.java +++ b/src/VueControleur/VueControleurGyromite.java @@ -16,6 +16,7 @@ import javax.swing.*; import modele.calculs.Controle4Directions; import modele.calculs.Direction; import modele.calculs.Jeu; +import modele.calculs.MenuInput; import modele.donnees.*; @@ -39,8 +40,33 @@ public class VueControleurGyromite extends JFrame implements Observer { private ImageIcon icoCorde; private ImageIcon icoBombe; - private JLabel[][] tabJLabel; // cases graphique (au moment du rafraichissement, chaque case va être associée à une icône, suivant ce qui est présent dans le modèle) + private ImageIcon titleImage; + private JLabel[][] tabJLabel; // cases graphique (au moment du rafraichissement, chaque case va être associée à une icône, suivant ce qui est présent dans le modèle) + private JComponent grilleJLabels = null; + private JComponent titleScreen = null; + + private KeyAdapter listenerJeu = new KeyAdapter() { // new KeyAdapter() { ... } est une instance de classe anonyme, il s'agit d'un objet qui correspond au controleur dans MVC + @Override + public void keyPressed(KeyEvent e) { + switch(e.getKeyCode()) { // on regarde quelle touche a été pressée + case KeyEvent.VK_LEFT : Controle4Directions.getInstance().setDirectionCourante(Direction.gauche); break; + case KeyEvent.VK_RIGHT : Controle4Directions.getInstance().setDirectionCourante(Direction.droite); break; + case KeyEvent.VK_DOWN : Controle4Directions.getInstance().setDirectionCourante(Direction.bas); break; + case KeyEvent.VK_UP : Controle4Directions.getInstance().setDirectionCourante(Direction.haut); break; + } + } + }; + private KeyAdapter listenerMenu = new KeyAdapter() { // new KeyAdapter() { ... } est une instance de classe anonyme, il s'agit d'un objet qui correspond au controleur dans MVC + @Override + public void keyPressed(KeyEvent e) { + switch(e.getKeyCode()) { // on regarde quelle touche a été pressée + case KeyEvent.VK_ENTER: MenuInput.getInstance().setDirectionAction(Direction.action); break; + case KeyEvent.VK_DOWN : MenuInput.getInstance().setDirectionAction(Direction.bas); break; + case KeyEvent.VK_UP : MenuInput.getInstance().setDirectionAction(Direction.haut); break; + } + } + }; public VueControleurGyromite(Jeu _jeu) { sizeX = jeu.SIZE_X; @@ -48,22 +74,19 @@ public class VueControleurGyromite extends JFrame implements Observer { jeu = _jeu; chargerLesIcones(); - placerLesComposantsGraphiques(); - ajouterEcouteurClavier(); + setUpFenetre(); + placerLesComposantsGraphiquesMenu(); + ajouterEcouteurClavierMenu(); } - private void ajouterEcouteurClavier() { - addKeyListener(new KeyAdapter() { // new KeyAdapter() { ... } est une instance de classe anonyme, il s'agit d'un objet qui correspond au controleur dans MVC - @Override - public void keyPressed(KeyEvent e) { - switch(e.getKeyCode()) { // on regarde quelle touche a été pressée - case KeyEvent.VK_LEFT : Controle4Directions.getInstance().setDirectionCourante(Direction.gauche); break; - case KeyEvent.VK_RIGHT : Controle4Directions.getInstance().setDirectionCourante(Direction.droite); break; - case KeyEvent.VK_DOWN : Controle4Directions.getInstance().setDirectionCourante(Direction.bas); break; - case KeyEvent.VK_UP : Controle4Directions.getInstance().setDirectionCourante(Direction.haut); break; - } - } - }); + private void ajouterEcouteurClavierJeu() { + removeKeyListener(listenerMenu); + addKeyListener(listenerJeu); + } + + private void ajouterEcouteurClavierMenu() { + removeKeyListener(listenerJeu); + addKeyListener(listenerMenu); } @@ -75,6 +98,8 @@ public class VueControleurGyromite extends JFrame implements Observer { icoMur = chargerIcone("Images/Mur.png"); icoCorde = chargerIcone("Images/Corde.png"); icoBombe = chargerIcone("Images/Bombe.png"); + + titleImage = chargerIcone("Images/TitleScreen.png"); } private ImageIcon chargerIcone(String urlIcone) { @@ -90,12 +115,18 @@ public class VueControleurGyromite extends JFrame implements Observer { return new ImageIcon(image); } - private void placerLesComposantsGraphiques() { + private void setUpFenetre() { setTitle("Gyromite"); - setSize(400, 250); + setSize(400, 270); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // permet de terminer l'application à la fermeture de la fenêtre + } - JComponent grilleJLabels = new JPanel(new GridLayout(sizeY, sizeX)); // grilleJLabels va contenir les cases graphiques et les positionner sous la forme d'une grille + private void placerLesComposantsGraphiquesJeu() { + if(titleScreen != null) { + remove(titleScreen); + titleScreen = null; + } + grilleJLabels = new JPanel(new GridLayout(sizeY, sizeX)); // grilleJLabels va contenir les cases graphiques et les positionner sous la forme d'une grille tabJLabel = new JLabel[sizeX][sizeY]; @@ -109,6 +140,16 @@ public class VueControleurGyromite extends JFrame implements Observer { add(grilleJLabels); } + private void placerLesComposantsGraphiquesMenu() { + if(grilleJLabels != null) { + remove(grilleJLabels); + grilleJLabels = null; + } + titleScreen = new JLabel(); + ((JLabel) titleScreen).setIcon(titleImage); + add(titleScreen); + } + /** * Il y a une grille du côté du modèle ( jeu.getGrille() ) et une grille du côté de la vue (tabJLabel) @@ -139,7 +180,16 @@ public class VueControleurGyromite extends JFrame implements Observer { @Override public void update(Observable o, Object arg) { - mettreAJourAffichage(); + switch (jeu.getState()) { + case 0: + break; + case 3: + placerLesComposantsGraphiquesJeu(); + ajouterEcouteurClavierJeu(); + case 4: + mettreAJourAffichage(); + break; + } /* SwingUtilities.invokeLater(new Runnable() { @Override diff --git a/src/modele/calculs/Direction.java b/src/modele/calculs/Direction.java index 1432ac9..504eefe 100644 --- a/src/modele/calculs/Direction.java +++ b/src/modele/calculs/Direction.java @@ -10,5 +10,5 @@ package modele.calculs; * */ public enum Direction { - haut, bas, gauche, droite + haut, bas, gauche, droite, action } diff --git a/src/modele/calculs/Jeu.java b/src/modele/calculs/Jeu.java index db94c67..ae4ccd9 100644 --- a/src/modele/calculs/Jeu.java +++ b/src/modele/calculs/Jeu.java @@ -11,8 +11,9 @@ import modele.calculs.Gravite; import modele.calculs.IO.LecteurFichier; import modele.calculs.Ordonnanceur; import modele.donnees.*; +import modele.donnees.Menu; -import java.awt.Point; +import java.awt.*; import java.util.HashMap; /** Actuellement, cette classe gère les postions @@ -35,8 +36,17 @@ public class Jeu { private Ordonnanceur ordonnanceur = new Ordonnanceur(this); + // Etat du jeu courant. 0 = ecran titre, 2 = Menu choix, 4 = Plateau Jeu (les valeurs entre sont les valeurs de transitions) + private int state = 0; + + public synchronized int getState() { + int retour = state; + if (state % 2 == 1) state ++; + return retour; + } + public Jeu() { - initialisationDesEntites(); + startTitleScreen(); } public void resetCmptDepl() { @@ -55,12 +65,23 @@ public class Jeu { public Heros getHector() { return hector; } - + + // PARTIE INITIALISATIONS private void initialisationDesEntites() { + this.state = 3; LecteurFichier.loadMap("Map/test.gyro", this); System.out.println("Map loaded"); } + public void startTitleScreen() { + this.state = 0; + + MenuInput.getInstance().addEntiteDynamique(new Menu(this)); + + ordonnanceur.add(MenuInput.getInstance()); + } + + // PARTIE MANIPULATIONS ENTITE public void addEntite(ObjetGyromide e, int x, int y) { if(e instanceof ElementFond) grilleEntites[x][y][1] = e; @@ -198,4 +219,16 @@ public class Jeu { public Ordonnanceur getOrdonnanceur() { return ordonnanceur; } + + // PARTIE MANIPULATION MENU + public synchronized boolean updateMenu(Direction d) { + System.out.println("Mis a jour du menu"); + switch (getState()) { + case 0: + if (d == Direction.action) + initialisationDesEntites(); + break; + } + return true; + } } diff --git a/src/modele/calculs/Ordonnanceur.java b/src/modele/calculs/Ordonnanceur.java index 8030938..ab7a59c 100644 --- a/src/modele/calculs/Ordonnanceur.java +++ b/src/modele/calculs/Ordonnanceur.java @@ -8,9 +8,15 @@ import static java.lang.Thread.*; public class Ordonnanceur extends Observable implements Runnable { private Jeu jeu; private ArrayList lstDeplacements = new ArrayList(); + private ArrayList buffer_lstDeplacements = new ArrayList(); private long pause; public void add(RealisateurDeDeplacement deplacement) { - lstDeplacements.add(deplacement); + buffer_lstDeplacements.add(deplacement); + } + private void addBuffer() { + for (RealisateurDeDeplacement r : buffer_lstDeplacements) + lstDeplacements.add(r); + buffer_lstDeplacements.clear(); } public Ordonnanceur(Jeu _jeu) { @@ -30,19 +36,34 @@ public class Ordonnanceur extends Observable implements Runnable { notifyObservers(); while(true) { - jeu.resetCmptDepl(); - for (RealisateurDeDeplacement d : lstDeplacements) { - if (d.realiserDeplacement()) - update = true; - } + switch (jeu.getState()) { + case 0: + for (RealisateurDeDeplacement d : lstDeplacements) { + if (d.realiserDeplacement()) + update = true; + } - Controle4Directions.getInstance().resetDirection(); + MenuInput.getInstance().resetDirection(); + break; + case 3: + case 4: + jeu.resetCmptDepl(); + for (RealisateurDeDeplacement d : lstDeplacements) { + if (d.realiserDeplacement()) + update = true; + } + + Controle4Directions.getInstance().resetDirection(); + break; + } if (update) { setChanged(); notifyObservers(); } + addBuffer(); + try { sleep(pause); } catch (InterruptedException e) {