Universität Paderborn - Home Universität Paderborn
Die Universität der Informationsgesellschaft

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