Grundsätzliches Vorgehen

Objekte in einer Welt-Klasse erzeugen und/oder zur Welt hinzufügen

Beispiel:

Screenshot: Greenfoot-3-Objekte in einer Weltklasse erzeugen

In einer World-Klasse können Sie die Methode this.addObject(…) verwenden, z.B.

this.addObject(new Monster(), 100, 300)

Die Methode bekommt drei Parameter:

  • ein Objekt (das hier mit new Monster() erzeugt wird)
  • eine x-Position (hier: 100)
  • eine y-Position (hier: 300)

Für die x- und y-Position können Sie auch die Methoden getWidth() und/oder getHeight() verwenden:

this.addObject(new Ball(),this.getWidth()/2,this.getHeight()/2)

In diesem Beispiel wird der Ball genau in die Mitte der Welt gesetzt. Wenn die Welt 600 Pixel breit ist, hat getWidth() den Wert 600 und getWidth()/2 den Wert 300.

Die Größe der Welt sehen wir in der super(…)-Methode. super(600,400,1) bedeutet, dass die Welt 600 Pixel breit und 400 Pixel hoch ist.

Objekte in einer Actor-Klasse erzeugen und zur Welt hinzufügen

Beispiel:

Screenshot: Greenfoot-3-Objekte in einer Weltklasse erzeugen

Auch hier benutzen wir die Methode addObject(…). Wir möchten zum Beispiel in der Klasse Schlange ein neues Objekt der Klasse Schneeball erzeugen und der Welt hinzufügen (vulgo: einen Schneeball werfen). Das machen wir bspw. mit

this.getWorld().addObject(new Schneeball(), 100, 200)

Da die Methode addObject(…) jedoch eine Methode der World-Klassen ist, müssen wir uns erst die Welt "holen" mit this.getWorld(), siehe unten. Während wir oben in der Weltklasse this verwenden konnten, müssen wir jetzt stattdessen this.getWorld() schreiben.

Objekt zuerst als lokale Variable erzeugen

Manchmal ist es nützlich, das Objekt separat zu erzeugen, Beispiel:

var Person einePerson = new Person()
this.addObject(einePerson, 200, 200)

Mit der Taste v deklarieren Sie in Greenfoot 3 (Stride-Szenario) eine neue Variable, hier vom Datentyp Person. Der Name der Variable ist einePerson, könnte natürlich auch anders lauten (z.B. person oder josef oder fritz).

Wenn wir das Objekt wie im Beispiel eben separat deklariert haben, können wir seine Methoden benutzen, zum Beispiel:

var Blume schoeneRose = new Blume()
schoeneRose.turn(90)
this.addObject(schoeneRose, 250, 350)

Nachdem wir hier ein Objekt namens schoeneRose vom Typ Blume angelegt haben, ändern wir seine Ausrichtung (Rotation) mittels turn(90) (das heißt: Das Objekt wird um 90 Grad nach rechts gedreht) und setzen es erst dann auf die Welt.

Screenshot: Greenfoot 3, World-Klasse

Objekte zur Laufzeit erzeugen

Während ein Greenfoot-3-Programm läuft, möchten wir manchmal ein neues Objekt erzeugen (z.B. soll ein neuer Gegner auftauchen, ein neues Hindernis, neue einzusammelnde Gegenstände o.ä.). Das funktioniert sehr ähnlich wie oben beschrieben.

Dazu müssen wir:

  1. ein Objekt der gewünschten Klasse erzeugen;
  2. das Objekt auf der aktuellen Welt platzieren

Code-Beispiel:

class Monster
if(Greenfoot.isKeyDown("space"))
    var Ball b = new Ball()
    this.getWorld().addObject(b, this.getX(), this.getY())

Wenn die Leertaste gedrückt wird, erzeugen wir ein neues Objekt (Name des Objekts: b) der Klasse Ball.
Dann stellen wir fest, in welcher Welt wir uns gerade befinden (mit this.getWorld()) und fügen das Objekt ein. this ist in diesem Fall unser Monster-Objekt.

Mit this.getX() und this.getY() holen wir uns die x- und y-Position, auf der this (also das Monster) gerade sitzt. Damit erscheint das neue Objekt an der Stelle, an der sich das Monster befindet.

Wir können uns die Welt auch in einem separaten Schritt als lokale Variable erzeugen:

var World meineWelt = this.getWorld()
meineWelt.addObject(new Muenze(), 100, 200)

Wir erzeugen ein neues Objekt (Name: meineWelt) der Greenfoot-Klasse World; wieder ist das die Welt (bzw. das Welt-Objekt), dem das Monster (this, siehe oben) angehört.

Falls die Münze auf einer zufälligen Stelle auftauchen soll:

meineWelt.addObject(new Muenze(), Greenfoot.getRandomNumber(meineWelt.getWidth()),Greenfoot.getRandomNumber(meineWelt.getHeight()))

Für die x- und y-Position erzeugen wir jeweils eine Zufallszahl zwischen 0 und der Breite/Höhe der Welt.