Appearance
Pong Ball
Ziel
In Pong Ball erlernen wir das Konzept von ereignisorientierter Programmierung. Wir reagieren auf Keyboard Input und Timer Events um einen Ball über den Bildschirm zu steuern.
Projekt Importieren
Laden Sie die Vorlage als ZIP herunter über GitLab in dem Sie diesem Link folgen.
Importieren Sie das Projekt in Eclipse. Starten Sie das Projekt PongBallApp.java
. Ignorieren Sie ActivePanel.java
(dient nur als Hilfsmittel).
Implementieren Sie PongBallPanel.java
.
Grundgerüst
- Deklarieren und Implementieren Sie die Methode
drawBall
mit welcher Sie einen Ball auf dem Bildschirm an einer Position mit einer Farbe zeichnen. - Als Referenzpunkt des Balls soll die untere Mitte verwendet werden.
- Zeichnen Sie einen schwarzen Bildschirm und den Ball in der Mitte des Bildschirms.
Parametrisierung
- Erstellen Sie eine Konstante für den Radius des Balls und deklarieren Sie diese als
static final
im Klassenrumpf. - Erstellen Sie zwei Attribute
x
undy
vom Typenint
im Klassenrumpf. Sie dienen als Koordinaten des Balls. - Überschreiben Sie die Methode
onInit()
und setzen Sie die Koordinaten des Balls beim Starten des Panels in die Bildschirmmitte. - Zeichnen Sie in
paintComponent
den Ball an der Stellex
,y
.
Ereignisse: Keyboard Events
An dieser Stelle wollen wir den Ball mit den Pfeiltasten auf dem Keyboard steuern. Überschreiben Sie die Methode onKeyDown
. Folgen Sie dieser Vorgehensweise:
- Wenn
keyCode
KeyEvent.VK_UP
entspricht, dekrementieren Sie die y-Koordinate um10
. - Wenn
keyCode
KeyEvent.VK_DOWN
entspricht, inkrementieren Sie die y-Koordinate um10
. - Verfahren Sie analog mit der
x
Koordinate undKeyEvent.VK_LEFT
respektiveKeyEvent.VK_RIGHT
. - Führen Sie am Schluss einen
repaint()
aus.
An dieser Stelle sollten Sie nun in der Lage sein den Ball zu kontrollieren.
Bonus, WASD
Implementieren Sie die Bewegung mittels WASD
Tasten zusätzlich zu den Pfeiltasten.
Physik und States
Ziel soll es sein, den Ball via Space
-Taste "anzuschubsen". Dieser soll beim Kollidieren mit den Wänden die Bewegungsrichtung umkehren.
Konzept der Bewegung
Bewegt sich der Ball, so solle er periodisch seine x
und y
Koordinate ändern. Periodisch heisst jedes mal, wenn die zu überschreibende Methode onTick
aufgerufen wird.
onTick
wird alle 16ms aufgerufen und erlaubt uns den Gamestate (in diesem Fall die x
und y
Koordinate) ständig neu zu rechnen.
Um eine Bewegung durchführen zu können werden x
und y
inkrementiert und später via repaint()
ein neues Frame gezeichnet.
Geschwindigkeit
Um welchen Wert sollen x
und y
inkrementiert werden? Hierzu dienen zwei neue Variablen vx
und vy
(Velocity) um die Geschwindigkeit und die Richtung des Balls zu bestimmen.
- Die
x
Koordinate soll jedes mal umvx
inkrementiert werden. Istvx
positiv, so bewegt sich der Ball gegen rechts. Umgekehrt, wennvx
negativ ist, bewegt sich der Ball nach links. - Analog hierzu verhält sich
y
undvy
.
- Deklarieren Sie
vx
undvy
im Klassenrumpf als Attribute. Verwenden Sie den Typenint
für den Moment`. - Setzen Sie
vx
undvy
inonInit
auf0
. - Überschreiben Sie
onTick()
und inkrementieren Siex
umvx
undy
umvy
.
Anschubsen
- Wenn
VK_SPACE
gedrückt wird, soll der Ball angeschubst werden. Hierzu sollvx
undvy
auf einen positiven oder negativen Wert gesetzt werden.
Kollisionen mit der Wand
Zur Zeit fliegt der Ball in die Unendlichkeit. Das wollen wir ändern.
Kollidiert der Ball mit der Wand so wird einfach vx
resp. vy
umgekehrt um die Richtung zu ändern.
- Ändern Sie
onTick
so, dass die Richtung bei der Kollision mit der Wand ändert. - Tipp: Entscheiden Sie anhand von
x
resp.y
wie sichvx
undvy
ändern sollen. - Vorzeichenwechsel: Wie können Sie das Vorzeichen einer Variablen ändern?
Zufällige Richtung beim Starten
- Ändern Sie Ihren Code so, dass beim drücken der Space Taste eine zufällige Startrichtung verwendet wird.
- Beim erneuten Drücken von Space, soll der Ball wieder zentriert werden und eine neue Richtung erhalten.
Konstante Geschwindigkeit
Ziel ist es, eine Konstante Geschwindigkeit für den Ball zu erzielen, allerdings die Richtung des Balls frei zu lassen.
Bei einem festen Betrag v
und Winkel alpha
lässt sich vx
und vy
mit Trigonometrie berechnen.
- Gegeben
alpha
undv
: Wie berechnen sichvx
undvy
? - Ändern Sie den Datentypen von
x
,y
,vx
undvy
aufdouble
. - Casten Sie
x
undy
beim Aufruf vondrawBall
in einenint
. - Setzen Sie
vx
undvy
in der Anfangsbedingung (onKeyDown
) so, dass folgendes erfüllt ist:- Der Betrag des Vektors
v
ist Konstant =5
. - Der Winkel
alpha
wird zufällig zwischen 0 und 2 *PI
gewählt. vx
undvy
werden durch Betrag und Alpha errechnet.
- Der Betrag des Vektors
- Entfernen Sie nun den Code, welcher auf die Pfeiltasten reagiert.
Checkpoint: Big Bad Button
java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class BigButtonPanel extends JPanel {
// Hintergrund des Panels schwarz zeichnen
// bei Buttonpress
// via fillRect
boolean pressed = false;
public void init() {
setLayout(null);
JButton button = new JButton("BIG BAD BUTTON");
add(button);
button.setBounds(getWidth() / 2 - 200, getHeight() / 2 - 100, 400, 200);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
pressed = !pressed;
repaint();
}
});
// Listener registrieren und auf event reagieren
}
@Override
protected void paintComponent(Graphics g) {
if (pressed) {
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
} else {
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
}