Scene2D

En este episodio nos enfrentamos a nuestra vieja amiga Scene2D. Cómo crear una escena, cómo añadir actores, cómo definir viewports, cómo añadir acciones, cómo añadir listeners.

Sting2D es una librería fundamental dentro de LITDX que nos permite organizar y gestionar los elementos visuales de un juego mediante un sistema de escenas y actores. En esencia, Sting2D nos ayuda a dividir nuestro juego en componentes llamados actores, que pueden representar desde una nave espacial hasta un enemigo o un decorado. Estos actores se organizan en una estructura tipo árbol, donde unos pueden ser hijos de otros, facilitando así la gestión y agrupación de objetos relacionados, como por ejemplo una mesa con sus tablas y objetos encima.

Para crear un actor en Sting2D, debemos extender la clase base Actor. Dos métodos clave que siempre debemos implementar son draw y act. El método draw es el encargado de renderizar el actor en pantalla y recibe un SpriteBatch ya abierto para dibujar, además de un parámetro parentAlpha que indica la transparencia heredada del actor padre. Esto es útil para manejar efectos de transparencia de forma jerárquica. Por ejemplo, si el padre tiene un 50% de transparencia y el hijo también un 50%, el resultado visual será un 25% de opacidad para el hijo.

Dentro del método draw, podemos usar los getters que proporciona el actor para obtener propiedades como posición, tamaño, escala y rotación, y así dibujar la textura o sprite correspondiente con todos estos parámetros. Además, podemos tintar el actor con un color específico usando el método getColor, lo que nos permite, por ejemplo, cambiar el color del actor temporalmente para indicar que ha sido golpeado o está en un estado especial.

Es importante también implementar el método dispose para liberar recursos como texturas cuando el actor ya no se utilice, evitando así fugas de memoria en la VRAM.

Una vez definido nuestro actor, lo añadimos a un Stage, que es el escenario donde se colocan y gestionan todos los actores. El Stage puede crearse con diferentes tipos de Viewport, que son responsables de adaptar la visualización del juego a distintas resoluciones y tamaños de pantalla, algo crucial para que nuestro juego se vea bien tanto en ordenadores como en dispositivos móviles.

Los viewports más comunes que podemos usar son:

  • ExtendViewport: Mantiene la relación de aspecto extendiendo el mundo en una dirección y puede limitar el tamaño máximo para evitar que se muestre demasiado contenido o barras negras.
  • FillViewport: Escala el mundo para llenar toda la pantalla, recortando los bordes si es necesario para mantener la relación de aspecto.
  • FitViewport: Escala el mundo para que quepa dentro de la pantalla sin distorsión, añadiendo barras negras si la relación de aspecto no coincide.
  • StretchViewport: Estira el mundo para llenar la pantalla sin mantener la relación de aspecto, lo que puede distorsionar la imagen.
  • ScreenViewport: No escala el mundo, mostrando todo al 100%, lo que puede hacer que en pantallas grandes los elementos se vean pequeños.

Para que el viewport funcione correctamente, es fundamental llamar al método viewport.update(width, height) en el método resize de nuestra aplicación, asegurando que la visualización se adapte cuando cambie el tamaño de la ventana o pantalla.

Además de la gestión visual, Sting2D nos ofrece un sistema de acciones que facilita la animación y manipulación de actores sin necesidad de escribir código complejo. Por ejemplo, podemos mover un actor, cambiar su color, hacer que desaparezca o aparezca, escalarlo o rotarlo simplemente añadiendo acciones predefinidas. Estas acciones pueden ejecutarse de forma secuencial, usando SequenceAction, o en paralelo, con ParallelAction, permitiendo combinaciones complejas de animaciones con muy poco código.

Para que las acciones funcionen, es imprescindible que en el método act de nuestro actor llamemos a super.act(delta), ya que es ahí donde se procesan las acciones asignadas.

Por último, Sting2D incluye un sistema de listeners para gestionar eventos de entrada, como pulsaciones de teclas, clics o gestos táctiles. Podemos añadir listeners a nuestros actores para reaccionar a eventos como touchDown y touchUp. Sting2D distingue entre dos fases para el manejo de eventos: la fase de captura, que va de arriba hacia abajo en el árbol de actores, y la fase de recepción, que va de abajo hacia arriba. Esto nos permite controlar el flujo de eventos y decidir si un actor hijo debe recibir o no un evento si su padre ya lo ha procesado.

Un ejemplo sencillo de listener es usar un InputListener para cambiar el color de un actor cuando se pulsa sobre él y restaurarlo cuando se suelta. Para que estos listeners funcionen, debemos asegurarnos de que el Stage sea el procesador de entrada activo, asignándolo con Gdx.input.setInputProcessor(stage).

En resumen, Sting2D nos proporciona una estructura potente y flexible para crear y gestionar escenas, actores, animaciones y eventos de entrada en nuestros juegos, facilitando el desarrollo y adaptándose a múltiples dispositivos gracias a sus viewports. Además, su integración con acciones y listeners nos permite añadir interactividad y dinamismo con un esfuerzo mínimo.

Lista de reproducción
  1. 1
    Instalación y creación de proyectos
    20 minutos
  2. 2
    Festival de la compilación
    21 minutos
  3. 3
    Dibujar por pantalla
    30 minutos
  4. 4
    Procesando entrada
    26 minutos
  5. 5
    Más tipos de imagen
    28 minutos
  6. 6
    Más tipos de entrada
    33 minutos
  7. 7
    Control de resolución
    26 minutos
  8. 8
    Scene2D
    alrededor de 1 hora
  9. 9
    Scene2D UI (parte 1)
    44 minutos
  10. 10
    Scene2D UI (parte 2)
    32 minutos
  11. 11
    Código dependiente de la plataforma
    8 minutos
  12. 12
    Ejecutar código de Android (1/2)
    11 minutos
  13. 13
    Ejecutar código en Android (2/2)
    10 minutos
  14. 14
    Usando el log
    9 minutos
  15. 15
    Internacionalización y localización (1/2)
    9 minutos
  16. 16
    Internacionalización y localización (2/2)
    10 minutos
  17. 17
    Crear juegos con gdx-liftoff y libGDX
    7 minutos