 |
Übung 3.1 (3 Punkte, 1 für jedes Bild)
Besorgen Sie sich ein schönes Bild von einem Schwert, einem Schild und einer Rüstung und skalieren Sie die Bilder mit einem Graphikprogramm auf genau 120 Pixel Breite und 160 Pixel Höhe (es hat Vorteile, wenn später alle Bilder von Gegenständen gleich groß sind). Sorgen Sie dafür, dass Ihr Bild einen weißen Hintergrund hat.
|
Bildung einer Spezialgruppe
In jedem Informatikkurs gibt es einige Schüler(innen), die beim Programmieren nicht immer ein glückliches Händchen haben, dafür aber um so besser mit Photoshop umgehen können. Für diese Schüler(innen) bietet sich nun die Gelegenheit, eine Spezialgruppe zu bilden.
Ihre Mission: Besorgen Sie für den Kurs möglichst viele Bilder von Gegenständen (Schwerter, Lanzen, Schilde, Rüstungen etc.) aus dem Internet und skalieren Sie diese auf 120 x 160 Pixel mit weißem Hintergrund. Stellen Sie Ihre Bildersammlung dann dem ganzen Kurs zur Verfügung. Wenn Sie Ihre Sache gut machen, können Sie zumindest die Hälfte der in den Übungen 3.2 und 3.3 erreichbaren Punkte erzielen.
Bilder in Java
Bevor Sie hier weitermachen, sollten Sie sich die Grundlagen aneignen, indem Sie den Exkurs Applets 3 durcharbeiten.
|
|
|
|
Bilder in der Klasse Gegenstand
Betrachten Sie folgenden Quelltext des Konstruktors von Gegenstand:
public class Gegenstand
{
...die Attribute...
Image bild;
public Gegenstand
(int typ, String bez, double a,
double v, double g,
String dateiname, Applet p)
{
this.typ = typ;
bezeichnung = bez;
angriffswert = a;
verteidigungswert = v;
goldwert = g;
zustand = 100;
bild = p.getImage
(p.getCodeBase(), dateiname);
}
1 Die Klasse Gegenstand und ihr Konstruktor, neue Version
Hier finden Sie die Anwendung dessen, was Ihnen in dem Exkurs Applets 3 vermittelt wurde. Der letzte Parameter des Konstruktors ist ein Verweis auf das aufrufende Applet (ich weiß nicht, ob das wirklich die beste Methode ist; aber bei mir hat es jedenfalls so funktioniert...).
Schauen wir nun, wie man in der init()-Methode des Applets Gegenstände initialisiert:
waffe = new Gegenstand(1,"Glamdring",12,0,70,
"pics/sword01.jpg",this);
schild = new Gegenstand(2,"Orktöter",2,10,50,
"pics/schild01.jpg",this);
ruestung = new Gegenstand(3,"Panzer",0,14,80,
"pics/ruestung01.jpg",this);
2 Ausschnitt aus der init()-Methode des Applets
Als erstes wird jeweils der Typ des Gegenstandes übergeben: 1 für Waffe, 2 für Schild und 3 für Rüstung. Dann folgen die üblichen Werte: Angriffswert, Verteidigungswert und Goldwert. Der vorletzte Parameter ist der relative Dateipfad, in dem das Bild zu finden ist. Dabei ist es sinnvoll, innerhalb des BlueJ-Projektordners einen Unterordner für die Bilder anzulegen; es können im Laufe der Weiterentwicklung des Spiels nämlich eine ganze Menge Bilder werden. Der letzte Parameter ist "this". Was das bedeutet, sollte Ihnen aus dem Exkurs Applets 3 bekannt sein.
|
|
|
 |
Übung 3.2 (3 Punkte, 1 für jedes Bild)
Bringen Sie Ihr Applet nun so weit, dass es drei Gegenstände anzeigen kann.
Hier ein Beispiel für ein solches Applet:

1 Im Applet werden drei Gegenstände angezeigt.
Die graphische Darstellung in Abb. 1 ist noch nicht optimal. Die Gegenstände sehen zwar schon ganz gut aus, sie werden aber noch zu groß angezeigt. Die Textausgabe ist katastrophal.
|
Übung 3.3 (4 Punkte)
Setzen Sie die Graphik-Befehle drawLine und drawRect ein, um die Darstellung "gefälliger" zu machen. Skalieren Sie die Graphiken auf 60 x 80 Pixel, um Platz zu sparen. Das Skalieren geht ganz einfach, indem Sie bei dem Befehl g.drawImage einfach die Breite 60 und die Höhe 80 einsetzen. Die Bilddatei sollte allerdings dazu proportionale Dimensionen haben, ideal sind 120 x 160 Pixel.

2 Eine einfache Lösung der Übung 3.3 (2 Punkte)

3 Eine bessere Lösung (4 Punkte)
|
Übung 3.4 (9 Punkte)
Erweitern Sie die anzeigen()-Methode der Klasse Gegenstand so, dass die Gegenstände in etwa so angezeigt werden wie auf dem folgenden Bild:

4 Eine vollständige Lösung der Übung 3.4 (9 Punkte)
Zunächst einmal soll der gesamte Gegenstand - hier ein Schild - in einem plastisch wirkenden Rechteck oder Quadrat ausgegeben werden (1 Punkt).
Dann sollen der Name des Gegenstandes sowie die Attribute ausgegeben werden. Dafür können Sie 6 Punkte erhalten. Hier der Punkteschlüssel:
Ausgabe der Attributwerte nebeneinander in Rechtecken: 2 Punkte
zusätzlich verschiedenfarbige Hintergründe: 1 Punkt
zusätzlich Bezeichnung der Attribute in einer kleinen Schrift: 3 Punkte
Weitere 2 Punkte bekommen Sie, wenn Sie den Zustand des Gegenstandes durch einen senkrechten Balken anzeigen, dessen Höhe für den Zustand steht.
Wenn man das alles zusammenzählt, kommt man auf die sagenhafte Zahl von 9 Punkten, die Sie hier erzielen können. Allerdings müssen Sie sich selbst erkundigen, wie man in einem Applet verschiedene Schriften bzw. Schriftgrößen darstellen kann.
|
|
|
|
|
Übung 3.5 (4 Punkte, vielleicht sogar 5)
Es ist gut und schön, wenn man einen Gegenstand so genau betrachten kann wie in Übung 3.3. Für viele Zwecke reicht jedoch eine kleinere Darstellung eines Schwertes oder eines Schildes. Wenn der Held z.B. einen Rucksack mit zehn Gegenständen hat und man alle Gegenstände anzeigen will, muss die anzeigen()-Methode der Klasse Gegenstand wesentlich bescheidener sein.
Schreiben Sie eine zweite Methode zum Anzeigen von Gegenständen, die wesentlich weniger Platz benötigt ODER
Ergänzen Sie die anzeigen()-Methode um einen Parameter int Modus, der darüber entscheidet, wie viel Platz beim Anzeigen verbraucht wird ODER
Lassen Sie sich eine andere Lösung einfallen, um ein flexibles Anzeigen von Gegenständen zu realisieren.

5 Eine Lösung der Übung 3.5 (4 Punkte)
Einen weiteren, fünften Punkt erhalten Sie, wenn Sie eine dritte Anzeigen-Variante realisieren, bei der nur kleine Symbole des Gegenstandes in dem Applet erscheinen, die maximal 32 x 32 Pixel groß sind. Mit dieser dritten Variante (eigene Methode oder Ergänzung der anzeigen()-Methode) sollen später die Gegenstände dargestellt werden, die auf den Feldern des Spielfeldes herumliegen.

6 Eine bessere Lösung der Übung 3.5 (5 Punkte)
|
|
|
|
|
Übung 3.6 (6 Punkte)
Vielleicht ist es Ihnen schon aufgefallen: Wenn der Gegenstand eine sehr lange Bezeichnung hat, z.B. "grauenhaftes Schwert des Irrsinns, das bei jedem Gebrauch noch irrsinniger wird", so wird der String über den Begrenzungsrahmen hinaus geschrieben.
Sie erhalten die sechs Punkte, wenn Sie eine Funktion
private String trimString
(Graphics g, Font f, String s, int width)
schreiben, die den als Parameter übergebenen String s auf die Pixelbreite width beschneidet. Wenn Sie width genauso groß wählen wie die Breite des Ausgabekastens (minus der relativen Startposition des Strings - in den Abbildungen auf dieser Seite 5 Pixel), so bleibt der Name des Gegenstandes in dem Kasten, egal, wie lang der Name auch sein mag.
Sie können diese Aufgabe nur dann lösen, wenn Sie sich in die Klassen Font, String und FontMetrics einarbeiten! Denn die Fonts, mit denen wir arbeiten, sind in der Regel proportional und haben auch verschiedene Größen, Sie können also nicht einfach aus der Anzahl der Buchstaben auf die Länge des Strings in Pixeln schließen. Das geht nur bei einem nichtproportionalem Font, wo alle Buchstaben die gleiche Breite haben.
|
|
|
|