(80分跪求解答)分析下这段代码,8个方向的键盘监听器

aipb2008 2008-04-28 01:26:42

//add keyboard listener
addKeyListener(new KeyAdapter(){
boolean bUp = false;
boolean bDown = false;
boolean bLeft = false;
boolean bRight = false;

public void keyPressed(KeyEvent e){
int keyCode = e.getKeyCode();
{
if (keyCode == KeyEvent.VK_UP)
bUp = true;
else if (keyCode == KeyEvent.VK_DOWN)
bDown = true;
else if (keyCode == KeyEvent.VK_LEFT)
bLeft = true;
else if (keyCode == KeyEvent.VK_RIGHT)
bRight = true;
}
{
if (bLeft && bUp)
moveBall(-STEP_LEN,-STEP_LEN);
else if (bLeft && bDown)
moveBall(-STEP_LEN,+STEP_LEN);
else if (bRight && bDown)
moveBall(+STEP_LEN,+STEP_LEN);
else if (bRight && bUp)
moveBall(+STEP_LEN,-STEP_LEN);
else if (keyCode == KeyEvent.VK_UP)
moveBall(0,-STEP_LEN);
else if (keyCode == KeyEvent.VK_DOWN)
moveBall(0,STEP_LEN);
else if (keyCode == KeyEvent.VK_LEFT)
moveBall(-STEP_LEN,0);
else if (keyCode == KeyEvent.VK_RIGHT)
moveBall(STEP_LEN,0);
}
}

public void keyReleased(KeyEvent e){
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_UP)
bUp = false;
else if (keyCode == KeyEvent.VK_DOWN)
bDown = false;
else if (keyCode == KeyEvent.VK_LEFT)
bLeft = false;
else if (keyCode == KeyEvent.VK_RIGHT)
bRight = false;
}
});
setFocusable(true);
}


这是在JPanel里的代码,大家不用管moveBall函数,就是移动物体。

8个方向,上下左右,还有斜45度方向。

问题:
按键及释放顺序如果为 按12放12 响应正常,如果为 按12放21 响应会丢失1
举例:按RIGHT:右移
按DOWN :右下移
放RIGHT:下移
放DOWN :停

按RIGHT:右移
按DOWN :右下移
放DOWN :停 //我想要 右移 代码不知哪里有逻辑错误,帮忙分析并改正下
放RIGHT:停

问题补充:
这样设计键盘响应,当按一个键不放时,才按下总不能“很快”的响应,有点停滞然后在不断移动,可以改进吗?
同样的问题发生在按下A,释放A,再按下B时。
...全文
175 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fyxridd 2010-05-30
  • 打赏
  • 举报
回复
激动!!!!!
正是我要问的问题。
aipb2008 2008-04-29
  • 打赏
  • 举报
回复
已经很好的解决,用timer单独控制移动。
Inhibitory 2008-04-28
  • 打赏
  • 举报
回复
按键及释放顺序如果为 按12放12 响应正常,如果为 按12放21 响应会丢失1
因为你按下12后, 放了2, 这时并没有键按下事件, 所以不会进入keyPressed事件处理函数中,而重新绘制球, 所以不会再响应1,而只会响应键释放事件, 而在这里面, 并没有重绘界面, 所以会失去响应。

一般的做法是,在键的事件处理中只处理键被按下,即设置bUp, bDown等的值, 最后调用repaint()来重载绘制界面。

然后在JPanel的paintComponent函数中绘制球时, 再来判断bUp, bDown等的值, 调用相应的绘制函数。


这样设计键盘响应,当按一个键不放时,才按下总不能“很快”的响应,有点停滞然后在不断移动,可以改进吗?
至于这个问题, 把你的第一个问题解决后, 这个问题自然就解决了。
因为绘制界面的线程是底层去处理的, 即使很短时间内有非常多的paintComponent被调用, 底层也会压缩这些绘制, 并不是每次调用paintComponent都一定会被调用, 而是进行最有效的绘制,扔掉一些不必要的操作。
a_nuo 2008-04-28
  • 打赏
  • 举报
回复
按键的问题9楼方法可以解决,定义一个向量,然后球根据向量移动
移动响应的问题用线程处理可以解决
可以参考尚学堂的坦克大战的例子,上面解决按键问题很不错
q1531 2008-04-28
  • 打赏
  • 举报
回复
用向量,把按键先存到向量面。再取出来。这样两个问题都解决了。^-^
cb1156 2008-04-28
  • 打赏
  • 举报
回复
首先.
匹配判断用 swich case
参考线程吧

我也不是很懂..
友情UP一下.
胡矣 2008-04-28
  • 打赏
  • 举报
回复
aipb2008 2008-04-28
  • 打赏
  • 举报
回复
我也想过用线程,我考虑下。

谁能回答下我那个问题,按键顺序那个。
shili150 2008-04-28
  • 打赏
  • 举报
回复
怎么又下跪了?
alexice 2008-04-28
  • 打赏
  • 举报
回复
同意LS,把球的移动用线程处理,输入键值改变条件
我是风 2008-04-28
  • 打赏
  • 举报
回复
用线程处理,有必要的话,可以缓存一下键值。
黑夜愁客 2008-04-28
  • 打赏
  • 举报
回复
有时候java swing 就是那么慢..
Shine_Panda 2008-04-28
  • 打赏
  • 举报
回复
启动一个单独的线程来处理可能效果会好一点.
psyl 2008-04-28
  • 打赏
  • 举报
回复
难道是俄罗斯方块? 呵呵,我刚下载了ICAST的教程还没开始看。 共同学习。
KKK2007 2008-04-28
  • 打赏
  • 举报
回复
哦~`
aipb2008 2008-04-28
  • 打赏
  • 举报
回复
谢谢10f & 11f

我两种办法都试着改进下,解决了立马结贴。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧