Sonido ¿qué cosa?
¿Qué sería de la vida sin sonido? Y ni hablar de un videojuego...Quien no recuerda el Doom y los ruidos que se escuchan cuando habían monstruos pululando cerca nuestro....
¿Quién no tararea o silba la canción de su videojuego favorito?
Es mas ¿Qué seria del "Pump it up" o del "Dance Dance Revolution" sin sonido?
Creo que después de esto no es necesario explicar porque vamos a querer sonido y música dentro de nuestro juego. :-)
Ni tampoco decir sobre que va a estar orientado este 4to Tutorial.
Nosotros vamos a utilizar la SDL_Mixer como API para reproducir sonidos en nuestra aplicación, como siempre, esta librería es muy sencilla de utilizar y esta muy bien documentada, con lo cual nos va a ser de mucha ayuda cuando queramos hacer algunas cosas mas complejas.
Bueno, como ustedes cada vez quieren menos introducción teórica y mas código, les voy a dar el gusto y vamos a ver un ejemplo de como reproducir un sonido usando la SDL_Mixer, como es de costumbre, todo lo nuevo lo voy a explicar paso a paso.
Todo lo necesario para correr los ejemplos, incluido el código fuente esta en este aquí.
Este código es parte del archivo: sonidos.cpp.
#include < SDL_mixer.h >
Mix_Chunk *sonido = NULL;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)
Mix_OpenAudio (44100, MIX_DEFAULT_FORMAT, 2, 1024)
44100: la frecuencia de muestreo con la cual va a reproducir.
MIX_DEFAULT_FORMAT: formato de salida, no necesitamos saber mas por el momento.
2: cantidad de canales, 2 es estéreo.
1024: cantidad de bytes usados por sampleo.
Atención: SDL nativamente tiene la función que se llama SDL_OpenAudio, la función que acabamos de llamar se encarga de inicializar todo y tomar control de la parte de sonido, así que una llamada a las funciones nativas de audio de SDL no es para nada recomendable.
sonido = Mix_LoadWAV ("impacto1.wav");Fijense que acá estoy cargando un wav, pero con la misma función puedo cargar otros formatos, como por ejemplo el ogg.
Mix_PlayChannel (-1, sonido, 0);
while(Mix_Playing(-1) != 0)
{
SDL_Delay(1);
}En el momento que el sonido deje de reproducirse, el canal se libera y salimos del while.
¡Un segundo! ¿Qué esta pasando acá?
Mix_PlayChannel?, no es una función bloqueante, esto quiere decir que la función regresa inmediatamente y no espera que la canción o sonido termine de reproducir; es decir que corre en su propio Thread? (o hilo de ejecución), entonces nosotros debemos esperar que termine para poder terminar el programa. Si nosotros no hacemos este bucle while, el programa terminará y el sonido se cortará apenas comenzó a reproducirse.
Al hacer un juego, este bucle no lo vamos a tener que hacer, ya que el sonido se reproducirá mientras el programa calcula cosas y dibuja en la pantalla. Esto lo hicimos solo para mostrar como reproducir un sonido y nada más.
Mix_FreeChunk(sonido); Mix_CloseAudio();
Hit Music
Ahora que ya sabemos como reproducir sonido, vamos por la reproducción de musica.Como verán no es muy distinto conceptualmente, salvo por el uso de canales.
El código a continuación pertenece al archivo: musica.cpp.
Para reproducir musica, no hacemos uso de canales como lo hacíamos con el sonido sino que que la SDL_Mixer se encarga de tener un canal único para la reproducción de musica, este no trae problemas, ya que en pocos casos (me aventuraría a decir ninguno) vamos a tener 2 canciones de fondo al mismo tiempo. Para eso están los sonidos.
Ok, acá esta el código y la explicación de las partes nuevas.
Mix_Music *musica = NULL;
musica = Mix_LoadMUS ("mappy.mid");Mix_PlayMusic (musica, 0);
Mix_PlayingMusic();
Mix_FreeMusic(musica);
Seamos realistas
Si bien la SDL_Mixer nos permite reproducir eficientemente sonido y poder agregarle algunos efectos a los canales. Si lo que estamos buscando es algo para integrar en un juego 3D, entonces esta librería no es la mejor opción (como lo dice el propio autor), para ese tipo de manejo de sonido busquen sobre OpenAL.¡¿Y Ahora?!
Ahora que ya vimos como inicializar la SDL, como mostrar imágenes y generar animaciones simples, captura de eventos de teclado y mouse y por último sonido. No nos queda mucho mas por aprender para empezar a realizar nuestro ansiado y querido juego.Así que a partir de la 5ta entrega de estos Tutoriales SDL, vamos a empezar a hacer un juego muy sencillo para mostrar como todas estas partes se unen en una aplicación.
Les adelanto que el juego sera enteramente desarrollado en C (nada de C++), y les propongo una cosa: si desean que explique algún tema muy particular que no abarque en los anteriores tutoriales, mandenme un e-mail o dejen un comentario aquí mismo sobre que les gustaría que tenga el juego; que quede claro que no esta en discusión el diseño del juego ni estilo del juego.
Eso es todo, y ya saben, cualquier duda que tengan me mandan un e-mail o dejan un comentario aquí mismo.
Hasta luego.
