LIBGDX Musica son

De MediaWiki
Saltar a: navegación, buscar

UNIDADE 2: Música e efectos de son

Introdución

Aínda que non o pareza a música e efectos de son son moi importantes para un xogo. Agora mesmo como tedes o xogo non 'engancha' moito, pero xa veredes como cambia a cousa cando poñamos a música e os efectos de son.

Algúns dos recursos que temos en Internet son:

http://www.soundboard.com/category/Sound-Effects
http://www.sonidosmp3gratis.com/download.php?sonido=claxon%20de%20coche
http://www.drpetter.se/project_sfxr.html: Programa para xerar sons de tipo arcade.

Efectos de son

Información da wiki: https://github.com/libgdx/libgdx/wiki/Sound-effects

Os efectos de son a diferenza da música, son sons que duran uns segundos e que son tocados cando se produce algún evento no xogo.

A clase que manexa os sons é a clase Sounds.

A forma que temos de cargar un arquivo será a seguinte:

  1. Sound son = Gdx.audio.newSound(Gdx.files.internal("data/arquivo_son.mp3"));

Veremos no punto Gardando datos que daremos despois, explicamos que Gdx.files.internal fai referencia ó cartafol assets do proxecto Android.

Podedes ver todos os métodos dispoñibles no enlace anterior da clase Sound. Entre eles temos:


  • play(): toca o son. Está sobrecargado e pode usarse a versión no que se lle envía o nivel de volume.
Dito método devolve un id (long) o cal pode ser usado para:
Facer looping: que se repita o son.
Modificar o volume: modifica o volume do son. Valores entre 0 e 1.
  • Método dispose: libera o son da memoria. Necesario facelo ó saír do xogo.


Por exemplo:

  1. Sound son = Gdx.audio.newSound(Gdx.files.internal("data/arquivo_son.mp3"));
  2. son.play();
  3. son.dispose();


Música

Información da wiki: https://github.com/libgdx/libgdx/wiki/Streaming-music

A diferenza dos efectos de son que se gardan en memoria, a música é cargada do disco cando se necesita. Sempre deberemos utilizar esta opción cando teñamos unha música de fondo.

A música de fondo soe ocupar moito espazo en disco polo que é aconsellable editala e reducir a súa calidade (frecuencia de muestreo, canal mono,....)

Un programa para facer isto é o Audicity: http://audacity.sourceforge.net/?lang=es


Unha vez temos a música no cartafol assets da versión Android podemos utilizala facendo uso da clase Music.

  1. Music musica = Gdx.audio.newMusic(Gdx.files.internal("data/arquivo_musica.mp3"));


Entre os métodos a utiliza temos:



Por exemplo:

  1. Music musica = Gdx.audio.newMusic(Gdx.files.internal("data/arquivo_musica.mp3"));
  2. musica .setVolume(0.5f);
  3. musica .setLooping(true);
  4. musica .stop();
  5. musica.dispose();



TAREFA 2.12 A FACER: Esta parte está asociada á realización dunha tarefa.


Efectos de son aleatorios

No noso xogo queremos que cada certo tempo se escoite un son de claxon.

Para facer isto temos dúas opcións:

  • Opción a):
  • Definir unha variable no método controlarXogo de tipo float: float tempo=0;
  • Sumarlle delta: tempo+=delta dentro do método update e cada certo tempo facer tocar o claxon:
		tempo+=delta;
		if(tempo>=2f){
			tempo=0f;
			Audio.claxon[0].play();
		}
  • Opción b):

Utilizar a clase Timer.

Esta clase permite cada certo tempo e optativamente, de forma continuada, realizar unha tarefa (Task).

O proceso para o que nos ocupa sería:

Definimos na clase Audio e dentro do método incializarMusica (feito na tarefa anterior) un array de efectos de son para os coches:


Código da clase Audio
Obxectivo: definir un array de son para os tipos de claxon.

	public static Sound claxon[] = new Sound[3];
        ...............
	public static void inicializarMusica() {
		claxon[0] = Gdx.audio
				.newSound(Gdx.files.internal("MUSICA/LIBGDX_claxon.mp3"));
		claxon[1] = Gdx.audio
				.newSound(Gdx.files.internal("MUSICA/LIBGDX_claxon2.mp3"));
		claxon[2] = Gdx.audio
				.newSound(Gdx.files.internal("MUSICA/LIBGDX_claxon3.mp3"));
                ....................
        }

Nota: Os arquivos de audio os tedes subidos previamente na realización da tarefa 2.12.


Agora definimos na mesma clase unha tarefa para tocar o claxon. Necesitamos definila (poderíamos crear unha tarefa sen ter referencia a ela, de forma anónima) xa que cando vaiamos á pantalla de pausa, temos que parar os claxon´s e volvelos a poñer en marcha cando volvamos á pantalla do xogo.


Código da clase Audio
Obxectivo: definir a tarefa para que cada certo tempo toque un claxon.

  1. public class Audio {
  2.         ................
  3.         private static Task claxonCoches;
  4.         public static void iniciarClaxon(){
  5.                 claxonCoches = new Task(){
  6.  
  7.                         @Override
  8.                         public void run() {
  9.                                 // TODO Auto-generated method stub
  10.                                 Audio.claxon[MathUtils.random(0, 2)].play();
  11.                         }
  12.                 };
  13.  
  14.                 Timer.schedule(claxonCoches, 0, 2f);
  15.  
  16.         }
  17.        
  18.         public static void paraClaxon(){
  19.                 claxonCoches.cancel();
  20.         }
  21.         ................
  22. }


Agora só temos que chamar a ditos métodos dende a pantalla do xogo.

Código da clase PantallaXogo
Obxectivo: iniciar e deter o claxon dos coches en función se estamos xogando ou en pausa/saír.

  1.         @Override
  2.         public void show() {
  3.                 // TODO Auto-generated method stub
  4.                 Gdx.input.setInputProcessor(this);
  5.                 if (pause) Audio.playMusica();
  6.                 pause=false;
  7.                 Audio.auga.play();
  8.                 Audio.iniciarClaxon();
  9.         }
  10.         @Override
  11.         public void hide() {
  12.                  // TODO Auto-generated method stub
  13.                 Audio.auga.stop();
  14.                 if ((finXogo) || (sair)) dispose();
  15.                 Audio.paraClaxon();
  16.         }
  17.  
  18.         @Override
  19.         public void resume() {
  20.                 // TODO Auto-generated method stub
  21.                 Gdx.input.setInputProcessor(this);
  22.                 pause=false;
  23.                 Audio.playMusica();
  24.                 Audio.iniciarClaxon();
  25.                
  26.         }
  27.         ................











-- Ángel D. Fernández González -- (2015).