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

2013/3/29

moving and turning objects

2
3
4
5
6
7
8
Gingervitis Gingervitis

2013/3/30

#
should this replace the entire code then?
Gingervitis Gingervitis

2013/3/30

#
this isn't working.... it is making a million worms appear on screen, it says else without if.....
danpost danpost

2013/3/30

#
No, that just take care of the worms. It does not take care of the lobsters. The whole method will end up to be something like
public void lookForWorm()
{ 
    if ( canSee(Worm.class))
    {
        eat(Worm.class);
        Greenfoot.playSound("slurp.wav");
        wormsEaten++;
        if(counter != null) counter.add(1);
        if (!getWorld().getObjects(Worm.class).isEmpty()) return;
        //Start new round
        counter2.add(1);
        int numWorms = 0;
        if (wormsEaten == 27) numWorms = 30;
        else if (wormsEaten <= 288) numWorms = 33;
        else if (wormsEaten <= 915) numWorms = 66;
        else numWorms = 76;
        for (int i=0; i<numWorms; i++) createNewWorm();
        int numLobsters = 0;
        if (wormsEaten < 90) numLobsters = 4; else numLobsters = 6;
        for (int i=0; i<numLobsters; i++) createNewLobster();
    }
}
I noticed you had three counter classes all with the same code (just different names). You can create all your counters from the same class; just use a different name for each one, as follows:
Counter counter = new Counter();
Counter counter2 = new Counter();
Counter counter3 = new Counter();
danpost danpost

2013/3/30

#
You can also be more descriptive:
Counter scoreCounter = new Counter();
Counter levelCounter = new Counter();
// etc.
Gingervitis Gingervitis

2013/3/30

#
WOW. All that code was so simple and did so much.... I did not know that for the counters.... So I can remove the other 2 and just add what you wrote?
danpost danpost

2013/3/30

#
That and change the Class names in the constructor parameters for the Crab.
Gingervitis Gingervitis

2013/3/30

#
Thank you!
danpost danpost

2013/3/30

#
Also, you need to change the instance field declarations for the counters to be of type Counter; and remove Counter2.class from the setPaintOrder statement in the world class.
Gingervitis Gingervitis

2013/3/30

#
Yes, I did remove that .... is there a generic statement or set of code I could use that will set the boolean statement of another class true, from my crab class? I'm still confused trying to reference a boolean from another class....
danpost danpost

2013/3/30

#
'set a boolean statement of another class': do you mean 'set the value of a boolean variable in another class'?
Gingervitis Gingervitis

2013/3/30

#
I think.... Like being able to set it true or false from another class.... You are aware that I have power-ups in my game, and I want to create a lot of power-ups that will set other classes to do different things using booleans....if I have a generic way of setting that up, then I won't be asking you to set each power-up up for me......
Gingervitis Gingervitis

2013/3/30

#
I managed to set up another power-up copying and changing what you told me to do from a previous comment, but I got and error saying: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at Dominator.lobsterPowerUp(Dominator.java:30) at Dominator.act(Dominator.java:24) at greenfoot.core.Simulation.actActor(Simulation.java:565) at greenfoot.core.Simulation.runOneLoop(Simulation.java:523) at greenfoot.core.Simulation.runContent(Simulation.java:213) at greenfoot.core.Simulation.run(Simulation.java:203) What does this mean?
danpost danpost

2013/3/30

#
For a basic time-limited power-up, use a static timer field and static methods to get and set values (or state):
// add a static int field for the timer in the class that the power-up is for
private static int puTimer;
//                   -------------------
//     ---    add public static methods     ---
// setting the power-up state
public static void startPowerUp()
{
    puTimer = 200;
    // whatever needs to be done when power-up is started (or re-started)
}

// running the timer
public static void checkPuTimer()
{
    if (puTimer > 0) puTimer--;
    if (puTimer == 0)
    {
         // whatever needs done when timer expires
    }
}

// getting the power-up state
public static boolean isPoweredUp()
{
    return puTimer > 0;
}
//                       ---------------------
// in the world act method (to run the timers)
ClassName.checkPuTimer();
ClassName2.checkPuTimer();
// etc.
//                       ----------------------[
// from another class to get/set values (or states)
ClassName.staticMethodName(<params>);
danpost danpost

2013/3/30

#
The first recognizable line from the top that refers to your code is the fourth line of the error message: at Dominator.lobsterPowerUp(Dominator.java:30) The error occured in your Dominator class, in the lobsterPowerUp method (line 30 in the class). The array you are working with in that line does not have any data in it and therefore trying to 'get' something from it is futile (hence the error).
Gingervitis Gingervitis

2013/3/30

#
I think I screwed up the code for the power-up... when the lobster class is empty i get the same error, even when the power-up isn't active (this is a new power-up) Here is the code for the crab and dominator class
import greenfoot.*;  // (World, Actor, GreenfootImage, and Greenfoot)
import java.util.ArrayList;
/**
 * This class defines a crab. Crabs live on the beach. They like sand worms 
 * (very yummy, especially the green ones).
 * 
 * Version: 5
 * 
 * In this version, the crab behaves as before, but we add animation of the 
 * image.
 * 
 */

public class Crab extends Animal
{
    private GreenfootImage image1;
    private GreenfootImage image2;

    private int wormsEaten;
    private int timer1;
    private int timer2;
    private int timer3;
    private int angle;

    private Counter  scoreCounter;
    private Counter levelCounter;
    private Counter counter3;
    
    private DominatorPower1 powerUp;
    private DominatorPower2 dpPowerUp;
    private WormPowerUp wormPowerUp;

    public static boolean hasPowerUp;
    /**
     * Create a crab and initialize its two images.
     */
    public Crab()
    {

    }

    public Crab(Counter pointCounter, Counter pointCounter2)
    {
        scoreCounter  = pointCounter;
        levelCounter = pointCounter2;
        

        image1 = new GreenfootImage("crab.png");
        image2 = new GreenfootImage("crab2.png");
        setImage(image1);
    }

    /** 
     * Act - do whatever the crab wants to do. This method is called whenever
     *  the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act()
    {
        checkKeypress();
        switchImage();
        lookForWorm();
        cheat();
        ifCanSeeDP();
        addPowerUps();
        ifCanSeeWP();
        ifCanSeeLP1();
        ifCanSeeDP2();
    }

    public void setPowerUp(DominatorPower1 pu)  
    {  
        powerUp = pu;  
    }

    public void setWormPowerUp(WormPowerUp wpu)  
    {  
        wormPowerUp = wpu;   
    }
    
    public void setDPU2(DominatorPower2 dp2)
    {
        dpPowerUp = dp2;
    }

    /**
     * Alternate the crab's image between image1 and image2.
     */
    public void switchImage()
    {
        if ( getImage() == image1)
        {
            setImage(image2);
        }
        else
        {
            setImage(image1);
        }
    }

    /**
     * Check whether a control key on the keyboard has been pressed.
     * If it has, react accordingly.
     */
    public void checkKeypress()
    {
        if (Greenfoot.isKeyDown("left"))
        {

            move(-4);
            turn(-5);

        }
        setRotation(360);
        if (Greenfoot.isKeyDown("right"))
        {

            move(4);
            turn(5);

        }
        setRotation(90);  
        if (Greenfoot.isKeyDown("up"))  
        { 
            move(-4);

        }  
        if (Greenfoot.isKeyDown("down"))  
        {
            move(4);

        } 
        setRotation(0);
    }

    public void cheat()
    {
        String key=Greenfoot.getKey() ;
        if (key == null) return;  
        if ("".equals(key)  )     
        {
            createNewDominator();
        }
    }

    public void ifCanSeeDP()
    {
        if (canSee(DominatorPower.class))  
        {  
            eat(DominatorPower.class);  
            getWorld().removeObjects(getWorld().getObjects(DominatorPower1.class));  
            powerUp = new DominatorPower1();  
            getWorld().addObject(powerUp, getX(), getY());  
            timer1 = 500;  
        }  
        if (!isPoweredUp()) return;  
        angle = (angle+5)%360;    
        powerUp.setLocation(getX(), getY());    
        powerUp.setRotation(angle);    
        powerUp.move(40);  
        powerUp.turn(90);  
        timer1--;  
        if (timer1 == 0) getWorld().removeObject(powerUp);  

        if (timer1 >= 0 ) hasPowerUp=true;
        else
        {
            hasPowerUp = false;
        }
    }

    
    public boolean isPoweredUp()  
    {  
        return (powerUp != null && powerUp.getWorld() != null);

    }

    public boolean isWormPoweredUp()  
    {  
        return (wormPowerUp != null && wormPowerUp.getWorld() != null);        
    }
    
    public boolean isdp2PoweredUp()  
    {  
        return (dpPowerUp != null && dpPowerUp.getWorld() != null);        
    }

    public boolean wormPowerUp()
    {
        Crab crab = (Crab) getWorld().getObjects(Crab.class).get(0);  
        turnTowards(crab.getX(), crab.getY());   
        move(3);
        return false;
    }

    public boolean wormPowered()  
    {  
        return timer2 > 0;  
    }
    
    public boolean dp2Powered()
    {
        return timer3 > 0 ;
    }
    
    public void ifCanSeeLP1()
    {
        if (canSee(LobsterPowerUp1.class))
        {
            eat(LobsterPowerUp1.class);
            createNewLobster();
        }
    }
    
    public void ifCanSeeDP2()
    {
        if (canSee(DominatorPower2.class))
        {
            eat(DominatorPower2.class);
            getWorld().removeObjects(getWorld().getObjects(DominatorPower2.class));
            timer3 = 200;
            if (!isdp2PoweredUp()) return;
            timer3--;
            if (timer3 == 0) getWorld().removeObject(dpPowerUp);
        }
    }
    
    public void ifCanSeeWP()
    {
        if (canSee(WormPower.class))
        {
            eat(WormPower.class);
            getWorld().removeObjects(getWorld().getObjects(WormPower.class));  
            wormPowerUp = new WormPowerUp();  
            getWorld().addObject(wormPowerUp, getX(), getY());  
            timer2 = 150; 
        }
        if (!isWormPoweredUp()) return;  
        timer2--; 
        if (timer2 == 0) getWorld().removeObject(wormPowerUp);
    }

    public void addPowerUps()    
    {
        if (levelCounter.getValue() >= 1)
        {
            Greenfoot.getRandomNumber(10000);
            if (Greenfoot.getRandomNumber(10000) <= 10)
            {
                createNewDominatorPower();
            }
            
            if (Greenfoot.getRandomNumber(10000) <= 10)
            {
                createNewDominatorPower2();
            }
        }
        
        if (levelCounter.getValue() >=2)
        {
            Greenfoot.getRandomNumber(10000);
            if (Greenfoot.getRandomNumber(10000) <= 10)
            {
                createNewLobsterPower1();
            }
        }

        if (levelCounter.getValue() >= 5)
        {
            Greenfoot.getRandomNumber(10000);
            if (Greenfoot.getRandomNumber(10000) <= 10)
            {
                createNewWormPower();
            }
        }
    }

    /**
     * Check whether we have stumbled upon a worm.
     * If we have, eat it. If not, do nothing. If we have
     * eaten eight worms, we win.
     * 0   = Round 1   321 = Round 11   981  = Round 21
     * 27  = Round 2   387 = Round 12   1057 = Round 22
     * 57  = Round 3   453 = Round 13   1133 = Round 23
     * 90  = Round 4   519 = Round 14   1209 = Round 24
     * 123 = Round 5   585 = Round 15
     * 156 = Round 6   651 = Round 16
     * 189 = Round 7   717 = Round 17
     * 222 = Round 8   783 = Round 18
     * 255 = Round 9   849 = Round 19
     * 288 = Round 10  915 = Round 20
     */
    public void lookForWorm()
    { 

        if ( canSee(Worm.class))
        {
            eat(Worm.class);  
        Greenfoot.playSound("slurp.wav");  
        wormsEaten++;  
        if(scoreCounter != null) scoreCounter.add(1);  
        if (!getWorld().getObjects(Worm.class).isEmpty()) return;  
        //Start new round  
        levelCounter.add(1);  
        int numWorms = 0;  
        if (wormsEaten == 27) numWorms = 30;  
        else if (wormsEaten <= 288) numWorms = 33;  
        else if (wormsEaten <= 915) numWorms = 66;  
        else numWorms = 76;  
        for (int i=0; i<numWorms; i++) createNewWorm();  
        int numLobsters = 0;  
        if (wormsEaten < 90) numLobsters = 4; else numLobsters = 6;  
        for (int i=0; i<numLobsters; i++) createNewLobster();

        }
    }

    public void turnAtEdge()
    {
        if ( atWorldEdge())
        {
            turn(17);
        }
    }

    public void randomTurn()
    {
        if (Greenfoot.getRandomNumber(100) < 10)
        {
            turn( Greenfoot.getRandomNumber(45) );
        }  
    }

    public void createNewDominator()
    {
        Dominator newDominator;
        newDominator = new Dominator();

        World world;
        world = getWorld();

        int worldWidth = world.getWidth();
        int worldHeight =world.getHeight();

        int x = Greenfoot.getRandomNumber(worldWidth);
        int y = Greenfoot.getRandomNumber(worldHeight);
        world.addObject(newDominator, x, y);

    }

    public void createNewWorm()
    {
        Worm worm = new Worm();

        World world = getWorld();

        int worldWidth = world.getWidth();
        int worldHeight =world.getHeight();

        int x = Greenfoot.getRandomNumber(worldWidth);
        int y = Greenfoot.getRandomNumber(worldHeight);
        world.addObject(worm, x, y);
    }

    public void createNewLobster()
    {
        Lobster lobster = new Lobster();

        World world = getWorld();

        int worldWidth = world.getWidth();
        int worldHeight =world.getHeight();

        int x = Greenfoot.getRandomNumber(worldWidth);
        int y = Greenfoot.getRandomNumber(worldHeight);
        world.addObject(lobster, x, y);
        if ( x == getX() && y ==getY())
        {
            Crab crab = new Crab();
            world.addObject(crab, x, y);
        }
    }

    public void createNewDominatorPower()
    {
        DominatorPower dp = new DominatorPower();

        World world = getWorld();

        int worldWidth = world.getWidth();
        //int worldHeight =world.getHeight();

        int x = Greenfoot.getRandomNumber(worldWidth);

        world.addObject(dp, x, 1);
    }
    
    public void createNewDominatorPower2()
    {
        DominatorPower2 dp2 = new DominatorPower2();

        World world = getWorld();

        int worldWidth = world.getWidth();
        //int worldHeight =world.getHeight();

        int x = Greenfoot.getRandomNumber(worldWidth);

        world.addObject(dp2, x, 1);
    }

    public void createNewWormPower()
    {
        WormPower wp = new WormPower();

        World world = getWorld();

        int worldWidth = world.getWidth();
        //int worldHeight =world.getHeight();

        int x = Greenfoot.getRandomNumber(worldWidth);

        world.addObject(wp, x, 1);
    }
    
    public void createNewLobsterPower1()
    {
        LobsterPowerUp1 lpu1 = new LobsterPowerUp1();

        World world = getWorld();

        int worldWidth = world.getWidth();
        //int worldHeight =world.getHeight();

        int x = Greenfoot.getRandomNumber(worldWidth);

        world.addObject(lpu1, x, 1);
    }
}
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Dominator here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Dominator extends Animal
{
    /**
     * Act - do whatever the Dominator wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    int lobster = 0;
    public boolean lobsterPowerUp;
    public void act() 
    {
        move(5);
        lookForLobster();
        turnAtEdge();
        randomTurn();
        lobstersEaten();
        lobsterPowerUp();
    }  
    
    public void lobsterPowerUp()
    {
        Crab crab = (Crab) getWorld().getObjects(Crab.class).get(0);
        Lobster lobster = (Lobster) getWorld().getObjects(Lobster.class).get(0);
        if (crab != null && crab.dp2Powered())  
        {  
            turnTowards(lobster.getX(), lobster.getY());  
            move(3);  
            //if (getWorld().getObjects(Lobster.class).isEmpty()) return;
        }  
    }

    
    public void turnAtEdge()
    {
        if ( atWorldEdge())
        {
            turn(17);
        }
    }

    public void randomTurn()
    {
        if (Greenfoot.getRandomNumber(100) < 10)
        {
            turn( Greenfoot.getRandomNumber(45) );
        }  
    }

    public void lobstersEaten()
    {
        if (canSee(Lobster.class))
        {
            eat(Lobster.class);
        }

        if(getWorld().getObjects(Lobster.class).isEmpty())
        {
            if (canSee(Crab.class))
            {
                //eat(Crab.class);
            }
        }

    }

    /**
     * Check whether we have stumbled upon a lobster.
     * If we have, eat it. If not, do nothing. If we have
     * eaten x lobsters, we win.
     */
    public void lookForLobster()
    { 
        if ( canSee(Lobster.class))
        {
            eat(Lobster.class);
            Greenfoot.playSound("slurp.wav");
            lobster = lobster + 1;
        }

        if(getWorld().getObjects(Lobster.class).isEmpty())
        {
            if (canSee(Crab.class))
            {
                eat(Crab.class);
            }
        }

    }
}
There are more replies on the next page.
2
3
4
5
6
7
8