summaryrefslogtreecommitdiff
path: root/ws2015/eip/blaetter/10/1/de/lmu/ifi/tcs/HuepfendeBaelle.java
blob: a5f1ce8f4a2b3d5d5ced47ad1fd7009445fb1d74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package de.lmu.ifi.tcs;

import java.awt.Color;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.Random;

/* Änderungen:
 *   - Runnable interface für HuepfendeBaelle
 *   - Neue Konstante maxFramerate & update-frequenz limitiert auf maxFramerate updates/sekunde
 *   - Auslagerung der update & zeichen-schleife in run()
 *   - Aufrufen von run() in neuem thread
 *
 * Hinzugefügte Methoden: run
 * Veränderte Methoden: main
 */


public class HuepfendeBaelle implements Runnable {

	private ArrayList<Ball> baelle;
	private GraphicsWindow gw;
	
    // Parameter
	private final static int max_x = 640;     
	private final static int max_y = 480;
	private final static int ballgroesse = 20;
	private final static int knopfgroesse = 40;

    private final static int maxFramerate = 30;

	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		
		Point randpunkt = new Point(max_x-ballgroesse,max_y-ballgroesse);
		ArrayList<Ball> baelle = new ArrayList<Ball>();
		
		Ball b = new Ball(randpunkt, new Point(50,60), 100,90, Color.MAGENTA);
		baelle.add(b);
		b = new Ball(randpunkt, new Point(200,100), -5,20, Color.ORANGE);
		baelle.add(b);
		b = new Ball(randpunkt, new Point(323,243), 10,-30, Color.GREEN);
		baelle.add(b);
		b = new Ball(randpunkt, new Point(23,43), -199,-200);
		
		GraphicsWindow gw = new GraphicsWindow(max_x,max_y);
		gw.setText("Bälle anklicken; blaue Leiste zum Beenden anklicken.");
		
		HuepfendeBaelle hb = new HuepfendeBaelle(baelle, gw);
		
		Thread draw = new Thread(hb);
		draw.start();
		
		// Vearbeitung der Mouse-clicks.
		Point click = gw.mouseClick();
		Random zufall = new Random(); 
		while (click.x >= 0 && click.x <= max_x && click.y >= knopfgroesse && click.y <= max_y) {
			if (hb.treffer(click)) {
				gw.setText("Treffer! ("+ click.x + "," + click.y +")");
			} else {
				gw.setText("Daneben! ("+ click.x + "," + click.y +")");
				synchronized (hb) {
				    b = new Ball(randpunkt, click, (zufall.nextDouble()-0.5)*200, (zufall.nextDouble()-0.5)*200);
				    hb.plusBall(b);
				}
			}
			click = gw.mouseClick();
		}

		draw.interrupt();
		
		// gw.setText("Auf Wiedersehen!");
		// gw.sleep(8000);

		
		System.exit(0);
	}

    public void run() {
	try {
	    while(! Thread.interrupted()) {
		synchronized (this) {
		    for (Ball ball : baelle) {
			ball.updatePosition();
		    }
		    zeichneAlleBaelle();
		}
		Thread.sleep(1000/maxFramerate);
	    }
	} catch (InterruptedException e) {};
    }
	
	/**
	 * @param baelle
	 * @param gw
	 */
	public HuepfendeBaelle(ArrayList<Ball> baelle, GraphicsWindow gw) {
		this.baelle = baelle;
		this.gw = gw;	
	}

	
	/* Zeichnet alle Baelle ins GraphicsWindow ein */
	public void zeichneAlleBaelle() {
		gw.clear();
		zeichneEnde();
		for (Ball ball : baelle) {
			gw.setColor(ball.getFarbe());
			zeichneBallBei(ball.holePosition());
		}
	}
	
	/* Zeichnet einen Ball bei einer speziellen Position */
	public void zeichneBallBei(Point p) {
		Shape ball = new Ellipse2D.Double(p.getX(), p.getY(), ballgroesse, ballgroesse);
		gw.fill(ball);
	}

	/* Fügt einen weiteren Ball hinzu */
	public void plusBall(Ball b) {
		this.baelle.add(b);
	}
	
	/* Prüft ab, ob sich an einer gegebenen Position ein Ball befindet 
	 * und wechselt ggf. dessen Farbe.
	 */
	public boolean treffer(Point schuss) {
		for (Ball ball : baelle) {
			Point bpos = ball.holePosition();
			bpos.translate(ballgroesse/2, ballgroesse/2);
			if (schuss.distance(bpos) <= ballgroesse+5) {
				ball.wechsleFarbe();
				return true;
			}
		}
		return false;
	}
	
	/*
	 * Zeichnet einfach nur einen blauen Balken am oberen Fensterrand.
	 */
	public void zeichneEnde() {
		Rectangle ende = new Rectangle(0,0,max_x, knopfgroesse);
		gw.setColor(Color.BLUE);
		gw.fill(ende);
	}
}