// // Jeu.java // Pong // import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.geom.Rectangle2D; import javax.swing.JButton; import javax.swing.Timer; import javax.swing.JPanel; class Jeu extends JPanel implements ActionListener,MouseMotionListener{ private double maxX,maxY; // dimensions de la surface de jeu private double hauteurP,largeurP,miLargeurP; // dimensions de la palette double epaisseur = 5; // epaisseur des murs, plafond et plancher private Toolkit tk; private Balle balle; // objets graphiques private Rectangle2D palette, murGauche, murDroit, plancher, plafond; private Timer timer; // objets d'interaction private JButton bouton; Jeu(Balle balle,Timer timer,JButton bouton){ this.balle=balle; this.timer=timer; this.bouton=bouton; // dimensions de l'applet this.maxX = getSize().width; this.maxY = getSize().height; tk = getToolkit(); // palette miLargeurP = balle.getDiametre(); largeurP=miLargeurP*2; hauteurP = 15; palette = new Rectangle2D.Double((maxX-largeurP)/2,maxY-epaisseur-hauteurP, largeurP,hauteurP); // frontières murGauche = new Rectangle2D.Double(0,0,epaisseur,maxY); murDroit = new Rectangle2D.Double(maxX-epaisseur,0,epaisseur,maxY); plafond = new Rectangle2D.Double(0,0,maxX,epaisseur); plancher = new Rectangle2D.Double(0,maxY-epaisseur,maxX,epaisseur); // indiquer qu'on écoutera les mouvements de la souris addMouseMotionListener(this); } // ajuster les objets graphiques si le jeu a changé de dimension public void updateMurs(){ double maxX=getSize().width, maxY=getSize().height; if(this.maxX!=maxX ||this.maxY!=maxY){ this.maxX=maxX; this.maxY=maxY; palette.setFrame((maxX-largeurP)/2,maxY-epaisseur-hauteurP,largeurP,hauteurP); murGauche.setFrame(0,0,epaisseur,maxY); murDroit.setFrame(maxX-epaisseur,0,epaisseur,maxY); plafond.setFrame(0,0,maxX,epaisseur); plancher.setFrame(0,maxY-epaisseur,maxX,epaisseur); } } // affichage du contenu de l'écran public void paintComponent (Graphics g) { super.paintComponent(g); Graphics2D g2D = (Graphics2D)g; updateMurs(); //g2D.drawString(balle.getX()+","+balle.getY(),10,15); g2D.fill(murGauche); g2D.fill(murDroit); g2D.fill(plafond); g2D.fill(plancher); g2D.setColor(Color.blue); balle.afficher(g2D); g2D.setColor(Color.red); g2D.fill(palette); } private void bip(){ tk.beep(); } // traitement des Action Events du Timer public void actionPerformed(ActionEvent e){ // déplacer la balle balle.allerA(balle.getX()+balle.getDx(),balle.getY()+balle.getDy()); // vérification d'un changement de direction (avec accélération...) if(balle.intersects(murGauche)||balle.intersects(murDroit)){ // frappe un coté double dx = balle.getDx(); balle.setDx(dx>0 ? -(++dx) : -(--dx)); bip(); } else if(balle.intersects(plafond)||balle.intersects(palette)){ double dy = balle.getDy(); balle.setDy(dy>0 ? -(++dy) : -(--dy)); bip(); } else if(balle.intersects(plancher)){ balle.cacher(); bouton.setText("lancer"); timer.stop(); } repaint(); } // traite les déplacements de souris public void mouseDragged(MouseEvent ev){// ignore } public void mouseMoved(MouseEvent ev){ // deplace x en s'assurant qu'on reste dans les bornes de l'applet double px = Math.min(maxX-miLargeurP-epaisseur, Math.max(ev.getX(),miLargeurP+epaisseur)); palette.setFrame(px-miLargeurP,palette.getY(),largeurP,hauteurP); repaint(); } }