Greenfoot "Little Crab" Spiel Erweiterungen

JannisKiesow

Mitglied
Hallo!
Ich habe folgendes Problem:
Wie oben angedeutet habe ich mir mit Hilfe des Buches "Einführung in Java mit Greenfoot" und dem genannten Programm mein erstes kleines Spiel entwickelt. Bis jetzt konnte ich immer unter Anleitung des Buches arbeiten. Am Ende des Kapitels wurden weitere Ideen zum Ausbau des Spiels vorgeschlagen, darunter auch, dass für jeden gefressenen Wurm ein neuer erscheint. Das möchte ich erreichen und hätte es jetzt theoretisch so gelöst:

Java:
 public void wurmFressen()
    {
        if(canSee(Worm.class))
        {
            eat(Worm.class);
            Greenfoot.playSound("slurp.wav");
            wormsEaten = wormsEaten + 1;
            if(wormsEaten==8)
            {
                Greenfoot.playSound("fanfare.wav");
                Greenfoot.stop();
            }
           
            /**
             * Hier möchte ich den neuen Wurm erzeugen lassen
             */
            
           CrabWorld.addObject(new Worm(),Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
        }
    }

Wenn ich die Klasse Crab jetzt kompilieren will, erhalte ich allerdings den Error: non-static method addObject(greenfoot.Actor,int,int) cannot be referenced from a static context.

Ich hoffe ich habe mein Problem ausführlich genug beschrieben.. Vielen Dank schonmal für die Hilfe!

Mfg
 

Fu3L

Top Contributor
Du musst anscheinend erst eine Instanz der Klasse CrabWorld erstellen. Dann diese nicht statischen Methoden auf diesen Instanzen aufrufen.

Ich weiß OO ist schwer, das hatte ich anfangs auch, aber Objektorientierte Programmierung musst du noch mehr verinnerlichen.
 

JannisKiesow

Mitglied
Kannst du mir vielleicht zeigen wie das geht? Im Moment sieht meine CrabWorld Klasse so aus:

Java:
import greenfoot.*;  // (Actor, World, Greenfoot, GreenfootImage)

public class CrabWorld extends World
{
    /**
     * Erzeugt die Krabbenwelt (den Strand). Unsere Welt hat eine Größe 
     * von 560x560 Zellen, wobei jede Zelle nur ein Pixel groß ist.
     */
    public CrabWorld() 
    {
        super(560, 560, 1);
        populateWorld();
        addWorm();
        
    }
    
    public void populateWorld()
    {
        addObject(new Crab(),150,100);
        addObject(new Lobster(),50,50);
        addObject(new Lobster(), Greenfoot.getRandomNumber(300),Greenfoot.getRandomNumber(350));
        addObject(new Lobster(), 500,500);
     }
    
     
     public void addWorm()
     {
         addObject(new Worm(), Greenfoot.getRandomNumber(560), Greenfoot.getRandomNumber(560));
        }
    
    
}
 

Fu3L

Top Contributor
In deiner Klasse wo die Würmer gefressen werden können, sollte eine Variable:

Java:
CrabWorld crabWorld = new CrabWorld();

definiert sein. Das kann auch geteilt passieren, also am Anfang deklariert und später initialisiert.

Dann kannste in wurmFressen() per crabWorld.addObject(...) drauf zugreifen.

Aber wie gesagt: Bitte nochma genauer im Buch nachlesen... Dadurch und durch Ausprobieren, machts schon irgendwann Klick^^ ;)
 

JannisKiesow

Mitglied
Hmm ich habe das "erledigt" Zeichen zu früh gesetzt :/ Ich habe das Problem versucht folgender Maßen zu lösen:

Java:
public void wurmFressen()
    {
        

        if(canSee(Worm.class))
        {
            eat(Worm.class);
            Greenfoot.playSound("slurp.wav");
            wormsEaten = wormsEaten + 1;
            CrabWorld crabWorld = new CrabWorld();
            crabWorld.addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));
            
            if(wormsEaten==8)
            {
                Greenfoot.playSound("fanfare.wav");
                Greenfoot.stop();
            }
            
           
            
            

        }

Ich wollte dann mit

Java:
CrabWorld crabWorld = new CrabWorld();
            crabWorld.addObject(new Worm(), Greenfoot.getRandomNumber(560),Greenfoot.getRandomNumber(560));

die Variable erstellen und mit ihr auf die Klasse CrabWorld zugreifen.. Er spuckt mir auch keine Fehler aus, nur wenn ich einen Wurm fresse erscheint kein neuer (was ja aber der Fall sein soll).
Hoffe du oder jemand anders kann mir an dieser Stelle nochmal helfen..
 

Fu3L

Top Contributor
Du erstellst ja eine neue CrabWorld... Du musst in deinem ganzen Programm, so würde ich vermuten, nur eine einzige Instanz nutzen. Sie müsste wie gesagt eine Klassen- oder Instanzvariable (besser letzteres) deiner kontrollierenden Klasse sein... Nur aus der einen Methode kann man natürlich nicht genau ersehen, wie es dann auszusehen hat.

Jedenfalls kurz: Wenn du deine angezeigte/ausgegebene CrabWorld ändern willst, darfst du nicht die Änderungen an einer gerade neu erstellten world durchführen.
 

Ähnliche Java Themen

Neue Themen


Oben