Häufig wollen Sie in Greenfoot 3 Bilder verändern. Sie brauchen dazu nicht jedesmal die Bilddatei in einem Bildbearbeitungsprogramm bearbeiten.

Vorbemerkung 1: Bildmanipulationen ändern nichts an der Ausrichtung des Objekts!

Wenn Sie das Bild einer Spielfigur verändern, bleibt die Ausrichtung des Objekts gleich. Im Beispiel "spiegeln" unten schaut der Pelikan nach links - das Objekt ist aber noch nach rechts ausgerichtet (Standardausrichtung für neue Objekte). Wenn Sie den Pelikan nun mit move(5) vorwärts bewegen, dann fährt er nach rechts - obwohl er nach links blickt. Sie müssten also zusätzlich die Ausrichtung mit setRotation(...) oder turn(...) verändern.

Vorbemerkung 2: Bildmanipulation im Konstruktor

Möglicherweise wissen Sie nicht, was die Konstruktormethode ist. Das ist nicht schwer zu verstehen und häufig sehr praktisch, hier finden Sie ein dreiminütiges Videotutorial dazu: Konstruktor in Java/Greenfoot 3

In aller Kürze: Der Konstruktor ist eine Methode, die aufgerufen wird, wenn Sie ein Objekt erzeugen. Das ist ungeheuer praktisch, da Sie im Konstruktor einem Objekt direkt die entsprechenden Werte oder Veränderungen mitgeben können.

Klicken Sie in Greenfoot 3 einfach in das Feld "Constructors" und drücken Sie die Taste C - schwupp, da ist er schon.

Screenshot: In Greenfoot 3 einen Konstruktor anlegen

Alles, was Sie in diese Methode schreiben, wird beim Erzeugen eines Objekts geschehen.

ACHTUNG: Im Konstruktor können Sie die getWorld()-Methode nicht verwenden! Verwenden Sie stattdessen die addedToWorld(…)-Methode (siehe Greenfoot-API). (Das Objekt ist erst auf der Welt verfügbar, wenn der Konstruktor ausgeführt wurde.)

Bild spiegeln

Zwei Spielfiguren bewerfen sich mit Schneebällen, der Pelikan und die Schlange. Allerdings schauen beide Spielfiguren nach rechts - sie sollen sich aber gegenseitig anschauen.

Screenshot Greenfoot 3 - zwei Actor-Spielfiguren

Das erledigen Sie - am besten im Konstruktor der Klasse Pelikan - elegant mit dem Befehl

this.getImage().mirrorHorizontally()

this.getImage() gibt Ihnen das GreenfootImage des Objekts zurück; dieses GreenfootImage können Sie in vielerlei Art manipulieren.

mirrorHorizontally() spiegelt das Bild an der x-Achse (also links-rechts); Sie können auch mirrorVertically() benutzen.

Greenfoot 3: zwei Spielfiguren, die sich anschauen

Bild drehen

Sie können ein Objekt mit turn(…) drehen, in die Klammer kommt als Parameter die Anzahl der Grade. Damit drehen Sie jedoch das ganze Objekt. Wenn Sie nur das Bild drehen wollen, die Ausrichtung des Objekts jedoch beibehalten, benutzen Sie rotate(…) mit einer Grad-Anzahl:

this.getImage().rotate(90)

dreht das Bild "auf" dem Objekt um 90 Grad im Uhrzeigersinn. Wie oben bemerkt: Die Ausrichtung des Objekts bleibt gleich!

Das kann z.B. sehr praktisch sein, wenn eine Spielfigur sich abwechselnd nach rechts und links bewegt und entsprechend in unterschiedliche Richtungen schauen muss.

Bild skalieren

Zweifelsohne eine der wichtigsten Methoden zur Bildmanipulation. Sie können die Größe des Bildes verändern - auch während der Laufzeit.

Eine der häufigsten Anwendungsmöglichkeiten: Sie möchten Bilder einfach verkleinert verwenden. Sie verteilen 10 zufällige Schlangen auf der Welt:

Screenshot: Greenfoot-3-Szenario mit 10 Schlangen in Originalgröße

Diese Schlangen sind zu groß. Also schreiben Sie in den Konstruktor der Schlange:

this.getImage().scale(20,20)

Damit werden alle Schlangen sozusagen noch vor ihrer Entstehung auf die Größe 20 x 20 Pixel skaliert:

Screenshot: Greenfoot-3-Szenario mit 10 verkleinerten Schlangen

Allerdings haben Sie bei dieser Methode das Problem, dass die Schlangen evtl. unproportional verkleinert werden. Deshalb noch ein anderes Beispiel:

Jedesmal, wenn eine Spielfigur einen Hamburger sammelt, nimmt sie ein wenig an Größe zu:

if(this.isTouching(Hamburger.class))
    this.removeTouching(Hamburger.class)
    var int neueHoehe(int)(this.getImage().getHeight()*1.2)
          int neueBreite(int)(this.getImage().getWidth()*1.2)
    this.getImage().scale(neuebreite,neuehoehe)

Wir legen die neuen Ausmaße in den lokalen Variablen neueHoehe und neueBreite fest, indem wir die aktuelle Breite/Höhe mit 1.2 multiplizieren. Die Spielfigur wird also bei jeder Hamburgerberührung um 20 Prozent größer.

Das Ergebnis dieser Rechnung kann eine Kommazahl sein. Da wir in der scale(…)-Methode nur int-Werte benutzen können (also ganze Zahlen), müssen wir das Ergebnis der Rechnung in einen int Umwandeln - das nennen wir Casting.

Geistereffekt: Transparenz eines Bildes verändern

Die "Durchsichtigkeit" eines Bildes verändern wir mit

this.getImage().setTransparency(100)

0 ist vollständig transparent (=unsichtbar), 255 ist vollständig deckend (das ist der Standardwert).

Falls wir mit einem anderen Objekt kollidieren, könnten wir dessen Transparenz ändern etwa mit

if(this.isTouching(Gegner.class))
    var Gegner g = (Gegner) this.getOneIntersectingObject(Gegner.class)
    g.getImage().setTransparency(120)

Wir könnten auch dem Gegner den gleichen Transparenzwert zuweisen, den die Spielfigur hat, z.B.

    g.getImage().setTransparency(this.getImage().getTransparency())
  • g ist das Objekt, mit dem wir zusammenstoßen
  • this ist das eigene Objekt (also die Klasse, in der wir gerade programmieren, z.B. Spielfigur)
  • getTransparency() gibt uns den Transparenzwert zurück, den this hat. Wenn this eine Transparenz von 255 hat, dann hat this.getImage().getTransparency() den Wert 255.