Movement animation

Sorry about all these questions but I have one more.

I have this sprite sheet were the first three imaegs are the animaton for the guy walking up, then thenext 3 are of him walking down etc. I have figured out how to do this animation, but for some reason, my code doesn’t want my guy to “walk”

In my KeyPeessed It moves the character and trigers it to change frames by setting the varaible walking to true…


            //Check arrows for character movement
      if(e.getKeyCode() == keyUp){
            player_y = player_y - 3;
            walk = true;
            walking = true;
            dir = 1;
            repaint();
      } else if (e.getKeyCode() == keyDown){
            player_y = player_y + 3;
            walk = true;
            walking = true;
            dir = 2;
            repaint();
      } else if (e.getKeyCode() == keyLeft){
            player_x = player_x - 3;
            dir = 3;
            walk = true;
            walking = true;
            repaint();
      } else if (e.getKeyCode() == keyRight){
            player_x = player_x + 3;
            dir = 4;
            walk = true;
            walking = true;
            repaint();
      } 

Then in the KeyRelease method, I make he animation stop by turning off walking…


public void keyReleased(KeyEvent e){ 

      if(e.getKeyCode() == keyUp){

            walking = false;

      } else if (e.getKeyCode() == keyDown){

            walking = false;

      } else if (e.getKeyCode() == keyLeft){


            walking = false;

      } else if (e.getKeyCode() == keyRight){

            walking = false;

      }


      }

Then what does the animation is in my very own drawAvatar method… READ THE NOTES IN THE CODE


      public void drawAvatar(Image avatar,int x,int y,int sprite,int frame,Graphics g){
            int sprite2;
            int up = 0;
            int down = 96;
            int left = 192;
            int right = 288;
      
            sprite2 = sprite * 32;
            //The following IF statements is suppos to trigger the animation....
            if(walk==true){
                  up = 0;
                  down = 96;
                  left = 192;
                  right = 288;

                          //if walking == true, then keep doing the animations, else stop. If you take away the if statement and keep walk = false, the animation will play indefinatly, that is my problem. The animation won't play because of if walking = true

            if(walking == true){
                        walk = false;
                  } else {
                        walk = true;
                  }
                        
            }else if(walk==false){
                  up = 32;
                  down = 128;
                  left = 224;
                  right = 320;
                  walk = true;
            }
            
       
            
            switch(frame){
            
                  case 1:
                        //Up
      
                        g.drawImage(avatar,x,y,x+32,y+32,up,sprite2,up + 32,sprite2+32,this);
                        repaint();
                  break;
                  
                  case 2:
                        //Down
                        g.drawImage(avatar,x,y,x+32,y+32,down,sprite2,down + 32,sprite2+32,this);
                        repaint();
                  break;
                  
                  case 3:
                        //Left
                        g.drawImage(avatar,x,y,x+32,y+32,left,sprite2,left + 32,sprite2+32,this);
                        repaint();
                  break;
                  
                  case 4:
                        //Right                            x    y       x           y
                        g.drawImage(avatar,x,y,x+32,y+32,right,sprite2,right + 32,sprite2+32,this);
                        repaint();
                  break;
            }
      }


[code[

For one thing, you should avoid moving the player directly in the KeyListener methods. Instead of setting player_x and player_y as soon as a key press is detected, you could set a boolean leftPressed, rightPressed, etc. and then move the player during the game loop. You should also be repainting during the game loop, too.

As far as animation goes, you have a lot of booleans that have confusingly similiar names (walk vs. walking?). I think your code is mostly right, though. Try something like this:


if (leftPressed && !rightPressed) {
      //the left arrow is pressed, so set animation to walk left if it's not already
      if (animation != WALK_LEFT)
            setAnimation(WALK_LEFT);
      player_x -= dx;
} else if (rightPressed && !leftPressed) {
      //the right arrow is pressed, so set animation to walk right
      if (animation != WALK_RIGHT)
            setAnimation(WALK_RIGHT);
      player_x += dx;
} else {
      //if no key is pressed, stop walking
      if (animation == WALK_LEFT)
            setAnimation(STAND_LEFT);
      if (animation == WALK_RIGHT)
            setAnimation(STAND_RIGHT);
}

There may be a better way to do that, but that’s what I just came up with.