Processing 02
Processing 02
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.
Was ist Objekt-Orientierte-Programmierung?
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.
Objekte und Klassen?
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.).
Aus was besteht eine Klasse?
Eine Klasse besteht grundsätzlich aus:
1.Name der Klasse
2.Variablen der Klasse
3.Konstruktor der Klasse
4.Funktionen der Klasse
Ableitung
Mit diesem Wissen können wir nun unsere Klasse "Ball" ableiten.
Implementierung
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 ist
Ball ball; //Objekt deklarieren
Im
setup()
initialisieren wir dann dieses Objekt
ball = new Ball(); //Objekt initialisieren
Dann können wir im draw() auf die Funktionen der Klasse zugreifen
ball.update()
ball.checkEdges()
ball.display()
Argumente
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:
1. Farbe der Objekte
2. Startposition der Objekte
3. Geschwindigkeit der Objekte
4. Grösse der Objekte
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.
Merke!
- Klassen sind generische Objekte
- Objekte sind initialisierte Ableitungen von Klassen
- Argumente können den Objekten als Individualisierungs-Merkmale übergeben werden
Aufgaben
- Nutzt eure Kenntnisse und programmiert ein weiteres Argument für die Steuerung der Strichbreite
Mehrere Objekte einer Klasse
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.
1.Ein Array von Objekten
Zunächst deklarieren wir ein Array von Objekten
Ball [] balls; //Array von Ball-Objekten
Danach legen wir fest, wie viele Objekte wir darstellen möchten
int numOfBalls = 20 //20 Bälle darstellen
2.Bälle instanzieren
Im
setup()
müssen wir diese Bälle nun instanzieren. Dazu definieren wir erst die Grösse des Arrays
balls = 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()
.
Aufgaben:
- Lest und versteht Seiten 67 - 83 aus dem Buch "Nature Of Code" von Daniel Shiffman
- Erweitert euer Beispiel "P02_3_Bouncing_Ball_OOP_Array" so dass ihr mehrere Bälle habt, welche auf euren Mauszeiger reagieren.
Weiteres:
-
OOP - Tutorial mit Darstellungen
- Learning Processing - Shiffman Seiten 121 - 137