Greenfoot mouseClicked?

1 Antwort

Die mouseClicked-Methode prüft, ob auf das Objekt, welches ihr übergeben wurde, geklickt wurde. In deinem Fall zeigt this offensichtlich nicht auf das Schwein.

a) Hole dir erst eine Instanz des Schweins und übergib diese dann an die Methode. Angenommen, du hast noch keine Referenz auf das Objekt verfügbar und es gibt nur ein Schwein in der ganzen Welt, könntest du so vorgehen:

List<Pig> pigsInWorld = world.getObjects(Pig.class);

if (pigsInWorld.size() > 0) {
  pig = pigsInWorld.get(0);
}

Dies solltest du irgendwo initial einmal machen, wenn du weißt, dass das Schwein zu dem Zeitpunkt existiert und sich auch nicht ändert (in Form von: Das Schwein stirbt und seine Referenz wird aus dem Speicher gelöscht). Ob pig daher eine lokale Variable oder eine Instanzvariable ist, lasse ich daher an der Stelle offen.

Die Referenz übergibst du wie gesagt an mouseClicked:

if (Greenfoot.mouseClicked(pig))

b) Wenn du dich beim Aufruf von mouseClicked in der Klasse befindest, die das Schwein definiert, kannst du wiederum this verwenden.

In beiden Fällen solltest du darauf achten, dass die Klasse für das Schwein von der Basisklasse Actor erbt.

class Pig extends Actor {

Bezüglich des Alters:

Zuerst braucht es eine Instanzvariable, die sich das Alter des Schweins merkt.

class Pig extends Actor {
  private int age;

Am besten werden dazu noch zwei Methoden implementiert, um das Alter zurückzugeben und zu erhöhen.

public void incrementAge() {
  ++age;
}

public int getAge() {
  return age;
}

Nun wirst du doch irgendwo sicherlich die move-Methode des Schweins aufrufen, um es zu bewegen. Diese wird am besten in einer eigenen move-Methode gekapselt, die fortan verwendet wird (und in der auch Prüfungen / die Alterserhöhung stattfinden).

public void moveOneStep() {
  move(/* some distance ... */);
}

Wenn die Wegstrecke, die dieser Methode übergeben wird, 0 beträgt, sollte das Alter nicht erhöht werden. Ob das zu prüfen ist, musst du selbst entscheiden.

Aber ganz bestimmt ist noch eine andere Prüfung notwendig: Ob ein Schritt nach vorn / hinten überhaupt möglich war. Du benötigst eine Kollisionsabfrage mit Wänden / Hindernissen. Die sollte sich jedoch nicht als sonderlich schwierig erweisen. Schau dir die Methoden an, die in der Actor-Klasse implementiert sind. Du kannst dir bspw. die Objekte holen, die sich vor dem Schwein befinden. Wenn es keine gibt, kann es sich problemlos nach vorn bewegen.

Wenn ein Schritt vollführt werden konnte, kannst du auch das Alter mit der increment-Methode erhöhen.