package linea; import java.awt.Color; 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; import javax.swing.JOptionPane; public class Jeu implements KeyListener, ActionListener { //------------------------------------------------------------------------- // PROPRIETES //------------------------------------------------------------------------- protected ZoneDessin ecran = new ZoneDessin(); protected Cercle demiCercleAvant; protected Cercle demiCercleArriere; protected Ligne ligne; private int _niv = 1; protected Timer horloge; protected double score = 0; protected JLabel labScore; //------------------------------------------------------------------------- // CONSTRUCTEUR //------------------------------------------------------------------------- public Jeu() { labScore = new JLabel(); labScore.setText("

score : 0

"); labScore.setBounds(20, 0, 200, 50); ecran.add(labScore); } //------------------------------------------------------------------------- // METHODES DE GESTION DU JEU //------------------------------------------------------------------------- /** * Centralise la création et la configuration des objets du jeu. * Évite de répéter ce code dans demarrer() et resetLevel(). */ private void initialiserPartie() { // 1. Nettoyage de l'écran ecran.reinitialiser(); // 2. Création des instances demiCercleAvant = new Cercle(90, -180); demiCercleArriere = new Cercle(90, 180); ligne = new Ligne(_niv); // 3. Configuration visuelle demiCercleArriere.setCouleur(new Color(0.8f, 0.0f, 0.0f)); demiCercleAvant.setCouleur(new Color(0.0f, 0.8f, 0.0f)); // 4. Ajout à l'écran (l'ordre définit la superposition) ecran.ajouterObjet(demiCercleArriere); ecran.ajouterObjet(ligne); ecran.ajouterObjet(demiCercleAvant); } public void demarrer() { JFrame fenetre = new JFrame("Linea Game"); // Initialise les objets une première fois initialiserPartie(); ecran.addKeyListener(this); ecran.setFocusable(true); fenetre.setContentPane(ecran); fenetre.pack(); fenetre.setLocation(100, 100); fenetre.setVisible(true); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Création et lancement du timer horloge = new Timer(40, this); horloge.start(); } private void resetLevel() { // Réinitialisation des variables de jeu score = 0; labScore.setText("

score : 0

"); // Ré-initialisation des objets graphiques initialiserPartie(); // Relance le timer existant et redonne le focus if (horloge != null) horloge.restart(); ecran.requestFocusInWindow(); } //------------------------------------------------------------------------- // EVENEMENTS (Timer & Clavier) //------------------------------------------------------------------------- @Override public void actionPerformed(ActionEvent e) { ecran.traiterBoucleAnimation(); if (ecran.aCollision()) { horloge.stop(); Object[] options = {"Relancer", "Quitter"}; int choix = JOptionPane.showOptionDialog(null, "Perdu\nScore : " + (int)score, "Game Over", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0]); if (choix == 0) resetLevel(); else System.exit(0); return; } // Calcul du score basé sur le temps écoulé score += (0.05 + (0.05 * horloge.getDelay() / 100.0)); labScore.setText("

score : " + (int)score + "

"); } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_UP) { demiCercleAvant.Monter(); demiCercleArriere.Monter(); } } @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_UP) { demiCercleAvant.ArreterMonter(); demiCercleArriere.ArreterMonter(); } } @Override public void keyTyped(KeyEvent e) {} }