[Pong] VI: ¡¡Rompiendo la barrera del sonido!!

¡¡Hola a todos!!

Como ya dejé caer hace unos días, el blog ha tenido que sufrir una serie de catastróficas desdichas, materializadas en faltas de actualizaciones por mi parte. Tengo “excusa”: me quedaron tres para septiembre (me alucina esta frase) de las cuales me he presentado a dos y he salido victorioso. LEVEL UP!!

Por cierto, he sacado un 8 en FOL lo cual automáticamente me ha convertido en el señor Master FOL para todos mis compañeros, con el consiguiente descojone generalizado que eso acarrea ¬_¬

En fin amigos, que nada más que decir que Phil Spectrum vuelve a dar guerra, así que “al tajo”. ¡¡Vamos a ponerle unos sonidos al Pong!!

Para empezar a poner sonidos, lo primero que hay que hacer es tener sonidos. Para crear los míos yo he utilizado Reason, un programa para trabajar con MIDI. He tirado con el porque ya lo tengo y lo se manejar, aunque probablemente no sea lo más adecuado para algo más bien sencillo…

Reason, programa para manejar MIDI

Hay más aplicaciones con versiones gratuitas (incluso seguro que aplicaciones libres) con las que se puede hacer algo resultón. Por ejemplo y sin googlear mucho: Free Audio Editor. De todas formas, para facilitároslo más aún aquí os dejo los archivos que yo he utilizado: Sonidos.rar

Una vez tenemos los sonidos los meteremos en el paquete que vamos a utilizar. En mi caso, los he considerado parte del paquete Configuracion así que los he metido ahí y después he creado la clase Sonido, dentro del mismo.

Esta clase simplemente va a servir para crear los objetos que vamos a utilizar para llamar a los sonidos cuando sea necesario, para ello hemos de importar las clases Applet y AudioClip y a continuación lo dejamos tal que así:

package Configuracion;

import java.applet.Applet;
import java.applet.AudioClip;

/**
 * Clase de configuración para crear los objetos con los que se llamará a los sonidos
 * @author Phil Spectrum
 */
public class Sonido
{
    public static final AudioClip PARED = Applet.newAudioClip(Sonido.class.getResource("pared.wav"));
    public static final AudioClip RAQUETA = Applet.newAudioClip(Sonido.class.getResource("raqueta.wav"));
}

Una vez tenemos la clase, lo que hemos de hacer a continuación es simplemente introducir los métodos de AudioClip que necesitemos en las clases que nos lo requieran. Empezaremos por el método ActionPerformed() de la clase Pong para añadir el sonido de la colisión de la pelota con las raquetas. Como es algo muy sencillo voy a poner solo el código correspondiente al método citado (para el resto del código, ver anteriores actualizaciones):

    /**
     * Aquí especificamos lo que va a hacer el Timer
     * En este caso, llama el método mover() de la clase Pelota y repinta la pantalla
     * También llama al método mover() de la misma clase Pong
     * Controlamos las colisiones con intersects y
     * alteramos la puntuación cada vez que la pelota sale del frame y
     * creamos una nueva pelota si esta es menor que 10
     * además llamamos a la clase Sonido para reproducir las colisiones con las raquetas
     * En el momento en que la puntuación llega a 10, paramos el timer
     * @param e le enviamos un evento, en este caso el Timer
     */
    @Override
    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == timer)
        {
            Rectangle rA = jugadorA.getBounds();
            Rectangle rB = jugadorB.getBounds();
            Rectangle rP = pelota.getBounds();
            if (rA.intersects(rP))
            {
                pelota.setMoverX(1);
                Sonido.RAQUETA.play();
            }
            else if (rB.intersects(rP))
            {
                pelota.setMoverX(-1);
                Sonido.RAQUETA.play();
            }
            else if (pelota.getX() > (config.getX() + 150))
            {
                jugadorA.setPuntuacion(jugadorA.getPuntuacion()+1);
                if (jugadorA.getPuntuacion() < 10)
                {
                    pelota = new Pelota(config);
                    pelota.setMoverX(-1);
                }
            }
            else if (pelota.getX() < - 150)
            {
                jugadorB.setPuntuacion(jugadorB.getPuntuacion() + 1);
                if (jugadorB.getPuntuacion() < 10)
                {
                    pelota = new Pelota (config);
                }
            }
            else if (jugadorA.getPuntuacion() == 10 | jugadorB.getPuntuacion() == 10)
            {
                timer.stop();
            }
            if (jugadorA.getPuntuacion()<=10 & jugadorB.getPuntuacion()<=10)
            {
                pelota.mover();
                this.mover();
                this.repaint();
            }
        }
    }

Ahora haremos lo mismo con las colisiones de la pelota en el frame. Para ello, nos vamos al método mover() de la clase Pelota.

Este caso es un poco más especial. No se si recordaréis que habíamos hecho que no se crease una nueva pelota hasta que la anterior pasase 150px extras del frame. Pues bien, para que cuando ocurra eso no haya sonido, hemos de limitarlo. Por ello, para los sonidos de colisión utilizaremos además un if anidado de esta manera:

 /**
     * Método mediante el que se mueve la pelota
     * Cuando esta llega a los bordes del frame altera la dirección de las coordenadas
     * También llamamos a la clase Sonido para que reproduzca el sonido de colisión
     * cuando la pelota se encuentra entre los límites del frame
     */
    public void mover()
    {
        if(y + moverY < 0)         {             moverY = 1;             if (this.getX() > 0 && this.getX() < config.getX())             {                 Sonido.PARED.play();             }         }         //Aquí no se por qué hay que añadirle 25px más, si no se sale del frame         else if(y + moverY > config.getY() - (config.getLADO_PELOTA()+25))
        {
            moverY = -1;
            if (this.getX() > 0 && this.getX() < config.getX())
            {
                Sonido.PARED.play();
            }
        }
        x = x + moverX;
        y = y + moverY;
    } 

Y con esto ya tenemos un Pong que suena! ^_^

Por último un par de cosas: Robertus me recomendó que cambiase el anterior “LOOSE” por “LOSE” (una mala pasada que me jugó mi relaxing inglés with café con leche), gracias por comentarlo. Aún me falta echar un ojo también al código que JooseLuis me pasó para solucionar el tema de los 25 píxels, a ver si saco esta semana un poco de tiempo y lo reviso, parecía algo interesante aunque de entrada no lo comprendí en el primer vistazo, gracias a ti también y, en general: a todos los que me echáis un cable comentando vuestras impresiones al código que aquí comparto, de eso va la cosa 🙂

Así que, para todos vosotros, me despido con una canción de Septiembre que siempre me gustó mucho:

Anuncios
Esta entrada fue publicada en Happy Coding y etiquetada , , , , , . Guarda el enlace permanente.

Una respuesta a [Pong] VI: ¡¡Rompiendo la barrera del sonido!!

  1. Pingback: [Lluvia de Pixels] #00: Juegos para todos | The Phil Spectrum Project

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s