package linea; import java.awt.Color; import java.awt.Font; 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.SwingConstants; 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 protected Ligne lili = new Ligne(); // 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 = 1; // un label qui servira à afficher le score protected JLabel labScore; protected int compteurFrames = 0; protected boolean enCollision = false; protected boolean estGameOver = false; protected JLabel labGameOver; protected int compteurGameOver = 0; protected int compteurInvincible = 0; // ------------------------------------------------------------------------- // METHODES // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // Constructeur de la classe // ------------------------------------------------------------------------- public Jeu() { // Gestion du score : a réactiver en fin de TP, inutile au début labScore = new JLabel(); labScore.setForeground(Color.WHITE); labScore.setText("

" + (int) score + "

"); labScore.setBounds(20, 0, 200, 50); ecran.add(labScore); labGameOver = new JLabel("GAME OVER", SwingConstants.CENTER); labGameOver.setForeground(Color.WHITE); labGameOver.setFont(new Font("Arial", Font.BOLD, 60)); labGameOver.setBounds(0, 200, 800, 100); labGameOver.setVisible(false); ecran.add(labGameOver); ecran.traiterBoucleAnimation(); } // ------------------------------------------------------------------------- // 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(demiCercleArriere); ecran.ajouterObjet(lili); ecran.ajouterObjet(demiCercleAvant); demiCercleArriere.setCouleur(new Color(0.0f, 0.4f, 0.0f)); demiCercleAvant.setCouleur(new Color(0.0f, 0.5f, 0.0f)); // 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 : demiCercleArriere.setCouleur(new Color(0.8f, 0.0f, 0.0f)); // donner la couleur des 2 demi-cercles, par exemple : // demiCerleArriere.setCouleur(new Color(0.8f,0.0f,0.0f)); } // ------------------------------------------------------------------------- // Méthode appelée lorsqu'un événement timer se produit // ------------------------------------------------------------------------- @Override public void actionPerformed(ActionEvent e) { if (estGameOver == true) { compteurGameOver = compteurGameOver + 1; if (compteurGameOver >= 75) { RecommencerPartie(); } return; } ecran.traiterBoucleAnimation(); compteurFrames = compteurFrames + 1; if (compteurFrames >= 25) { score = score + 1; compteurFrames = 0; } if (compteurInvincible < 75) { compteurInvincible = compteurInvincible + 1; } else { if (demiCercleArriere.VerifierCollision(lili)) { if (enCollision == false) { score = score - 5; enCollision = true; } } else { enCollision = false; } } if (score <= 0) { score = 0; estGameOver = true; ecran.arreter(); labGameOver.setVisible(true); } labScore.setText("

" + (int) score + "

"); demiCercleArriere.ResterDansLigne(lili); demiCercleAvant.ResterDansLigne(lili); } private void RecommencerPartie() { lili = new Ligne(); demiCercleAvant.y = 200; demiCercleAvant.vitesse = -1.0; demiCercleArriere.y = 200; demiCercleArriere.vitesse = -1.0; ecran.viderObjets(); ecran.ajouterObjet(demiCercleArriere); ecran.ajouterObjet(lili); ecran.ajouterObjet(demiCercleAvant); score = 1; compteurFrames = 0; enCollision = false; estGameOver = false; compteurGameOver = 0; compteurInvincible = 0; labGameOver.setVisible(false); ecran.demarrer(); } }