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
相关产品推荐
相关产品推荐

