Objekte 3 - Woche 8
Aufgaben
G1: Dynamische Rotationen
Ermögliche das dynamische Erzeugen von rotierenden visuellen Elementen unter Einsatz einer ArrayList.
Programmiere dafür eine eigene Klasse, in der die Zeichenmethode mit Hilfe von pushMatrix()
und popMatrix()
das Element eigenständig dreht.
Tipp: Nutze für den Start das Beispiel "Dynamische Bälle" und passe es an.
G2: Schildkröte
Erweitere die Klasse "Turtle" so, dass es eine Zeichenmethode gibt, die an die aktuelle Position ein Bild zeichnet. Lasse nun diese Schildkröte über die Zeichenfläche krabbeln. Verwende zunächst gerade Bewegungen, und versuche dann, diese Bewegungen natürlicher werden zu lassen.
Projekt 2: Objektorientierung
Diesmal gibt es keine thematische Aufgabe, sondern eine technische. Entwerft und entwickelt ein Programm, dass Objekte sinnvoll einsetzt.
Dokumentation
Schreibt als Kommentar am Anfang in euren Code:
- Vollständige Namen aller Gruppenmitglieder
- Macht drei Screenshots, und gebt sie mit ab.
- Projektbeschreibung: Was ist die Idee/der Hintergrund? Was macht das Programm?
- Eventuelle Schwierigkeiten, bzw. Unvollständigkeiten in der Umsetzung
Die von euch erstellten Screenshots und Beschreibung werde ich im Internet mit euren Namen veröffentlichen.
Style
Achtet darauf, dass ihr den Code formattiert, sinnvolle, aussagekräftige Variablennamen verwendet und – vor allem – gut kommentiert. (Siehe auch den Style Guide)
Abgabe
Die Projekte müssen im Intranet der BTK eingereicht werden. Archiviert euren Sketch (Processing Menü > Tools > Archive Sketch) und ladet diese Zip-Datei bei der entsprechenden Aufgabe hoch. Kopiert die Screenshots vorher in den Sketch-Ordner!
Letzter Abgabetermin ist Montag, 10.12.07.
Multiple Objekte 2
Wie letzte Woche gezeigt, kann man mit Hilfe von Arrays viele Objekte verwalten. So können zum Beispiel zehn Bälle animiert werden:
Möchte man nun aber neue Bälle im Laufe des Programms hinzufügen, geht dies mit Arrays nicht. Die Länge eines Arrays wird beim Deklarieren festgelegt und ist dann nicht mehr änderbar. Das Array kann also nur genau so viele Elemente aufnehmen, wie am Anfang definiert wurde. Wenn etwa bei Mausklick jeweils ein neuer Ball erzeugt werden soll, benötigt man zur Verwaltung der Bälle dynamische Listen.
ArrayList
Um eine dynamische Liste zu erstellen, können wir die Klasse ArrayList
verwenden.
Diese Klasse erlaubt es uns Listen zu erzeugen, denen wir Elemente hinzufügen und wieder entnehmen können.
In der ersten Zeile wird eine dynamische Liste mit dem Namen balls
erzeugt. Diese
ist zunächst leer, hat also noch keine Elemente. Dann wird ein neuer Ball erzeugt
und (in der vierten Zeile) der Liste hinzugefügt. Nun hat die Liste also ein Element. Nachdem
ein zweiter Ball erzeugt und hinzugefügt wurde, sind es natürlich zwei Elemente. Und so kann
man – ohne die Anzahl vorher festlegen zu müssen – immer weitere Elemente der
Liste hinzufügen.
Beispiel: Dynamische Bälle
Zurück zum Beispiel mit den vielen Bällen: Es soll bei Mausklick also je ein neuer Ball angezeigt und animiert werden.
Da im obigen Programm die ArrayList erzeugt, ihr aber in setup()
keine Bälle
hinzugefügt werden, ist diese anfänglich leer. Erst bei mousePressed
wird
ein neuer Ball an die aktuelle Mausposition erstellt und der Liste hinzugefügt.
In draw()
wird die Liste mit Hilfe einer for-Schleife durchgegangen. In Zeile 10 wird
mit get(i)
auf das i. Element zugegriffen, und in der Variable ball
gespeichert. Hier gibt es eine Besonderheit zu beachten: Vor dem Zuweisen in eine Variable
muss das Element aus der Liste in den richtigen Datentyp gewandelt werden. Dazu muss der Klassenname
in Klammern vor der Anweisung stehen.
arrayList.add(element);
Fügt ein Element ans Ende der Liste hinzu. Das Element muss ein Objekt sein (eine int
-Variable kann
folglich nicht in einer ArrayList
gespeichert werden).
arrayList.get(index);
Erlaubt den Zugriff auf ein bestimmtes Element der Liste. Durch den index
wird
die Position des Elements angegeben und dieses zurück gegeben.
Dabei ist zu beachten, dass das Element zunächst gecasted, d.h. in den richtigen Datentyp gewandelt werden muss.
arrayList.remove(index);
Entfernt das Element an der angegebenen Position.
arrayList.size();
Gibt die Anzahl der Elemente zurück.
Exkurs: Java
ArrayList ist keine Processing-, sondern ein Java-Klasse. Wie man diese und viele weitere einsetzen kann, wird in diesem kurzen Abschnitt gezeigt.
Processing basiert auf der Programmiersprache Java. Wenn man in der Entwicklungsumgebung auf "Run" klickt, wird das Processing-Programm im Hintergrund zunächst in Java umgewandelt, und dann erst ausgeführt. (Daher auch die .java-Dateien im Ordner, wenn man einen Sketch exportiert.)
Dass Processing auf Java aufsetzt, bedeutet, dass man in Processing auch alle Klassen und Objekte verwenden kann, die es in Java gibt. Wer solche Objekte verwenden will, kann in der Java-Referenz nach schauen (die sehr umfangreich ist).
Nutzt man solche Klassen aus Java, muss man die vorher importieren. Dazu schreibt man
am Anfang des Programms z.B. import java.util.Calendar;
, wenn man
die Calendar-Klasse einsetzen möchte.
Tabs
Wenn man viele Klassen in seinem Programm benutzt, kann es leicht unübersichtlich werden. Dann hilft es, die verschiedenen Klassen in Tabs auszulagern: Diese kann man über den kleinen Button ganz rechts erstellen, und dort wie gewohnt Code reinschreiben. Alle Programmzeilen aller Tabs werden beim Ausführen wieder zusammen gefügt, und wie ein Programm behandelt.
Programm mit drei Tabs
Processings Objekte
Die Objekt-Datentypen, die Processing bereitstellt (wie Array, String oder PImage)
haben wir bisher meist nur als einfache Variablen benutzt. Diese haben aber ebenso
wie Objekte unserer selbst definierten Klassen Eigenschaften und Methoden, die man
verwenden kann.
(Siehe auch nochmal Array Eigenschaften.)
String
Texte, die in Strings gespeichert sind, können nicht nur unter Einsatz eines Fonts
angezeigt, sondern auch manipuliert werden. (Wir hatten bereits gesehen, wie man
Einzeltexte verkettet und so längere Strings erzeugt – dies aber noch ohne Methoden,
sondern mit Hilfe des Konkatenierungs-Operators: text = text1 + text2;
Im folgenden Beispiel werden die beiden String-Methoden charAt(pos)
und length()
benutzt.
Erstere liefert das Zeichen an der angegebenen Position zurück, während length()
die Länge des Strings (also die Anzahl der Zeichen) zurück gibt.
- Processing Reference: String
- Processing Reference: String.charAt()
- Processing Reference: String.length()
PImage
Auch ein PImage
hat viele interessante Eigenschaften und Methoden. So
kann man beispielsweise die Farbinformationen eines Bildes auslesen und verwenden, ohne
das Bild vorher auf der Zeichenfläche platziert zu haben. Dazu kann image.get(x, y)
verwendet werden.
Nächste Stunde werden wir uns hiermit detaillierter beschäftigen, da dies auch für Videobearbeitung interessant wird.