You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java顶视角射击游戏如何通过键盘输入切换玩家朝向动画

存在的问题

  • paintComponent方法拼写错误,调用父类方法时误写为paintComponenet,导致绘制逻辑异常
  • 仅修改了playerFace变量,没有将该变量对应的图像绘制到界面上,切换操作没有对应渲染逻辑
  • 离屏缓冲myBuffer没有先填充背景,也没有绘制玩家头像的逻辑
  • 定时器相关代码未初始化启动,原有定时绘制逻辑完全不执行
  • 每次按键都重新加载图片,资源重复加载效率低,容易出现卡顿

修复后的完整代码

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 final ImageIcon PLAYER_UP = new ImageIcon("PlayerUpImage.png");
   private final ImageIcon PLAYER_DOWN = new ImageIcon("PlayerDownImage.png");
   private final ImageIcon PLAYER_LEFT = new ImageIcon("PlayerLeftImage.png");
   private final ImageIcon PLAYER_RIGHT = new ImageIcon("PlayerRightImage.png");
   
   private Player player;
   private ImageIcon playerFace = PLAYER_UP;

   private BufferedImage myImage;
   private Graphics myBuffer;
   private Timer timer;   
   
   public FinalPanel()
   {
      myImage =  new BufferedImage(FRAME, FRAME, BufferedImage.TYPE_INT_RGB);
      myBuffer = myImage.getGraphics();
      // 初始化玩家对象
      player = new Player();
      // 初始化定时器,50ms刷新一次(20帧)
      timer = new Timer(50, new Listener());
      timer.start();

      addKeyListener(new Key());
      setFocusable(true);  
   }
   
   private class Listener implements ActionListener
   {
      public void actionPerformed(ActionEvent e)
      {
         // 先清空背景
         myBuffer.setColor(BACKGROUND);
         myBuffer.fillRect(0,0,FRAME,FRAME);
         // 绘制当前朝向的玩家头像,位置用player对象的坐标
         myBuffer.drawImage(playerFace.getImage(), player.getX(), player.getY(), player.getXWidth(), player.getYWidth(), null);
         repaint();
      }
   }


   public void paintComponent(Graphics g)
   {
      // 修正拼写错误
      super.paintComponent(g);
      g.drawImage(myImage, 0, 0, getWidth(), getHeight(), null);
   }
   // 按键控制玩家切换朝向,同时更换对应的面部动画展示朝向变化
   private class Key extends KeyAdapter
   {
      public void keyPressed(KeyEvent e)
      {
         if(e.getKeyCode() == KeyEvent.VK_W)
         {
            playerFace = PLAYER_UP;
         }
         if(e.getKeyCode() == KeyEvent.VK_S)
         {
            playerFace = PLAYER_DOWN;
         }
         if(e.getKeyCode() == KeyEvent.VK_A)
         {
            playerFace = PLAYER_LEFT;
         }
         if(e.getKeyCode() == KeyEvent.VK_D)
         {
            playerFace = PLAYER_RIGHT;
         }
      }
   }
}

注意事项

  • 请确保所有玩家素材图片放在项目的工作目录下,否则会加载失败显示空白
  • 如果需要调整玩家大小,可以直接修改Player类的构造参数,绘制时会自动适配尺寸

内容的提问来源于stack exchange,提问作者GoodMovies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 14:54:04