如何为键盘输入制作不同的动画

How to make different animations for keyboard input

我正在 java 中制作一个自上而下的射击游戏,其中我有一个静止的玩家,他可以左右转动并且可以向移动到中心的敌人开枪(玩家所在的位置) ).当我的播放器转动时,我为每一侧制作了不同的面孔,但是当我使用箭头键时我无法弄清楚如何切换面孔。这是我的主面板:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

public class FinalPanel extends JPanel
{
   private static final int FRAME = 1600;
   private static final Color BACKGROUND = new Color(255, 255, 255);
   private Player player;
   private ImageIcon faces;
   private ImageIcon playerFace = new ImageIcon("PlayerUpImage.png");

   private BufferedImage myImage;
   private Graphics myBuffer;
   private Timer timer;   
   
   public FinalPanel()
   {
      myImage =  new BufferedImage(FRAME, FRAME, BufferedImage.TYPE_INT_RGB);
      myBuffer = myImage.getGraphics();

      

      addKeyListener(new Key());
      setFocusable(true);  
   }
   
   private class Listener implements ActionListener
   {
      public void actionPerformed(ActionEvent e)
      {
         ImageIcon player = new ImageIcon("PlayerUpImage.png");
         myBuffer.drawImage(player.getImage(), 800, 800, null);
         repaint();
      }
   }


   public void paintComponent(Graphics g)
   {
      super.paintComponenet(g);
      g.drawImage(myImage, 0, 0, getWidth(), getHeight(), null);
   }
   private class Key extends KeyAdapter//The arrow keys make the player change directions and it replaces his face with a different animation to show the change in direction
   {
      public void keyPressed(KeyEvent e)
      {
         if(e.getKeyCode() == KeyEvent.VK_W)
         {
            playerFace = new ImageIcon("PlayerUpImage.png");
         }
         if(e.getKeyCode() == KeyEvent.VK_S)
         {
            playerFace = new ImageIcon("PlayerDownImage.png");
         }
         if(e.getKeyCode() == KeyEvent.VK_A)
         {
            playerFace = new ImageIcon("PlayerLeftImage.png");
         }
         if(e.getKeyCode() == KeyEvent.VK_D)
         {
            playerFace = new ImageIcon("PlayerRightImage.png");
         }
         repaint();
      }
   }
}

玩家class:

import java.awt.*;
import javax.swing.*;

public class Player
{
   //Private fields for player class
   private int myX;
   private int myY;
   private int myXWidth;
   private int myYWidth;
   
   public Player()
   {
      myX = 775;
      myY = 775;
      myXWidth = 50;
      myYWidth = 50;
   }
   
   public Player(int x, int y, int xWidth, int yWidth)
   {
      myX = x;
      myY = y;
      myXWidth = xWidth;
      myYWidth = yWidth;
   }
   
   //I borrowed this health code from: 
   int liveCount = 10;

   public boolean damage() {
      --liveCount;
      return isDead();
   }

   public boolean isDead() {
      return liveCount < 1;
   }

   public void boostLives(int moreLives) {
      liveCount += moreLives;
   }

   //Accessor Methods//
   public int getX() 
   { 
      return myX;
   }
   public int getY()      
   { 
      return myY;
   }
   public int getXWidth() 
   { 
      return myXWidth;
   }
   public int getYWidth() 
   { 
      return myYWidth;
   }
   //Modifier Methods//
   public void setX(int x)
   {
      myX = x;
   } 
   public void setY(int y)
   {
      myY = y;
   } 
   public void setXWidth(int xWidth)
   {
      myXWidth = xWidth;
   }
   public void setYWidth(int yWidth)
   {
      myYWidth = yWidth;
   }

}

我有一些可能有用的建议:

不要使用变量面,而是使用一个名为 playerFace 的 ImageIcon,默认方向为向上

private ImageIcon playerFace = new ImageIcon(“PlayerUpImage.png”);

您的绘制方法可能如下所示

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(playerFace.getImage(), 800, 800, null);
}

在你的keyPressed方法中,你所要做的就是改变播放器图像并调用repaint方法,让面板再次调用paintComponent方法:

public void keyPressed(KeyEvent e) {
//pressed d for example
    if(e.getKeyCode() == KeyEvent.VK_D)
        playerFace = new ImageIcon(“PlayerImageRight.png”);
    ... //if else’s for other keys

    repaint();
}

最好,您希望将 playerFaces 作为 Player class 的属性,并使用 getter 方法来获取 playerFace 方向(因此使 playerFace 成为 Player 的变量)。但这是为了让你开始

您还需要设置一个框架,而不是使用您当前的变量 FRAME

public FinalPanel() {
    JFrame frame = new JFrame();
    frame.setSize(1600, 1600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.add(this);
    frame.setVisible(true);

    addKeyListener(new Key());
    setFocusable(true);
}