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);
}
}
