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

2020/11/24

not in world issues

NewbJava NewbJava

2020/11/24

#
I am trying to animate an explosion and pieces flying in a game below is my code and error. Thank you to anyone who tries to solve this problem.
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Meteors extends Obstacles
{
   private boolean toRemove=true;
    public void act() 
    {
        move(); 
        remove(); 
        Hancur();
    }   
    public void Hancur() 
    {  
        Actor lasars = getOneIntersectingObject(Lasars.class); 
        if(lasars != null) 
        { 
        getWorld().removeObject(lasars);
        for(int i=0;i<10;i++) 
        { 
            int posx=-20+Greenfoot.getRandomNumber(40);  
            int posy=-20+Greenfoot.getRandomNumber(40);
            getWorld().addObject(new Animate(getImage()),getX()+posx,getY()+posy); 
        } 
        getWorld().addObject(new Explosion(),getX(),getY());  
        
        getWorld().removeObject(this);
        toRemove=true;
    
}   

} 
}
NewbJava NewbJava

2020/11/24

#
Here is the error. java.lang.IllegalStateException: Actor not in world. An attempt was made to use the actor's location while it is not in the world. Either it has not yet been inserted, or it has been removed. at Meteors.Hancur(Meteors.java:14) at Meteors.act(Meteors.java:10)
danpost danpost

2020/11/24

#
Remove line 26 and switch lines 9 and 10. Finally, remove "=true" from line 5 (or change to "=false").
NewbJava NewbJava

2020/11/24

#
danpost wrote...
Remove line 26 and switch lines 9 and 10. Finally, remove "=true" from line 5 (or change to "=false").
That fixed the error problem, but now some of the meteors will have the explosion effect and the debris effect but some of the meteors do not do that. Also after the meteors do the explosion effect they do not disappear. Below are the classes I have.
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class MyWorld extends World
{ 
     
    public MyWorld()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(600, 400, 1, false);   
        prepare(); 
         
          
         
    } 
    public void act() 
    { 
       if(Greenfoot.getRandomNumber(15)<1) 
       {
       addMeteor();  
       }
        
    }  
    public void addMeteor() 
    { 
     addObject(new Meteors(),getWidth()-1,Greenfoot.getRandomNumber(getHeight()));
    }
    private void prepare() 
    {  
        Rocket Rocket = new Rocket(); 
        addObject(Rocket, 100,200); 
        Rocket.setLocation(0,200);  
        
    }
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Rocket extends Actor
{
    private int xdistance=0,ydistance=0; 
    boolean fire = true; 
    private boolean toRemove=false;
     
    public void addedToWorld(World MyWorld) 
    { 
       xdistance=getX(); 
       ydistance=getY(); 
    } 
     
    public void move() 
    { 
      double rx=xdistance-getX(); 
      double ry=ydistance-getY(); 
      double r=Math.sqrt(rx*rx+ry*ry); 
      int b=5; 
      int posx=0,posy=0;
      if(r>b)  
      {  
        posx=(int)(getX()+b*rx/r);  
        posy=(int)(getY()+b*ry/r);
        } else{  
            posx=xdistance; 
            posy=ydistance; 
        } 
        setLocation(posx,posy); 
    } 
    
   
    public void act() 
    {
      if(Greenfoot.mouseMoved(null))  
      { 
          MouseInfo mouse=Greenfoot.getMouseInfo(); 
          xdistance=mouse.getX(); 
          ydistance=mouse.getY(); 
        } 
       move(); 
       fireLasars(); 
        
    }
    public void fireLasars()  
    {  
        if(Greenfoot.isKeyDown("a") && fire == true ) 
        { 
            getWorld().addObject(new Lasars(),getX() - 30,getY());  
            fire = false; 
        } 
        else if (!Greenfoot.isKeyDown("a")) 
        { 
            fire = true; 
        }
} 
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Lasars extends Actor
{
     public boolean toRemove=false; 
    public void act() 
    { 
    lasarMove();  
    removeLasars();  
    
    } 
    public void lasarMove() 
    {  
        setLocation(getX() + 5,getY()); 
         
    }
    public void removeLasars() 
    {  
        Actor meteors = getOneIntersectingObject(Meteors.class); 
       if(meteors != null) 
       {  
           getWorld().removeObject(meteors); 
           getWorld().removeObject(this);
        }
       else if (this.isAtEdge() == true)
        {
           World world;
           world = getWorld();
           world.removeObject(this);
           return;
    } 
   
    }
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Obstacles extends Actor
{
     
    public void act() 
    {
         
    }    
    public void move() 
    { 
      setLocation(getX()-10,getY());    
      Actor actor=getOneIntersectingObject(Rocket.class); 
    }   
    public void remove() 
    { 
        if (this.isAtEdge() == true)
        {
           World world;
           world = getWorld();
           world.removeObject(this);
           return;
    }
} 
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Meteors extends Obstacles
{
   private boolean toRemove=true;
    public void act() 
    {
        move(); 
        Hancur();
        remove(); 
        
    }   
    public void Hancur() 
    {  
        Actor lasars = getOneIntersectingObject(Lasars.class); 
        if(lasars != null) 
        { 
        getWorld().removeObject(lasars);
        for(int i=0;i<10;i++) 
        { 
            int posx=-20+Greenfoot.getRandomNumber(40);  
            int posy=-20+Greenfoot.getRandomNumber(40);
            getWorld().addObject(new Animate(getImage()),getX()+posx,getY()+posy); 
        } 
        getWorld().addObject(new Explosion(),getX(),getY());  
        
        
        
        toRemove=false;
    
}   

} 
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)


public class Explosion extends Actor
{ 
    private int time = 5; 
    public void addedToWorld(World MyWorld) 
    {  
        GreenfootImage image=new GreenfootImage(100,100); 
        image.setColor(new Color(255,255,0,180)); 
        image.fillOval(0,0,image.getWidth()-1,image.getHeight()-1); 
        image.fillOval(20,20,image.getWidth()-41,image.getHeight()-41); 
        setImage(image); 
        time=5; 
    
    }
    public void act() 
    {
       if(time>0) time--; 
       else getWorld().removeObject(this); 
       
    }    
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)


public class Animate extends Actor
{ 
    public int xaxisV=0, yaxisV=0,rotation=0; 
    
    public Animate(GreenfootImage img) 
    {  
        GreenfootImage image =new GreenfootImage(10,10); 
        image.drawImage(img,-Greenfoot.getRandomNumber(img.getWidth()),-Greenfoot.getRandomNumber(img.getHeight())); 
        setImage(image); 
    }
        
    public void addedToWorld(World MyWorld) 
    {  
        xaxisV=-5+Greenfoot.getRandomNumber(10); 
        yaxisV=-5+Greenfoot.getRandomNumber(10); 
        rotation=-10+Greenfoot.getRandomNumber(20); 
        if(xaxisV==0) 
        { 
            xaxisV=1; 
        } 
        if(yaxisV==0) 
        { 
            yaxisV=1; 
        } 
    }
    
    public void act() 
    {
        setLocation(getX()+xaxisV,getY()+yaxisV); 
        setRotation(getRotation()+rotation); 
        if(getX()<-200 || getY()<-200 || getX()>getWorld().getWidth()+200 || getY()>getWorld().getHeight()+200) 
        { 
            getWorld().removeObject(this); 
        }
        
    }    
 
}
danpost danpost

2020/11/24

#
NewbJava wrote...
now some of the meteors will have the explosion effect and the debris effect but some of the meteors do not do that. Also after the meteors do the explosion effect they do not disappear.
First:
danpost wrote...
remove "=true" from line 5 (or change to "=false").
"line 5" -- not "27". After correcting the above, move line 5 to the Obstacles class and change line 17 in that class to:
if (toRemove || isAtEdge())
NewbJava NewbJava

2020/11/24

#
danpost wrote...
NewbJava wrote...
now some of the meteors will have the explosion effect and the debris effect but some of the meteors do not do that. Also after the meteors do the explosion effect they do not disappear.
First:
danpost wrote...
remove "=true" from line 5 (or change to "=false").
"line 5" -- not "27". After correcting the above, move line 5 to the Obstacles class and change line 17 in that class to:
if (toRemove || isAtEdge())
I changed everything you told me to but i am still having the issue that when the lasar hits the meteor the meteor is not removed.
danpost danpost

2020/11/24

#
NewbJava wrote...
I changed everything you told me to but i am still having the issue that when the lasar hits the meteor the meteor is not removed.
Show updated Obstacles and Meteors classes.
NewbJava NewbJava

2020/11/24

#
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Obstacles extends Actor
{
     private boolean toRemove=false;
    public void act() 
    {
         
    }    
    public void move() 
    { 
      setLocation(getX()-10,getY());    
      Actor actor=getOneIntersectingObject(Rocket.class); 
    }   
    public void remove() 
    { 
        if (toRemove || isAtEdge())
        {
           World world;
           world = getWorld();
           world.removeObject(this);
           return;
    }
} 
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Meteors extends Obstacles
{
   private boolean toRemove=false;
    public void act() 
    {
        move(); 
        Hancur();
        remove(); 
        
    }   
    public void Hancur() 
    {  
        Actor lasars = getOneIntersectingObject(Lasars.class); 
        if(lasars != null) 
        { 
        getWorld().removeObject(lasars);
        for(int i=0;i<10;i++) 
        { 
            int posx=-20+Greenfoot.getRandomNumber(40);  
            int posy=-20+Greenfoot.getRandomNumber(40);
            getWorld().addObject(new Animate(getImage()),getX()+posx,getY()+posy); 
        } 
        getWorld().addObject(new Explosion(),getX(),getY());  
        
        
        
        toRemove=true;
    
}   

} 
}
NewbJava NewbJava

2020/11/24

#
danpost wrote...
NewbJava wrote...
I changed everything you told me to but i am still having the issue that when the lasar hits the meteor the meteor is not removed.
Show updated Obstacles and Meteors classes.
Here is the updated code.
danpost danpost

2020/11/24

#
NewbJava wrote...
Here is the updated code.
Remove line 5 from Meteors class and change "private" to "protected" on line 5 in Obstacles class.
NewbJava NewbJava

2020/11/24

#
danpost wrote...
NewbJava wrote...
Here is the updated code.
Remove line 5 from Meteors class and change "private" to "protected".
Thank you that fixed that problem. The other problem I was having is that some lasers would hit a meteor and not show the animation and just disappear
NewbJava NewbJava

2020/11/24

#
danpost wrote...
NewbJava wrote...
Here is the updated code.
Remove line 5 from Meteors class and change "private" to "protected" on line 5 in Obstacles class.
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Lasars extends Actor
{
     public boolean toRemove=false; 
    public void act() 
    { 
    lasarMove();  
    removeLasars();  
    
    } 
    public void lasarMove() 
    {  
        setLocation(getX() + 5,getY()); 
         
    }
    public void removeLasars() 
    {  
        Actor meteors = getOneIntersectingObject(Meteors.class); 
       if(meteors != null) 
       {  
           getWorld().removeObject(meteors); 
           getWorld().removeObject(this);
        }
       else if (this.isAtEdge() == true)
        {
           World world;
           world = getWorld();
           world.removeObject(this);
           return;
    } 
   
    }
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)


public class Animate extends Actor
{ 
    public int xaxisV=0, yaxisV=0,rotation=0; 
    
    public Animate(GreenfootImage img) 
    {  
        GreenfootImage image =new GreenfootImage(10,10); 
        image.drawImage(img,-Greenfoot.getRandomNumber(img.getWidth()),-Greenfoot.getRandomNumber(img.getHeight())); 
        setImage(image); 
    }
        
    public void addedToWorld(World MyWorld) 
    {  
        xaxisV=-5+Greenfoot.getRandomNumber(10); 
        yaxisV=-5+Greenfoot.getRandomNumber(10); 
        rotation=-10+Greenfoot.getRandomNumber(20); 
        if(xaxisV==0) 
        { 
            xaxisV=1; 
        } 
        if(yaxisV==0) 
        { 
            yaxisV=1; 
        } 
    }
    
    public void act() 
    {
        setLocation(getX()+xaxisV,getY()+yaxisV); 
        setRotation(getRotation()+rotation); 
        if(getX()<-200 || getY()<-200 || getX()>getWorld().getWidth()+200 || getY()>getWorld().getHeight()+200) 
        { 
            getWorld().removeObject(this); 
        }
        
    }    
 
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)


public class Explosion extends Actor
{ 
    private int time = 5; 
    public void addedToWorld(World MyWorld) 
    {  
        GreenfootImage image=new GreenfootImage(100,100); 
        image.setColor(new Color(255,255,0,180)); 
        image.fillOval(0,0,image.getWidth()-1,image.getHeight()-1); 
        image.fillOval(20,20,image.getWidth()-41,image.getHeight()-41); 
        setImage(image); 
        time=5; 
    
    }
    public void act() 
    {
       if(time>0) time--; 
       else getWorld().removeObject(this); 
       
    }    
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Obstacles extends Actor
{
     protected boolean toRemove=false;
    public void act() 
    {
         
    }    
    public void move() 
    { 
      setLocation(getX()-10,getY());    
      Actor actor=getOneIntersectingObject(Rocket.class); 
    }   
    public void remove() 
    { 
        if (toRemove || isAtEdge())
        {
           World world;
           world = getWorld();
           world.removeObject(this);
           return;
    }
} 
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Meteors extends Obstacles
{
   
    public void act() 
    {
        move(); 
        Hancur();
        remove(); 
        
    }   
    public void Hancur() 
    {  
        Actor lasars = getOneIntersectingObject(Lasars.class); 
        if(lasars != null) 
        { 
        getWorld().removeObject(lasars);
        for(int i=0;i<10;i++) 
        { 
            int posx=-20+Greenfoot.getRandomNumber(40);  
            int posy=-20+Greenfoot.getRandomNumber(40);
            getWorld().addObject(new Animate(getImage()),getX()+posx,getY()+posy); 
        } 
        getWorld().addObject(new Explosion(),getX(),getY());  
        
        
        
        toRemove=true;
    
}   

} 
}
danpost danpost

2020/11/24

#
NewbJava wrote...
some lasers would hit a meteor and not show the animation and just disappear
Remove all from after line 18 to the keyword "if" on line 25 in the Lazars class.
NewbJava NewbJava

2020/11/24

#
danpost wrote...
NewbJava wrote...
some lasers would hit a meteor and not show the animation and just disappear
Remove all from after line 18 to the keyword "if" on line 25 in the Lazars class.
Thank you, that fixed the problem. I appreciate you taking the time to help me.
You need to login to post a reply.