3.让小蛇动起来

想让他动,让它实现监听就好了。
思路:
  1. 写一个键盘监听器,监听面板上的一切东西
  2. 直接在GamePanel实现KeyListener接口,重写这三个方法,降低成本
  1. 写按压方法即可,其余两个没用,空着就好
  1. 想要监听事件被开启生效,需要加一些设置就获取键盘的一些监听。在构造器里边设置一下。
  1. 启动测试,空格就被监听上了
     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 }
空格监听效果图:
按一下空格:
posted @ 2020-03-30 17:22  断浮  阅读(157)  评论(0编辑  收藏  举报