zoukankan      html  css  js  c++  java
  • 4.14Java游戏小项目之键盘控制原理

    4.14Java游戏小项目之键盘控制原理

    本质理解

    键盘和程序交互原理:

    • 每次按下键、松开键触发响应的键盘事件。

    • 按下和松开用true和false表示

    • 将事件封装到KeyEvent对象中

    • 识别按下哪个键就是对键盘进行编号

      • 编号通过KeyEvent对象来查询

    • 本项目有四个方向,设置四个基本方向,按下=true,松开=false,左右移动只需要对其进行加、减即可

    键盘监听是一个内部类

    示例:

        /*
       定义一个键盘监听的内部类
       KeyMonitor继承于KeyAdapter
        */
       class KeyMonitor extends KeyAdapter{

           /*重写父类的两个方法,按下、抬起*/

           /*重写按下键方法*/
           //keyEvent是一个对象,包含了所有按下键的信息
           @Override
           public void keyPressed(KeyEvent e){
               System.out.println("按下:" + e.getKeyCode());
          }
           
           /*重写抬起键方法*/
           @Override
           public void keyReleased(KeyEvent e){
               System.out.println("抬起:" + e.getKeyCode());
          }

      }



          addKeyListener(new KeyMonitor()); //给窗口增加键盘监听

    在Plane类中增加几个新的变量用于飞机的控制

    流程梳理:

    • 增加四个变量控制飞机上、下、左、右四个方向

    • 流程控制:

      • 方向向左:y-,方向向右:y+,方向向上:x+,方向向下:x-

      • 当键盘监听到按下事件的时候,飞机向上移动---坐标轴变化

      • 到键盘监听到松开事件的时候,飞机向上移动的事件取消,变为不动的状态

    为此需要写两个方法---增加方向,取消方向

    键盘与游戏物体的交互:

    方法一:

        /*
       给飞机增加几个新的变量
       代表飞机的方向
       设置飞机的速度,继承、重写
       */
       int speed = 30;
       boolean left,right,up,down;    
    /*增加方向*/
       /*
       因为要和键盘交互,当监听到事件的时候会调用这个方法
       所以形参是监听到按下的键---KeyEvent的对象作为形参
       按下某个键。增加相应的方向
        */
       public void addDirection(KeyEvent e){
           switch (e.getKeyCode()){
               case KeyEvent.VK_LEFT:
                   left = true;
                   break;

               case KeyEvent.VK_UP:
                   up = true;
                   break;

               case KeyEvent.VK_RIGHT:
                   right = true;
                   break;

               case KeyEvent.VK_DOWN:
                   down = true;
                   break;
                   /*因为键的标号不好记,KeyEvent给每个键提供了一个常量
                   是一个十六进制数
                   赋值给了VK_方向键
                    */
          }
      }

    方法二:

        /*根据流程控制有了增加方向还要有相应的减方向*/
       /*
       写一个方法,取消方向的
        */
       public void minusDirection(KeyEvent e){
           switch (e.getKeyCode()){
               case KeyEvent.VK_LEFT:
                   left = false;
                   break;

               case KeyEvent.VK_UP:
                   up = false;
                   break;

               case KeyEvent.VK_RIGHT:
                   right = false;
                   break;

               case KeyEvent.VK_DOWN:
                   down = false;
                   break;
                   /*
                   代码几乎一致,只是把方向进行了取消
                    */
          }
      }

    使用方法:

        /*
       给飞机增加几个新的变量
       代表飞机的方向
       设置飞机的速度,继承、重写
       */
       int speed = 30;
       boolean left,right,up,down;

       /*重写父类方法*/
       /*
       因为这个属性用了private修饰符,所以不能直接重写
        */
       @Override
       public void drawSelf(Graphics g){
           g.drawImage(img,(int)x,(int)y,null);

           /*根据方向判断方向的+、-*/
           if (left = true){
               x -= speed; //speed n.速度
          }

           if (right = true){
               x += speed;
          }

           if (up = true){
               y -= speed; //y -= speed ---> y = y - speed
          }

           if (down = true){
               y += speed;
          }
      }

     

    It's a lonely road!!!
  • 相关阅读:
    【转】虚函数什么情况下会内联
    构造函数不能为虚函数的原因
    《python编程》第四章——文件和目录工具
    《python编程》第三章笔记——脚本运行上下文
    《python编程》第二章笔记
    《Python编程》第一章笔记
    报错:IndentationError:unindent does not match any outer indentation level
    报错:SyntaxError: Non-ASCII character 'xe7' in file:
    1-2、make_db_file.py
    1-1.initdata.py
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14659755.html
Copyright © 2011-2022 走看看