Creative Coding

btk

Till Nagel

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.

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.

Creative Commons Lizenz: Namensnennung-NichtKommerziell-Weitergabe unter gleichen Bedingungen 2.0 (Deutschland)

© 2008 Till Nagel, All rights reserved – Alle Rechte vorbehalten.