Programmiert man ein Spiel wie beispielsweise Pong, stellt man schnell fest, dass die Aufgaben der einzelnen Objekte im Code teilweise sehr umfangreich sind und sich auch wiederholen. So gelten für beide Objekte der Klasse SCHIFF beispielsweise, dass sie beide das Spielfeld nicht verlassen dürfen. Einziger Unterschied ist, mit welchen Tasten sie kontrolliert werden und welche x-Position sie auf der Zeichenfläche haben.
Wir sehen im Spiel verschiedene Objekte: Zwei Objekte der Klasse SCHIFF, die von Spielern gesteuert werden, und einen Ball, der von den Rändern abprallt. Wir können nun den Code in drei Teile aufteilen.
- Code des BALL
- Code der SCHIFFe
- Code der zum Spielfeld und der Processing App gehört

Aufgabe:
Schau dir den Code des Spiels Pong an und überlege, welche Bestandteile zu welchem Teil des Spieles (BALL, SCHIFF, SPIELFELD) gehört. Den Code kannst du hier anschauen.
4.1.1 Klassendefinition in Java
Jede Klasse wird in Java in einer eigenen Datei gespeichert. Der Code einer Klasse beginnt mit dem Schlüsselwort
class, gefolgt vom Bezeichner der Klasse.Es ist üblich, Attribute der Klasse am Anfang der Klasse zu deklarieren. Der Code, der zu einer Klasse gehört wird mit geschweiften Klammern umrahmt.
Merksatz 4.1.1.1
Der Code der Klassendefinition des BALL mit seinen Attributen lautet also wie folgt:
class BALL{
int x;
int y;
int r;
int vx;
int vy;
}
Es fällt auf, dass nun die Startwerte, der Attribute, fehlen die wir bisher in der setup() Methode festgelegt haben. Damit diese Zuweisungen direkt beim Erstellen eines Objektes der Klasse BALL ausgeführt werden, braucht die Klasse eine besondere Methode, die man Konstruktor nennt.
Die Startwerte der Attribute werden beim Erstellen eines Objektes einer Klasse durch den Konstruktor festgelegt. Der Konstruktor ist eine besondere Methode, deren Name der Name der Klasse ist.
Merksatz 4.1.1.2class BALL{ //Attribute BALL() { //Zuweisungen } }
Nach dem Verschieben der Zuweisungen in den Konstruktor ergibt sich folgender Code:
class BALL{
//Attribute
int x;
int y;
int r;
int vx;
int vy;
//Konstruktor
BALL()
{
//Setzen der Startwerte im Konstruktor
xB = 200;
yB = 200;
vx = 2;
vy = 2;
r = 10;
}
}
4.1.2 Definieren eigener Methoden
Nachdem wir nun die Attribute übertragen haben, müssen wir überlegen, welche Aufgaben die Klasse BALL zu erfüllen hat. Wie uns aus der Unterstufe bekannt ist, sind die Fähigkeiten der Klasse die Methoden der Klasse.
Wir stellen fest es gibt drei Fähigkeiten, die die Klasse BALL braucht:
- Zeichnen des Balles.
- Bewegen des Balles.
- Richtung des Balles wechseln, wenn eine Kollision geschehen ist.
Jede dieser Fähigkeiten und Aufgaben wir zu einer Methode.
Methoden, die eine Reihe von Befehlen durchführen, werden in Java mit dem Schlüsselwort
voideingeleitet. Anschließend kommt der Bezeichner der Methode, gefolgt von zwei runden Klammern. Wir nennen dies den Methodenkopf.Der Code, der ausgeführt werden soll, wenn die Methode aufgerufen wird, folgt in geschweiften Klammern. Diesen Bestandteil einer Methode nennen wir Methodenrumpf.
Merksatz 4.1.2.1
Damit können wir das Zeichnen wie folgt in eine Methode übertragen:
void Zeichnen() //Methodenkopf
{
//Methodenrumpf
circle(x,y,r); //Zeichnet einen Kreis mit Radius r um P(x|y)
}
4.1.3 Verwenden von Klassen
Das Verwenden der Klassen ist im Detail erst Stoff der 10.Klasse. Daher übernehmen wir hier einfach nur die notwendigen Code Abschnitte, ohne groß auf die Gründe einzugehen.
Um einen BALL in unserer Processing App zu verwenden müssen wir nun bei den Attributen folgenden Code ergänzen:
BALL b;
In der setup() Methode erstellen wir den BALL mit:
void setup()
{
b = new BALL();
}
Anschließend können wir den BALL z.B. in der draw() Methode mit dem Aufrufen seiner Zeichnen() Methode zeichnen oder mit Bewegen() auf dem Feld bewegen:
void draw()
{
b.Bewegen(); //ruft die Methode der Klasse BALL auf
b.Zeichnen(); //Dafür brauchen wir die Punktnotation (siehe 6./7.Klasse)
}
Objekte einer Klasse kann man als Attribut durch Angabe des Klassennamens als Datentyp verwenden. Man erstellt sie mit dem
Merksatz 4.1.3.1newOperator. Anschließend werden die Methoden der Klasse mit der aus der Unterstufe bekannten Punktnotation ausgeführt.
Aufgabe 1:
Bei den Aufgaben verwenden wir die Entwicklungsumgebung Processing. Wenn du einen Befehl suchst, schaue auf https://processing.org/reference nach!
- Erstelle ein neues Processing Projekt.
- Kopiere den folgenden Code in dein Projekt:
void setup()
{
size(400,400);
}
void draw()
{
}
- Erstelle anschließend eine neue Klasse BALL und übertrage nur die Attribute des Balles in diese Klasse. Achte darauf, dass du eine neue Datei öffnest und das Schlüsselwort
classverwendest. - Ergänze den Konstruktor mit den entsprechenden Zuweisungen.
- Ergänze die Methoden
Zeichnen()undBewegen(). - Code der Vorlage findest du hier.
Aufgabe 2:
- Finde die Bestandteile der Klasse SCHIFF und baue eine Klasse SCHIFF analog zur Klasse BALL
Aufgabe 3:
- Überlege, wie man den Code der Kollisionsabfrage in eine Methode in der Processing App auslagern könnte, um den Code Übersichtlicher zu gestalten.
Aufgabe 4:
- Überlege, welche Klassen man beim Spiel Argar.io braucht.
- Erstelle die passenden Klassen, so dass sich Gegner von alleine über das Spielfeld bewegen. Der Spielende sollte sich mit der Tastatur bewegen.