Música

Y después del sonido siempre queda la música. Por eso en este vídeo vemos el funcionamiento de la clase Music, para añadir música a nuestro juego.

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.

Para enriquecer la experiencia de nuestro juego 2D, es fundamental integrar música y efectos de sonido que acompañen la acción y generen una atmósfera más inmersiva. En este caso, vamos a trabajar con música en formato XM y sonidos para disparos y explosiones, manejando su carga, reproducción, pausa y detención de forma sencilla.

Primero, debemos importar la música que queremos usar. En nuestro ejemplo, hemos elegido una canción llamada Super Chicken en formato XM, descargada de una página de dominio público para evitar problemas de copyright. La colocamos dentro de la carpeta de sonidos de nuestro proyecto para tenerla organizada y accesible.

Para poder reproducir archivos en formato XM o MOD, necesitamos una librería adicional llamada IBXM. Esta librería la extraemos del paquete de Slick2D que ya teníamos y la añadimos a nuestro proyecto como un archivo .jar o .hard según el entorno. Esto nos permitirá manejar estos formatos de música sin complicaciones.

Una vez configurado el entorno, podemos crear una instancia de la clase Music para cargar la canción desde el disco duro. Esta clase ofrece varios constructores, algunos de los cuales permiten cargar la música en modo streaming, útil para archivos grandes que se reproducen mientras se descargan. En nuestro caso, como la música está local, la cargamos directamente sin streaming:

Music musica;

public void init() throws SlickException {
    musica = new Music("sonidos/superchicken.xm");
}

La clase Music nos proporciona métodos para controlar la reproducción, como play(), stop(), y loop(). Además, podemos pausar y reanudar la música con pause() y resume(). También es posible consultar y modificar la posición actual de reproducción con getPosition() y setPosition(), lo que nos da flexibilidad para manejar la música según el estado del juego.

Para ajustar el volumen de manera progresiva, podemos usar el método fade(float volumen, int milisegundos), que permite hacer efectos de fade in o fade out. Si queremos que la música se detenga automáticamente al terminar un fade out, podemos activar stopAfterFade().

Probando estos métodos, podemos hacer que la música comience a sonar al pulsar la tecla espacio y se detenga cuando se lo indiquemos:

if (input.isKeyPressed(Input.KEY_SPACE)) {
    musica.play();
}

if (input.isKeyPressed(Input.KEY_S)) {
    musica.stop();
}

En el contexto del juego, queremos que la música de fondo suene durante toda la partida. Para ello, declaramos una variable de tipo Music en la clase principal del juego y la inicializamos en el método init(). La reproducimos al comenzar la partida y la detenemos cuando el jugador pierde:

public class Juego {
    private Music fondo;

    public void init() throws SlickException {
        fondo = new Music("sonidos/superchicken.xm");
        fondo.play();
    }

    public void update(GameContainer gc, int delta) {
        if (nave.muerta()) {
            if (fondo.playing()) {
                fondo.stop();
            }
        }
    }
}

Para los efectos de sonido, como disparos y explosiones, usamos la clase Sound. Dado que varias instancias de la nave espacial compartirán los mismos sonidos, cargamos estos efectos de forma estática para evitar recargas innecesarias:

public class Nave {
    private static Sound disparo = null;
    private static Sound explosion = null;

    public Nave() throws SlickException {
        if (disparo == null) {
            disparo = new Sound("sonidos/disparo.ogg");
        }
        if (explosion == null) {
            explosion = new Sound("sonidos/explosion.ogg");
        }
    }

    public void disparar() {
        disparo.play();
    }

    public void explotar() {
        explosion.play();
    }
}

En el juego, cuando el jugador pulsa la tecla para disparar, llamamos al método disparar() para reproducir el sonido correspondiente. De igual forma, cuando un alien explota tras una colisión, reproducimos el sonido de explosión.

Para ajustar el volumen de la música y que no opaque los efectos de sonido, podemos modificar el volumen al reproducirla, por ejemplo, reduciéndolo a la mitad:

fondo.play(1.0f, 0.5f); // volumen al 50%

Con estas implementaciones, conseguimos que el juego tenga una música de fondo que se reproduce durante la partida, sonidos para las acciones clave como disparos y explosiones, y un control sencillo sobre la reproducción y el volumen de cada uno. Así, mejoramos la experiencia del jugador de forma práctica y efectiva.

Lista de reproducción
  1. 1
    Instalando las herramientas Java
    11 minutos
  2. 2
    Instalando Slick2D
    26 minutos
  3. 3
    Estados e imágenes
    23 minutos
  4. 4
    Respuesta de usuario
    24 minutos
  5. 5
    Colisiones
    25 minutos
  6. 6
    Matemáticas y física
    13 minutos
  7. 7
    SpriteSheet
    13 minutos
  8. 8
    Tilemaps básicos
    23 minutos
  9. 9
    Escalas
    11 minutos
  10. 10
    Animaciones (parte 1)
    14 minutos
  11. 11
    Animaciones (parte 2)
    15 minutos
  12. 12
    Radiografía de un estado
    12 minutos
  13. 13
    Mover con el ratón (parte 1)
    11 minutos
  14. 14
    Mover con el ratón (parte 2)
    13 minutos
  15. 15
    Sonido
    13 minutos
  16. 16
    Música
    14 minutos
  17. 17
    Fuentes
    19 minutos
  18. 18
    Instalar Slick en NetBeans
    6 minutos