4.键盘控制小蛇移动

  1. 想让小蛇动起来,就得让小蛇的脑袋还有它整个身体是不停的往一个方向在走的。就需要一个定时器了。
  2. 实现一个接口ActionListener,重写一个事件监听的方法actionPerformed
  1. new一个定时器,单位是ms
  1. 写监听方法
  1. 右移完成,启动测试,按下空格小蛇右移。
  2. 想让小蛇上下左右动,就得监听键盘事件了。怎么移动呢,先让按下键盘上下左右键时,脑袋变方向。
      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 }
    View Code

    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 }

     

     

     

posted @ 2020-03-30 17:27  断浮  阅读(315)  评论(0编辑  收藏  举报