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

2016/12/27

Timer method for hit enemy

1
2
hoegie hoegie

2016/12/27

#
Hi there, I am making a space invader game and have trouble with making an timer method for one of my enemies, the turtle. The goal is when the turtle is hit by a fireball, a timer goes off. Within this (game/frame)time, the turtle is vulnerable to a second attack. When the turtle dies, he falls down and becomes a power-up for our hero. I tried with a boolean statement that sets the timer on or off. I tried with different combinations of for-loops, but nothing works... A big thank you from Belgium, the land of beer and sunshine!
Who can help this Belgian dude out?
    private GreenfootImage turtleRight1;
    private GreenfootImage turtleRight2;
    private GreenfootImage turtleRight3;
    private GreenfootImage turtleRight4;
    private GreenfootImage turtleLeft1;
    private GreenfootImage turtleLeft2;
    private GreenfootImage turtleLeft3;
    private GreenfootImage turtleLeft4;

    private GreenfootImage turtleHitLeft1;
    private GreenfootImage turtleHitLeft2;
    private GreenfootImage turtleHitLeft3;
    private GreenfootImage turtleHitLeft4;
    private GreenfootImage turtleHitRight1;
    private GreenfootImage turtleHitRight2;
    private GreenfootImage turtleHitRight3;
    private GreenfootImage turtleHitRight4;

    private int frame = 1;

    private boolean moveRight;

    private boolean turtleHit;
    
    private int turtleTimer;    

    public Turtle()
    {
        turtleRight1 = new GreenfootImage("turtleRight1.png");
        turtleRight2 = new GreenfootImage("turtleRight2.png");
        turtleRight3 = new GreenfootImage("turtleRight3.png");
        turtleRight4 = new GreenfootImage("turtleRight4.png");
        turtleLeft1 = new GreenfootImage("turtleLeft1.png");
        turtleLeft2 = new GreenfootImage("turtleLeft2.png");
        turtleLeft3 = new GreenfootImage("turtleLeft3.png");
        turtleLeft4 = new GreenfootImage("turtleLeft4.png");

        turtleHitLeft1 = new GreenfootImage("turtleHitLeft1.png");
        turtleHitLeft2 = new GreenfootImage("turtleHitLeft2.png");
        turtleHitLeft3 = new GreenfootImage("turtleHitLeft3.png");
        turtleHitLeft4 = new GreenfootImage("turtleHitLeft4.png");
        turtleHitRight1 = new GreenfootImage("turtleHitRight1.png");
        turtleHitRight2 = new GreenfootImage("turtleHitRight2.png");
        turtleHitRight3 = new GreenfootImage("turtleHitRight3.png");
        turtleHitRight4 = new GreenfootImage("turtleHitRight4.png");

        setImage(turtleRight1);

        frame = 1;

        moveRight = true;

        turtleHit = false;
        turtleTimer = 0;
        

    }

   

    public void act() 
    {

        checkTurtleHit();
        animate();
        animateTurtleHit();
        turnAtEdge();
        dropBomb();

    }

    private void turnAtEdge()
    {
        if (isAtEdge())
        {
            changeDirectionMove();
        }
    }

    private void changeDirectionMove()
    {
        if(moveRight)
        {
            moveRight = false;            
        }
        else
        {
            moveRight = true;

        }
    }

    private void checkTurtleHit()
    {
        if(isTouching(Fireball.class))
        {
          
            turtleTimer = 100;
            turtleTimerMethod();
            //turtleHit = false;

        }
      
        {
            turtleHit = false; 

        } 
        
    private void animate()
    {
        if (moveRight && !turtleHit)
        {
            move(5);  
            if(frame == 2)
            {
                setImage(turtleRight1);
            }
            else if(frame == 3)
            {
                setImage(turtleRight2);
            } 
            else if(frame == 4)
            {
                setImage(turtleRight3);
            }    
            else if(frame == 5)
            {
                setImage(turtleRight4);
                frame = 1;
                return;
            }

            frame++;

        }
        else if (!turtleHit)
        {
            move(-5);
            if(frame == 2)
            {
                setImage(turtleLeft1);
            }
            else if(frame == 3)
            {
                setImage(turtleLeft2);
            }      
            else if(frame == 4)
            {
                setImage(turtleLeft3);
            }    
            else if(frame == 5)
            {
                setImage(turtleLeft4);
                frame = 1;
                return;
            }

            frame++;}
    }

    private void animateTurtleHit()
    {
        if (turtleHit && moveRight)
        {
            move(5);  
            if(frame == 2)
            {
                setImage(turtleHitRight1);
            }
            else if(frame == 3)
            {
                setImage(turtleHitRight2);
            } 
            else if(frame == 4)
            {
                setImage(turtleHitRight3);
            }    
            else if(frame == 5)
            {
                setImage(turtleHitRight4);
                frame = 1;
                return;
            }

            frame++;

        }
        else if (turtleHit && !moveRight)
        {
            move(-5);
            if(frame == 2)
            {
                setImage(turtleHitLeft1);
            }
            else if(frame == 3)
            {
                setImage(turtleHitLeft2);
            }      
            else if(frame == 4)
            {
                setImage(turtleHitLeft3);
            }    
            else if(frame == 5)
            {
                setImage(turtleHitLeft4);
                frame = 1;
                return;
            }

            frame++;}
    }

    }
}
danpost danpost

2016/12/27

#
You do not show any 'turtleTimerMethod' method; and it is only called when touching a Fireball object (which does not seem correct; but, cannot be sure without seeing what the method does).
hoegie hoegie

2016/12/28

#
First of all, thank you for the reply! 1) I have put the full code of my turtle-class below, including my not working turtleTimerMethod 2)The general idea was to enable a timer when the fireball touches the turtle. I thought about enabling the timer and the animation with a boolean value turtleHit. When the timer runs, you see that the turtle is hit and if you can hit it within the time given, the turtle will be destroyed. 3)Can you tell me why it does not seem correct? A big thank you!
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Turtle here.
 * 
 * @author Hans De Maere 
 * @version (a version number or a date)
 */
public class Turtle extends Enemies
{
    /**
     * Act - do whatever the Turtle wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    private GreenfootImage turtleRight1;
    private GreenfootImage turtleRight2;
    private GreenfootImage turtleRight3;
    private GreenfootImage turtleRight4;
    private GreenfootImage turtleLeft1;
    private GreenfootImage turtleLeft2;
    private GreenfootImage turtleLeft3;
    private GreenfootImage turtleLeft4;

    private GreenfootImage turtleHitLeft1;
    private GreenfootImage turtleHitLeft2;
    private GreenfootImage turtleHitLeft3;
    private GreenfootImage turtleHitLeft4;
    private GreenfootImage turtleHitRight1;
    private GreenfootImage turtleHitRight2;
    private GreenfootImage turtleHitRight3;
    private GreenfootImage turtleHitRight4;

    private int frame = 1;

    private boolean moveRight;

    private boolean turtleHit;
    
    private int turtleTimer;    

    public Turtle()
    {
        turtleRight1 = new GreenfootImage("turtleRight1.png");
        turtleRight2 = new GreenfootImage("turtleRight2.png");
        turtleRight3 = new GreenfootImage("turtleRight3.png");
        turtleRight4 = new GreenfootImage("turtleRight4.png");
        turtleLeft1 = new GreenfootImage("turtleLeft1.png");
        turtleLeft2 = new GreenfootImage("turtleLeft2.png");
        turtleLeft3 = new GreenfootImage("turtleLeft3.png");
        turtleLeft4 = new GreenfootImage("turtleLeft4.png");

        turtleHitLeft1 = new GreenfootImage("turtleHitLeft1.png");
        turtleHitLeft2 = new GreenfootImage("turtleHitLeft2.png");
        turtleHitLeft3 = new GreenfootImage("turtleHitLeft3.png");
        turtleHitLeft4 = new GreenfootImage("turtleHitLeft4.png");
        turtleHitRight1 = new GreenfootImage("turtleHitRight1.png");
        turtleHitRight2 = new GreenfootImage("turtleHitRight2.png");
        turtleHitRight3 = new GreenfootImage("turtleHitRight3.png");
        turtleHitRight4 = new GreenfootImage("turtleHitRight4.png");

        setImage(turtleRight1);

        frame = 1;

        moveRight = true;

        turtleHit = false;
        turtleTimer = 0;
        

    }

    /**
     * We bepalen de bewegingen van de vijanden en het droppen van bommen.
     * If de booleaanse expressie moveRight true is dan beweeg ik naar rechts. In het andere
     * geval beweeg ik naar links.
     * Als ik op het einde van de spelwereld kom dan gebruik ik de methode changeDirectionMove
     * 
     */

    public void act() 
    {

        checkTurtleHit();
        animate();
        animateTurtleHit();
        turnAtEdge();
        dropBomb();

    }

    private void turnAtEdge()
    {
        if (isAtEdge())
        {
            changeDirectionMove();
        }
    }

    private void changeDirectionMove()
    {
        if(moveRight)
        {
            moveRight = false;            
        }
        else
        {
            moveRight = true;

        }
    }

    private void checkTurtleHit()
    {
        if(isTouching(Fireball.class))
        {
            //een aparte methode laten incrementeren    en dit combineren met de turtleTimerMethode (maar dan met een while loop, zolang deze conditie true is, de lus uitvoeren...)
            turtleTimer = 100;
            turtleTimerMethod();
            //turtleHit = false;

        }
        /*if(!isTouching(Fireball.class))
         * 
         * 
         * 
         * 
         * 
         * 
        
        {
            turtleHit = false; 

        } 
        */
    }
            

    private void turtleTimerMethod()
    {
        if (turtleTimer > 0)
        {
            turtleTimer--;
            turtleHit = true;
            if(turtleTimer == 1)
            {
                turtleHit = false;
                turtleTimer = 100;
            }
        }
        
        
        
        
        
        
       
        
        /**for (int i = 0; i < turtleTimer; i++)
        {
            turtleHit = true;
               
        }
        
         if (turtleTimer == 49)
        {
            turtleTimer = 0;
            turtleHit = false;
        }        
               
        **/
        //http://www.greenfoot.org/topics/2621
        /**
        while (activateWhileLoop)
        {
            turtleHit = true;
        }
        
        
        
        for (int i = 0; i < turtleTimer; i++)
        {

            turtleHit = true; 

        }
        turtleTimer = 0;
        
        

        //Zolang de timer gaat turtlehitTimer = true
        //nadat deze afgelopen is zetten we deze op false
        //we zetten de turtleTimer opnieuw op 0

        
         * private void createStars(int number) 
        {
        GreenfootImage background = getBackground();             
        for (int i = 0; i < number; i++) 
        {
        int x = Greenfoot.getRandomNumber( getWidth() );
        int y = Greenfoot.getRandomNumber( getHeight() );
        int color = 120 - Greenfoot.getRandomNumber(100);
        background.setColor(new Color(color,color,color));
        background.fillOval(x, y, 2, 2);
        }
         * 
         * 
         * 
         * 
         * 
         * 
         * 
         * 
         * 
         */

        
        
        
    }


    private void animate()
    {
        if (moveRight && !turtleHit)
        {
            move(5);  
            if(frame == 2)
            {
                setImage(turtleRight1);
            }
            else if(frame == 3)
            {
                setImage(turtleRight2);
            } 
            else if(frame == 4)
            {
                setImage(turtleRight3);
            }    
            else if(frame == 5)
            {
                setImage(turtleRight4);
                frame = 1;
                return;
            }

            frame++;

        }
        else if (!turtleHit)
        {
            move(-5);
            if(frame == 2)
            {
                setImage(turtleLeft1);
            }
            else if(frame == 3)
            {
                setImage(turtleLeft2);
            }      
            else if(frame == 4)
            {
                setImage(turtleLeft3);
            }    
            else if(frame == 5)
            {
                setImage(turtleLeft4);
                frame = 1;
                return;
            }

            frame++;}
    }

    private void animateTurtleHit()
    {
        if (turtleHit && moveRight)
        {
            move(5);  
            if(frame == 2)
            {
                setImage(turtleHitRight1);
            }
            else if(frame == 3)
            {
                setImage(turtleHitRight2);
            } 
            else if(frame == 4)
            {
                setImage(turtleHitRight3);
            }    
            else if(frame == 5)
            {
                setImage(turtleHitRight4);
                frame = 1;
                return;
            }

            frame++;

        }
        else if (turtleHit && !moveRight)
        {
            move(-5);
            if(frame == 2)
            {
                setImage(turtleHitLeft1);
            }
            else if(frame == 3)
            {
                setImage(turtleHitLeft2);
            }      
            else if(frame == 4)
            {
                setImage(turtleHitLeft3);
            }    
            else if(frame == 5)
            {
                setImage(turtleHitLeft4);
                frame = 1;
                return;
            }

            frame++;}
    }

    private void dropBomb()
    {
        if(Greenfoot.getRandomNumber(1000)< 2) 
        {
            TurtleBomb turtleBomb = new TurtleBomb ();
            getWorld().addObject(turtleBomb, getX(), getY());

        }
    }
}
danpost danpost

2016/12/28

#
Remove line 148. That only keeps the timer going (I would think you would want it to stop when reaching zero). Remove the 'turtleHit' field altogether. You can check that state by looking at the timer value (if not zero, then was already hit once and timer is running). In the 'checkTurtleHit' method, if touching a Fireball object, you should first check the timer to see whether to make vulnerable or die:
if (isTouching(Fireball.class))
{
    if (turtleTimer == 0) turtleTimer = 100; // only start timer if timer is not already running
    else getWorld().removeObject(this); // die if timer was running
}
else if (turtleTimer > 0) turtleTimer--; // run timer
After the call to 'checkTurtleHit' in the act method, you will need to add the following line:
if (getWorld() == null) return;
This is so that the following code will not execute when the actor has been removed from the world. Your 'anamiteTurtleHit' method can use the value of 'turtleTimer' as well, not only to see IF the animation should run, but to also control that animation.
danpost danpost

2016/12/28

#
When a turtle is hit, is the fireball being removed from the world? I do not see that happening here. If removed from another class or not removed at all, then there will be issues to deal with; unless the fireball is not to be removed, in which case more code changes are needed to prevent the 'isTouching' code above from pretty much immediately removing the turtle from the world.
hoegie hoegie

2016/12/28

#
First of all a big thanks for your fast and very clear post! I understand the timer part... and it makes sense to me. I used the code but as you predicted, it gave problems because I have troubles removing the fireball... I use a boolean value isAlive to set the fireball alive or dead. This works well for my other objects but not for the turtle. Below, you can see the code.
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Fireball here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Fireball extends Actor
{
    private boolean isAlive;

    /**
     * Het initialiseren van de Fireball. We declareren een veld isAlive en initialiseren deze als zijnde 
     * een Boolean (true)
     */

    public Fireball()
    {
        isAlive = true;

    }

    /**
     * De Fireball draait -90 graden en beweegt naar boven
     * checkHit controleert of er vijanden geraakt worden en verwijderd deze
     * removeEndOfThisWorld controleert of de Fireball het einde van het speelveld bereikt en verwijderd deze dan
     * checkIsAlive controleert adhv de booleaanse expressie isAlive of de Fireball dient verwijderd te worden
     */
    public void act() 
    {

        setLocation(getX(), getY()-10);   

        checkHit(); 
        removeEndOfWorld();

        checkIsAlive();

    }

    /**http://www.greenfoot.org/doc/tut-3 - uitleg samenvatten dmv deze tutorial:
     * We declareren een variabele van het type Actor. Dit doen we omdat de methode getOneObjectAtOffset vraagt naar een actor. 
     * Vanuit deze actor roepen we de methode getoneoObject... aan.
     * Hierin bewaren we het resultaat van de methode getOneObjectAtOffset 
    Indien deze variabele niet leeg is dan doen we iets. We maken een variable van het type world
    We vragen de wereld op en steken deze in deze variabele world. We hebben nu een referentie naar de wereld.
    We roepen de wereld op en gebruiken deze om het object 
    te verwijderen

    VERDER UITZOEKEN ofwel doen met isTouching removeTouching 
     */

    private void checkHit()
    {

        Actor turtle;
        turtle = getOneObjectAtOffset(0, 0, Turtle.class);
        if(turtle != null)
        {
            World world; 
            world = getWorld();
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);
            
                        
        }

        Actor snail;
        snail = getOneObjectAtOffset(0, 0, Snail.class);
        if(snail != null)
        {
            World world; 
            world = getWorld();
            world.removeObject(snail);
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);
            
        }

        Actor dragon;
        dragon = getOneObjectAtOffset(0, 0, Dragon.class);
        if(dragon != null)
        {
            World world; 
            world = getWorld();
            world.removeObject(dragon);
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);

        }
        
        Actor snailBomb;
        snailBomb = getOneObjectAtOffset(0, 0, SnailBomb.class);
        if(snailBomb != null)
        {
            World world; 
            world = getWorld();
            world.removeObject(snailBomb);
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);

        }
        
        Actor dragonBomb;
        dragonBomb = getOneObjectAtOffset(0, 0, DragonBomb.class);
        if(dragonBomb != null)
        {
            World world; 
            world = getWorld();
            world.removeObject(dragonBomb);
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);

        }
        
        Actor turtleBomb;
        turtleBomb = getOneObjectAtOffset(0, 0, TurtleBomb.class);
        if(turtleBomb != null)
        {
            World world; 
            world = getWorld();
            world.removeObject(turtleBomb);
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);

        }
        
        
        
        
        }
    
          

    /**
     * Indien mijn Fireball voorbij positie 5 op de y-as gaat dan verwijder ik mezelf 
     * (this = de instantie van de klasse fireball)
     */ 
    
    private void removeEndOfWorld()
    {
        if(getY() <= 5)
        {
            isAlive = false;                    
        }
    }

    /**
     * We declareren een veld isAlive en initialiseren deze als zijnde 
     * een Boolean (true) 
     */

    private void checkIsAlive()
    {
        if(!isAlive) {
            getWorld().removeObject(this);
        }
    }

}

danpost danpost

2016/12/28

#
I was not aware you had collision checking between a turtle and a fireball in the class of the Fireball. In fact, that is a major issue -- you should not check for collision between two types of objects in more than one place. Since all you do with the fireball upon collision is remove it, it would seem best to place the collision code between these two in the class of the turtle. The fireball collision code with other objects are okay where they are, as you are just removing those objects as well. Remove lines 56 through 70 of the FIreball class code above and insert the following at line 5 in my last code post:
Actor fireball = getOneIntersectingObject(Fireball.class);
Greenfoot.playSound("enemieFirstHit.wav");
Explosion explosion = new Explosion();
getWorld().addObject(explosion, fireball.getX(), fireball.getY()-20);
getWorld().removeObject(fireball);
hoegie hoegie

2016/12/28

#
Thanks, I will try it out! When my game is ready, I will post it on the site... maybe it can - in some way - help others
hoegie hoegie

2017/1/2

#
I tried the code but I get errors like actor not in the world? I tried different modifications and alterations but I allways get the same kind of errors, "actor not in this world" It has something to do with the checkTurtleHit method but I do not know where the problem is... I have changed the collision detection from the fireball to the turtle. Thanks in advance for clearing things out... I can feel I am almost there :-)
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Turtle here.
 * 
 * @author Hans De Maere 
 * @version (a version number or a date)
 */
public class Turtle extends Enemies
{
    /**
     * Act - do whatever the Turtle wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    private GreenfootImage turtleRight1;
    private GreenfootImage turtleRight2;
    private GreenfootImage turtleRight3;
    private GreenfootImage turtleRight4;
    private GreenfootImage turtleLeft1;
    private GreenfootImage turtleLeft2;
    private GreenfootImage turtleLeft3;
    private GreenfootImage turtleLeft4;

    private GreenfootImage turtleHitLeft1;
    private GreenfootImage turtleHitLeft2;
    private GreenfootImage turtleHitLeft3;
    private GreenfootImage turtleHitLeft4;
    private GreenfootImage turtleHitRight1;
    private GreenfootImage turtleHitRight2;
    private GreenfootImage turtleHitRight3;
    private GreenfootImage turtleHitRight4;

    private int frame = 1;

    private boolean moveRight;

    private boolean turtleHit;

    private int turtleTimer; 
    private Counter counter; //we maken een veld waarin de de referentie naar de counter kan opgeslagen worden.

    public Turtle(Counter newCounter)
    {
        counter = newCounter; // De constructor ontvangt een counter (type) en slaagt deze op als parameter newCounter. deze is onze referentie naar de counterklasse. We maken deze en bewaren deze daarna in het veld counter.

        turtleRight1 = new GreenfootImage("turtleRight1.png");
        turtleRight2 = new GreenfootImage("turtleRight2.png");
        turtleRight3 = new GreenfootImage("turtleRight3.png");
        turtleRight4 = new GreenfootImage("turtleRight4.png");
        turtleLeft1 = new GreenfootImage("turtleLeft1.png");
        turtleLeft2 = new GreenfootImage("turtleLeft2.png");
        turtleLeft3 = new GreenfootImage("turtleLeft3.png");
        turtleLeft4 = new GreenfootImage("turtleLeft4.png");

        turtleHitLeft1 = new GreenfootImage("turtleHitLeft1.png");
        turtleHitLeft2 = new GreenfootImage("turtleHitLeft2.png");
        turtleHitLeft3 = new GreenfootImage("turtleHitLeft3.png");
        turtleHitLeft4 = new GreenfootImage("turtleHitLeft4.png");
        turtleHitRight1 = new GreenfootImage("turtleHitRight1.png");
        turtleHitRight2 = new GreenfootImage("turtleHitRight2.png");
        turtleHitRight3 = new GreenfootImage("turtleHitRight3.png");
        turtleHitRight4 = new GreenfootImage("turtleHitRight4.png");

        setImage(turtleRight1);

        frame = 1;

        moveRight = true;

        turtleHit = false;
        turtleTimer = 0;

    }

    /**
     * We bepalen de bewegingen van de vijanden en het droppen van bommen.
     * If de booleaanse expressie moveRight true is dan beweeg ik naar rechts. In het andere
     * geval beweeg ik naar links.
     * Als ik op het einde van de spelwereld kom dan gebruik ik de methode changeDirectionMove
     * 
     */

    public void act() 
    {

        checkTurtleHit();
        if (getWorld() == null) return;
        animate();
        animateTurtleHit();
        turnAtEdge();
        dropBomb();


    }

    private void turnAtEdge()
    {
        if (isAtEdge())
        {
            changeDirectionMove();
        }
    }

    private void changeDirectionMove()
    {
        if(moveRight)
        {
            moveRight = false;            
        }
        else
        {
            moveRight = true;

        }
    }

    private void checkTurtleHit()
    {

        /**Actor fireball;
        fireball = getOneObjectAtOffset(0, 0, Fireball.class);
        if(fireball != null)
        {
        counter.addScore(10);
        World world; 
        world = getWorld();
        world.removeObject(fireball);
        Greenfoot.playSound("enemieFirstHit.wav");
        Explosion explosion = new Explosion ();
        getWorld().addObject(explosion, getX(), getY()-20);

        }
         */
        Actor fireball = getOneIntersectingObject(Fireball.class);
        Greenfoot.playSound("enemieFirstHit.wav");
        Explosion explosion = new Explosion();
        getWorld().addObject(explosion, fireball.getX(), fireball.getY()-20);
        getWorld().removeObject(fireball);

        
        if(isTouching(Fireball.class))
        {
            if (turtleTimer == 0) turtleTimer = 100; // de timer alleen laten starten indien hij nog niet aan het lopen is
            else getWorld().removeObject(this); // sterven indien de timer aan het lopen is
        }
        else if (turtleTimer > 0) turtleTimer--; // timer laten lopen
        

    }

    private void animate()
    {
        if (moveRight && !turtleHit)
        {
            move(5);  
            if(frame == 2)
            {
                setImage(turtleRight1);
            }
            else if(frame == 3)
            {
                setImage(turtleRight2);
            } 
            else if(frame == 4)
            {
                setImage(turtleRight3);
            }    
            else if(frame == 5)
            {
                setImage(turtleRight4);
                frame = 1;
                return;
            }

            frame++;

        }
        else if (!turtleHit)
        {
            move(-5);
            if(frame == 2)
            {
                setImage(turtleLeft1);
            }
            else if(frame == 3)
            {
                setImage(turtleLeft2);
            }      
            else if(frame == 4)
            {
                setImage(turtleLeft3);
            }    
            else if(frame == 5)
            {
                setImage(turtleLeft4);
                frame = 1;
                return;
            }

            frame++;}
    }

    private void animateTurtleHit()
    {
        if (turtleHit && moveRight)
        {
            move(5);  
            if(frame == 2)
            {
                setImage(turtleHitRight1);
            }
            else if(frame == 3)
            {
                setImage(turtleHitRight2);
            } 
            else if(frame == 4)
            {
                setImage(turtleHitRight3);
            }    
            else if(frame == 5)
            {
                setImage(turtleHitRight4);
                frame = 1;
                return;
            }

            frame++;

        }
        else if (turtleHit && !moveRight)
        {
            move(-5);
            if(frame == 2)
            {
                setImage(turtleHitLeft1);
            }
            else if(frame == 3)
            {
                setImage(turtleHitLeft2);
            }      
            else if(frame == 4)
            {
                setImage(turtleHitLeft3);
            }    
            else if(frame == 5)
            {
                setImage(turtleHitLeft4);
                frame = 1;
                return;
            }

            frame++;}
    }

    private void dropBomb()
    {
        if(Greenfoot.getRandomNumber(1000)< 2) 
        {
            TurtleBomb turtleBomb = new TurtleBomb ();
            getWorld().addObject(turtleBomb, getX(), getY());

        }
    }
}
hoegie hoegie

2017/1/2

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

/**
 * Write a description of class Fireball here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Fireball extends Actor
{
    private boolean isAlive;
    private Counter counter; //we maken een veld waarin de de referentie naar de counter kan opgeslagen worden.

    /**
     * Het initialiseren van de Fireball. We declareren een veld isAlive en initialiseren deze als zijnde 
     * een Boolean (true)
     * De constructor van het pinguinObject verwacht een counterobject. Dit om een referentie te hebben naar de counter.
     */

    public Fireball(Counter newCounter)
    {
        counter = newCounter; // De constructor ontvangt een counter (type) en slaagt deze op als parameter newCounter. deze is onze referentie naar de counterklasse. We maken deze en bewaren deze daarna in het veld counter.
        isAlive = true;

    }

    /**
     * De Fireball draait -90 graden en beweegt naar boven
     * checkHit controleert of er vijanden geraakt worden en verwijderd deze
     * removeEndOfThisWorld controleert of de Fireball het einde van het speelveld bereikt en verwijderd deze dan
     * checkIsAlive controleert adhv de booleaanse expressie isAlive of de Fireball dient verwijderd te worden
     */
    public void act() 
    {

        setLocation(getX(), getY()-10);   

        checkHit(); 
        removeEndOfWorld();

        checkIsAlive();

    }

    /**http://www.greenfoot.org/doc/tut-3 - uitleg samenvatten dmv deze tutorial:
     * We declareren een variabele van het type Actor. Dit doen we omdat de methode getOneObjectAtOffset vraagt naar een actor. 
     * Vanuit deze actor roepen we de methode getoneoObject... aan.
     * Hierin bewaren we het resultaat van de methode getOneObjectAtOffset 
    Indien deze variabele niet leeg is dan doen we iets. We maken een variable van het type world
    We vragen de wereld op en steken deze in deze variabele world. We hebben nu een referentie naar de wereld.
    We roepen de wereld op en gebruiken deze om het object 
    te verwijderen

    VERDER UITZOEKEN ofwel doen met isTouching removeTouching 
     */

    private void checkHit()
    {

        /**Actor turtle;
        turtle = getOneObjectAtOffset(0, 0, Turtle.class);
        if(turtle != null)
        {
            World world; 
            world = getWorld();
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);
            
                        
        }*/

        Actor snail;
        snail = getOneObjectAtOffset(0, 0, Snail.class);
        if(snail != null)
        {
            counter.addScore(5);
            World world; 
            world = getWorld();
            world.removeObject(snail);
            
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);
            
        }

        Actor dragon;
        dragon = getOneObjectAtOffset(0, 0, Dragon.class);
        if(dragon != null)
        {
            counter.addScore(10);
            World world; 
            world = getWorld();
            world.removeObject(dragon);
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);

        }
        
        Actor snailBomb;
        snailBomb = getOneObjectAtOffset(0, 0, SnailBomb.class);
        if(snailBomb != null)
        {
            counter.addScore(1);
            World world; 
            world = getWorld();
            world.removeObject(snailBomb);
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);

        }
        
        Actor dragonBomb;
        dragonBomb = getOneObjectAtOffset(0, 0, DragonBomb.class);
        if(dragonBomb != null)
        {
            counter.addScore(3);
            World world; 
            world = getWorld();
            world.removeObject(dragonBomb);
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);

        }
        
        Actor turtleBomb;
        turtleBomb = getOneObjectAtOffset(0, 0, TurtleBomb.class);
        if(turtleBomb != null)
        {
            counter.addScore(5);
            World world; 
            world = getWorld();
            world.removeObject(turtleBomb);
            isAlive = false;
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion ();
            getWorld().addObject(explosion, getX(), getY()-20);

        }
        
        
        
        
        }
    
          

    /**
     * Indien mijn Fireball voorbij positie 5 op de y-as gaat dan verwijder ik mezelf 
     * (this = de instantie van de klasse fireball)
     */ 
    
    private void removeEndOfWorld()
    {
        if(getY() <= 5)
        {
            isAlive = false;                    
        }
    }

    /**
     * We declareren een veld isAlive en initialiseren deze als zijnde 
     * een Boolean (true) 
     */

    private void checkIsAlive()
    {
        if(!isAlive) {
            getWorld().removeObject(this);
        }
    }

}

danpost danpost

2017/1/2

#
Try this for the 'checkTurtleHit' method:
public void checkTurtleHit()
{
    if (isTouching(Fireball.class))
    {
        if (turtleTimer == 0)
        {
            turtleTimer = 100;
            Actor fireball = getOneIntersectingObject(Fireball.class);
            Greenfoot.playSound("enemieFirstHit.wav");
            Explosion explosion = new Explosion();
            getWorld().addObject(explosion, fireball.getX(), fireball.getY()-20);
            getWorld().removeObject(fireball);
        }
        else getWorld().removeObject(this);
    }
    else if (turtleTimer > 0) turtleTimer--;
}
hoegie hoegie

2017/1/2

#
Thanks for the fast reply. I will try it ASAP!
hoegie hoegie

2017/1/2

#
The code works! I have two questions: 1) I have altered it a bit because I want the turtle to change it´ s animation as long as the timer runs. In the animationmethod "animateTurtleHit()" you can see that I work with a Boolean value "turtleHit" The idea is to use it as a switch to animateTurtleHit (timed method) or to animate a normal turtle. When the turtle is hit, the animation lasts 100 counts and the returns to normal animation. I can make switch it on, I can switch it off, but I can not use it within the timer? 2) Is there any way of avoiding this line of code or using something different? I have to explain to my teacher every code use but this is a bit too difficult for me to explain... This is a suggestion you have mad. It works, but I cannot understand it... "After the call to 'checkTurtleHit' in the act method, you will need to add the following line: 1 if (getWorld() == null) return; This is so that the following code will not execute when the actor has been removed from the world." Big thanks!
hoegie hoegie

2017/1/2

#
private void checkTurtleHit()
    {

        {
            if (isTouching(Fireball.class))
            {
                if (turtleTimer == 0)
                {
                    turtleTimer = 100;
                    Actor fireball = getOneIntersectingObject(Fireball.class);
                    Greenfoot.playSound("enemieFirstHit.wav");
                    Explosion explosion = new Explosion();
                    getWorld().addObject(explosion, fireball.getX(), fireball.getY()-20);
                    getWorld().removeObject(fireball);
                    turtleHit = true;
                }
                else
                {               
                    Greenfoot.playSound("enemieFirstHit.wav");
                    Explosion explosion = new Explosion();
                    getWorld().addObject(explosion, getX(), getY()-20);
                    getWorld().removeObject(this);
                                    }
            }
            else if (turtleTimer > 0) 
            {
                turtleTimer--;                            
            }
            else if (turtleTimer == 1) 
            {
               turtleHit = false;            
            }
        }

    }
hoegie hoegie

2017/1/2

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

/**
 * Write a description of class Turtle here.
 * 
 * @author Hans De Maere 
 * @version (a version number or a date)
 */
public class Turtle extends Enemies
{
    /**
     * Act - do whatever the Turtle wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    private GreenfootImage turtleRight1;
    private GreenfootImage turtleRight2;
    private GreenfootImage turtleRight3;
    private GreenfootImage turtleRight4;
    private GreenfootImage turtleLeft1;
    private GreenfootImage turtleLeft2;
    private GreenfootImage turtleLeft3;
    private GreenfootImage turtleLeft4;

    private GreenfootImage turtleHitLeft1;
    private GreenfootImage turtleHitLeft2;
    private GreenfootImage turtleHitLeft3;
    private GreenfootImage turtleHitLeft4;
    private GreenfootImage turtleHitRight1;
    private GreenfootImage turtleHitRight2;
    private GreenfootImage turtleHitRight3;
    private GreenfootImage turtleHitRight4;

    private int frame = 1;

    private boolean moveRight;

    private boolean turtleHit;

    private int turtleTimer; 
    private Counter counter; //we maken een veld waarin de de referentie naar de counter kan opgeslagen worden.

    public Turtle(Counter newCounter)
    {
        counter = newCounter; // De constructor ontvangt een counter (type) en slaagt deze op als parameter newCounter. deze is onze referentie naar de counterklasse. We maken deze en bewaren deze daarna in het veld counter.

        turtleRight1 = new GreenfootImage("turtleRight1.png");
        turtleRight2 = new GreenfootImage("turtleRight2.png");
        turtleRight3 = new GreenfootImage("turtleRight3.png");
        turtleRight4 = new GreenfootImage("turtleRight4.png");
        turtleLeft1 = new GreenfootImage("turtleLeft1.png");
        turtleLeft2 = new GreenfootImage("turtleLeft2.png");
        turtleLeft3 = new GreenfootImage("turtleLeft3.png");
        turtleLeft4 = new GreenfootImage("turtleLeft4.png");

        turtleHitLeft1 = new GreenfootImage("turtleHitLeft1.png");
        turtleHitLeft2 = new GreenfootImage("turtleHitLeft2.png");
        turtleHitLeft3 = new GreenfootImage("turtleHitLeft3.png");
        turtleHitLeft4 = new GreenfootImage("turtleHitLeft4.png");
        turtleHitRight1 = new GreenfootImage("turtleHitRight1.png");
        turtleHitRight2 = new GreenfootImage("turtleHitRight2.png");
        turtleHitRight3 = new GreenfootImage("turtleHitRight3.png");
        turtleHitRight4 = new GreenfootImage("turtleHitRight4.png");

        setImage(turtleRight1);

        frame = 1;

        moveRight = true;

        turtleHit = false;
        turtleTimer = 0;

    }

    /**
     * We bepalen de bewegingen van de vijanden en het droppen van bommen.
     * If de booleaanse expressie moveRight true is dan beweeg ik naar rechts. In het andere
     * geval beweeg ik naar links.
     * Als ik op het einde van de spelwereld kom dan gebruik ik de methode changeDirectionMove
     * 
     */

    public void act() 
    {

        checkTurtleHit();
        if (getWorld() == null) return;
        animate();
        animateTurtleHit();
        turnAtEdge();
        dropBomb();

    }

    private void turnAtEdge()
    {
        if (isAtEdge())
        {
            changeDirectionMove();
        }
    }

    private void changeDirectionMove()
    {
        if(moveRight)
        {
            moveRight = false;            
        }
        else
        {
            moveRight = true;

        }
    }

    /**
     * 
     * We maken een timer die aftelt van 100 naar 0
     */
    
    
    private void checkTurtleHit()
    {

        {
            if (isTouching(Fireball.class))
            {
                if (turtleTimer == 0)
                {
                    turtleTimer = 100;
                    Actor fireball = getOneIntersectingObject(Fireball.class);
                    Greenfoot.playSound("enemieFirstHit.wav");
                    Explosion explosion = new Explosion();
                    getWorld().addObject(explosion, fireball.getX(), fireball.getY()-20);
                    getWorld().removeObject(fireball);
                    turtleHit = true;
                }
                else
                {               
                    Greenfoot.playSound("enemieFirstHit.wav");
                    Explosion explosion = new Explosion();
                    getWorld().addObject(explosion, getX(), getY()-20);
                    getWorld().removeObject(this);
                                    }
            }
            else if (turtleTimer > 0) 
            {
                turtleTimer--;                            
            }
            else if (turtleTimer == 1) 
            {
               turtleHit = false;            
            }
        }

    }

    private void animate()
    {
        if (moveRight && !turtleHit)
        {
            move(5);  
            if(frame == 2)
            {
                setImage(turtleRight1);
            }
            else if(frame == 3)
            {
                setImage(turtleRight2);
            } 
            else if(frame == 4)
            {
                setImage(turtleRight3);
            }    
            else if(frame == 5)
            {
                setImage(turtleRight4);
                frame = 1;
                return;
            }

            frame++;

        }
        else if (!turtleHit)
        {
            move(-5);
            if(frame == 2)
            {
                setImage(turtleLeft1);
            }
            else if(frame == 3)
            {
                setImage(turtleLeft2);
            }      
            else if(frame == 4)
            {
                setImage(turtleLeft3);
            }    
            else if(frame == 5)
            {
                setImage(turtleLeft4);
                frame = 1;
                return;
            }

            frame++;}
    }

    private void animateTurtleHit()
    {
        if (turtleHit && moveRight)
        {
            move(5);  
            if(frame == 2)
            {
                setImage(turtleHitRight1);
            }
            else if(frame == 3)
            {
                setImage(turtleHitRight2);
            } 
            else if(frame == 4)
            {
                setImage(turtleHitRight3);
            }    
            else if(frame == 5)
            {
                setImage(turtleHitRight4);
                frame = 1;
                return;
            }

            frame++;

        }
        else if (turtleHit && !moveRight)
        {
            move(-5);
            if(frame == 2)
            {
                setImage(turtleHitLeft1);
            }
            else if(frame == 3)
            {
                setImage(turtleHitLeft2);
            }      
            else if(frame == 4)
            {
                setImage(turtleHitLeft3);
            }    
            else if(frame == 5)
            {
                setImage(turtleHitLeft4);
                frame = 1;
                return;
            }

            frame++;}
    }

    private void dropBomb()
    {
        if(Greenfoot.getRandomNumber(1000)< 2) 
        {
            TurtleBomb turtleBomb = new TurtleBomb ();
            getWorld().addObject(turtleBomb, getX(), getY());

        }
    }
}
There are more replies on the next page.
1
2