Aunque cada vez existen menos terminales Android con teclado físico, siempre es interesante aprender a gestionar los eventos procedentes del teclado. Su manejo se ilustra en el siguiente ejercicio.

 

Ejercicio paso a paso: Manejo de la nave con el teclado

Veamos cómo podemos utilizar un manejador de eventos de teclado para maniobrar la nave de Asteroides:

1. Abre el proyecto Asteroides.

2. Inserta este código en la clase VistaJuego.

@Override

       public boolean onKeyDown(int codigoTecla, KeyEvent evento) {

             super.onKeyDown(codigoTecla, evento);

              // Suponemos que vamos a procesar la pulsación

             boolean procesada = true;

             switch (codigoTecla) {

             case KeyEvent.KEYCODE_DPAD_UP:

                    aceleracionNave = +PASO_ACELERACION_NAVE;

                    break;

             case KeyEvent.KEYCODE_DPAD_LEFT:

                    giroNave = -PASO_GIRO_NAVE;

                    break;

             case KeyEvent.KEYCODE_DPAD_RIGHT:

                    giroNave = +PASO_GIRO_NAVE;

                    break;

             case KeyEvent.KEYCODE_DPAD_CENTER:

             case KeyEvent.KEYCODE_ENTER:

                    ActivaMisil();

                    break;

             default:

                    // Si estamos aquí, no hay pulsación que nos interese

                    procesada = false;

                    break;

             }

             return procesada;

       }

3. Cada vez que se pulse una tecla se realizará una llamada al método onKeyDown() con los siguientes parámetros: El primero es un entero que nos identifica el código de la tecla pulsada. El segundo es de la clase KeyEventy nos permite obtener información adicional sobre el evento, como por ejemplo, cuando se produjo. Este método ha de devolver un valor booleano, verdadero, si consideramos que la pulsación ha sido procesada por nuestro código, y falso, si queremos que otro manejador de evento siguiente al nuestro reciba la pulsación.

4. Antes de ponerlo en marcha comenta la llamada a ActivaMisil(), dado que esta función aún no está implementada.

5. Verifica si funciona correctamente.

NOTA:Para poder recoger eventos de teclado desde una vista es necesario que esta tenga el foco y para que esto sea posible verifica que tiene la propiedad focusable="true"

 

Práctica: Manejo de la nave con el teclado

El ejercicio anterior no funciona de forma satisfactoria. Cuando pulsamos una tecla para girar la nave se pone a girar pero ya no hay manera de pararla. El manejador de eventos onKeyDown solo se activa cuando se pulsa una tecla, pero no cuando se suelta.

Trata de escribir el manejador de eventos onKeyUp para que la nave atienda a las órdenes de forma correcta. Puedes partir del siguiente código:


@Override

       public boolean onKeyUp(int codigoTecla, KeyEvent evento) {

             super.onKeyUp(codigoTecla, evento);

             // Suponemos que vamos a procesar la pulsación

             boolean procesada = true;

             ...

             return procesada;

       }

 

Solución: Una posible solución al ejercicio se muestra a continuación:

@Override

       public boolean onKeyUp(int codigoTecla, KeyEvent evento) {

             super.onKeyUp(codigoTecla, evento);

             // Suponemos que vamos a procesar la pulsación

             boolean procesada = true;

             switch (codigoTecla) {

             case KeyEvent.KEYCODE_DPAD_UP:

                    aceleracionNave = 0;

                    break;

             case KeyEvent.KEYCODE_DPAD_LEFT:

             case KeyEvent.KEYCODE_DPAD_RIGHT:

                    giroNave = 0;

                    break;

             default:

                    // Si estamos aquí, no hay pulsación que nos interese

                    procesada = false;

                    break;

             }

             return procesada;

       }


{jcomments on}