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 (without 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));
}
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: 06.01.2014


