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

2017/11/30

Trying to shoot randomly appearing enemy but get error

Brantgarron Brantgarron

2017/11/30

#
When I try to shoot my randomly appearing enemy an error pops up saying "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." Although, In my world I am pretty sure that I added the code for the randomly appearing enemy. Also he only appears once and I would like him to appear every 30 seconds or so.
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class ammo here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class ammo  extends Actor
{
    boolean removed;
    /**
     * Act - do whatever the ammo wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    
    public ammo()
    {
        removed = false;
    }
    public void act() 
    {
        if(removed)
        return;
        move();
        killEnemy();
        

    }   
    public void move()
    {
        if(getY()<=0)
        {
            removed = true;
            getWorld().removeObject(this);
            return;
        }
        setLocation(getX(), getY()-10);
    }
    public void killEnemy()
    { 
        
        Actor enemy = getOneObjectAtOffset(0,0,Enemy.class);
        if(enemy != null)
        {

            getWorld().removeObject(enemy);
            getWorld().removeObject(this);
            
        }
    }
}
Brantgarron Brantgarron

2017/11/30

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

/**
 * Write a description of class doodleWorld here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class doodleWorld  extends World
{
    boolean bStarted, started = false;
    boolean once;
    int transparency = 0;
    int scrollSpeed;
    boolean scroll;
    boolean fall;
    boolean ended;
    int restart;
    
    int height = 0;
    int doodleX;
    /**
     * Constructor for objects of class doodleWorld.
     * 
     */
    public doodleWorld()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(300,400, 1,false); 

        addObject(new ground(), 56, 317);
        addObject(new doodler(false), 56,200);
        setPaintOrder(scoreKeeper.class, doodler.class, ground.class, ammo.class);
        setBackground("title.png");
        getBackground().setTransparency(255);
        once = true;
        started = false;
        height = 0;
        fall = false;
        ended = false;
    }

    public void act()
    {
        if(bStarted==false & Greenfoot.mouseMoved(this))
        {
            bStarted = true;
        }

        if(started==false & bStarted==true)
        {
            MouseInfo mouse = Greenfoot.getMouseInfo();

            if(Greenfoot.mouseClicked(this))
            {
                if(mouse.getX()>=45 & mouse.getX()<=148
                && mouse.getY()>=104 & mouse.getY()<=138)
                {
                    started = true;
                }
            }
        }
        if(started==true & once==true)
        {
            setBackground("paper.png");
            cleanup();
            once = false;
            setLevel(1);
        }
        if(fall)
        {
            end();
        
        }

    }
    public void spawnEnemy(int numEnemies)
    {
        for (int i = 0; i< numEnemies; i++)
        {
            Enemy e = new Enemy();
            addObject(e, Greenfoot.getRandomNumber(getWidth()), Greenfoot.getRandomNumber(getHeight()));
           
        }
    }
    
    
    public void cleanup()
    {
        removeObjects(getObjects(doodler.class));
        removeObjects(getObjects(ground.class));
    }

    public void setLevel(int level)
    {
        switch(level)
        {
            case 1: gamePlay(); break;
        }
    }

    public void gamePlay()
    {
        addObject(new doodler(), getWidth()/2, 300);
        addObject(new ground(false), 28,391);
        addObject(new ground(false), 83,391);
        addObject(new ground(false), 83+55,391);
        addObject(new ground(false), 83+55+55,391);
        addObject(new ground(false), 83+55+55+55,391);
        addObject(new ground(false), 83+55+55+55+55,391);
        
        addObject(new ground(), Greenfoot.getRandomNumber(300), 250);
        addObject(new ground(), Greenfoot.getRandomNumber(300), 150);
        addObject(new ground(), Greenfoot.getRandomNumber(300), 50);
        addObject(new Enemy(), Greenfoot.getRandomNumber(300), 50);
        addObject(new scoreKeeper(), 253,385);
    }
    
    public void end()
    {
        cleanup();
        /*started=false;
        bStarted=false;
        addObject(new ground(), 56, 317);
        addObject(new doodler(false), 56,200);

        setBackground("title.png");
        getBackground().setTransparency(255);
        once = true;
        started = false;
        height = 0;
        fall = false;
        ended = false;*/
        addObject(new GameOver(),getWidth()/2,getHeight()/2);
        
        
        
        
    }
}

Super_Hippo Super_Hippo

2017/11/30

#
Problem 1: Move line 25 (or 26) to the beginning of the act method (before you use that 'if (removed)'. Problem 2: Yes, you have the spawn Enemy method but it is never used. You only add a new Enemy in lime 115 (gamePlay method) which is called once when the first Level is created, not while the actual game is running.
Brantgarron Brantgarron

2017/11/30

#
Super_Hippo wrote...
Problem 1: Move line 25 (or 26) to the beginning of the act method (before you use that 'if (removed)'. Problem 2: Yes, you have the spawn Enemy method but it is never used. You only add a new Enemy in lime 115 (gamePlay method) which is called once when the first Level is created, not while the actual game is running.
How would I do it while the game is running
Super_Hippo Super_Hippo

2017/11/30

#
You can have a variable used as a timer in your world.
private int enemySpawnTimeMax=30*55, enemySpawnTimer=enemySpawnTimeMax; 

public void act()
{
    if (--enemySpawnTimer == 0)
    {
        enemySpawnTimer = enemySpawnTimeMax;
        addObject(new Enemy(), Greenfoot.getRandomNumber(300), 50);
    }
}
You need to login to post a reply.