在这之前,我们已经接触过,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中会出现,按一次空格,出现一串子弹的结果。