package animationPersonnages; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import personnages.Bonhomme; import personnages.Personnage; public class IHMJeuBalles extends JPanel implements KeyListener,ItemListener, ActionListener, Runnable { private static final long serialVersionUID = 1L;; private JButton demarrer = new JButton("demarrer"); private JButton stopper = new JButton("stopper"); private JCheckBox lent = new JCheckBox("Lent"); private JCheckBox normal = new JCheckBox("Normal"); private JCheckBox rapide = new JCheckBox("Rapide"); private long date; private Color couleur = Color.BLACK; private int taille = 40; private int direction = Personnage.DROITE; public static int VITESSE_LENTE = 50; public static int VITESSE_NORMALE = 100; public static int VITESSE_RAPIDE = 150; private int vitesse = VITESSE_LENTE; private JLabel labelEtat = new JLabel(" "); private Personnage promeneur = null; private LanceBalles lanceBalles; private DessinJeuBalles dessin = new DessinJeuBalles(this); private boolean arrete; private int nbPromeneurs; private static final int MAX_PROMENEURS = 3; public IHMJeuBalles() { JPanel panneauBoutons = new JPanel(); ButtonGroup groupe = new ButtonGroup(); setLayout(new BorderLayout(5, 5)); dessin.addKeyListener(this); lent.addKeyListener(this); normal.addKeyListener(this); rapide.addKeyListener(this); demarrer.addActionListener(this); stopper.addActionListener(this); lent.addItemListener(this); normal.addItemListener(this); rapide.addItemListener(this); groupe.add(lent); groupe.add(normal); groupe.add(rapide); lent.setSelected(true); panneauBoutons.add(demarrer); panneauBoutons.add(stopper); panneauBoutons.add(lent); panneauBoutons.add(normal); panneauBoutons.add(rapide); labelEtat.setText ("balles evitees : 0, record : 0"); add(panneauBoutons, BorderLayout.NORTH); add(dessin, BorderLayout.CENTER); add(labelEtat, BorderLayout.SOUTH); setBackground(Color.WHITE); date = System.currentTimeMillis(); lanceBalles = new LanceBalles(this, 2 * dessin.getHauteur()/3); lanceBalles.setVitesseMin(vitesse); lanceBalles.setVitesseMax(4 * vitesse); lanceBalles.setDelai(vitesse); } public long getDate() { return date; } public DessinJeuBalles getDessin() { return dessin; } public int getDirection() { return direction; } public LanceBalles getLanceBalles() { return lanceBalles; } public JLabel getLabelEtat() { return labelEtat; } public int getNbPromeneurs() { return nbPromeneurs; } public int getVitesse() { if (lent.isSelected()) return (VITESSE_LENTE); else if ( normal.isSelected()) return (VITESSE_NORMALE); else if (rapide.isSelected()) return (VITESSE_RAPIDE); return (VITESSE_NORMALE); } public void setDirection(int direction) { this.direction = direction; } public Personnage getPromeneur() { return promeneur; } public boolean isArrete() { return arrete; } public void setPromeneur(Personnage promeneur) { this.promeneur = promeneur; } public void actualiserLabelEtat() { labelEtat.setText("balles evitees : " + lanceBalles.getCompteur() + ", nbPromeneursRestants : " + (MAX_PROMENEURS - nbPromeneurs)); } public void itemStateChanged(ItemEvent evt) { if(evt.getSource() == lent) vitesse = VITESSE_LENTE; else if(evt.getSource() == normal) vitesse = VITESSE_NORMALE; else if(evt.getSource() == rapide) vitesse = VITESSE_RAPIDE; else vitesse = VITESSE_NORMALE; if (lanceBalles != null) { lanceBalles.setVitesseMin(vitesse); lanceBalles.setVitesseMax(4 * vitesse); lanceBalles.setDelai(vitesse); } if (promeneur != null) { promeneur.setVitesse(vitesse); promeneur.setTempsSaut(8 * promeneur.getAttente()); } dessin.requestFocus(); } public void keyPressed(KeyEvent evt) { if (System.currentTimeMillis() - date < 500) return; if (evt.getKeyCode() == KeyEvent.VK_RIGHT) { direction = Personnage.DROITE; if (promeneur != null) promeneur.setDirection(direction); } else if (evt.getKeyCode()== KeyEvent.VK_LEFT) { direction=Personnage.GAUCHE; if (promeneur != null) promeneur.setDirection(direction); } else if (evt.getKeyCode()== KeyEvent.VK_UP) { if (promeneur != null) promeneur.sauter(); } dessin.requestFocus(); } public void keyReleased(KeyEvent evt){} public void keyTyped(KeyEvent evt){} public void actionPerformed(ActionEvent evt) { if (evt.getSource() == demarrer) { arrete = false; lanceBalles.setCompteur(0); nbPromeneurs = 0; actualiserLabelEtat(); new Thread(this).start(); lanceBalles.demarrer(); synchronized(this){ notifyAll(); } } else if (evt.getSource() == stopper) { arrete = true; lanceBalles.setFonctionne(false); if (promeneur != null) promeneur.setCyclique(false); synchronized(this){ notifyAll(); } } dessin.requestFocus(); } public void run() { while (!arrete) { synchronized(this) { try { while ((promeneur != null) && (!arrete)) wait(); wait(1000); } catch (InterruptedException e) { e.printStackTrace(); } } if (arrete) break; date = System.currentTimeMillis(); promeneur = new Bonhomme(dessin, dessin.getLargeur()/2 , 2* dessin.getHauteur()/3, taille, couleur, true); if (nbPromeneurs == MAX_PROMENEURS) { promeneur = null; arrete = true; } else { nbPromeneurs++; actualiserLabelEtat(); promeneur.setDirection(direction); promeneur.setVitesse(vitesse); promeneur.setTempsSaut(3 * promeneur.getAttente()); promeneur.start(); synchronized(lanceBalles) { lanceBalles.notify(); } } } lanceBalles.vider(); } public void setArrete(boolean arrete) { this.arrete = arrete; } }