08 enero 2009

Remake (parcial) de Fruity Frank... 25 - Añadiendo efectos sonoros

Vamos a añadir sonidos al juego, para que tenga "algo más de vida". Para conseguirlo, crearemos una nueva clase "Sonido", que se apoyará en "Sdl_mixer", ocultando los detalles de esta librería.

Por ejemplo, el constructor se encargará de cargar un fichero de música:
    /// Constructor a partir de un nombre de fichero
public Sonido(string nombreFichero)
{
punteroInterno = SdlMixer.Mix_LoadMUS(nombreFichero);
}

Y tendremos funciones para reproducir un sonido una vez (por ejemplo, cuando muere un enemigo, o nuestro personaje, o cuando recogemos una fruta), así como para reproducir un sonido de forma continua (para la música de fondo):
    /// Reproducir una vez
public void Reproducir1()
{
SdlMixer.Mix_PlayMusic(punteroInterno, 1);
}

/// Reproducir continuo (musica de fondo)
public void ReproducirFondo()
{
SdlMixer.Mix_PlayMusic(punteroInterno, -1);
}

También necesitamos otra función que permita dejar de reproducir sonidos:
    /// Interrumpir toda la reproducción de sonido
public void Interrumpir()
{
SdlMixer.Mix_HaltMusic();
}


Así, cada nivel tendrá una música de fondo. Esta música se declara en la clase "Nivel" genérica:
    public class Nivel
{
protected Sonido miMusicaFondo;
...

En la clase "Nivel" prepararemos también las funciones para reproducir su música de fondo o para detenerla, ambas basadas en las posibilidades de la clase "Sonido":
    public void ReproducirMusica()
{
if (miMusicaFondo != null)
miMusicaFondo.ReproducirFondo();
}

public void PararMusica()
{
if (miMusicaFondo != null)
miMusicaFondo.Interrumpir();
}

Y esa música se cargará en el constructor de cada "clase hija" (porque cada nivel concreto tendrá su propia música de fondo):
    public class Nivel1: Nivel
{

const byte NUMENEMIGOS = 3;

public Nivel1()
{
byte i;

miMapa = new Mapa1();
miMusicaFondo = new Sonido("sonidos\\fruity-nivel1.mp3");
enemigos = new Enemigo[NUMENEMIGOS];
...

En el juego, tendremos una música adicional para el cambio de nivel (todavía no habrá sonido al recoger frutas ni al morir personajes), y entonces, cuando se cambio de nivel, deberemos parar la música del nivel anterior, reproducir el sonido de cambio de nivel, y a continuación comenzar a reproducir la música de fondo del nuevo nivel, así:
    public  void SiguienteNivel()
{
miNivel.PararMusica();
musicaNuevoNivel.Reproducir1();
...
if (numeroNivel % 3 == 1)
miNivel = new Nivel1();
...
miNivel.ReproducirMusica();



Sólo falta crear la carpeta sonidos, y guardar en ella los sonidos que nos interesan, que habremos capturado previamente del juego original, o bien habremos creado nosotros mismos. También deberemos modificar los ficheros "BAT" encargados de compilar todos los fuentes, para que incluyan la nueva clase "Sonido".

Como siempre, todo el fuente del proyecto está en: code.google.com/p/fruityfrank

1 comentario:

kuki dijo...

Gracias por la felicitacion!
=)