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

Java 如何为键盘输入制作不同的动画,java,animation,keyboard,project,panel,Java,Animation,Keyboard,Project,Panel,我正在用爪哇制作一个自上而下的射击游戏,我有一个固定的玩家,他可以左右转动,可以向移动到中间(玩家所在的位置)的敌人开枪。当我的球员转身时,我为每一边做了不同的面,但我不知道如何在使用箭头键时切换面。这是我的主面板: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; public class FinalPanel extends JPanel { priva

我正在用爪哇制作一个自上而下的射击游戏,我有一个固定的玩家,他可以左右转动,可以向移动到中间(玩家所在的位置)的敌人开枪。当我的球员转身时,我为每一边做了不同的面,但我不知道如何在使用箭头键时切换面。这是我的主面板:

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();
      }
   }
}
球员级别:

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: https://stackoverflow.com/questions/9834609/how-to-make-a-player-class-that-holds-lives-inheritance//
   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;
   }

}
import java.awt.*;
导入javax.swing.*;
公开课选手
{
//玩家类的私有字段
私有int myX;
私家密室;
私有int myXWidth;
密威茨私人酒店;
公共玩家()
{
myX=775;
myY=775;
myXWidth=50;
myYWidth=50;
}
公共播放器(整数x,整数y,整数xWidth,整数yWidth)
{
myX=x;
myY=y;
myXWidth=xWidth;
myYWidth=yWidth;
}
//我从以下地方借用了此健康代码:https://stackoverflow.com/questions/9834609/how-to-make-a-player-class-that-holds-lives-inheritance//
int-liveCount=10;
公共布尔损坏(){
--活计数;
返回isDead();
}
公共布尔ISDED(){
返回liveCount<1;
}
公共虚空boostLives(int morelifes){
liveCount+=更多生命;
}
//存取器方法//
公共int getX()
{ 
返回myX;
}
公共int getY()
{ 
返回myY;
}
公共int getXWidth()
{ 
返回myXWidth;
}
public int getYWidth()
{ 
返回myYWidth;
}
//修正方法//
公共无效集合x(整数x)
{
myX=x;
} 
公共空间设置(整数y)
{
myY=y;
} 
公共void setXWidth(int xWidth)
{
myXWidth=xWidth;
}
公共无效设置宽度(整数宽度)
{
myYWidth=yWidth;
}
}

我有一些建议可能会有所帮助:

不要使用可变面,而是使用名为playerFace的图像图标,默认方向为向上

private ImageIcon playerFace = new ImageIcon(“PlayerUpImage.png”);
您的绘制方法可以如下所示

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(playerFace.getImage(), 800, 800, null);
}
在按下键的方法中,您所要做的就是更改播放器图像并调用方法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();
}
最好是将playerFace作为Player类的一个属性,并使用getter方法来获取playerFace方向(从而使playerFace成为Player的变量)。但这是为了让你开始

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

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

嘿,谢谢你的回答。我做了一些改变。你能看一下吗?你好@GoodMovies,首先,当你按键时,播放器没有改变方向,我说的对吗?其次,你设置了一个计时器,每10毫秒重置一次你的玩家图像,我认为这就是一直重置你的角色。此外,您正试图使用可变面更改播放器的方向,但似乎在您的按键方法之外没有使用面变量。我建议您创建一个新的简单Java文件,并尝试我的建议,这样您就不会重写现有代码。看看是否有帮助。尽量不要使用计时器,你是对的,我的播放器没有移动。我已经删除了计时器,并根据您的建议更改了代码。我现在的问题是,我的屏幕上没有任何内容。我在这里编辑了我的代码,以便您可以看到更新。谢谢这可能会做到,注意在我的paintComponent方法中,第一行是super.paintComponent(g),这很重要,任何带有图形的swing应用程序都有这一点。试着包括这个,告诉我它是否有效我只是把它放进去,但它似乎仍然不起作用。