4.键盘控制小蛇移动
- 想让小蛇动起来,就得让小蛇的脑袋还有它整个身体是不停的往一个方向在走的。就需要一个定时器了。
- 实现一个接口ActionListener,重写一个事件监听的方法actionPerformed
- new一个定时器,单位是ms
- 写监听方法
- 右移完成,启动测试,按下空格小蛇右移。
- 想让小蛇上下左右动,就得监听键盘事件了。怎么移动呢,先让按下键盘上下左右键时,脑袋变方向。
1 package com.gui.snake; 2 3 import javax.swing.*; 4 import java.awt.*; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 import java.awt.event.KeyEvent; 8 import java.awt.event.KeyListener; 9 10 //游戏的面板 11 public class GamePanel extends JPanel implements KeyListener, ActionListener { 12 13 //定义蛇的数据结构 14 int length; //蛇的长度 15 int[] snakeX = new int[600]; //蛇的x坐标 25*25 16 int[] snakeY = new int[500]; //蛇的Y坐标 25*25 17 String fx; 18 //游戏当前的状态:开始、停止 19 boolean isStart = false; //默认是不开始 20 21 //定时器 以毫秒为单位 1000ms = 1s 22 Timer timer = new Timer(100, this);//100ms执行一次 23 24 //构造器 25 public GamePanel() { 26 init(); 27 //获得焦点和键盘事件 28 this.setFocusable(true);//获得焦点事件 29 this.addKeyListener(this);//获得键盘监听事件:写的当前这个类,所以是this如果是其他类的话,去new一个监听器 30 timer.start();//游戏一开始,就让定时器启动 31 } 32 33 //初始化方法 34 public void init() { 35 length = 3; 36 snakeX[0] = 100; 37 snakeY[0] = 100;//脑袋的坐标 38 snakeX[1] = 75; 39 snakeY[1] = 100;//第一个身体的坐标 40 snakeX[2] = 50; 41 snakeY[2] = 100;//第二个身体的坐标 42 fx = "R";//初始方向向右 43 } 44 45 //绘制面板,我们游戏中的所有东西,都是用这个画笔来画。 Ctrl+O,画组件 46 @Override 47 protected void paintComponent(Graphics g) { 48 super.paintComponent(g);//清屏的作用,不用会闪烁 49 //绘制静态的面板 50 this.setBackground(Color.WHITE); 51 Data.header.paintIcon(this, g, 25, 11);//头部广告栏画上去 52 g.fillRect(25, 75, 850, 600);//默认游戏界面 53 54 //把小蛇画上去 55 if (fx.equals("R")) { 56 Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);//蛇头初始化向右,需要通过方向来判断 57 } else if (fx.equals("L")) { 58 Data.left.paintIcon(this, g, snakeX[0], snakeY[0]); 59 } else if (fx.equals("U")) { 60 Data.up.paintIcon(this, g, snakeX[0], snakeY[0]); 61 } else if (fx.equals("D")) { 62 Data.down.paintIcon(this, g, snakeX[0], snakeY[0]); 63 } 64 65 for (int i = 1; i < length; i++) { 66 Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);//蛇的身体 67 } 68 69 //游戏状态 70 if (isStart == false) { 71 g.setColor(Color.white); 72 g.setFont(new Font("楷体", Font.BOLD, 40)); 73 g.drawString("按下空格开始游戏", 300, 300); 74 } 75 } 76 77 78 //键盘监听事件 79 @Override 80 public void keyPressed(KeyEvent e) { 81 int keyCode = e.getKeyCode();//获得键盘按键是哪一个 82 if (keyCode == KeyEvent.VK_SPACE) {//如果按下的是空格键 83 isStart = !isStart;//取反 84 repaint();//重新绘制,因为值已经变化了 85 } 86 //小蛇移动 87 if (keyCode == KeyEvent.VK_UP) { 88 fx = "U"; 89 } else if (keyCode == KeyEvent.VK_DOWN) { 90 fx = "D"; 91 } else if (keyCode == KeyEvent.VK_LEFT) { 92 fx = "L"; 93 } else if (keyCode == KeyEvent.VK_RIGHT) { 94 fx = "R"; 95 } 96 } 97 98 //事件监听---需要通过固定的时间来刷新,1s=10次 99 @Override 100 public void actionPerformed(ActionEvent e) { 101 if (isStart) {//如果游戏是开始状态,就让小蛇动起来! 102 103 //右移 104 for (int i = length - 1; i > 0; i--) {//后一节移到前一节的位置 snake[1] = snake [0]; 105 snakeX[i] = snakeX[i - 1]; 106 snakeY[i] = snakeY[i - 1]; 107 } 108 snakeX[0] = snakeX[0] + 25; 109 110 //边界判断 111 if (snakeX[0] > 850) { 112 snakeX[0] = 25; 113 } 114 115 repaint();//重画页面 116 } 117 timer.start(); 118 } 119 120 @Override 121 public void keyReleased(KeyEvent e) { 122 123 } 124 125 @Override 126 public void keyTyped(KeyEvent e) { 127 128 } 129 130 131 }
7.脑袋可以动了以后,真实走的时候要往上往下走的。所以应该在事件监听里面做这个事情。
1 //事件监听---需要通过固定的时间来刷新,1s=10次 2 @Override 3 public void actionPerformed(ActionEvent e) { 4 if (isStart) {//如果游戏是开始状态,就让小蛇动起来! 5 6 //移动 7 for (int i = length - 1; i > 0; i--) {//后一节移到前一节的位置 snake[1] = snake [0]; 8 snakeX[i] = snakeX[i - 1]; 9 snakeY[i] = snakeY[i - 1]; 10 } 11 12 //走向 13 if (fx.equals("R")) { 14 snakeX[0] = snakeX[0] + 25; 15 if (snakeX[0] > 850) { snakeX[0] = 25; }//边界判断 16 } else if (fx.equals("L")) { 17 snakeX[0] = snakeX[0] - 25; 18 if (snakeX[0] < 25) { snakeX[0] = 850; }//边界判断 19 } else if (fx.equals("U")) { 20 snakeY[0] = snakeY[0] - 25; 21 if (snakeY[0] < 75) { snakeY[0] = 650; }//边界判断 22 } else if (fx.equals("D")) { 23 snakeY[0] = snakeY[0] + 25; 24 if (snakeY[0] > 650 ) { snakeY[0] = 75; }//边界判断 25 } 26 27 repaint();//重画页面 28 } 29 timer.start(); 30 }