¿Cómo detectar varias teclas por teclado simultáneamente?

Iniciado por Zodiak98, 12 Julio 2016, 23:14 PM

0 Miembros y 1 Visitante están viendo este tema.

Zodiak98

Verán, actualmente estoy programando un juego bastante simple en Java, pero hay una cosa. Cuando yo presiono la tecla de la flecha izquierda(por ejemplo) la nave empieza a moverse (lógicamente) hacia la izquierda, pero si mientras la tengo presionada, presiono espacio (para disparar), la nave se detiene.

Lo que quiero es que me orienten en cómo hacer que eso no suceda, es decir, que la nave no deje de moverse mientras tenga la tecla presionada independientemente si presiono espacio.

Es decir, me muevo, presiono espacio, que dispare, y si no he soltado la tecla, que no se detenga sino que siga moviéndome hasta que la suelte (en este ejemplo, la izquierda).

Gunhack

Para eso hay dos eventos, keyPressed y keyReleased.

Con un array añades la tecla pulsada al mismo cada vez que detectas un keyPressed, y si detectas keyReleased lo quitas del array.  :P

Gunhack

Intenta probar esto y dime si es lo que necesitabas  :P

Código (java) [Seleccionar]
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

import javax.swing.*;

public class PruebaTeclas {

public static void main(String[] args) {

new WindowPrinc();
}

}

class WindowPrinc extends JFrame {

private JLabel lDireccion, lCouunt;
private int disp;
java.util.List<String> Dir;


public WindowPrinc() {

setTitle("Prueba");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setBounds(Toolkit.getDefaultToolkit().getScreenSize().width/2 - 100,
Toolkit.getDefaultToolkit().getScreenSize().height/2 - 100,
100, 100);

setLayout(new FlowLayout());

lDireccion = new JLabel("Direccion: N/A");
lCouunt = new JLabel("Disparos: 0");
disp = 0;
Dir = new ArrayList<>();
Dir.add("N/A");

add(lDireccion);
add(lCouunt);

        this.addKeyListener(new KeyAdapter() {

@Override
public void keyPressed(KeyEvent e) {

int c = 0;

if(c == 0 && Dir.size() < 2) {

switch(e.getKeyCode()) {

case KeyEvent.VK_UP:
Dir.add("ARRIBA");
break;
case KeyEvent.VK_DOWN:
Dir.add("ABAJO");
break;
case KeyEvent.VK_LEFT:
Dir.add("IZQUIERDA");
break;
case KeyEvent.VK_RIGHT:
Dir.add("DERECHA");
break;
}
c++;
}

if(e.getKeyCode() == KeyEvent.VK_SPACE) {
disp++;
lCouunt.setText("Disparos: " + disp);
}

lDireccion.setText("Direccion: " + Dir.get(Dir.size()-1));
}

@Override
public void keyReleased(KeyEvent e) {

switch(e.getKeyCode()) {

case KeyEvent.VK_UP:
deleteKey("ARRIBA");
break;
case KeyEvent.VK_DOWN:
deleteKey("ABAJO");
break;
case KeyEvent.VK_LEFT:
deleteKey("IZQUIERDA");
break;
case KeyEvent.VK_RIGHT:
deleteKey("DERECHA");
break;
}

lDireccion.setText("Direccion: " + Dir.get(Dir.size()-1));
}

void deleteKey(String dir) {

for(int i = 0; i < Dir.size(); i++) {

if(dir == Dir.get(i)){

Dir.remove(i);
}
}

if(Dir.size() == 0) {

Dir.add("N/A");
}
}
});

setVisible(true);
}
}


+ 1 Oculto(s)

ohh funciona con varias teclas, tuve este mismo problema y recien veo la solucion