viernes, 27 de mayo de 2011

Interacción avanzada con aplicaciones Java utilizando el teclado


En muchas aplicaciones Java queremos interaccionar con el teclado no únicamente para introducir datos, sino para hacer otro tipo de acciones. Un ejemplo de esto son los juegos, en los que queremos detectar qué teclas o combinaciones de teclas se están pulsando en cada momento.

Java proporciona la interfaz KeyListener que deben implementar todas aquellas clases interesadas en procesar eventos del teclado.

La interfaz define tres métodos:
  • void keyPressed(KeyEvent e) para cuando una tecla se pulsa
  • void keyReleased(KeyEvent e) para cuando una tecla se suelta
  • void keyTyped(KeyEvent e) para cuando se escribe un caracter

Una forma de implementar la interfaz KeyListener para conocer qué teclas se están pulsando en un momento determinado en una aplicación Java es la siguiente:

1. Creamos una clase que implemente la interfaz KeyListener

2. Creamos los atributos de la clase
Nos interesará crear:
  • Un array que almacene el estado de cada una de las teclas de un teclado; este estado puede ser un booleano (pulsado o no pulsado). Un valor que se puede utilizar como tamaño del array y que valdrá para la mayoría de teclados es 256.  
  • También podríamos querer tener otro array donde almacenemos estados más allá de un simple booleano (por ejemplo un enumerado con pulsado, pulsado por primera vez o pulsado y mantenido pulsado).
  • Otros atributos que pueden interesarnos son booleanos que nos indiquen si se ha pulsado una tecla o no, para los casos en los que nos de igual qué tecla se haya pulsado.
3. Implementamos los métodos de la interfaz
Como hemos visto antes, los métodos reciben como parámetro un KeyEvent, el cual tiene un método getKeyCode que nos devuelve el código de la tecla. Una vez comprobemos que este código está dentro de los valores admitidos por nuestro array (entre 0 y 255) actualizamos los atributos para almacenar el estado actual del teclado.

4. Implementamos los métodos para preguntar por el estado de las teclas
Finalmente, implementaremos los métodos que queramos para preguntar a nuestra clase acerca del estado actual del teclado. Por ejemplo:

  • boolean teclaPulsada(int tecla)
  • boolean teclaNoPulsada(int tecla)
  • boolean algunaTeclaPulsada()
  • boolean algunaTeclaNoPulsada()

Una vez tengamos nuestra clase implementada (y probada) ya podemos utilizarla en nuestra aplicación.
Primero nos definimos e inicializamos un objeto de dicha clase y después le iremos preguntando por las teclas acerca de las que nos interesa conocer su estado.

Referencias:

  • Esta entrada ha sido inspirada por esta y esta, en ellas podéis encontrar ejemplos de lo que he explicado.
  • Aquí podéis encontrar más información de cómo implementar la interfaz KeyListener.
  • Una librería que tiene buena pinta para manejar entrada de datos en juegos es Jinput.
  • Y una muy buena referencia para programar juegos en Java es el libro Killer Game Programming in Java, disponible por completo en la Web, continuamente actualizado y con un montón de ejemplos de código. 


Y, para finalizar, Java además de proporcionar una interfaz para procesar eventos de teclado también proporciona una para procesar eventos del ratón. ¿A alguien se le ocurre cómo se puede llamar la interfaz?

2 comentarios:

  1. MouseListener o ClickListener supongo :)

    ResponderEliminar
  2. ¡Premio! MouseListener (http://download.oracle.com/javase/6/docs/api/java/awt/event/MouseListener.html)

    ResponderEliminar