日期:2014-05-20  浏览次数:20662 次

java键盘监听如何去除其他键的干扰
我最近在用java写一个简单的雷电飞机小游戏,飞机已经能够根据键盘键盘输入,上下左右移动,但是如果在按上键的同时,即让飞机向上移动,再按住其他键,如攻击键,飞机就立刻停止移动。该如何让飞机向上移动的过程中不受其他键的干扰,求高手赐教,不胜感激!!
键盘监听代码如下:
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
//上下左右移动
if(e.getKeyCode()==KeyEvent.VK_W)
{
if(this.myplane.y>0)
{
this.myplane.y-=this.myplane.speed;
}

}else if(e.getKeyCode()==KeyEvent.VK_D)
{
if(this.myplane.x<358)
{
this.myplane.x+=this.myplane.speed;
}
}
else if(e.getKeyCode()==KeyEvent.VK_S)
{
if(this.myplane.y<350)
{
this.myplane.y+=this.myplane.speed;
}
}
else if(e.getKeyCode()==KeyEvent.VK_A)
{
if(this.myplane.x>0)
{
this.myplane.x-=this.myplane.speed;
}
}else {

}
}

------解决方案--------------------
采用面向对象的编程思想,
飞机可单独创建一个类,
子弹也单独创建一个类,

飞机的飞行是需要“飞行员”的,即给飞机中放置一个线程,控制飞机的运动;而键盘的“按下/抬起”则控制线程的“休眠/唤醒”,从而达到间接控制飞机的目的,即可让运动与开火不冲突。

且此种方式使得飞机在变换运动方向的瞬间不产生“卡壳”现象。

另外,键盘事件的监听方法中,绝不可使用:
if(...){

} else if(...){

}
这种形式,建议使用多个单分支的结构如:
if(...){

}
if(...){

}
或者switch-case语句
------解决方案--------------------
简单的操作,你可以设置一些全局变量如FLAG,当执行一种操作的时候是A,然后执行另外的操作时候为B,
JScript code

if(this.myplane.y>0&&FLAG =='A')
{
this.myplane.y-=this.myplane.speed;
}else...

------解决方案--------------------
每个类似于无限循环的线程都设定一个flg作为暂停或者退出的标志。每次循环都先判断这个值,或者无视,或者continue,或者break。自己定义好这个东西。键盘的监听一定要分压下和抬起。压下的时候将对应的flg值设定好,抬起的时候也只是设定flg值。这样你只要考虑好逻辑上怎么设计的问题就行了。