Java AWT键侦听器反应缓慢
我正在用JavaSwing创建一个简单的游戏。我有一个问题,Java AWT键侦听器反应缓慢,java,swing,awt,keylistener,Java,Swing,Awt,Keylistener,我正在用JavaSwing创建一个简单的游戏。我有一个问题,keylister的反应似乎有点起伏/缓慢。角色使用以下代码移动: // player control public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key){ case(KeyEvent.VK_LEFT): dx = -speed; break; case(KeyEven
keylister
的反应似乎有点起伏/缓慢。角色使用以下代码移动:
// player control
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case(KeyEvent.VK_LEFT): dx = -speed; break;
case(KeyEvent.VK_RIGHT): dx = speed; break;
case(KeyEvent.VK_UP): dy = -speed; break;
case(KeyEvent.VK_DOWN): dy = speed; break;
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case(KeyEvent.VK_LEFT): dx = 0; break;
case(KeyEvent.VK_RIGHT): dx = 0; break;
case(KeyEvent.VK_UP): dy = 0; break;
case(KeyEvent.VK_DOWN): dy = 0; break;
}
}
// this method is performed each time before redrawing the screen
public void step() {
x += dx;
y += dy;
}
大多数情况下,一切都很好,但有时角色在对键盘做出反应之前会停止一段时间。如何让键盘输入更流畅?谢谢大家的回答!他们帮助我走上了正确的道路 正如我在评论中所说,这里发生的事情如下: 例如,如果我们按住右键-角色向右移动,然后按左键,它开始向左移动。现在,如果我们释放右键,xSpeed将重置为零,
keylister
必须等待再次触发keyPressed()
,因为我们仍然按住左键。“按键重复速度”默认设置,据我所知无法调整
因此,解决方案是跟踪当前按下的键,这样我们就不必在释放右键时将角色的速度降为零,如果我们仍然按住左键
抱歉,这里有一个有点晦涩的示例,只是试图保持代码的小型化:
// Define keys: up, right, down, left
// 0 - not pressed, 1 - pressed
private int[] keys = {0, 0, 0, 0};
// player control
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
// we set the corresponding 'key indicator' to 1 when it is pressed
switch(key){
case(KeyEvent.VK_LEFT): dx = -speed; keys[3] = 1; break;
case(KeyEvent.VK_RIGHT): dx = speed; keys[1] = 1; break;
case(KeyEvent.VK_UP): dy = -speed; keys[0] = 1; break;
case(KeyEvent.VK_DOWN): dy = speed; keys[2] = 1; break;
case(KeyEvent.VK_SPACE): fireOn = true; break;
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
// now before resetting the speed we check if the opposite key
// is still pressed
switch(key){
case(KeyEvent.VK_LEFT): if(keys[1]==0){dx = 0;} keys[3] = 0; break;
case(KeyEvent.VK_RIGHT): if(keys[3]==0){dx = 0;} keys[1] = 0; break;
case(KeyEvent.VK_UP): if(keys[2]==0){dy = 0;} keys[0] = 0; break;
case(KeyEvent.VK_DOWN): if(keys[0]==0){dy = 0;} keys[2] = 0; break;
case(KeyEvent.VK_SPACE): fireOn = false; break;
}
}
另一种方法可能有助于:
object.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
updateOpreation();
}
@Override
public void keyReleased(KeyEvent e) {
updateOpreation();
}
@Override
public void keyPressed(KeyEvent e) {
updateOpreation();
}
}
可能是“关键重复速度”。您是否考虑过使用键绑定?这根本不是真的,反应慢???,当然有一个问题==取决于您的代码。。。。(使用
KeyBinding
)也是一样),为了更好地帮助您更快地编辑您的问题,在阅读了有关键绑定的内容后,它们的工作方式似乎与keylister
的工作方式相同,我还想知道是否可以在触发按键事件后“退出”按键事件,因此,它不会重复从键盘到键侦听器的正确输出
与键绑定
相同,但这里的相似性已经结束,接下来的一切都是关于聚焦
和聚焦子系统
,与键绑定
无关,你永远无法解决这个问题,使用KeyListener
是最重要、最主要的问题,取决于…,最多,您可以使用SSCCE编辑您的帖子,以获得更好的帮助通过鼠标查看帖子单击“使用Swing Timer延迟任何监听器的事件没有问题”,您现在可以看到差异吗???为什么需要此帮助?