LIBGDX Musica son

De Manuais Informática - IES San Clemente.
Revisión del 18:57 2 may 2015 de Angelfg (discusión | contribuciones) (Introdución)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Ir a la navegación Ir a la búsqueda

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 -- (2014).