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

2012/6/12

Is it possible to add objects to the world from a static class?

mrjelle88 mrjelle88

2012/6/12

#
Hi, I am trying to add objects from a certain class called ' blok'. They have to spawn in 'Breakout'. Is that possible? When i use the following code it won' t work, what should I do?
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;

/**
 * Write a description of class Blok here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Blok extends Actor
{
    /**
     * Act - do whatever the Blok wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public static int blokjes = 30;
    public void act() 
    {
       Actor bal = getOneIntersectingObject(Bal.class); 
       if(bal !=null) //check if the ball hits the block, if so remove the block and make the ball move the other way back and var blokjes -- and check for stop(if blokjes is 0)
       {
           blokjes --;
           if(blokjes<1)
           {
               Greenfoot.stop();
            }
           getWorld().removeObject(this);
           Bal.speedY = -Bal.speedY;
           if(blokjes==15)
           {
               getWorld();
               Breakout.level_2();
            }
    }    
}
}
For blok and
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
 * Write a description of class Breakout here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Breakout extends World
{

    /**
     * Constructor for objects of class Breakout.
     * 
     */
    public Breakout()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(400, 600, 1);
        setBackground("bricks2.gif");
        populate();
    }
    
    public void populate() 
    {
        // Plaats hier de objecten in de wereld

        // xBatje is de x-coordinaat van het midden van het middelste batje 
        int xBatje = 200;
        int yBatje = 550;
        
        GreenfootImage b1Img = new GreenfootImage("bat1.png");
        // De breedte van het middelste batje
        int widthBatje = b1Img.getWidth();

        GreenfootImage b2Img = new GreenfootImage("bat2.PNG");
        // De breedte van een zij-batje
        int widthSideBatje = b2Img.getWidth();

        // Creeer het middelste batje en plaats het in de wereld
        Batje batje = new Batje(b1Img, 
                            //linkergrens is de breedte van het linker zij-batje + de helft van de breedte van het middelste batje
                            widthSideBatje + widthBatje / 2,
                            //rechtergrens is de breedte van de wereld - (de helft van de breedte van het middelste batje + de breedte van het rechterbatje)
                            getWidth() - (widthSideBatje + widthBatje / 2)
                            );
        addObject(batje, xBatje, yBatje);

        // Creeer het linker zij-batje en plaats het in de wereld
        LBatje leftBatje = new LBatje(b2Img, 
                            //linkergrens is de breedte van het linker zij-batje 
                            b2Img.getWidth() / 2, 
                            //rechtergrens is de breedte van de wereld - (de helft van de breedte van het linker batje + de breedte van het middelste batje + de breedte van het rechterbatje)
                            getWidth() - (widthSideBatje / 2 + widthBatje + widthSideBatje)
                            );
       
        // initiele x-coordinaat (midden) is het midden van het middelste batje - de helft van de breedte van het middelste batje - de helft van de breedte van het linker zij-batje                     
        addObject(leftBatje, xBatje - widthBatje / 2 - widthSideBatje / 2, yBatje); 

        // Creeer het rechter zij-batje en plaats het in de wereld
        Batje rightBatje = new RBatje(b2Img, 
                            //linkergrens is de breedte van het linker zij-batje + de breedte van het middelste batje + de helft van de breedte van het rechter batje
                            widthSideBatje + widthBatje + widthSideBatje / 2, 
                            //rechtergrens is de breedte van de wereld - (de helft van de breedte van het rechter batje)
                            // de + 1 is waarschijnlijk het resultaat van een afrondingsfout
                            getWidth() - (b2Img.getWidth() / 2 + 1)
                            ); 
        addObject(rightBatje, xBatje + widthBatje / 2 + widthSideBatje / 2, yBatje); 
        
        addObject(new Bal(), 200, 200);
        addObject(new L1(), 17,584);
        addObject(new L2(), 50,584);
        addObject(new L3(), 83,584);
        Bal.levens = 3;
        
       int a=0;
        while(a<5)
        {
            addObject(new Blok(), 100+50*a, 100);
            a=a+1;
        }
        int b=0;
        while(b<5)
        {
            addObject(new Blok(), 100+50*b, 50);
            b=b+1;
        }
        int c=0;
        while(c<5)
        {
            addObject(new Blok(), 100+50*c, 150);
            c=c+1;
        }
        
        
        
        Blok.blokjes = 30; //resets the var
    }
    
    public static void level_2() {
               int a=0;
        while(a<5)
        {
            addObject(new Blok(), 100+50*a, 100);
            a=a+1;
        }
        int b=0;
        while(b<5)
        {
            addObject(new Blok(), 100+50*b, 50);
            b=b+1;
        }
        int c=0;
        while(c<5)
        {
            addObject(new Blok(), 100+50*c, 150);
            c=c+1;
        }
    }

    
}
For Breakout. It gives the following error: 'non-static method addObject(greenfoot.Actor,int,int) cannot be referenced from a static context' Thanks in advantage, Jelle
danpost danpost

2012/6/12

#
Remove 'static' from the Level_2 method declaration in the 'Breakout' world class; and, change lines 31 and 32 in the 'Blok' actor class to the following:
Breakout bo = (Breakout) getWorld(); // getting a reference to your Breakout world, where the Level_2 method is located
bo.Level_2();
mrjelle88 mrjelle88

2012/6/12

#
Thanks a lot, it compiles. Only problem is that now I get an error at the point where the blokjes var reaches 15 and it should spawn the new level: java.lang.NullPointerException at Blok.act(Blok.java:32) at greenfoot.core.Simulation.actActor(Simulation.java:507) at greenfoot.core.Simulation.runOneLoop(Simulation.java:470) at greenfoot.core.Simulation.runContent(Simulation.java:204) at greenfoot.core.Simulation.run(Simulation.java:194) I believe nullpointer is that i point to something that doesn't exist, is that right? And if so, then why does it give this error? At line 32 I point to Level2(), and I'm sure that this function does exist.
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;

/**
 * Write a description of class Blok here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Blok extends Actor
{
    /**
     * Act - do whatever the Blok wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public static int blokjes = 30;
    public void act() 
    {
       Actor bal = getOneIntersectingObject(Bal.class); 
       if(bal !=null) //check if the ball hits the block, if so remove the block and make the ball move the other way back and var blokjes -- and check for stop(if blokjes is 0)
       {
           blokjes --;
           if(blokjes<1)
           {
               Greenfoot.stop();
            }
           getWorld().removeObject(this);
           Bal.speedY = -Bal.speedY;
           if(blokjes==15)
           {
               Breakout bo = (Breakout) getWorld();
               bo.Level_2();
            }
    }    
}
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
 * Write a description of class Breakout here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Breakout extends World
{

    /**
     * Constructor for objects of class Breakout.
     * 
     */
    public Breakout()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(400, 600, 1);
        setBackground("bricks2.gif");
        populate();
    }
    
    public void populate() 
    {
        // Plaats hier de objecten in de wereld

        // xBatje is de x-coordinaat van het midden van het middelste batje 
        int xBatje = 200;
        int yBatje = 550;
        
        GreenfootImage b1Img = new GreenfootImage("bat1.png");
        // De breedte van het middelste batje
        int widthBatje = b1Img.getWidth();

        GreenfootImage b2Img = new GreenfootImage("bat2.PNG");
        // De breedte van een zij-batje
        int widthSideBatje = b2Img.getWidth();

        // Creeer het middelste batje en plaats het in de wereld
        Batje batje = new Batje(b1Img, 
                            //linkergrens is de breedte van het linker zij-batje + de helft van de breedte van het middelste batje
                            widthSideBatje + widthBatje / 2,
                            //rechtergrens is de breedte van de wereld - (de helft van de breedte van het middelste batje + de breedte van het rechterbatje)
                            getWidth() - (widthSideBatje + widthBatje / 2)
                            );
        addObject(batje, xBatje, yBatje);

        // Creeer het linker zij-batje en plaats het in de wereld
        LBatje leftBatje = new LBatje(b2Img, 
                            //linkergrens is de breedte van het linker zij-batje 
                            b2Img.getWidth() / 2, 
                            //rechtergrens is de breedte van de wereld - (de helft van de breedte van het linker batje + de breedte van het middelste batje + de breedte van het rechterbatje)
                            getWidth() - (widthSideBatje / 2 + widthBatje + widthSideBatje)
                            );
       
        // initiele x-coordinaat (midden) is het midden van het middelste batje - de helft van de breedte van het middelste batje - de helft van de breedte van het linker zij-batje                     
        addObject(leftBatje, xBatje - widthBatje / 2 - widthSideBatje / 2, yBatje); 

        // Creeer het rechter zij-batje en plaats het in de wereld
        Batje rightBatje = new RBatje(b2Img, 
                            //linkergrens is de breedte van het linker zij-batje + de breedte van het middelste batje + de helft van de breedte van het rechter batje
                            widthSideBatje + widthBatje + widthSideBatje / 2, 
                            //rechtergrens is de breedte van de wereld - (de helft van de breedte van het rechter batje)
                            // de + 1 is waarschijnlijk het resultaat van een afrondingsfout
                            getWidth() - (b2Img.getWidth() / 2 + 1)
                            ); 
        addObject(rightBatje, xBatje + widthBatje / 2 + widthSideBatje / 2, yBatje); 
        
        addObject(new Bal(), 200, 200);
        addObject(new L1(), 17,584);
        addObject(new L2(), 50,584);
        addObject(new L3(), 83,584);
        Bal.levens = 3;
        
       int a=0;
        while(a<5)
        {
            addObject(new Blok(), 100+50*a, 100);
            a=a+1;
        }
        int b=0;
        while(b<5)
        {
            addObject(new Blok(), 100+50*b, 50);
            b=b+1;
        }
        int c=0;
        while(c<5)
        {
            addObject(new Blok(), 100+50*c, 150);
            c=c+1;
        }
        
        
        
        Blok.blokjes = 30; //resets the var
    }
    
    public void Level_2() {
               int a=0;
        while(a<5)
        {
            addObject(new Blok(), 100+50*a, 100);
            a=a+1;
        }
        int b=0;
        while(b<5)
        {
            addObject(new Blok(), 100+50*b, 50);
            b=b+1;
        }
        int c=0;
        while(c<5)
        {
            addObject(new Blok(), 100+50*c, 150);
            c=c+1;
        }
    }

    
}
danpost danpost

2012/6/12

#
You need to get the reference to the world before 'this' is removed from it, or getWorld will return 'null'. So, in the 'Blok' class code, move line 31 up to line 27.
danpost danpost

2012/6/12

#
Hesitation in Greenfoot got me to click on 'Post' a second time.
mrjelle88 mrjelle88

2012/6/12

#
Thank you very much, you saved me from a bad note in school! I had to get passed this to be able to move on to the next part, so it really helped me out :) Also I learned from your explaination! Thanks :)
You need to login to post a reply.