Kü /Info Oberstufe OOP - Spieleprogrammierung SJ 2015/2016 Wie zeichnet man einfache Figuren in Java? Ziel ist es zu verstehen, wie das Zeichnen von Formen mit Java grundsätzlich funktioniert. Wenn du das verstanden hast, ist es relativ einfach, neue Spielerklassen zu entwerfen. Eine Erklärung dazu gibt es hier: Video: o http://perm.ly/oop-spiele-figuren-zusammenstellen Schauen wir uns dazu zunächst die Methode getForm() von der Klasse Kachel an, denn sie ist für das Aussehen der Kachel verantwortlich: public Shape getForm(){ GeneralPath rechteck = new GeneralPath(); rechteck.moveTo(0 , 0); rechteck.lineTo(breite, 0); rechteck.lineTo(breite, hoehe); rechteck.lineTo(0, hoehe); rechteck.lineTo(0 , 0); // transformieren: AffineTransform t = new AffineTransform(); t.translate(xPosition, yPosition); Rectangle2D umriss = rechteck.getBounds2D(); t.rotate(Math.toRadians(orientierung),umriss.getX()+ umriss.getWidth()/2,umriss.getY()+ umriss.getHeight()/2); return t.createTransformedShape(rechteck); } Diese gehen wir nun Stück für Stück durch, um zu verstehen, wie sie arbeitet und dann in der Lage zu sein, Dinge zu ändern, um neue Spieler zu zeichnen. 1. Die erste Zeile: public Shape “getForm(){“ gibt den Namen und den Rückgabewert: Shape. Dieser Shape enthält nachher den Umriss des Spielers und kann an das Spielfeld zum Zeichnen direkt weitergereicht werden. Shape ist eine Klasse, die Java bereits vorgibt. 2. Die Zeile: GeneralPath rechteck = new GeneralPath(); erzeugt offensichtlich ein Objekt rechteck, welches vom Typ „GeneralPath“ ist. Auch das ist eine Klasse, die von Java bereits vorgegeben wird und die zum Zeichnen von Objekten verwendet wird. Sie stellt folgende Methoden zur Verfügung: - moveTo(int x, int y) lineTo (int x_neu, int y_neu) append(…) - …… Um auf die Methoden von der Klasse GeneralPath zugreifen zu können, muss man ein Objekt der Klasse GeneralPath erzeugen. Wir brauchen die Methoden, um einzelne Linien zeichnen zu können. Der Spieler setzt sich dann nachher aus die- Kü /Info Oberstufe OOP - Spieleprogrammierung SJ 2015/2016 sen einzelnen Linien (dem Path) zusammen. Daher wird das Objekt rechteck erzeugt. Über die Punktnotation (siehe Einschub I) kann das Objekt nun auf die Methoden zugreifen und Stück für Stück Linien zeichnen, die zu einem GeneralPath zusammengesetzt werden. Um diese Klasse verwenden zu können, wird am Anfang der Klasse Kachel folgende Anweisung ausgeführt: import java.awt.geom.GeneralPath; Dadurch ist die Klasse und somit auch alle enthaltenen Methoden in unserer Klasse Kachel bekannt. Sie wird sozusagen „hinzugenommen“. 3. Die Zeile: rechteck.moveTo(0 , 0); legt den Startpunkt des neu zu schaffenden Objektes fest – von hier aus werden die folgenden Linien gezogen (bis zum nächsten rechteck.moveTo…) 4. Die Zeile: rechteck.lineTo(breite, 0); zieht eine Linie von dem zuletzt angegebenen Punkt (hier (0,0)) zu einem neuen Punkt (0+breite, 0+0). Allgemein hieße die Anweisung: : rechteck.lineTo(x, y); dadurch würde von dem vorher gegebenen Punkt (xalt, yalt) nun eine Linie gezogen zu dem Punkt (xalt+x, yalt+y). 5. Die weiteren Zeilen ergeben sich aus 4. Analog. 6. Der zweite Teil bleibt erst einmal eine Art „black box“: // transformieren: AffineTransform t = new AffineTransform(); t.translate(xPosition, yPosition); Rectangle2D umriss = rechteck.getBounds2D(); t.rotate(Math.toRadians(orientierung),umriss.getX()+ umriss.getWidth()/2,umriss.getY()+ umriss.getHeight()/2); return t.createTransformedShape(rechteck); Hier wird die Kachel mit dem gesamten GeneralPath einfach nur verschoben und gegebenenfalls gedreht. Denn wir haben sie ja zunächst oben links in der Ecke gezeichnet – auf dem Spielfeld soll sie aber vielleicht an einer ganz anderen Position und gedreht – aber mit dem gleichen GeneralPath erscheinen. Beachte: das Objekt existiert nun im Prinzip in zwei Darstellungen: Als Objekt mit gespeicherten Werten in den Instanzvariablen Als Shape mit Punktkoordinaten gespeichert: Kü /Info Oberstufe OOP - Spieleprogrammierung SJ 2015/2016 Woher kommen all diese vorgegebenen Klassen und woher weiß man, was sie können, bzw. welche Methoden man dadurch verwenden kann? Es gibt sogenannte Java-Klassenbibliotheken (API), in denen alle bereits geschriebenen und für die Allgemeinheit zur Verfügung gestellten Klassen geordnet und verfügbar gemacht wurden. Über die import Anweisung können diese Klassen dem eigenen Projekt bzw. der einzelnen Klasse hinzugefügt werden, so dass davon dann auch Objekte abgeleitet werden können und die Methoden der hinzugefügten Klassen über diese Objekte dann zur Verfügung stehen.