2009-04-15 23 views
15

¿Cómo manejo las pulsaciones simultáneas de teclas en Java?¿Cómo manejo las pulsaciones simultáneas de teclas en Java?

Estoy tratando de escribir un juego y necesito manejar varias pulsaciones de teclas a la vez.

Cuando estoy presionando una tecla (digamos que avanzo) y luego sostengo otra tecla (por ejemplo, para girar a la izquierda), se detecta la nueva clave pero ya no se detecta la anterior.

+1

Más detalles, por favor! ¿Que estás tratando de hacer? –

+1

mala pregunta, necesita mucha más información: ¿Por qué el medio ambiente? ¿Oscilación? AWT? ¿Qué quieres decir con "manejar"? –

Respuesta

15

Una forma sería realizar un seguimiento de qué teclas están actualmente desactivadas.

Cuando obtiene un evento keyPressed, agregue la nueva clave a la lista; cuando recibe un evento keyReleased, elimine la clave de la lista.

Luego, en su bucle de juego, puede hacer acciones basadas en lo que está en la lista de teclas.

+0

Eso no parece tan hackish. (Obviamente hay pequeños problemas relacionados con el enfoque, supongo que todos asumen el foco de ganancia/pérdida.) –

+0

@MichaelMyers cómo se repite la clave, si mantengo presionada una tecla se muestra como una pryamid de su lado: a | a, a | a, a, a | a, a, a, a | a, a, a | a, a | a – KisnardOnline

+0

@JayAvon: Creo que vale la pena hacer una nueva pregunta. –

2

En general, lo que está describiendo se puede lograr utilizando bitmasks.

+3

-1 no hay respuesta relacionada con java y no hay ayuda para contestar la pregunta – Janusz

+0

¿A qué te refieres con Janusz? Es más que relevante. Sí, no está relacionado con Java, pero eso no significa que sea útil. –

3

Aquí es un ejemplo de código que muestra cómo realizar una acción cuando se presiona CTRL + Z:

import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
class p4 extends Frame implements KeyListener 
{ 
    int i=17; 
    int j=90; 
    boolean s1=false; 
    boolean s2=false; 

    public p4() 
    { 
     Frame f=new Frame("Pad"); 

     f.setSize(400,400); 
     f.setLayout(null); 
     Label l=new Label(); 
     l.setBounds(34,34,88,88); 
     f.add(l); 

     f.setVisible(true); 
     f.addKeyListener(this); 
    } 

    public static void main(String arg[]){ 
     new p4(); 
    } 

    public void keyReleased(KeyEvent e) { 
     //System.out.println("re"+e.getKeyChar()); 

     if(i==e.getKeyCode()) 
     { 
      s1=false; 
     } 

     if(j==e.getKeyCode()) 
     { 
      s2=false; 
     } 
    } 

    public void keyTyped(KeyEvent e) { 
     //System.out.println("Ty"); 
    } 

    /** Handle the key pressed event from the text field. */ 
    public void keyPressed(KeyEvent e) { 
     System.out.println("pre"+e.getKeyCode()); 

     if(i==e.getKeyCode()) 
     { 
      s1=true; 
     } 

     if(j==e.getKeyCode()) 
     { 
      s2=true; 
     } 

     if(s1==true && s2==true) 
     { 
      System.out.println("EXIT NOW"); 
      System.exit(0); 
     } 
    } 

    /** Handle the key released event from the text field. */ 

} 
+0

Pero, ¿qué pasa si otras claves tienen que ser claves no modificadoras? Digamos, teclas de dirección para mover un objeto a través de la pantalla y espacio para disparar? Quieres poder disparar mientras te mueves – TheRealChx101

Cuestiones relacionadas