Objektorientierte Programmierung WS 2013/2014 - Datei PinBallGame.java
import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.util.Vector; import java.util.Enumeration; public class PinBallGame extends Frame { public static final int FrameWidth = 300; public static final int FrameHeight = 600; private Vector <Ball> balls = new Vector<Ball>(); // die Hindernisse private Vector <PBElement> pbelements = new Vector<PBElement>(); // Für das DoubleBuffering private Graphics bufferGraphics; private Image buffer; // Ein Bild für den Ballstarter private Image img = Toolkit.getDefaultToolkit().getImage("arrow.png"); private void bufferInit() { // wir zeichnen in einen Puffer buffer = this.createImage(FrameWidth, FrameHeight); bufferGraphics = buffer.getGraphics(); } public static void main(String[] args) { new PinBallGame().setVisible(true); } public PinBallGame() { setTitle("Java Pin Ball (with Holes)"); setSize(FrameWidth, FrameHeight); setBackground(Color.black); addMouseListener(new MouseKeeper()); // Konstruktion der Hindernisse pbelements.addElement(new Feder(40, FrameHeight - 40)); pbelements.addElement(new Feder(150, FrameHeight - 100)); pbelements.addElement(new Feder(FrameWidth - 40, FrameHeight - 200)); pbelements.addElement(new Ablenker(100, 400)); pbelements.addElement(new Ablenker(110, 150)); pbelements.addElement(new Ablenker(FrameWidth - 70, 330)); pbelements.addElement(new Punkt(70, 190, 100)); pbelements.addElement(new Punkt(70, 440, 120)); pbelements.addElement(new Punkt(220, 480, 200)); pbelements.addElement(new Punkt(150, 300, 160)); pbelements.addElement(new Loch(170, 70)); } private class PinBallThread extends Thread { private Ball theBall; public PinBallThread(Ball aBall) { theBall = aBall; } public void run() { while (theBall.y() - theBall.radius() < FrameHeight) { theBall.move(); // Beruehrung eines Hindernisses for (Enumeration pbelems = pbelements.elements(); pbelems.hasMoreElements();) { PBElement e = (PBElement) pbelems.nextElement(); if (e.intersects(theBall)) { e.hit(theBall); } } repaint(); try { sleep(10); } catch (InterruptedException e) { System.exit(0); } } } } private class MouseKeeper extends MouseAdapter { public void mousePressed(MouseEvent e) { int x = e.getX(); int y = e.getY(); if ((x > FrameWidth - 50) && (y > FrameHeight - 50)) { PinBall newBall = new PinBall(e.getX(), e.getY()); balls.addElement(newBall); new PinBallThread(newBall).start(); } if ((x > FrameWidth - 40) && (y < 40)) { System.exit(0); // clicked on BYE } } } public void paint(Graphics g) { if (buffer == null) { bufferInit(); } // loesche Puffer bufferGraphics.setColor(Color.black); bufferGraphics.fillRect(0, 0, FrameWidth, FrameHeight); bufferGraphics.setFont(bufferGraphics.getFont().deriveFont((float) 16.0)); bufferGraphics.setColor(Color.yellow); bufferGraphics.drawString("BYE", FrameWidth - 40, 40); bufferGraphics.drawImage(img, FrameWidth - 65, FrameHeight - 60, this); for (int i = 0; i < balls.size(); i++) { Ball aBall = (Ball) balls.elementAt(i); // der Ball soll nicht links oder rechts aus dem Spiel laufen if (aBall.x() - 10 < 0 || aBall.x() + 10 > FrameWidth) { aBall.setMotion(-aBall.dx, aBall.dy); } aBall.paint(bufferGraphics); } for (Enumeration pbelems = pbelements.elements(); pbelems.hasMoreElements();) { ((PBElement) pbelems.nextElement()).paint(bufferGraphics); } Punkt.showScore(bufferGraphics); // der ganze puffer wird auf einmal gezeichnet g.drawImage(buffer, 0, 0, this); } // wir uebschreiben update um ein loeschen des bildes zu vermeiden // das brauchen wir nicht, da wir den ganzen puffer auf einmal schreiben // und dadurch auf jeden fall das vorherige bild geloescht wird. public void update(Graphics g) { paint(g); } }
Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 14.01.2014