Files
Projet_Dev_Java/linea/linea/Jeu.java

179 lines
6.3 KiB
Java
Raw Normal View History

2026-02-03 16:19:39 +01:00
package linea;
2026-02-04 23:07:47 +01:00
import java.awt.Color;
2026-02-03 16:19:39 +01:00
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
public class Jeu implements KeyListener, ActionListener{
//-------------------------------------------------------------------------
// PROPRIETES
//-------------------------------------------------------------------------
// Ecran : instance de ZoneDessin, qui contiendra tous les objets graphiques
// et les animera
protected ZoneDessin ecran = new ZoneDessin();
// Le cercle : en fait 2 demis-cercles, un qui passera sous la ligne
// un qui passera dessus
protected Cercle demiCercleAvant = new Cercle(90,-180); // celui qui est sur la ligne
protected Cercle demiCercleArriere = new Cercle(90,180); // celui qui est derrière la ligne
// A FAIRE : ajouter les objets graphiques manquants, s'il y en a
2026-02-04 23:07:47 +01:00
protected Ligne laLigne = new Ligne(); // Ligne infinie du jeu
2026-02-03 16:19:39 +01:00
// Timer : un objet qui émet des événements à un intervalle choisi,
// il sert à donner le pas de l'animation
protected Timer horloge;
// Une variable qui contiendra le score
protected double score=0;
// un label qui servira à afficher le score
2026-02-17 12:44:43 +01:00
protected JLabel labScore;
protected boolean jeuCommence = false;
2026-02-03 16:19:39 +01:00
//-------------------------------------------------------------------------
// METHODES
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
// Constructeur de la classe
//-------------------------------------------------------------------------
public Jeu(){
// Gestion du score : a réactiver en fin de TP, inutile au début
// Ajout du niveau du jeu
labLevel = new JLabel();
labLevel.setText("<html><h3>niveau : 1</h3></html>");
labLevel.setBounds(20, 50, 200, 50);
ecran.add(labLevel);
2026-02-03 16:19:39 +01:00
labScore = new JLabel();
labScore.setText("<html><h3>score : 0</h3></html>");
labScore.setBounds(20, 0, 200, 50);
ecran.add(labScore);
2026-02-10 15:58:09 +01:00
2026-02-03 16:19:39 +01:00
}
//-------------------------------------------------------------------------
// Méthodes qu'il faut implémenter pour être
// conforme à un KeyListener
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
// Appui sur une touche
// -> l'événement est émis lorsqu'on appuie, puis selon le rythme de
// répétition du clavier
//-------------------------------------------------------------------------
@Override
public void keyPressed(KeyEvent e){
// keyCode 38 : up
// keyCode 40 : down
int keyCode = e.getKeyCode();
if (keyCode==38){ // touche "flèche vers le haut"
// On demande aux deux demi-cercle de "monter"
demiCercleAvant.Monter();
demiCercleArriere.Monter();
}
}
//-------------------------------------------------------------------------
// Relâchement de la touche
//-------------------------------------------------------------------------
@Override
public void keyReleased(KeyEvent e){
// keyCode 38 : up
// keyCode 40 : down
int keyCode = e.getKeyCode();
if (keyCode==38){
// On demande aux deux demi-cercle "d'arrêter de monter"
demiCercleAvant.ArreterMonter();
demiCercleArriere.ArreterMonter();
}
}
//-------------------------------------------------------------------------
// Une méthode que nous n'utilisons pas
//-------------------------------------------------------------------------
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
//-------------------------------------------------------------------------
// Démarrage du jeu :
// création de diverses instances et
//-------------------------------------------------------------------------
public void demarrer(){
// Création d'une fenêtre
JFrame fenetre = new JFrame();
// A FAIRE :
// placer dans l'instance de l'écran tous les objets graphiques nécessaires
// par exemple : ecran.ajouterObjet(demiCerleArriere);
2026-02-04 23:07:47 +01:00
this.ecran.ajouterObjet(demiCercleArriere);
this.ecran.ajouterObjet(laLigne);
this.ecran.ajouterObjet(demiCercleAvant);
2026-02-03 16:19:39 +01:00
// on indique que c'est le jeu qui traitera les appuis sur une touche
ecran.addKeyListener(this);
ecran.setFocusable(true);
fenetre.setContentPane(ecran);
fenetre.pack();
fenetre.setLocation(100, 100);
fenetre.setVisible(true);
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Démarrage du timer, qui rythmera l'animation
horloge = new Timer(40, this);
horloge.start();
// A FAIRE :
// donner la couleur des 2 demi-cercles, par exemple : demiCerleArriere.setCouleur(new Color(0.8f,0.0f,0.0f));
2026-02-08 11:39:15 +01:00
demiCercleArriere.setCouleur(new Color(26, 95, 161));
demiCercleAvant.setCouleur(new Color(26, 95, 161));
2026-02-03 16:19:39 +01:00
}
2026-02-08 11:39:15 +01:00
//------------------------------------------------------------------------------------------------
2026-02-03 16:19:39 +01:00
// Méthode appelée lorsqu'un événement timer se produit
2026-02-08 11:39:15 +01:00
// -> C'est ici que la loqique et l'animation du jeu sont traitées
// -> C'est ici que la vérification de la collision entre la ligne et le cercle doit être faite
//------------------------------------------------------------------------------------------------
2026-02-03 16:19:39 +01:00
@Override
public void actionPerformed(ActionEvent e) {
2026-02-07 14:11:34 +01:00
this.ecran.traiterBoucleAnimation();
2026-02-08 11:39:15 +01:00
boolean verification = this.laLigne.estDansCercle(this.demiCercleAvant);
2026-02-10 16:33:33 +01:00
if(verification){
this.score += 5;
2026-02-10 16:33:33 +01:00
}else{
// Le score reste identique
2026-02-10 16:33:33 +01:00
//-------------------------------------------------------------------------------------------------------------------
// A FAIRE: Le jeu peut s'arrêter si la ligne n'est pas dans le cercle
// NB: Le jeu commence quand la ligne est dans le cercle
// Au début le ligne n'est pas dans le cercle car la ligne est à droite du cercle, et elle se déplace vers la gauche
//-------------------------------------------------------------------------------------------------------------------
2026-02-17 12:44:43 +01:00
if (this.jeuCommence) {
this.horloge.stop(); // 1. Arrêter le temps
this.ecran.partiePerdue = true; // 2. Signaler à l'écran
this.ecran.repaint(); // 3. Forcer l'affichage du texte
}
2026-02-10 16:33:33 +01:00
}
labScore.setText("<html><h3>score : " + this.score + "</h3></html>");
2026-02-17 12:44:43 +01:00
2026-02-03 16:19:39 +01:00
}
}