如何使用键绑定在屏幕上移动矩形?

我正在尝试创建的游戏是蛇,到目前为止我已经想出如何使用paint(Graphics g)一点JPanel ,鼠标监听器,现在我正在尝试创建一个将在屏幕上移动的矩形使用键绑定或键侦听器,但我不知道我应该怎么做。

这是我的代码到目前为止,它有2个部分。 第一部分叫做snake2因为如果我不知道自己在做什么,我会用不同的东西制作相同的程序。 Snake使用框架,但Snake2使用JPanel (看起来更好……)

  import java.awt.*; //required for MouseListener import java.awt.event.*; //requied for Graohics import java.applet.*; import javax.swing.*; public class Snake2 extends JPanel { private Rectangle sampleObject; public Snake2() { addMouseListener(new MouseListener()); } /* create background */ public void paint (Graphics g) { Font angel = new Font("Angelic War", Font.BOLD, 60); Font ith = new Font("Ithornît", Font.BOLD, 78); setBackground(Color.darkGray); g.setColor(Color.darkGray); g.fillRect(0,0,700,850); g.setColor(Color.gray); g.fillRect(50,150,600,650); g.setColor(Color.white); g.drawRect(50,150,600,650); g.drawString("Quit",52,116); g.drawRect(50,100,30,20); //g.setFont(angel); //g.drawString("SNAKE",300,70); g.setFont(ith); g.drawString("SNAKE",280,90); } public void sprite (int x, int y, Graphics g){ g.setColor(Color.white); g.fillRect(300,200,10,10); } public void start (int x, int y, Graphics g){ g.setColor(Color.white); g.drawString("START GAME",300,425); } } /* Tracks where mouse is clicked */ class MouseListener extends MouseAdapter { public void mouseReleased(MouseEvent me) { if (me.getX() >= 50 && me.getX() = 100 && me.getY() <= 120) { System.exit(0); } String str="Mouse Released at "+me.getX()+","+me.getY(); System.out.println(str); } } 

第二部分是:

  import javax.swing.JFrame; import java.awt.Dimension; public class SnakeDisplay { public static void main ( String [ ] arguments ) { JFrame frame = new JFrame ( "Snake" ); Snake2 panel = new Snake2 ( ); frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE ); frame.add ( panel ); frame.setContentPane ( panel ); frame.setPreferredSize ( new Dimension ( 700, 850 ) ); //frame.setLocationRelativeTo ( null ); frame.setVisible ( true ); frame.pack ( ); } } 

  1. 您应该覆盖paintComponent中的paintComponent并在其中调用super.paintComponent(g)
  2. 请参见如何使用键绑定教程 。 在这种情况下,键绑定是优先的,而不是KeyListener
  3. pack() 然后 setVisible()
  4. 您应该为x anf y location设置全局变量,以便可以在Action访问它们。 然后在你的动作中,增加你的x或y并重新绘制

尝试运行此示例

 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class KeyBidings extends JFrame { int x = 0; int y = 0; DrawPanel drawPanel = new DrawPanel(); public KeyBidings(){ Action rightAction = new AbstractAction(){ public void actionPerformed(ActionEvent e) { x +=10; drawPanel.repaint(); } }; InputMap inputMap = drawPanel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW); ActionMap actionMap = drawPanel.getActionMap(); inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "rightAction"); actionMap.put("rightAction", rightAction); add(drawPanel); pack(); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); setVisible(true); } private class DrawPanel extends JPanel { protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.GRAY); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.GREEN); g.fillRect(x, y, 50, 50); } public Dimension getPreferredSize() { return new Dimension(400, 200); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ public void run(){ new KeyBidings(); } }); } } 

在此处输入图像描述

这是你更关心的代码

  Action rightAction = new AbstractAction(){ public void actionPerformed(ActionEvent e) { x +=10; drawPanel.repaint(); } }; InputMap inputMap = drawPanel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW); ActionMap actionMap = drawPanel.getActionMap(); inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "rightAction"); actionMap.put("rightAction", rightAction); 

创建自定义操作并将该操作添加到操作映射,并链接到输入映射击键。 在动作中,根据方向增加或减小x和/或y,然后重新绘制面板。


请参阅 密钥绑定教程 | 图形教程