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

2017/9/16

Multiple Animations

Ethannnn6122 Ethannnn6122

2017/9/16

#
I'm trying to make animations on key presses. My code seems to partially work but if you click the key twice or click 2 keys at the same time it breaks and the animation gets stuck on one frame. I was wondering if anyone had a better way of doing this. My Code:
import greenfoot.*;  
 
public class Cole extends Actor
{
    private final GreenfootImage RMstart= new GreenfootImage("ColeIdle1.png");

    private final GreenfootImage RMwalk1= new GreenfootImage("ColeMoore1.png");
    private final GreenfootImage RMwalk2= new GreenfootImage("ColeMoore2.png");
    private final GreenfootImage RMwalk3= new GreenfootImage("ColeMoore3.png");
    private final GreenfootImage RMwalk4= new GreenfootImage("ColeMoore4.png");
    
    private final GreenfootImage RMp1 = new GreenfootImage("ColeMoorep1.png");
    private final GreenfootImage RMp2 = new GreenfootImage("ColeMoorep2.png"); 
    private final GreenfootImage RMp3 = new GreenfootImage("ColeMoorep3.png");
    private final GreenfootImage RMp4 = new GreenfootImage("ColeMoorep4.png"); 
    private final GreenfootImage RMp5 = new GreenfootImage("ColeMoorep5.png");
    private final GreenfootImage RMp6 = new GreenfootImage("ColeMoorep6.png"); 
  
    
    private final GreenfootImage LMstart= new GreenfootImage(RMstart);
 

    private final GreenfootImage LMwalk1 = new GreenfootImage(RMwalk1);
    private final GreenfootImage LMwalk2 = new GreenfootImage(RMwalk2);
    private final GreenfootImage LMwalk3 = new GreenfootImage(RMwalk3);
    private final GreenfootImage LMwalk4 = new GreenfootImage(RMwalk4);
    
    private final GreenfootImage LMp1 = new GreenfootImage(RMp1);
    private final GreenfootImage LMp2 = new GreenfootImage(RMp2); 
    private final GreenfootImage LMp3 = new GreenfootImage(RMp3);
    private final GreenfootImage LMp4 = new GreenfootImage(RMp4); 
    private final GreenfootImage LMp5 = new GreenfootImage(RMp5);
    private final GreenfootImage LMp6 = new GreenfootImage(RMp6); 
    
  
    
    private int speed = 3;
    private int frame;
    private boolean walking;
    private boolean facingRight;
    private boolean isKeyPressed;
    private int Wdelay = 5;
    private int pdelay = 5;
 
    public Cole()
    {
        setImage(RMstart);
        walking = false;
        facingRight = true;
        
        LMstart.mirrorHorizontally();
   
        LMwalk1.mirrorHorizontally();     
        LMwalk2.mirrorHorizontally();     
        LMwalk3.mirrorHorizontally();
        LMwalk4.mirrorHorizontally();  
        
        LMp1.mirrorHorizontally();
        LMp2.mirrorHorizontally();
        LMp3.mirrorHorizontally();
        LMp4.mirrorHorizontally();
        LMp5.mirrorHorizontally();
        LMp6.mirrorHorizontally();
              
        
      
    }
 
  
    public void act() 
    {
        checkKeys();
    }
 
  
   public void checkKeys()
    {
        isKeyPressed = false;
        if (Greenfoot.isKeyDown("d") && Greenfoot.isKeyDown("a"))
        {
            stopWalking();
            isKeyPressed = true;
        }
        else if (Greenfoot.isKeyDown("d"))
        {
            walkRight();
            setLocation (getX()+speed, getY());
            isKeyPressed = true;
        }
        else if (Greenfoot.isKeyDown("a"))
        {
            walkLeft();
            setLocation (getX()-speed, getY());
            isKeyPressed = true;
        }if (Greenfoot.isKeyDown("e") && (facingRight == true)) {
            isKeyPressed = true;
            rightPunch();
        }
        if (Greenfoot.isKeyDown("e") && (facingRight == false)) {
            isKeyPressed = true;
            leftPunch();
        }
        if (!(isKeyPressed))
        {
            stopWalking();
        }
    }
   
    
    public void rightPunch(){
      walking= false;
      facingRight= true;
      frame++;
      
      if (frame==1 *pdelay) {
          
        } else if (frame==2 * pdelay)  {
            setImage(RMp1);
        }
        else if (frame==3 * pdelay)  {
            setImage(RMp2);
        }
        else if (frame==4 * pdelay)  {
            setImage(RMp3);
        }
        else if (frame==5 * pdelay)  {
            setImage(RMp4);
        }
        else if (frame==6 * pdelay)  {
            setImage(RMp5);
        }
        else if (frame==7 * pdelay)  {
            setImage(RMp6);
            frame =1;
            return;
        }
    }
    public void leftPunch()
    {
        walking = false;
        facingRight = false;
        frame ++;
        if(frame < 1 * pdelay)
        {
          
        }
        else if(frame < 2 * pdelay)
        {
            setImage(LMp1);
        }
        else if(frame < 3 * pdelay)
        {
            setImage(LMp2);
        }
        else if (frame < 4 * pdelay)
        {
            setImage(LMp3);
        }
        else if (frame < 5 * pdelay) 
        {
            setImage(LMp4);
            
        }
        else if (frame < 6 * pdelay) 
        {
            setImage(LMp5);
            
        }
        else if (frame < 7 * pdelay) 
        {
            setImage(LMp6);
            frame=1;
            return ;
        }
    }
 
    public void walkRight()
    { 
        walking = true;
        facingRight = true;
        frame ++;
         if(frame==1 * Wdelay)
        {
           
        }
        else if(frame==2 * Wdelay)
        {
            setImage(RMwalk1);
        }
        else if(frame==3 * Wdelay)
        {
            setImage(RMwalk2);
        }
        else if (frame==4 * Wdelay)
        {
            setImage(RMwalk3);
        } else if (frame==5 * Wdelay) 
        {
            setImage(RMwalk4);
            frame =1;
            return;
        }
            
 
    }
 
    public void walkLeft()
    {
        walking = true;
        facingRight = false;
        frame ++;
        if(frame < 1 * Wdelay)
        {
          
        }
        else if(frame < 2 * Wdelay)
        {
            setImage(LMwalk1);
        }
        else if(frame < 3 * Wdelay)
        {
            setImage(LMwalk2);
        }
        else if (frame < 4 * Wdelay)
        {
            setImage(LMwalk3);
        }
        else if (frame < 5 * Wdelay) 
        {
            setImage(LMwalk4);
            frame =1;
            return;
        }
    }
 
    public void stopWalking()
    {
        walking = false;
        if (facingRight)
            setImage(RMstart);
        else
            setImage(LMstart);
    }
}
danpost danpost

2017/9/17

#
One problem is with the conditions used in your animation methods. In leftPunch and walkLeft, no matter what the number of frame below number of images in set times the delay, the last 'if' condition will end up to be true -- and its image will be what you end up viewing. Change "<' to ">' (or ">=') so all images in a set will be viewed at some point. In other methods, you are using '==', which is not only inconsistent, but may not work when changing from one image set to another.
You need to login to post a reply.