Detectar la entrada del usuario es fundamental para que cualquier juego sea interactivo y divertido. Sin la capacidad de saber cuándo el jugador pulsa una tecla o mueve el ratón, nuestro juego no sería más que una animación sin control. Por eso, vamos a explorar cómo manejar estas entradas usando Java y la librería Sleek, centrándonos en las diferencias entre detectar teclas pulsadas y teclas presionadas, así como en el manejo de los botones y la posición del ratón.
Para empezar, la clase Input es la clave para obtener la información de entrada. Esta clase la obtenemos a través del contenedor de nuestro juego, que es la ventana donde se dibujan todos los elementos y que recibe las señales del sistema operativo sobre las acciones del usuario. Así, creamos una variable de tipo Input y la inicializamos con container.getInput() para poder consultar el estado del teclado y del ratón.
En cuanto al teclado, existen dos métodos principales para detectar la pulsación de teclas: isKeyDown e isKeyPressed. La función isKeyDown devuelve true mientras la tecla esté siendo mantenida pulsada. Por ejemplo, si mantenemos la tecla espacio presionada durante cinco segundos, esta función devolverá true durante todo ese tiempo. En cambio, isKeyPressed devuelve true solo una vez por cada pulsación, es decir, detecta si la tecla fue pulsada desde la última vez que se llamó a esta función, pero no mientras se mantenga presionada.
Para ilustrar esto, imaginemos que queremos mostrar una imagen solo mientras se mantenga pulsada la tecla espacio. Usando isKeyDown(Input.KEY_SPACE), podemos dibujar la imagen mientras la tecla esté presionada y ocultarla cuando se suelte. Por otro lado, si usamos isKeyPressed(Input.KEY_SPACE), la imagen solo aparecerá brevemente durante un ciclo de actualización, porque esta función detecta la pulsación puntual y luego vuelve a false hasta que se pulse de nuevo.
Para manejar este comportamiento con isKeyPressed, podemos usar una variable booleana que se active cuando se detecta la pulsación y se mantenga activa hasta que otra acción la desactive. Por ejemplo, podemos hacer que al pulsar espacio la variable imagenPulsada se ponga a true y que mientras esta variable sea verdadera, la imagen se dibuje en pantalla. Además, podemos combinar condiciones para que, por ejemplo, si se pulsa la tecla control izquierdo, la variable se ponga a false y la imagen desaparezca.
Un paso más allá es controlar la posición de la imagen en pantalla usando variables para las coordenadas x e y. En lugar de dibujar la imagen siempre en una posición fija, podemos actualizar estas variables según las teclas de dirección que el usuario pulse. Si detectamos que la tecla arriba está pulsada, disminuimos la coordenada y para que la imagen suba; si es la tecla abajo, aumentamos y para que baje; y de forma similar para las teclas izquierda y derecha modificamos la coordenada x. Así, la imagen se moverá por la pantalla respondiendo a las entradas del teclado.
Pasando al ratón, el manejo es similar. Podemos detectar si un botón está pulsado con métodos como isMouseButtonDown(int button) o si se ha pulsado con isMousePressed(int button). Los botones del ratón se identifican con números: el botón izquierdo es el 0, el derecho el 1 y el central el 2. Si queremos que una imagen se dibuje solo mientras el botón izquierdo esté pulsado, podemos usar isMouseButtonDown(0) para comprobarlo.
Al igual que con el teclado, isMousePressed detecta la pulsación puntual y solo devuelve true durante un ciclo, por lo que para mantener un estado podemos usar una variable booleana que se active cuando se detecta la pulsación y se mantenga hasta que se desactive.
Además, podemos obtener la posición actual del ratón en la ventana con getMouseX() y getMouseY(). Esto nos permite, por ejemplo, mostrar en pantalla las coordenadas del ratón o hacer que ciertos elementos aparezcan o desaparezcan según la posición del cursor. Por ejemplo, podemos hacer que una imagen solo se muestre cuando el ratón esté en la mitad derecha de la pantalla, comprobando si getMouseX() es mayor que la mitad del ancho de la ventana.
Un ejemplo sencillo para mostrar las coordenadas del ratón en pantalla sería:
String cadena = "(" + input.getMouseX() + ", " + input.getMouseY() + ")";
g.drawString(cadena, 10, 10);
Y para mostrar una imagen solo cuando el ratón esté en la mitad derecha:
boolean puedoVerImagen = input.getMouseX() > 320;
if (puedoVerImagen) {
imagen.draw(100, 100);
}
Con estas técnicas podemos crear juegos que respondan de forma fluida y natural a las acciones del jugador, ya sea con el teclado o con el ratón. La clave está en entender cuándo usar isKeyDown para acciones continuas y isKeyPressed para acciones puntuales, y en aprovechar la posición del ratón para interacciones más dinámicas.
El siguiente paso en el desarrollo será aprender a detectar colisiones entre objetos, lo que nos permitirá crear juegos más complejos y divertidos. Pero por ahora, dominar la entrada del usuario es esencial para que nuestro juego cobre vida y podamos empezar a construir experiencias interactivas.