por Fernando Lorenzon em 05/07/2010 as 10:34

Continuando a série sobre XNA, vamos abordar o áudio do XNA.

Em primeiro lugar, temos uma classe usada somente para tocar música, chamada de Song.

Para carregar o som, deve-se usar o Content.Load da mesma forma que uma textura, passando por parâmetro o caminho relativo do arquivo (sem extensão) a partir do diretório Content.

Segue o código:

C:
  1. Song song = Content.Load<Song>("Songs\\Intro");

Para tocar a música, deve-se usar a classe estática MediaPlayer, que é própria do XNA. Vejam todos os comandos possíveis:

C:
  1. MediaPlayer.IsRepeating = true;
  2. MediaPlayer.Play(song);
  3. MediaPlayer.Stop();

Já os efeitos sonoros são utilizados de várias maneiras. Eu estou utilizando uma implementação própria do XNA 3.0, onde podemos instanciar uma classe SoundEffect de maneira similar ao Song. A diferença é que os arquivos devem ser do tipo wave.

C:
  1. SoundEffect SFXExplosion = Content.Load<SoundEffect>("Sounds\\explosion");

Com isso, podemos tocar o som a qualquer momento usando a função Play().

C:
  1. SFXExplosion.Play();

O que ocorre neste Play() é criar uma nova instância daquele som e tocá-lo. Se o Play() for chamado várias vezes, vários sons são tocados ao mesmo tempo, em sobreposição. Isso não é muito útil, a não ser em situação em que o som deve ser tocado de maneira independente. Um exemplo disso é quando coletamos moedas no Super Mario.

Mas caso seja preciso tocar somente uma instância do som, usando repetição, aí a figura muda:

C:
  1. SoundEffect SFXRocket = Content.Load<SoundEffect>("Sounds\\rocket");
  2. SoundEffectInstance SFXRocketInstance = Globals.SFXRocket.CreateInstance();

Com esta instância do som rocket, podemos aplicar loop no som e tocá-lo sem sobreposição de áudio. Ou seja, ao dar um novo Play(), o som corta e começa novamente. Tocando o som a partir da instância ele automaticamente se repete quando chega ao fim. Eu uso isso para ficar repetindo o som do foguete das naves enquanto ele está acionado.

Para tocar o som, basta fazer o seguinte:

C:
  1. SFXRocketInstance.Play();

Parte 5 - Mais Scenes
Parte 7 - Conclusão

Categorias: Desenvolvimento | No Comments »


Deixe um comentário