Wichtige Greenfoot-Grundlagen, Teil 1

Greenfoot-API

Alle verfügbaren Methoden („Befehle“) finden Sie in der Dokumentation der Greenfoot-API. Ich habe hier die für uns wichtigsten Methoden etwas einfacher und mit Beispielen versehen zusammengefasst.

Wichtige Klassen: Actor, World, Greenfoot

Zu Beginn sind für uns die Klassen Actor und World sehr wichtig. Von denen können wir keine Objekte erzeugen, aber wir können Unterklassen bilden (z.B. die Klasse „Rakete“ oder „Auto“ als Unterklasse zur Actor-Klasse).

Die Unterklassen zu Actor können alle Actor-Methoden (wie z.B. move(…), turn(…) oder setLocation(…)), die Unterklassen der World-Klasse können alle World-Methoden (z.B. addObject(…) oder showText(…)).

Von der Klasse Greenfoot erzeugen wir keine Objekte, aber wir benutzen Sie für eher „allgemeine“ Methoden, z.B. Greenfoot.isKeyDown(…), Greenfoot.mouseClicked(…), Greenfoot.setSpeed(…)

Schlüsselwort this

Vorbemerkung: Wir verwenden immer this, wenn wir anzeigen wollen, dass wir uns auf das aktuelle Objekt beziehen, also

// Klasse Auto

this.move(10)

this ist das Objekt der Klasse Auto, DIESES Objekt soll sich um 10 Pixel bewegen.

Meistens funktioniert das alles auch ohne this, wir werden aber an einen Punkt kommen, an dem wir this brauchen, um DIESES Objekt von anderen Objekten unterscheiden zu können. Also beharre ich darauf, dass Sie immer this verwenden, wenn Sie DIESES Objekt meinen.

Greenfoot-Klasse: Tastensteuerung (isKeyDown(…))

Zur Abfrage von Tasten schreiben Sie beispielsweise:

if(Greenfoot.isKeyDown("d"))

    this.turn(20)

Die Methode isKeyDown(…) bekommt einen String als Parameter, also eine Zeichenkette in Anführungszeichen. Wir verwenden space für Leertaste, left/right/up/down für Pfeiltasten etc.

Greenfoot-Klasse: Zufallszahl erzeugen

Greenfoot.getRandomNumber(maximalwert:int)

Die Methode bekommt als Parameter einen int-Wert (Ganzzahl) und erzeugt eine Zufallszahl von 0 bis maximalWert-1. Mit Greenfoot.getRandomNumber(2) bekommen Sie also zufällig die Zahl 0 oder 1 ausgespuckt. Wenn Sie eine Zahl zwischen 5 und 9 wollen, schreiben Sie also

Greenfoot.getRandomNumber(5)+5

Greenfoot.getRandomNumber(5) erzeugt eine Zahl  von 0 bis 4, es wird jeweils 5 dazu addiert – also erhalten Sie eine Zahl von 5 bis 9.

 

World-Klassen: Der Welt einen Actor hinzufügen (addObject(…))

addObject(objekt:Actor, xPos:int, yPos:int)

Die World-Klassen kennen eine Methode addObject(…), mit der der Welt ein neues Actor-Objekt hinzugefügt wird. Wir können also in einer World-Klasse (z.B. in der vorgegebenen MyWorld-Klasse) schreiben:

this.addObject(new Auto(), 200, 300)

this ist die Welt, new Auto() erzeugt ein neues Objekt der Klasse Auto, 200 ist die x-Position, 300 die y-Position, auf der das Auto erscheint.

Sehr ausführlich beschrieben hier: Objekte erzeugen und zur Welt hinzufügen

World-Klassen: Einen Text auf die Welt schreiben (showText(…))

showText(text:String, xPos:int, yPos:int)

Der Text kann nur ein String (eine Zeichenkette, gewöhnlich an Anführungszeichen erkennbar) sein. Wenn Sie also ein Attribut vom Datentyp int haben (z.B. punkte), führt showText(punkte, 100, 100) zu einer Fehlermeldung, weil punkte kein String ist. Hängen Sie deshalb einen String vorne oder hinten dran (showText("Sie haben " + punkte + " Punkte!", 100, 100)) oder wandeln Sie den int um in einen String (showText(String.valueOf(punkte), 100, 100)).

World-Klassen: Höhe/Breite der Welt herausfinden mit getWidth(), getHeight()

Wenn Sie in einer World-Klasse schreiben

this.showText("Höhe der Welt: " + this.getHeight(), 300, 300)

dann erhalten Sie die Ausgabe, wie hoch die Welt ist. Entsprechend getWidth().

Actor-Klassen: Vom Actor aus auf World-Klasse zugreifen mit getWorld()

Sie möchten, dass ein Actor veranlasst, dass Text auf die Welt geschrieben wird. Da der Actor die Methode showText(…) nicht kennt, können Sie in der Klasse Auto nicht schreiben

// Klasse Auto:

this.showText(…) // FALSCH!

Nur die World-Klasse kennt die Methode showText(…). Also schreiben wir in der Klasse Auto:

// Klasse Auto:

this.getWorld().showText(…)

this (das Objekt der Klasse Auto) holt sich die Welt, in der es sich gerade aufhält und lässt diese Welt die Methode showText(…) ausführen.

Das funktioniert mit allen Welt-Methoden; ein häufiges Beispiel ist die Verwendung der Methode addObject(…), wenn eine Spielfigur einen Schuss abfeuert (siehe hier: Tutorial ‚Spielfigur schießt‘).

Beachten Sie, dass getWorld() keinen Parameter bekommt – d.h. Sie schreiben in die Parameterklammern hinter getWorld nichts, also NICHT getWorld(irgendwas) <- FALSCH! FALSCH!

 Actor-Klassen: Einen Actor bewegen mit move(…)

move(pixel:int)

Wenn ein Actor neu in die Welt gesetzt wird, schaut er standardmäßig nach Osten. move(…) bewegt den Actor um die angegebene Entfernung in Pixeln, und zwar in die Richtung, in die er gerade „schaut“ (kann man mit getRotation() herausbekommen).

move bekommt einen int-Parameter, also eine ganze Zahl. Beispiel:

// Klasse Auto

this.move(10)

= das Auto-Objekt (this) bewegt sich um 10 Pixel in die Richtung, in die es ausgerichtet ist.

Actor-Klassen: Einen Actor bewegen mit turn(…)

turn(grad:int)

Dreht den Actor um die angegebene Gradzahl. Als Parameter bekommt die Methode einen int-Wert, also eine ganze Zahl. Beispiel:

// Klasse Auto

this.turn(-5)

dreht das Objekt der Klasse Auto um 5 Grad nach links.

Actor-Klassen: Rand-Kollision prüfen mit isAtEdge()

Sie wollen wissen, ob der Actor am Rand des Szenarios anstößt. Sie schreiben

// Klasse Auto

if(this.isAtEdge())
    // irgendetwas passiert

Actor-Klassen: Kollision mit anderen Objekten prüfen mit isTouching(…); removeTouching(…)

Sie wollen wissen, ob der Actor mit einem anderen Objekt auf der Welt zusammenstößt. Sie schreiben

// Klasse Auto

if(this.isTouching(Stein.class))
    // irgendetwas passiert

Die Methode isTouching(…) bekommt eine Klasse als Parameter; vergessen Sie nicht, hinter den Klassennamen „.class“ zu schreiben.

Nun könnten Sie das Objekt, mit dem der Actor kollidiert entfernen:

// Klasse Auto

if(this.isTouching(Stein.class))
     this.removeTouching(Stein.class)

Actor-Klassen: Position verändern mit setLocation(…)

setLocation(neueXPos:int, neueYPos:int)

setLocation(…) bekommt also zwei int-Parameter (zwei ganzzahlige Werte), die die neue Position anzeigen. Schreiben wir also

// Klasse Auto

this.setLocation(100, 100)

Dann wird das Auto auf die Position 100, 100 gesetzt. Falls wir das Auto in die Mitte der Welt setzen wollen, können wir schreiben

// Klasse Auto

this.setLocation(this.getWorld().getWidth()/2, this.getWorld().getHeight()/2)

Wir holen uns also die Breite bzw. Höhe der Welt und teilen diesen Wert durch zwei. Unabhängig von der Weltgröße wird das Objekt damit immer in die Mitte der Welt gesetzt.

Wenn Sie ein Objekt an eine zufällige Position setzen wollen, dann schreiben Sie:

this.setLocation(this.getWorld().getRandomNumber(weltbreite:int), this.getWorld().getRandomNumber(welthoehe:int))

Die Weltbreite und Welthöhe müssen Sie angeben; wenn Sie also wissen, dass ihre Welt 600 Pixel breit und 400 Pixel hoch ist, dann können Sie schreiben

this.setLocation(this.getWorld().getRandomNumber(600), this.getWorld().getRandomNumber(400))

Wesentlich eleganter ist es natürlich, die Weltbreite und -höhe einfach zu „holen“:

this.setLocation(this.getWorld().getRandomNumber(this.getWorld().getWidth()), this.getWorld().getRandomNumber(this.getWorld().getHeight()))

 

Actor-Klassen: x-/y-Position herausfinden mit getX(), getY()

getX() bzw. getY() gibt uns die aktuelle x-/-y-Position des Actors zurück. Wenn wir also schreiben:

// Klasse Auto

this.getWorld().showText("X-Position: " + this.getX())

dann bekommen wir aktuelle x-Position des Objekts angezeigt.

Um zu überprüfen, ob ein Objekt oben am Rand angekommen ist, können Sie schreiben

if(this.getY() < 20)

    // irgendwas passiert

Actor-Klassen: Kombination aus setLocation(…) und getX()/getY()

 

Sie möchten Ihr Actor-Objekt auf Tastendruck um 5 Pixel nach oben bewegen. Sie schreiben also

this.setLocation(getX(), getY() - 5)

Würden Sie schreiben

this.setLocation(getX(), getY())

dann würde gar nichts passieren – denn getX() und getY() sind die aktuelle Position des Actor-Objekts, und sie würden das Objekt genau auf die gleiche Position setzen, an der es sich befindet. Durch getY()-5 jedoch ist die neue y-Position um 5 Pixel verringert (zur Erinnerung: links oben ist x=0 und y=0).

Attribute anlegen und verwenden

Attribute sind Eigenschaften, die alle Objekte einer Klasse haben. Wenn unsere Klasse Auto also ein Attribut

private String marke

hat, dann hat JEDES Auto eine Eigenschaft marke und einen Wert dafür. Den Wert können Sie verändern z.B. durch

this.marke = "Metz Motors"

Wie Sie einen Punktezähler bauen, erlernen Sie hier: Zähler für Punkte, Kollisionen etc. in Greenfoot 3 bauen . Und dann können Sie abfragen, wie viele Leben noch übrig sind o.ä.,  z.B.

if(this.leben == 0)

// Held hat keine Leben mehr, Spiel ist vorbei

if(this.punkte == 1000)

// Held hat 1000 Punkte, Level wechseln

if(this.gesundheit <= 10)

// Held hat nur noch wenig Gesundheit, Warnung ausgeben
PDF erzeugen