package VueControleur; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Observable; import java.util.Observer; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.*; import modele.calculs.Controle4Directions; import modele.calculs.Direction; import modele.calculs.Jeu; import modele.calculs.MenuInput; import modele.donnees.*; /** Cette classe a deux fonctions : * (1) Vue : proposer une représentation graphique de l'application (cases graphiques, etc.) * (2) Controleur : écouter les évènements clavier et déclencher le traitement adapté sur le modèle (flèches direction Pacman, etc.)) * */ public class VueControleurGyromite extends JFrame implements Observer { private Jeu jeu; // référence sur une classe de modèle : permet d'accéder aux données du modèle pour le rafraichissement, permet de communiquer les actions clavier (ou souris) private int sizeX; // taille de la grille affichée private int sizeY; // icones affichées dans la grille private ImageIcon icoHero; private ImageIcon icoIA; private ImageIcon icoVide; private ImageIcon icoMur; private ImageIcon icoColonne; private ImageIcon icoCorde; private ImageIcon icoBombe; 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; case KeyEvent.VK_NUMPAD4: modele.calculs.Colonne.getInstance().setDirectionColonne(Direction.action); break; case KeyEvent.VK_NUMPAD1: modele.calculs.Colonne.getInstance().setDirectionColonne(Direction.action); 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; sizeY = _jeu.SIZE_Y; jeu = _jeu; chargerLesIcones(); setUpFenetre(); placerLesComposantsGraphiquesMenu(); ajouterEcouteurClavierMenu(); } private void ajouterEcouteurClavierJeu() { removeKeyListener(listenerMenu); addKeyListener(listenerJeu); } private void ajouterEcouteurClavierMenu() { removeKeyListener(listenerJeu); addKeyListener(listenerMenu); } private void chargerLesIcones() { icoHero = chargerIcone("Images/prof.png"); icoIA = chargerIcone("Images/Fantome.png"); icoVide = chargerIcone("Images/Vide.png"); icoColonne = chargerIcone("Images/Colonne.png"); 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) { BufferedImage image = null; try { image = ImageIO.read(new File(urlIcone)); } catch (IOException ex) { Logger.getLogger(VueControleurGyromite.class.getName()).log(Level.SEVERE, null, ex); return null; } return new ImageIcon(image); } private void setUpFenetre() { setTitle("Gyromite"); setSize(400, 270); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // permet de terminer l'application à la fermeture de la fenêtre } 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]; for (int y = 0; y < sizeY; y++) { for (int x = 0; x < sizeX; x++) { JLabel jlab = new JLabel(); tabJLabel[x][y] = jlab; // on conserve les cases graphiques dans tabJLabel pour avoir un accès pratique à celles-ci (voir mettreAJourAffichage() ) grilleJLabels.add(jlab); } } grilleJLabels.setBackground(Color.BLACK); 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) */ private void mettreAJourAffichage() { for (int x = 0; x < sizeX; x++) { for (int y = 0; y < sizeY; y++) { if (jeu.getGrille()[x][y][0] != null) { if (jeu.getGrille()[x][y][0] instanceof Heros)// si la grille du modèle contient un Pacman, on associe l'icône Pacman du côté de la vue // System.out.println("Héros !"); tabJLabel[x][y].setIcon(icoHero); else if (jeu.getGrille()[x][y][0] instanceof Mur) tabJLabel[x][y].setIcon(icoMur); else if (jeu.getGrille()[x][y][0] instanceof Colonne) tabJLabel[x][y].setIcon(icoColonne); else if (jeu.getGrille()[x][y][0] instanceof IA) tabJLabel[x][y].setIcon(icoIA); } else if (jeu.getGrille()[x][y][1] != null) { if (jeu.getGrille()[x][y][1] instanceof Corde) tabJLabel[x][y].setIcon(icoCorde); else if (jeu.getGrille()[x][y][1] instanceof Bombe) tabJLabel[x][y].setIcon(icoBombe); } else tabJLabel[x][y].setIcon(icoVide); } } } @Override public void update(Observable o, Object arg) { switch (jeu.getState()) { case 0: break; case 3: placerLesComposantsGraphiquesJeu(); ajouterEcouteurClavierJeu(); case 4: mettreAJourAffichage(); break; } /* SwingUtilities.invokeLater(new Runnable() { @Override public void run() { mettreAJourAffichage(); } }); */ } }