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

2019/6/4

Creating Animations for Two Actors

ButerWarior ButerWarior

2019/6/4

#
I'm currently trying to create an explosion animation for both spaceship and monsters at contact. My first problem is that the Greenfoot.delay freezes the wholle game itself, which is unsatisfying, and the second problem is that a monster that is farther away rolls the animation. Here is my code for the spaceship:
if(!getObjectsInRange(100,monsters.class).isEmpty())
        {
            monsters monsters = (monsters) getWorld().getObjects(monsters.class).get(0);
            monsters.setImage("explosion1 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion2 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion3 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion4 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion5 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion6 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion7 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion8 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion9 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion10 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion11 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion12 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion13 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion14 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion15 img.png");
            Greenfoot.delay(1);
            monsters.setImage("explosion16 img.png");
            Greenfoot.delay(1);
            removeTouching(monsters.class);
            setImage("explosion1 img.png");
            Greenfoot.delay(1);
            setImage("explosion2 img.png");
            Greenfoot.delay(1);
            setImage("explosion3 img.png");
            Greenfoot.delay(1);
            setImage("explosion4 img.png");
            Greenfoot.delay(1);
            setImage("explosion5 img.png");
            Greenfoot.delay(1);
            setImage("explosion6 img.png");
            Greenfoot.delay(1);
            setImage("explosion7 img.png");
            Greenfoot.delay(1);
            setImage("explosion8 img.png");
            Greenfoot.delay(1);
            setImage("explosion9 img.png");
            Greenfoot.delay(1);
            setImage("explosion10 img.png");
            Greenfoot.delay(1);
            setImage("explosion11 img.png");
            Greenfoot.delay(1);
            setImage("explosion12 img.png");
            Greenfoot.delay(1);
            setImage("explosion13 img.png");
            Greenfoot.delay(1);
            setImage("explosion14 img.png");
            Greenfoot.delay(1);
            setImage("explosion15 img.png");
            Greenfoot.delay(1);
            setImage("explosion16 img.png");
            Greenfoot.delay(1);
            getWorld().removeObject(this);
        }
        else
        {
            if(Greenfoot.mouseMoved(null) || Greenfoot.mouseDragged (null))
            {
                MouseInfo mouse =Greenfoot.getMouseInfo();
                setLocation(mouse.getX(), mouse.getY());
            }
        }
Super_Hippo Super_Hippo

2019/6/4

#
Yes, you should never use the "delay" method for a game unless you want everything to freeze.
private static GreenfootImage explosionImages = new GreenfootImage[16];

static
{
    for (int i=1; i<explosionImages.length+1; i++)
    {
        explosionImages[i-1] = new GreenfootImage("explosion"+i+" img.png");
    }
}

private int explosionTimer = -1; //-1 = not active

public void act()
{
    if (explosionTimer > -1)
    {
        if (explosionTimer == explosionImage.length)
        {
            getWorld().removeObject(this);
            return;
        }
        setImage(explosionImage[explosionTimer++]);
        return;
    }
    
    //rest of act method for when the object isn't destroyed yet
}

public void startExplosion()
{
    if (explosionTimer < 0) explosionTimer = 0;
}
Then, you can start the explosions like this: (if the above code is in both classes or in a superclass of both)
Monster monster = (Monster) getOneIntersectingObject(Monster.class);
if (monster != null)
{
    monster.startExplosion();
    startExplosion();
}
(Didn't test the code, so there might be a few mistakes.) The second problem happens because you check for a monster in a range, but then get a reference to the first monster in the world no matter where it is.
ButerWarior ButerWarior

2019/6/4

#
Is it possible to create the animation with the command getObjectsInRange? When I use getOneIntersectingObject, it looks odd when they do overlap, since I didn't create transparent backgrounds.
Super_Hippo Super_Hippo

2019/6/4

#
Yes, you could either do:
if (!getObjectsInRange(100, Monster.class).isEmpty())
{
    getObjectsInRange(100, Monster.class).get(0).startExplosion();
    startExplosion;
}
Or:
for (Monster monster : getObjectsInRange(100, Monster.class))
{
    monster.startExplosion();
    startExplosion();
}
(Not exactly sure if any manuell casting is required, but in theory, it should not.)
ButerWarior ButerWarior

2019/6/4

#
Another problem is when I do
GreenfootImage explosionImages = new GreenfootImage[16];
When I do this, idk y but it says that greenfoot.greenfootimage cannot be converted to greenfoot.greenfootimage.
Super_Hippo Super_Hippo

2019/6/5

#
Should be this:
GreenfootImage[] explosionImages = new GreenfootImage[16];
ButerWarior ButerWarior

2019/6/5

#
Wow that cleared out most of the other errors, and I can actually understand how that works. Now, the only problem is that when I code it so it acts startExplosion, it says that startExplosion is not a method. Btw, spelling is correct, and I definitely have the method. Thanks in advance, you rly helped me out. EDIT: Nvm, all I had to do was remove the startExplosion after the get(0). THANK YOU NOW MY GAME WORKS AS I WANTED IT TO.
Super_Hippo Super_Hippo

2019/6/5

#
If you remove the "startExplosion", the monster will not (or at least should not) explode though, only the spaceship. A line like this does not do anything:
getObjectsInRange(100, Monster.class).get(0);
Maybe it has to be this:
((Monster) getObjectsInRange(100, Monster.class).get(0)).startExplosion();
You need to login to post a reply.