java - AWT KeyListener react 慢

标签 java swing awt keylistener

我正在使用 Java Swing 创建一个简单的游戏。我有一个问题 - KeyListener 似乎 react 有点不稳定/缓慢。角色使用以下代码移动:

// 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;
}

大多数时候一切都很好,但有时角色会在对键盘使用react之前停下来一段时间。如何让键盘输入更流畅?

最佳答案

谢谢大家的回答!他们帮助我走上了正确的道路。

正如我在评论中所说,这里发生的事情如下: 例如,如果我们按住右键 - 角色向右移动,那么我们按左键,角色开始向左移动。现在,如果我们释放右键,xSpeed 将重置为零,并且 KeyListener 必须等待 keyPressed() 再次触发,因为我们仍然按住左键 key 。 “按键重复速度”是默认设置的,据我了解无法调整。

因此,解决方案是跟踪当前按下的键,这样如果我们仍然按住左键,则在释放右键时我们不必将角色的速度降至零。

抱歉,这个例子有点神秘,只是想保持代码较小:

// 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;
    }
}

关于java - AWT KeyListener react 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10902789/

相关文章:

Java 8 : Executing reduce operation on Stream

java - 选择具有 between where 限定符的命名参数查询

java 。 Swing 。更改容器中组件的顺序

java - java中如何让按钮点击时不可见?

java - 检查文件扩展名是否为 .txt 的程序

java - 将 JComponent 的宽度和高度设置为实例变量

java - SecureSocial 库中缺少 securesocial.core.Identity?

java - 如何在 swing 中动态增加 JDialog 的大小?

Java 的 Paint() 方法到底是如何以及何时被调用的?

java - 无法让 NetBeans 在 Java 中访问 "FigurePanel"