Android. Juego del Ahorcado (XI). Poniendo música de fondo.

android gingerbreadSiguiendo con el juego del Ahorcado en Android, en un post anterior definimos el menú de configuración con dos opciones: una para activar/desactivar la música de fondo y otra para activar/desactivar la opción de ayuda en el juego. En este post vamos a desarollar que nuestro juego reproduzca música de fondo si la opción de la configuración está activada.

Líneas generales.

Los pasos que se han efectuado, a grandes rasgos, son los siguientes:

  • Copiar el fichero .mp3 a la carpeta de los recursos raw del proyecto.
  • Modificar la clase Configuracion.java para poder acceder al estado de la entrada de configuración referente a la música de fondo.
  • Crear una nueva clase, de nombre audiojuego.java, que se responsabilizará del control de la reproducción de la música.
  • Modificar la clase juego.java, para el control del paro de la reproducción cuando el juego no está activo.
  • Modificar la clase Escenario.java, para poner en marcha el reproductor.

Al final de este artículo puedes, si quieres, descargar el código fuente actualizado (sin el mp3, que dejo a tu elección).

Veamos los pasos en detalle.

Copiar el fichero .mp3

Lo primero que me gustaría comentar es que, si no tenemos nuestros propias creaciones musicales, recomiendo que se busquen aquellas que permitan la reproducción (por supuesto no comercial). Este es el caso de jamendo.com, un site en el que se puede descargar música con licencia Creative Commons.

En mi caso, estuve escuchando algunas canciones y me gustó una que descargué:

Una vez tengamos el fichero mp3, lo copiamos. Para ello, tenemos que buscar la siguiente carpeta:

workspace -> Ahorcado -> res -> raw

En Eclipse, los proyectos se guardan dentro de lo que llama workspace. Por defecto, la carpeta se llama así, a no ser que el programador lo haya cambiado. Dentro de esta carpeta tenemos una subcarpeta por cada proyecto que desarrollemos, Ahorcado es el nombre de mi proyecto, así que la carpeta se llama igual. Dentro de ella tenemos res y dentro raw. Es aquí donde copiamos el fichero mp3.

Una vez copiado, volvamos a Eclipse, seleccionemos el proyecto del Ahorcado y hagamos un refresh (bien con F5 o con el botón derecho del ratón y buscando la opción refresh).

Modificación de la clase Configuracion.java.

La modificación efectuada es para poder acceder al valor de la entrada de configuración referente a la música de fondo. Se diferencia de la versión anterior en los imports nuevos y la creación de un nuevo método de nobre getMusic. Como se ve, se ha definido este método como estático. No es objetivo de esta serie de posts explicar el detalle de la programación orientada a objetos. Si el lector quiere profundizar más sobre este punto, puede leer este pequeño tutorial.

package misejemplos.ahorcado;
import android.content.Context;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class Configuracion extends PreferenceActivity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}

public static boolean getMusic(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context)
.getBoolean(“música”, true);
}

}

Creación de la clase audiojuego.java

Tiene como misión poner en marcha y parar la música de fondo. Su cuerpo es el siguiente:

package misejemplos.ahorcado;

import android.content.Context;
import android.media.*;

public class audiojuego {

private static MediaPlayer mireproductor = null;

public static void reproduce(Context context, int resource) {

para_musica();

if (Configuracion.getMusic(context)) {
mireproductor = MediaPlayer.create(context, resource);
mireproductor.setLooping(true);
mireproductor.start();
}
}

public static void para_musica() {
if (mireproductor != null) {
mireproductor.stop();
mireproductor.release();
mireproductor = null;
}
}

public static MediaPlayer get_mireproductor()
{
return mireproductor;
}

}

Modificación de la clase juego.java

Se ha añadido una redefinición del método onStop. Este método, heredado de Activity, se ejecuta cada vez que la actividad no está activa, que no es lo mismo que finalizada. El motivo de esta modificación ha sido el controlar que, cuando la actividad no está activa, no se reproduzca la música.

@Override
protected void onStop()
{
//paramos la música siempre que la activity queda en background

audiojuego.para_musica();
super.onStop();
}

Modificación de la clase Escenario.java

Lo que se ha hecho es añadir al principio del método onDraw el código que hace que se ponga en marcha el reproductor. Eso sí, con la condición de que no esté ya en marcha, ya que si no fuese así, se reiniciaría la música cada vez que repintamos el juego. No pondré el código completo, ya que es largo. De todas formas, recuerdo que al final de este artículo se puede descargar todo el código fuente actualizado.

protected void onDraw(Canvas canvas)
{

// Ponemos en marcha la música, sólo si el reproductor está parado

if (audiojuego.get_mireproductor() == null)
{
audiojuego.reproduce(context, R.raw.nemesis);
}

if(nuevo_juego)
{
monigote = new Monigote(canvas);
palabra_juego = new palabra(res, canvas, monigote);

…..

Puedes descargar el código fuente haciendo clic aquí.

Acerca de Isildur Fuentes

Apasionado de las buenas historias y aikidoka de la tierra.

Publicado el julio 5, 2011 en Android, EDIB, Programación y etiquetado en , , , , , , . Guarda el enlace permanente. 11 comentarios.

  1. Buenas, me ha gustado mucho tu tutorial de como hacer el juego.

    Yo estoy haciendo uno, pero tengo un problema, he definido los botones del menu, pero no responden, no hacen lo que tienen que hacer, ni el “Exit” salir, ni el “About” la ayuda, nada…
    😦

    y he mirado tu codigo, y cambiando algunas cosas, esta igual.
    saludos

    PD: Que libro en Español me recomiendas para la programacion en Android?

    • Isidro Fuentes Hermoso

      Hola Jose.

      Si no consigues saber dónde está el porqué no te funcionan, y si quieres, no dudes en hacerlo saber a la comunidad para ver si entre todos lo arreglamos.

      Respecto a lo del libro, de momento no he visto ninguno que me guste. Por ahora, leo libros en inglés. Me parecen muy buenos y el lenguaje que utilizan no es demasiado complicado de entender.

      Un saludo y muchas gracias por tu interés en estos articulillos.

    • Isidro Fuentes Hermoso

      Hola de nuevo Jose.

      Justo hoy he pensado que podría interesarte una web en la que también desarrollan tutoriales de programación en Android, y en castellano. Le he echado un vistazo por encima y me ha parecido muy buena. Te paso el link:

      http://www.sgoliver.net/blog/?p=1313

      Ya me contarás qué te parece.

      Un saludo.

  2. Hola Isidro te felicito por este grandioso tutorial…es muy interesante…tengo una pregunta…estoy modificando algunas partes de juego solo lo mas simple y le agregue un mensaje en pantalla con Toast.makeText en el que quiero mostrar las veces que acierta el juego y las veces que falla, y asi poder terminar el juego una vez que gane o pierda!!!…pero no se como pasarle la variable “tamanyo_palabra_en_curso()” de clase “palabra” a la clase “Juego”(porke en clase Juego hice la modificacion)

    if (esletra(caracter))
    {
    // Aqui­ seguiremos con la lógica del juego.
    if(letraenpalabra(caracter) && !letraenacertadas(caracter) &&
    !letraenfalladas(caracter))
    {
    contador1 = contador1 + 1; //contador de letra acertada
    ecenario.getPalabra_juego().setLetras_acertadas(escenario.getPalabra_juego().getLetras_acertadas() + caracter);
    escenario.setLetra_pulsada(true);
    Toast.makeText(this,contador1+ ” ACIERTOS : “+ contador2 + ” FALLOS” , Toast.LENGTH_SHORT).show();
    }
    else……………
    quiero es que cuando contador1 sea igual a la longitud de la palabra salga un mensaje diciendo que ha ganado….pero no se como traer esa variable de la clase palabra

    • Isidro Fuentes Hermoso

      Hola fredelec. Te agradezco tus comentarios. Hoy me es del todo imposible, pero mañana le echo un vistazo y te comento cosas.

      Un saludo

    • Isidro Fuentes Hermoso

      Hola de nuevo.

      He estado mirando el tema y, si he entendido bien, creo que lo único que necesitas son dos cosas:

      1- El método tamanyo_palabra_en_curso() de la clase palabra está definido como privado:

      private int tamanyo_palabra_en_curso()
      {
      return palabra_en_curso.length();
      }

      ya que se definió así porque sólo se utilizaba dentro de la misma clase palabra. Si quieres que sea accesible desde otra clase (en tu caso la clase juego), debes redefinirlo como public (cambia la palabra private por public).

      2- Desde la clase juego podrás entonces acceder a él pasando por la clase escenario, de la siguiente forma:

      escenario.getPalabra_juego().tamanyo_palabra_en_curso()

      Espero haber ayudado con este tema. Si no lo he entendido bien, no dudes en comentarlo a la comunidad.

      Un saludo.

  3. Hola Isidoro, hace tiempo esperaba encontrarme con un tutorial como este, muchas gracias me ha servido bastante, desde hace un tiempo me propuse aprender a programar en Java, luego descubrí que existía Android y mas motivado me encuentro en aprender acerca de todo esto.
    Llegue a tu pagina cuando buscaba la manera de poner musica de fondo para un jueguito en el que estoy trabajando como desafio personal para aprender a trabajar con android, intente basarme en el codigo que muestras aca para lograr ponerle musica a mi juego pero no lo logre.
    Me preguntaba si podrias darme un ejemplo algo mas general, por decirlo de alguna manera, ya que en este tutorial la musica la usas de acuerdo a un juego en particular, que es el ahorcado. No se si me entindes ? quizá un codigo con el que pudiese experimentar, moldear e ir probando, puede ser talvez algo como una actividad en donde la musica simplemente se reprodujera, o lo que te resulte mas facil de explicar.

    Realmente me seria de mucha ayuda, gracias de antemano.

    • Isidro Fuentes Hermoso

      Hola Aroldo.

      Muchas gracias por tu comentario. Tomo nota de tu sugerencia. Estoy encantado de que se aporten posibilidades para desarrollo en Android. Si te he entendido bien, te sería de ayuda un artículo de cómo reproducir música en Android, la manera en la que se programa para adecuarlo a cualquier programa.

      Me gusta la idea.

      Saludos.

  4. Hola! Muy bueno el tutorial!

    Sólo una dudilla. Cuando pones .getBoolean(“música”, true). Que es ese parámetro “música”..? yo creo que nunca encuentra eso (al menos en mi caso) y siempre devuelve true. Estoy intentando que si en el menú le marco sin música, no suene la música al empezar el juego, pero no hay manera!
    Muchas gracias de todas formas.

    • Hola Androide!!🙂

      La idea es que, en el fichero /Ahorcado/res/xml/settings.xml, hay dos entradas: una para “música” y otra para “con ayuda”. Estas son las dos entradas (tipo checkbox) que aparecen cuando le das al botón de configuración. Lo que pretende este código es leer el valor que tiene esa entrada y así saber si está activada o no. Luego, teniendo en cuenta ese valor se reproduce la música o no.

      Eso el lo que pretende el código. En mi caso me funciona. Si aún habiendo comprobado de nuevo tu settings.xml y el código de las clases implicadas sigue sin funcionarte, no dudes en volver a comentarlo.

      Un saludo

  5. Hola Isidro
    De nuevo te felicito por los tutoriales me parecen muy buenos; yo tengo un problema y es q aunq esten desactivado los checkbox de mucica y ayuda me sigue reproduciendo la musica y saliendo la letra de ayuda quisiera saber si me podrias ayudar.

A %d blogueros les gusta esto: