lunes, 7 de septiembre de 2015

Crear juego RPG en C++ y Allegro 4 (7) Efectos sonoros

Continuamos con el curso de crea tu juego RPG en C++ y Allegro. En esta entrega se añadirá algunos efectos sonoros.



NOTA IMPORTANTE:

Para realizar este curso es necesario tener hecho los anteriores, ya que solo se hace referencia a cambios en el código.

Añadiendo Sonidos

Para este curso necesitaremos algunos recursos, concretamente los archivos de audio de los efectos que queramos añadir. Para ello se han buscado algunas páginas gratuitas, donde se puede descargar el efecto deseado.
1. Pagina web de sonidos gratuitos
2. Página web de sonidos gratuitos

Es importante recordar que el Allegro solo reconoce el formato WAV sin compresión, así que se debe de asegurar que todos los archivos de audio estén en este formato.

En este ejemplo añadiremos tres sonidos:

  • pasos.wav: el personaje hará un ruido al caminar
  • abrir_puerta.wav: al cambiar de escenario pasando por la puerta, suena el sonido de abrir una puerta.
  • bosque.wav: es un sonido ambiente del bosque donde se oyen animales, que se repetirá de forma cíclica.

Programación

Para poder utilizar sonidos en Allegro se debe de inicializar, y esto se añade a la función inicia_allegro() , justamente despues de ajustar la resolución de la pantalla.

    // incializa el audio en allegro
    if (install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) != 0) {
       allegro_message("Error: inicializando sistema de sonido\n%s\n", allegro_error);
    }
        
    // inicializa todo lo referente al sonido
    inicia_sonido();

Todo lo demás referente al sonido se va a poner aparte en un archivo llamado audio.h, que se encargará de todo el audio de nuestro juego.

// audio.h

SAMPLE *spasos;
SAMPLE *spuerta1;
SAMPLE *sbosque;

// funcion que carga todos los ficheros de audio
void inicia_sonido(){
 set_volume(230, 90);
 
 spasos     =  load_wav("pasos.wav");
 spuerta1 = load_wav("abrir_puerta.wav");
 sbosque  = load_wav("bosque.wav");
}

void sonido_pasos(){
     play_sample ( spasos, 100,128, 3300, 0 );
}

void sonido_abrirpuerta(){
     play_sample ( spuerta1, 100,128, 1300, 0 );     
}

void sonido_ambiente(){
     play_sample ( sbosque, 80,128, 900, 1 );     
}

void para_sonido_ambiente(){
     stop_sample( sbosque );
}
   
El comando play_sample requiere cinco parámetros:

  1. El SAMPLE que se quiere reproducir. 
  2. Indica el volumen, con un rango de 0 a 255 (máximo volumen). 
  3. Indica si se quiere que se escuche por la izquierda 0 o la derecha 255.
  4. La frecuencia es relativa: 1000 representa la frecuencia a la que el sample fue grabado, 2000 es el doble, etc.
  5. Repetición, si esta a 1 indica que se repetirá.


Ahora ya solo queda hacer las llamadas a las funciones de sonido, en el momento justo de cada una de las acciones a las que se quieren poner sonido.

En el archivo players.h, se coloca la llamada al sonido_pasos. Dentro de la función teclado, justo cuando se comprueba que se ha pulsado alguna de las teclas de dirección, dentro de la siguiente condición tal y como se muestra a continuación:

      if ( ax != x || ay != y )
      {
           sonido_pasos();
           // entra si a cambiado alguna de las variables x,y
           animacion++;
           if ( animacion > 2 ) animacion = 0;
      } 

Dentro del archivo mijuego.h, se añadirán los sonidos de la puerta (sonido_abrirpuerta) y ambiente (sonido_ambiente), justo cuando se cambia de escenario, en la función actualiza_juego(), después de comprobar si existe colisión.

    switch ( lugar ) 
    {           
    case 1:   // casa
         if ( cambio == 1 )
         {
              // cambiamos a otro lugar              
              lugar = 2;
              fondo  = bosq_a;
              choque = bosq_c;
              cielo  = bosq_b;  
              jugador.posiciona( 410,370 ); 
              desplazamiento_map_x=0;
              desplazamiento_map_y=160; 
              desplaza=true;     
              sonido_abrirpuerta();     
              sonido_ambiente();
         }
         break;
    case 2:   // bosque
         if ( cambio == 2 )
         {
              // cambiamos a otro lugar
              lugar = 1;
              fondo  = casa_a;
              choque = casa_c;
              cielo  = casa_b;  
              // situamos al prota dentro de la casa
              jugador.posiciona( 290,440 ); 
              desplazamiento_map_x=0;
              desplazamiento_map_y=0;  
              desplaza=false;   
              sonido_abrirpuerta(); 
              para_sonido_ambiente();      
         }
         break;  
    default:
         break;
    }       


Haz clic aqui para descargar los archivos wav comprimidos en RAR

Si quieres ver alguna de las anteriores entregas entra en el Contenido del Blog


Recuerda, si tienes algún problema con los ejemplos de la pagina, o alguna duda. Puedes plantear tu pregunta en el foro de programación:


4 comentarios:

  1. Tengo un problema con esta sesión (sé que los tengo con casi todas... jeje perdón): no sé donde hay que hacer el include de audio.h, ya que si lo hago en main, el resto de headers no lo detecta y no encuentran la función a la que llaman ( algo curioso, porque con global.h no me pasa nada del estilo), y si lo hago en los headers, da error porque redefine cosas que ya habían sido definidas en el primer include... ¿Dónde se tiene que poner exactamente el '#include "audio.h" '?

    ResponderEliminar
  2. Vale, acabo de comprobar que en C++ (al contrario que en Java, al que me han malacostumbrado en la universidad) el orden de los includes (imports en Java) importa... Perdón por las molestias :D

    ResponderEliminar
  3. Hola amigo me podrias pasar un enlace de descarga de el archivo mijuego.h ya editado y los demas, para los efectos sonoros y la musica, estoy intentando demasiado y no me funciona, porfavor ayuda.

    ResponderEliminar
    Respuestas
    1. Si tienes algún problema, escribe en el foro http://creatusjuegosdecero.webege.com/index.php

      Eliminar