sábado, 18 de agosto de 2012

Música y efectos de sonido en AndEngine.


Primeros pasos en la creación de Vídeos Juego



Hola a todos, este es un nuevo post, donde voy a hacer una muy breve reseña, sobre un tema extremadamente importante, pero que a veces a nosotros los programadores se nos pasa un poco por alto. Estos son la música y los efectos de sonido en un juego, que aunque parezca mentira, para que uno se concentre,  preste una real atención a un juego y ademas no aburra, son un factor fundamental. Quien no recuerda la musica y efecto de sonidos de juegos como PacMan, Mario Bros. y demás juegos legendarios? Por este motivo, ahora vamos a ver un poco como manejar y agregarlos a nuestro juego con las herramientas que nos brinda AndEngine.
Pues entonces comencemos :D

Cual es la diferencia?


Imagino que ya saben cual es la diferencia, pero vamos a aclararla por las dudas, en pocas palabras, la música es ese sonido que tenemos de fondo en el juego, en cambio los efectos de sonido son aquellos que se reproducen al realizar una acción determinada (por ejemplo un golpe ) y normalmente no duran mas de 3 segundos.

Algunas cosas a tener en cuenta es que lo ideal, sería que la música acompañe un poco la historia del juego, música un poco más tensa en momentos de acción, más alegre en partes donde no hay peligro y demás. Y otra cosa a tener en cuenta, es que no debe molestar, no debe provocar que la gente deje el juego, así que en mi humilde opinión, es importante que en las opciones, estè la de deshabilitar la música de fondo :D (igual con los efectos de sonido, a mi gusto personal, debe separarse, la música de los efectos de sonido). En cuanto a los efectos de sonido, creo que dependerá bastante del estilo del juego, en que tipo de efectos deseamos, por ejemplo podemos pretender que sean más reales, o graciosos. ;)

De donde obtengo los efectos de sonido?

Este es un tema importante a tener en cuenta, y se preguntaran el porque lo digo. Pues es sencillo, no podemos poner cualquier sonido que encontremos por ahí, porque por un tema de licencias podríamos tener problemas legales :P
Así que tenemos algunas opciones, una es buscar por internet con cuidado de que tenga una licencia que no nos restrinjan, o que por ejemplo debemos agregar la fuente de donde lo obtuvimos en los créditos de nuestro juego. Otra opcion seria crear nuestros sonidos ( aunque yo allá estudiado música, podría crearlos con Cubase, a veces por cuestiones de tiempo, o de creatividad no podría hacerlo.  :P ), si uno no tiene esta habilidad, no estaría mal, invitar a participar a algún conocido o amigo musico, creo que esto le daria un plus bastante importante a nuestro juego. De todas maneras como dije antes, hay bastantes recursos por internet de donde descargarlos.
Estos son un par de sitios que nos recomienda el libro de Rick Rogers:


- http://www.mymusicsource.com
- http://www.5alarmmusic.com/
- http://www.partnersinrhyme.com/


Algunas cosas que vamos a tener, que tener en cuenta ;)

Bueno una de las principales cosas que debemos tener en cuenta, es que tipo de archivos de sonido soporta Android, los agregaría aquí, pero para que la lista no esté desactualizada, les dejo el enlace oficial de los formatos multimedia que soporta Android, por si alguno más, es soportado en próximas actualizaciones :D

- http://developer.android.com/guide/appendix/media-formats.html

También hay que mirar, el peso de estos archivos, no tenemos que olvidarnos que esta programando sobre teléfonos móviles, y aunque ya existen versiones muy potentes. No queremos consumir toda la memoria, ni demasiados ciclos de procesamiento sólo en el sonido.  Asi que ahi que poner bien en la balanza, cuál es la calidad de sonido, en comparación del costo en reproducirlo y la memoria que deberemos utilizar.

Vamos a lo bueno, como manejamos esto en AndEngine.

En AndEngine podemos diferenciar las interfaces music, para la música que vamos a manejar y sounds, para los efectos de sonido que vamos a utilizar. Muchos podemos elegir utilizar por una cuestión de sencillez, un tema musical por activity, pero eso no lo vamos a poder hacer con los sonidos del juegos, ya que los efectos van a ser varios , así que para ello vamos a tener que utilizar SoundPool para poder gestionar esos clips de sonido. Esta es la docu oficial:
-http://developer.android.com/reference/android/media/SoundPool.html








Algunas Clases que nos ayudaran:

Music: Esta representa un stream de música.
Sound: Lo mismo pero con los efectos de sonido.
MusicFactory y SoundFactory: Estas clases nos ayudaran a manejar los sonidos con un patrón de tipo Singleton.

Nota: Si has manejados sonidos en Android, pues el manejo en sí, va a serte muy familiar ;)

La clase Music:


Normalmente no la vamos a utilizar instanciando directamente, para esto nosotros vamos a utilizar la clase MusicFactory para crear nuestros objetos de tipo Music, una vez que lo hayamos creado, estos objetos nos proveerán algunos metodos para poder manejarlos:
void play() ,  void stop() , void pause() , void resume() , void release() , void setLooping(final boolean pLooping) , void setVolume(final float pLeftVolume, final float pRightVolume) , void seekTo(final int pMilliseconds) , boolean isPlaying() , por sus nombre no creo que necesitan demasiada explicación :D

Y por ultimo, con este método vamos a poder registrar un Listener para que nos avise cuando termino el tema:  
void setOnCompletionListener(final OnCompletionListener pOnCompletionListener)

La clase Sound:


Esta clase, de la misma manera que hablamos de Music, normalmente no la instanciamos, sino que utilizaremos SoundFactory para ello. Algunas pequeñas diferencias es que no tenemos los metodos: seekTo(), isPlaying(), ni  setOnCompletionListener().

Pero adicionalmente tenemos algunos otros metodos:
void setLoopCount(final int pLoopCount) : Este método trabaja junto a setLooping(). Si este esta seteado en true, el efecto se repetirá hasta que llamemos al método stop(). En cambio si este esta seteado en false y setLoopCount() no esta en cero, el efecto se repetirá el número de veces que nosotros hayamos seteado con este método. (cuidado con que  esta basado en cero,así que si los ponernos en 4, el sonido se repetirá 5 veces).
Otro método es void setRate(final float pRate), con el podremos cambiar la velocidad de reproducción del sonido, el rango va de 0.5f o 2.0f.

La clase MusicFactory:
Como otras clases factory, en AndEngine, esta provee varios metodos createfrom....  para poder cargarlos de diferentes lugares a nuestros recursos:

Music createMusicFromFile(final MusicManager pMusicManager, final Context pContext, final File pFile)
Music createMusicFromAsset(final MusicManager pMusicManager, final Context pContext, final String pAssetPath)
Music createMusicFromResource(final MusicManager pMusicManager, final Context pContext, final int pMusicResID)

La clase SoundFactory:

De las misma manera que MusicFactory, podemos cargar los recursos de diferentes lugares con estos metodos:
Sound createSoundFromPath(final SoundManager pSoundManager, final Context pContext, final String pPath)
Sound createSoundFromAsset(final SoundManager pSoundManager, final Context pContext, final String pAssetPath)
Sound createSoundFromResource(final SoundManager pSoundManager, final Context pContext, final int pSoundResID)
Sound createSoundFromFileDescriptor(final SoundManager pSoundManager, final FileDescriptor pFileDescriptor, final long pOffset, final long pLength)

En ambos casos, SoundFactory y MusicFactory, tenemos el método setAssetBasePath(), por si necesitamos cargar recursos desde otro lado ;)

Y el código?

Estos son algunos de los ejemplos oficiales si asi se podria decir ;)

http://code.google.com/p/andengineexamples/source/browse/src/org/anddev/andengine/examples/SoundExample.java
http://code.google.com/p/andengineexamples/source/browse/src/org/anddev/andengine/examples/MusicExample.java


Creo que no vale la pena realizar un copy paste :D y estos son muy claros y sencillos de entender.

Fuentes de referencia:

http://www.andengine.org/blog/

http://www.andengine.org/forums/

https://github.com/nicolasgramlich/AndEngine


Este recurso es uno de los mas importantes:
http://code.google.com/p/andengineexamples/

Y una muy buena lectura el libro Learnin Android Game Programing:

http://www.amazon.com/Learning-Android-Game-Programming-Hands-On/dp/0321769627



Esto es todo por ahora, como podran ver, no es un tema tan complicado, como por ejemplo el anterior, pero sí muy importante si queremos que nuestro juego sea realmente agradable. Código no es tan complicado, y si han manejado este tipo de recursos en Android les resultara como comente anteriormente, muy familiar. Espero que les alla gustado el post, y también que tengan algún amigo músico que los ayude a crear sus sonidos jejeje



Saludos a todos, Gabriel E. Pozo