Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Zodiak98 en 12 Julio 2016, 23:14 pm



Título: ¿Cómo detectar varias teclas por teclado simultáneamente?
Publicado por: Zodiak98 en 12 Julio 2016, 23:14 pm
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).


Título: Re: ¿Cómo detectar varias teclas por teclado simultáneamente?
Publicado por: Gunhack en 13 Julio 2016, 08:12 am
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


Título: Re: ¿Cómo detectar varias teclas por teclado simultáneamente?
Publicado por: Gunhack en 13 Julio 2016, 17:36 pm
Intenta probar esto y dime si es lo que necesitabas  :P

Código
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.util.ArrayList;
  4.  
  5. import javax.swing.*;
  6.  
  7. public class PruebaTeclas {
  8.  
  9. public static void main(String[] args) {
  10.  
  11. new WindowPrinc();
  12. }
  13.  
  14. }
  15.  
  16. class WindowPrinc extends JFrame {
  17.  
  18. private JLabel lDireccion, lCouunt;
  19. private int disp;
  20. java.util.List<String> Dir;
  21.  
  22.  
  23. public WindowPrinc() {
  24.  
  25. setTitle("Prueba");
  26. setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  27. setBounds(Toolkit.getDefaultToolkit().getScreenSize().width/2 - 100,
  28. Toolkit.getDefaultToolkit().getScreenSize().height/2 - 100,
  29. 100, 100);
  30.  
  31. setLayout(new FlowLayout());
  32.  
  33. lDireccion = new JLabel("Direccion: N/A");
  34. lCouunt = new JLabel("Disparos: 0");
  35. disp = 0;
  36. Dir = new ArrayList<>();
  37. Dir.add("N/A");
  38.  
  39. add(lDireccion);
  40. add(lCouunt);
  41.  
  42.        this.addKeyListener(new KeyAdapter() {
  43.  
  44. @Override
  45. public void keyPressed(KeyEvent e) {
  46.  
  47. int c = 0;
  48.  
  49. if(c == 0 && Dir.size() < 2) {
  50.  
  51. switch(e.getKeyCode()) {
  52.  
  53. case KeyEvent.VK_UP:
  54. Dir.add("ARRIBA");
  55. break;
  56. case KeyEvent.VK_DOWN:
  57. Dir.add("ABAJO");
  58. break;
  59. case KeyEvent.VK_LEFT:
  60. Dir.add("IZQUIERDA");
  61. break;
  62. case KeyEvent.VK_RIGHT:
  63. Dir.add("DERECHA");
  64. break;
  65. }
  66. c++;
  67. }
  68.  
  69. if(e.getKeyCode() == KeyEvent.VK_SPACE) {
  70. disp++;
  71. lCouunt.setText("Disparos: " + disp);
  72. }
  73.  
  74. lDireccion.setText("Direccion: " + Dir.get(Dir.size()-1));
  75. }
  76.  
  77. @Override
  78. public void keyReleased(KeyEvent e) {
  79.  
  80. switch(e.getKeyCode()) {
  81.  
  82. case KeyEvent.VK_UP:
  83. deleteKey("ARRIBA");
  84. break;
  85. case KeyEvent.VK_DOWN:
  86. deleteKey("ABAJO");
  87. break;
  88. case KeyEvent.VK_LEFT:
  89. deleteKey("IZQUIERDA");
  90. break;
  91. case KeyEvent.VK_RIGHT:
  92. deleteKey("DERECHA");
  93. break;
  94. }
  95.  
  96. lDireccion.setText("Direccion: " + Dir.get(Dir.size()-1));
  97. }
  98.  
  99. void deleteKey(String dir) {
  100.  
  101. for(int i = 0; i < Dir.size(); i++) {
  102.  
  103. if(dir == Dir.get(i)){
  104.  
  105. Dir.remove(i);
  106. }
  107. }
  108.  
  109. if(Dir.size() == 0) {
  110.  
  111. Dir.add("N/A");
  112. }
  113. }
  114. });
  115.  
  116. setVisible(true);
  117. }
  118. }
  119.  
  120.  


Título: Re: ¿Cómo detectar varias teclas por teclado simultáneamente?
Publicado por: + 1 Oculto(s) en 13 Julio 2016, 17:50 pm
ohh funciona con varias teclas, tuve este mismo problema y recien veo la solucion