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