Entrada

Cómo trabajar con la entrada en nuestro juego usando los sistemas de libGDX que hay por debajo de mini2dx. Tenemos a nuestra disposición el sistema de polling y el sistema de Input Processors.

Este curso ha sido marcado como anticuado y no está siendo revisado de forma activa. Es posible que la información pueda estar desactualizada o que los enlaces se hayan roto.

Cuando trabajamos en el desarrollo de juegos, uno de los aspectos fundamentales es cómo gestionamos la entrada del usuario. Detectar cuándo se pulsa una tecla, cuándo se hace clic con el ratón o cuándo se toca la pantalla es esencial para controlar la interacción con nuestro personaje o elementos del juego. En este recorrido, vamos a explorar cómo manejar estas entradas de forma eficiente usando Mini2DX y LibGDX.

Para empezar, hemos preparado un escenario donde mostramos un personaje en pantalla utilizando sprites extraídos de una hoja de texturas. Usamos el método split para dividir una región de la textura en varias subregiones, que corresponden a las diferentes orientaciones del jugador: arriba, derecha, abajo e izquierda. Así, podemos cambiar la apariencia del personaje según la dirección hacia la que se mueve.

La forma más directa de detectar pulsaciones de teclas en LibGDX es mediante la clase GDX.input. Esta clase nos ofrece métodos estáticos para consultar el estado actual de la entrada, como si una tecla está siendo pulsada o si acaba de ser presionada. Por ejemplo, el método isKeyJustPressed devuelve true únicamente en el instante en que se pulsa una tecla, lo que nos permite reaccionar justo en ese momento.

Podemos aprovechar esto para cambiar la región del sprite del jugador según la tecla de dirección que se haya pulsado. Si detectamos que se ha pulsado la tecla de flecha arriba, asignamos la región correspondiente a la orientación hacia arriba, y así sucesivamente con las demás direcciones. Para mantener la orientación correcta del sprite, es necesario aplicar un setFlip después de cambiar la región, ya que el cambio puede resetear la inversión del sprite.

Este enfoque es sencillo y funciona bien, pero tiene una desventaja importante: la comprobación se realiza en cada actualización del juego, es decir, en cada frame. Esto significa que, incluso cuando no hay interacción, el juego está constantemente preguntando si alguna tecla está siendo pulsada, lo que puede suponer un gasto innecesario de recursos.

Para optimizar este proceso, LibGDX ofrece un sistema basado en eventos mediante la interfaz InputProcessor. Mini2DX facilita su uso al implementar esta interfaz en la clase BasicGame, lo que nos permite manejar eventos de entrada de forma asíncrona. En lugar de comprobar continuamente el estado de las teclas, podemos definir métodos que se ejecutan únicamente cuando ocurre un evento relevante, como pulsar o soltar una tecla.

Entre los métodos que podemos implementar están keyDown, que se llama cuando se pulsa una tecla, y keyUp, que se ejecuta cuando se suelta. En nuestro caso, nos interesa especialmente keyUp para detectar cuándo el jugador deja de presionar una tecla de dirección y actualizar la orientación del sprite en ese momento. Esto reduce el consumo de CPU, ya que el código solo se activa cuando hay una interacción real.

Dentro del método keyUp, podemos usar un switch para identificar qué tecla se ha soltado, comparando con las constantes de Input.Keys como Up, Down, Left y Right. Según la tecla, actualizamos la región del sprite y aplicamos el setFlip para mantener la orientación correcta. Si la tecla no es relevante, simplemente no hacemos nada y devolvemos false para indicar que no hemos procesado ningún evento significativo.

Este sistema basado en eventos no solo es más eficiente, sino que también organiza mejor nuestro código, separando la lógica de entrada del ciclo principal de actualización del juego. Además, LibGDX y Mini2DX soportan otros tipos de entrada, como eventos táctiles multitouch y botones del ratón, lo que amplía las posibilidades para interactuar con el juego.

Para profundizar en estos temas, la wiki de LibGDX es un recurso excelente, donde se detallan los métodos disponibles para manejar la entrada y los eventos, así como ejemplos para trabajar con diferentes dispositivos y tipos de interacción.

A continuación, un ejemplo simplificado de cómo implementar el manejo de teclas con InputProcessor en Mini2DX:

@Override
public boolean keyUp(int keycode) {
    switch (keycode) {
        case Input.Keys.UP:
            jugador.setRegion(arriba);
            jugador.setFlip(false, true);
            return true;
        case Input.Keys.DOWN:
            jugador.setRegion(abajo);
            jugador.setFlip(false, true);
            return true;
        case Input.Keys.LEFT:
            jugador.setRegion(izquierda);
            jugador.setFlip(false, true);
            return true;
        case Input.Keys.RIGHT:
            jugador.setRegion(derecha);
            jugador.setFlip(false, true);
            return true;
        default:
            return false;
    }
}

Con este enfoque, nuestro juego responde de manera eficiente y fluida a las entradas del usuario, mejorando la experiencia y optimizando el rendimiento.

Lista de reproducción
  1. 1
    Instalar Android Studio y crear proyecto
    12 minutos
  2. 2
    BasicGame y ejecutar proyecto
    11 minutos
  3. 3
    Renderizando imágenes
    11 minutos
  4. 4
    Entrada
    11 minutos
  5. 5
    Interpolate
    9 minutos
  6. 6
    Inyección de dependencia
    11 minutos