This site requires JavaScript, please enable it in your browser!
Greenfoot back
Joey1994
Joey1994 wrote ...

2018/9/29

non static method cannot be referenced from a static context.

Joey1994 Joey1994

2018/9/29

#
Hi, im having a problem. I made a code for the crab game when the crab eats a worm a new worm gets added. Now im trying to code to add 3 new worms when 3 worms have been eaten. This is the code for my crab.
import greenfoot.*; /** * This class defines a crab. Crabs live on the beach. */ public class Crab extends Actor { private boolean readyForRemove; private int wormsEaten; private GreenfootImage imagePotenStrekken; private GreenfootImage imagePotenSamen; /** * Dit is de constructor. * Hier word aan de variabelen de initieele waarde toegekent. */ public Crab()// Waarde instellen voor potenstrekken en potensamen { imagePotenStrekken = new GreenfootImage("crab.png"); // Waarde voor Potenstrekken // Constructor imagePotenSamen = new GreenfootImage ("crab2.png"); // Waarde Poten samen setImage(imagePotenStrekken); readyForRemove = false; wormsEaten = 0; // eigenlijk begint een int standaard vanop nul maar het is good practice om dit toch zo te doen. } public void act() { eetWorm(); verplaats(); wisselAfbeelding(); wormToevoegen(); spelGewonnen(); removeIfMarked(); } /** * Verplaats de krab met 5 pixels op het scherm */ public void verplaats() { //Als ik pijltje rechts duw: voorwaarts, 7 pixels if ( Greenfoot.isKeyDown("right") ) { move(7); } //Als ik pijltje links duw: achterwaarts, 7 pixels if ( Greenfoot.isKeyDown("left") ) { move(-7); } //Als ik spatie indruk: draai, 3 graden if ( Greenfoot.isKeyDown("space") ) { turn(10); } if ( Greenfoot.isKeyDown("up") ) { setLocation(getX(), getY() - 5); } if ( Greenfoot.isKeyDown("Down") ) { setLocation(getX(), getY() + 5); } } /** * Als Crab een Worm aanraakt zegt hij tegen de worm dat hij zichzelf moet verwijderen. * Hier word ook als er een worm word 'gegeten' iedere keer 1 bij de variable wormseaten bijgeschreven. */ private void eetWorm() { if (isTouching(Worm.class)) { Worm worm; worm = (Worm) getOneIntersectingObject(Worm.class); worm.remove(); wormsEaten = wormsEaten + 1; Greenfoot.playSound("slurp.wav"); } } /** * Gaat de waarde van de variable wormsEaten teruggeven * Hierdoor weten we hoeveel wormen Crab heeft gegeten */ public int HoeveelWormenGegeten() { return wormsEaten; } /** * Het spel is gewonnen als de waarde van variabel wormsEaten 8 is. */ private void spelGewonnen() { if (wormsEaten == 8){ Greenfoot.playSound("fanfare.wav"); Greenfoot.stop(); } } public void wormToevoegen() { if (wormsEaten == 3){ Worm worm; worm = worm; worm.nieuweWorm(); } } /** * Deze methode wisselt van afbeelding */ private void wisselAfbeelding() { if ( !isRemoved() ) { if (getImage() == imagePotenStrekken ) { //als de poten gestrekt zijn setImage(imagePotenSamen);//doe poten dich } else { setImage(imagePotenStrekken); // als dat niet waar }} } /** * Markeer het object om verwijderd te worden. */ public void remove() { readyForRemove = true; } /** * Geeft de huidige waarde true of false van de variabel readyForRemove */ public boolean isRemoved() { return readyForRemove; } /** * Verwijder het object indien het gemarkeerd is om te verwijderen. * Plaats deze methode als LAATSTE METHODE IN DE ACT!! */ private void removeIfMarked() { if (readyForRemove == true) { getWorld().removeObject(this); } } }
this is the code for my worm:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) /** * Write a description of class Worm here. * * @author (your name) * @version (a version number or a date) */ public class Worm extends Actor { private boolean readyForRemove; /** * Act - do whatever the Worm wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. */ public void act() { removeIfMarked();// Add your action code here. } /** * Dit is de constructor van Worm * Hier worden de initieele waardes van de variabelen gegeven. */ public Worm() { readyForRemove = false; } /** * Als je deze methode gebruikt die hieronder beschreven is, veranderd de waarde van variabel readyForRemove naar true */ public void remove() { readyForRemove = true; } /** * Gaat de huidige waarde opvragen van de variabel readyForRemove, true of false */ public boolean isMarkedRemove() { return readyForRemove; } /** * Verwijdert zichzelf als de waarde van removeIfMarked true is. */ private void removeIfMarked() { if ( readyForRemove == true) { getWorld().removeObject(this); } } /** * Maakt een nieuw object van Worm aan op een willekeurige plaats in de wereld */ public void nieuweWorm() { Worm worm; worm = new Worm(); CrabWorld crabWorld = (CrabWorld) getWorld(); int wereldBreedte = crabWorld.getWidth(); int wereldHoogte = crabWorld.getHeight(); int x = Greenfoot.getRandomNumber(wereldBreedte); int y = Greenfoot.getRandomNumber(wereldHoogte); crabWorld.addObject(worm, x, y); } }
danpost danpost

2018/9/29

#
The is a series of problems with how you are trying to add worms into the world during game-play. First, in the wormToevoegen method, you have this:
public void wormToevoegen()
{
    if (wormsEaten ==  3){
        Worm worm;
        worm = worm;
        worm.nieuweWorm();
    }
}
Line 2 creates a variable to hold a Worm object; then, line 3 assigns its value to itself (more of a fact than a command) -- its value remains null. Line 4 then tries to call method on a non-existent (null) worm. Let us now assume you had created a worm and assigned it to the variable -- what would happen upon calling the method on it? Well, when getWorld is called on that worm (in the nieuweWorm method), crabWorld will be assigned a null value as the worm was never added to any world. Another thing to be aware of is that you will have many act steps executed with wormsEaten having a value of 3. This will cause a multitude of worms to be added to the world. Therefore, you will need a way to determine whether the worms were added or not. If your initial worm count is 10, let us say, then you can ask if the number of worms in the world is 7 (in your CrabWorld act method) and add the 3 worms back, if so. By using the CrabWorld act method, you can avoid a lot of the difficulties in coding it.
You need to login to post a reply.