AWT KeyListener reacción lenta

Estoy creando un juego simple con Java Swing. Tengo un problema: KeyListenerparece reaccionar un poco entrecortado / lento. El personaje se mueve usando este código:

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

La mayoría de las veces todo está bien, pero a veces el personaje se detiene por un momento antes de reaccionar al teclado. ¿Cómo hacer que la entrada del teclado sea más suave?

Respuesta 1

Gracias a todos por sus respuestas! Me ayudaron a seguir el camino correcto.

Lo que sucede aquí, como dije en mi comentario, es lo siguiente: si, por ejemplo, estamos presionando la tecla derecha: el personaje se mueve hacia la derecha, entonces presionamos la tecla izquierda y comienza a moverse hacia la izquierda. Ahora, si soltamos la tecla derecha, la xSpeed ​​se restablecerá a cero y tendrá KeyListenerque esperar hasta que keyPressed()se vuelva a disparar, ya que todavía estamos presionando la tecla izquierda. La 'velocidad de repetición de teclas' está configurada por defecto y, por lo que yo entiendo, no se puede ajustar.

Entonces, la solución es hacer un seguimiento de las teclas que se presionan actualmente, para que no tengamos que bajar la velocidad del personaje a cero cuando se suelta la tecla derecha si todavía mantenemos presionada la tecla izquierda.

Perdón por un ejemplo un poco críptico, solo trato de mantener el código pequeño:

// 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;
    }
}
Respuesta: 2

Tengo una colección de archivos jar con dependencias en un patrón de diamante: base.jar & ...

Estoy usando seam para intentar hacer una aplicación web y estoy tratando de hacer un cuadro desplegable que muestre los vehículos que están almacenados en una base de datos y le permite al usuario seleccionar varios. Todo funciona ...

Estoy comenzando un nuevo proyecto usando Spring 3.1, Hibernate 4 y hay un requisito para rastrear cualquier actividad en la aplicación. ejemplo de seguimiento de actividad ¿quién cambió qué? de que a que y en ...

Tengo un gran archivo txt (1.5 Mb) como recurso privado en mi aplicación de Android. El archivo está estructurado así: "A1 | A2 | A3 | A4 # B1 | B2 | B3 | B4 # C1 | C2 | C3 | C4 # ..." donde A1, A2, A3, B1 ... son alfanuméricos. ..