In diesem Tutorial werden wir sehen, wie wir unseren Ball aus dem vorherigen Tutorial als eine eigene Klasse implementieren können. So nähern wir uns der Objek-Orientierten-Programmierung in Processing. Dafür werden wir Schritt für Schritt das Beispiel P01_2_BouncingBall_mit_Vektoren erweitern.
Objekt-Orientierte-Programmierung ermöglicht es uns generische Objekte (Klassen) zu erstellen und diese dann zu nutzen. Dies hat den Vorteil, dass oft verwendete Kombinationen aus Variablen und Funktionen in einem einzigen Objekt zusammengefasst werden können und dadurch leichter abrufbar sind. Weiter theoretische Grundlagen unter: Wikipedia.
Ein Objekt ist immer die Instanz einer Klasse. Die Klasse beschreibt also ein generisches Objekt welches dann mit verschiedenen Parametern als Objekt von der Klasse installiert werden kann. Zum Beispiel könnte es eine generische Klasse “Mensch” geben. Jeder individuelle Mensch ist nun eine Ableitung der Klasse, aber mit unterschiedlichen individuellen Merkmalen (Hautfarbe, Haarfarbe, Grösse, usw.).
Eine Klasse besteht grundsätzlich aus:
Mit diesem Wissen können wir nun unsere Klasse “Ball” ableiten.
Haben wir unsere generische Klasse “Ball” erstellt, können wir diese in unserem Hauptprogramm einbinden und nutzen. Dazu deklarieren wir zunächst ein Objekt, welches von unserer Klasse abgeleitet istBall ball; //Objekt deklarieren
Im setup()
initialisieren wir dann dieses Objektball = new Ball(); //Objekt initialisieren
Dann können wir im draw() auf die Funktionen der Klasse zugreifenball.update()
ball.checkEdges()
ball.display()
Bis jetzt haben wir noch nicht die Kompleten Möglichkeiten der OOP (Objekt-Orienterte-Programmierung) ausgenutzt. Wir haben zwar eine Klasse und können diese nun implementieren, aber wenn wir beispielsweise mehrere Objekte der selben Klasse “Ball” erstellen, so sehen diese immer gleich aus und haben das selbe Verhalten.
Um mehrere Objekte einer Klasse erstellen zu können, welche unterschiedlich aussehen und sich unterschiedlich verhalten verwenden wir sog. Argumente. Ein Argument kann sowohl bei der Initialisierung (also im Konstruktor der Klasse), als auch den einzelnen Funktionen einer Klasse übergeben werden.
Im folgenden wollen wir, folgende Parameter bestimmen können:
Dazu bearbeiten wir zunächst unsere Klasse “Ball” und erstellen einen neuen Konstruktor:
Der neue Konstruktor (Konstruktor2) unterscheidet sich darin, dass er die von uns gewünschten Argumente direkt akzeptiert und an unsere Funktionen weitergibt. Beim Initialisieren müssen wir nun nur noch die gewünschten Argumente übergeben und können kann verschiedene Objekte der Klasse “Ball” zeichnen.
Der nächste Schritt ist es, ein Array von “Ball”-Objekten zu erstellen. Jedes der Objekte soll dabei die von uns zuvor individualisierten Parameter erhalten (Farbe, Startposition, Geschwindigkeit, Grösse). Unsere Klasse “Ball” bleibt also bestehen und wir müssen lediglich in unsrem Hauptprogramm einige Erweiterungen vornehmen.
Zunächst deklarieren wir ein Array von ObjektenBall [] balls; //Array von Ball-Objekten
Danach legen wir fest, wie viele Objekte wir darstellen möchtenint numOfBalls = 20 //20 Bälle darstellen
Im setup()
müssen wir diese Bälle nun instanzieren. Dazu definieren wir erst die Grösse des Arraysballs = new Ball[numOfBalls]
Dann iterieren wir über die Anzahl unserer Bälle und instanzieren sie mit unterschiedlichen Argumenten. Weil alle andere Argumente haben sollen, nutzen wir dazu die Funktion random()
.
Im draw()
iterieren wir wieder über die Anzahl Bälle numOfBalls
und rufen deren Funktionen zur Aktualisierung update()
, zur Kantenkollision checkEdges()
und Zeichnen display()
.