【问题标题】:How to make different animations for keyboard input如何为键盘输入制作不同的动画
【发布时间】:2021-08-19 19:59:24
【问题描述】:

我正在用 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();
      }
   }
}

播放器类:

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

}

【问题讨论】:

    标签: java animation keyboard project panel


    【解决方案1】:

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

    不要使用变量 faces,而是使用一个名为 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 类的属性,并使用 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);
    }
    

    【讨论】:

    • 您好,感谢您的回答。我做了一些改变。你能看一下吗?
    • 你好@GoodMovies,首先,我是否正确,当你按键时玩家没有改变方向?其次,你设置了一个计时器,每 10 毫秒重置一次玩家图像,我认为这会一直重置你的角色。此外,您正在尝试使用变量 faces 更改玩家的方向,但似乎 faces 变量未在您的 keyPressed 方法之外使用。我建议您创建一个新的简单 Java 文件并尝试我的建议,这样您就不会覆盖现有代码。看看有没有帮助。尽量不要使用计时器
    • 是的,你说得对,我的播放器没有移动。我已根据您的建议删除了计时器并更改了我的代码。我现在遇到的问题是我的屏幕上没有任何东西。我在这里编辑了我的代码,以便您可以看到更新。谢谢
    • 好吧,这可能会做到,请注意在我的paintComponent 方法中第一行是super.paintComponent(g) 这很重要,任何带有图形的swing 应用程序都有这个。尝试包括这个,并告诉我它是否有效
    • 我刚把它放进去,但它似乎仍然不起作用。
    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2015-07-29
    • 2022-06-24
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多