3.让小蛇动起来
想让他动,让它实现监听就好了。
思路:
- 写一个键盘监听器,监听面板上的一切东西
- 直接在GamePanel实现KeyListener接口,重写这三个方法,降低成本
- 写按压方法即可,其余两个没用,空着就好
- 想要监听事件被开启生效,需要加一些设置就获取键盘的一些监听。在构造器里边设置一下。
- 启动测试,空格就被监听上了
1 package com.gui.snake; 2 3 import javax.swing.*; 4 import java.awt.*; 5 import java.awt.event.KeyEvent; 6 import java.awt.event.KeyListener; 7 8 //游戏的面板 9 public class GamePanel extends JPanel implements KeyListener { 10 11 //定义蛇的数据结构 12 int length; //蛇的长度 13 int[] snakeX = new int[600]; //蛇的x坐标 25*25 14 int[] snakeY = new int[500]; //蛇的Y坐标 25*25 15 String fx; 16 //游戏当前的状态:开始、停止 17 boolean isStart = false; //默认是不开始 18 19 //构造器 20 public GamePanel() { 21 init(); 22 //获得焦点和键盘事件 23 this.setFocusable(true);//获得焦点事件 24 this.addKeyListener(this);//获得键盘监听事件:写的当前这个类,所以是this如果是其他类的话,去new一个监听器 25 } 26 27 //初始化方法 28 public void init() { 29 length = 3; 30 snakeX[0] = 100; 31 snakeY[0] = 100;//脑袋的坐标 32 snakeX[1] = 75; 33 snakeY[1] = 100;//第一个身体的坐标 34 snakeX[2] = 50; 35 snakeY[2] = 100;//第二个身体的坐标 36 fx = "R";//初始方向向右 37 } 38 39 //绘制面板,我们游戏中的所有东西,都是用这个画笔来画。 Ctrl+O,画组件 40 @Override 41 protected void paintComponent(Graphics g) { 42 super.paintComponent(g);//清屏的作用,不用会闪烁 43 //绘制静态的面板 44 this.setBackground(Color.WHITE); 45 Data.header.paintIcon(this, g, 25, 11);//头部广告栏画上去 46 g.fillRect(25, 75, 850, 600);//默认游戏界面 47 48 //把小蛇画上去 49 if (fx.equals("R")) { 50 Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);//蛇头初始化向右,需要通过方向来判断 51 } else if (fx.equals("L")) { 52 Data.left.paintIcon(this, g, snakeX[0], snakeY[0]); 53 } else if (fx.equals("U")) { 54 Data.up.paintIcon(this, g, snakeX[0], snakeY[0]); 55 } else if (fx.equals("D")) { 56 Data.down.paintIcon(this, g, snakeX[0], snakeY[0]); 57 } 58 59 for (int i = 1; i < length; i++) { 60 Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);//蛇的身体 61 } 62 63 //游戏状态 64 if (isStart == false) { 65 g.setColor(Color.white); 66 g.setFont(new Font("楷体", Font.BOLD, 40)); 67 g.drawString("按下空格开始游戏", 300, 300); 68 } 69 } 70 71 72 //键盘监听事件 73 @Override 74 public void keyPressed(KeyEvent e) { 75 int keyCode = e.getKeyCode();//获得键盘按键是哪一个 76 if (keyCode == KeyEvent.VK_SPACE) {//如果按下的是空格键 77 isStart = !isStart;//取反 78 repaint();//重新绘制,因为值已经变化了 79 } 80 } 81 82 @Override 83 public void keyReleased(KeyEvent e) { 84 85 } 86 87 @Override 88 public void keyTyped(KeyEvent e) { 89 90 } 91 }
空格监听效果图:
按一下空格: