键盘监听器————在飞机大战中的利用(移动,加速,发射子弹,一应俱全)

在这之前,我们已经接触过,ActionListener,MouseListener等监听器,灵活运用了我们电脑所常用的工具。但是,作为一个常常玩游戏的人来说,键盘也是至关重要的!!!遥想当年,在4399傲视独立时,就靠一手键盘操作了~~~。

飞机大战 2022-08-05 15-43-58

所以,今天就让我们以飞机大战为例,来切入我们的键盘监听器。

1.创建键盘监听器类

public class Key implements KeyListener {
    double i=1;//做一个加速度
    Myplane myfight;
    Vector<Mybullet> mybullets;
    BufferedImage buff;

    public Key(BufferedImage buff,Myplane myfight, Vector<Mybullet> mybullets) {
        this.myfight = myfight;
        this.mybullets=mybullets;
        this.buff=buff;
    }//得到自身战机,自身子弹,子弹图片

老生常谈,先实现(implements)接口,然后借助构析方法得到我们所需的信息,如自身战机,自身子弹,子弹图片。

2.绑定键盘监听器

在窗口中加入,绑定我们的键盘监听器

             Key key=new Key(mybulletbuff,myfight,mybullets);//建立键盘监听器对象
            addKeyListener(key);//加入键盘监听器

3.写好键盘监听器内部方法:

先要将内嵌方法复制过来,再重写方法:

1.先写好移动的方法:

(前言,我们的自身战机采用了封装思想,故改变/得到属性,只能通过get()/set()方法)

    public void up(double i) {
            myfight.setSpeedy((int)(-7*i));
    }
    public void down(double i)
    {
            myfight.setSpeedy((int)(7*i));
    }
    public void left(double i){
            myfight.setSpeedx((int)(-9*i));
    }
    public void right(double i){
            myfight.setSpeedx((int)(9*i));
    }/*写好移动方法,逻辑为通过改变速度,而改变坐标
       减少运算,使移动更流畅*/

2.写好对应移动的按键反应:

        public void keyPressed(KeyEvent e){
        int key=e.getKeyCode();
        if(key==KeyEvent.VK_UP){
            up(i);
            i*=1.05;
        }
        if(key==KeyEvent.VK_DOWN){
            down(i);
            i*=1.05;
        }
        if(key==KeyEvent.VK_LEFT){
            left(i);
            i*=1.05;
        }
        if(key==KeyEvent.VK_RIGHT){
            right(i);
            i*=1.05;
        }
    }//按键反应,赋予速度
     public void keyReleased(KeyEvent e){
        int key=e.getKeyCode();
        if(key==KeyEvent.VK_UP||key==KeyEvent.VK_DOWN){
            myfight.setSpeedy(0);
             i=1;
        }
        if(key==KeyEvent.VK_LEFT||key==KeyEvent.VK_RIGHT){
            myfight.setSpeedx(0);
             i=1;
        }
    }//松键反应,速度为0

值得注意的是,键盘上的每个按键都对应了一个 int 值,所以我们用 int key来读到按键。

而我们每次按下按键时,会不断跑keyPressed方法,都会让我们的属性 double i,即我们设计的加速度,乘上 1.05 而变大。

故当我们持续不断按住时,会出现加速现象!!!

而一旦松开按键时,我们同时将速度变为0,加速度降为1,达到停下的目的。

3.写好对应发射子弹的按键反应:

public void keyReleased(KeyEvent e){
        if(key == KeyEvent.VK_SPACE){//将发射子弹放在松键反应上,可以避免一次发出一连串子弹
            Mybullet mybullet=new Mybullet(buff, myfight.getX(), myfight.getY(),
                    myfight.getWidth(), myfight.getHeight(), myfight.getSpeedx(),                 
                    myfight.getSpeedy());
            mybullets.add(mybullet);
        }//松开空格后,自身子弹数组加入信息
}

我们可以设置为松开空格后,就会发射子弹。

所以每次我们松开空格,就会创建一个子弹对象,加入到我方子弹数组里,由其他线程进行绘制。

如果放在keytype中会出现,按一次空格,出现一串子弹的结果。

猜你喜欢

转载自blog.csdn.net/AkinanCZ/article/details/126177598
今日推荐