mirror of
https://forge.univ-lyon1.fr/tplifap4/gyromite_ya.git
synced 2024-02-27 13:31:49 +01:00
205 lines
7.8 KiB
Java
205 lines
7.8 KiB
Java
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;
|
|
}
|
|
}
|
|
};
|
|
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();
|
|
}
|
|
});
|
|
*/
|
|
|
|
}
|
|
}
|