|
Neste tutorial vamos aprender como colocar aquela música de fundo nos jogos e como adicionar os efeitos sonoros também sem usar a ferramenta XACT. Caso você queira usar o XACT acesse este tutorial clicando aqui. Este componente foi testado no XNA 3.1 e qualquer mudança de versão pode acarretar ou não no funcionamento do mesmo.
Porém para trabalharmos com sons, primeiramente devemos conhecer o quais tipos de arquivos o XNA suporta.
Formatos de Áudio: XAP (projeto de áudio gerado pelo XACT Tool), WAV para efeitos sonoros e MP3 e WMA para músicas.
Com isso podemos tratar os sons da mesma forma que tratamos as texturas ou modelo 3D, simplesmente carregado o arquivo através do método Load de Content (Content.Load). Então neste tutorial vamos ver como usar as classes Song e SoundEffect.
Song: é usado para mídias longas (.mp3 e .wma) como por exemplo a trilha sonora de um jogo.
SoundEffect: é usado para mídias mais curtas (.wav) como por exemplo o tiro de uma arma, risadas, etc.
Exemplo de uso
Passo 1: para começar, crie um novo projeto e coloque qualquer nome, no meu caso irei chama-lo de TocandoMusicas. Agora vamos criar uma instância de cada classe (Song e SoundEffect). Veja como fica.
Song musica; SoundEffect risada;
Passo 2: Agora carregue os áudios no método LoadContent. Os áudios que serão utilizados podem ser baixados aqui. Para tocar a música carregada, utiliza-se o método Play da classe MediaPlayer e pode ser feito neste mesmo método.
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
musica = Content.Load<Song>(@"musica");
risada = Content.Load<SoundEffect>(@"risada");
MediaPlayer.Play(musica);
}
Passo 3: Se executar o projeto agora, escutara a música tocando. Mas vamos colocar o efeito de risada também, para isto, vamos acionar o efeito sonoro quando o jogador apertar a tecla ESPAÇO.
protected override void Update(GameTime gameTime)
{
KeyboardState keyboardState = Keyboard.GetState();
if (keyboardState.IsKeyDown(Keys.Space))
{
risada.Play();
}
base.Update(gameTime);
}
Pronto, basicamente é isto. Com este simples exemplo você já poderá colocar músicas e efeitos sonoros no seu jogo.
Classe estática MediaPlayer
| Função | Retorno | O que faz? |
| MediaPlayer.Play | void | Executa seu Som |
| MediaPlayer.Stop | void | Para o som que estiver tocando |
| MediaPlayer.Pause | void | Pausa o som que estiver tocando |
| MediaPlayer.Resume | void | Volta a tocar o som que estava tocando |
| MediaPlayer.PlayPosition | TimeSpan | Retorna a quanto tempo o som está tocando |
| MediaPlayer.State | MediaState | Retorna o estado (parado, pausado, tocando) |
| MediaPlayer.IsMuted | bool | Se verdadeiro está mudo, se falso não está mudo |
| MediaPlayer.IsRepeating | void | Se verdadeiro vai repetir, se falso não vai repetir |
Download
Para fazer download do exemplo criado neste tutorial clique no ícone de download abaixo.
Conclusão
Espero que este tutorial seja de uso para todos, mais simples do que isso impossível para tocar músicas em jogos. Abraços e até a próxima pessoal.
-
01/12/2011 16:13:20 | Kleber Andrade

Olá Weslley, ficamos feliz que nosso portal de jogos esteja te ajudando, pois é este o nosso objetivo.
Sobre os sons do XNA 3.0 para o XNA 4.0 não vi mudanças, eles funcionam da mesma forma. Pode ser que os formatos dos arquivos que você está usando não sejam compatíveis, pois os códigos de declaração, carregar e executar são os mesmos.
Abraços.
-
12/03/2012 00:11:05 |187.104.164.xxx| Lucas Martim

Ao fixar o som da risada a tecla "espaço", o som é repetido toda vez que eu apertar "espaço", independente se o som anterior ja tiver acabado ou não, e se eu manter a tecla pressionada, o som é ativado infinitamente. É possível melhorar o código para que isso não aconteça?
-
12/03/2012 08:39:48 | Kleber Andrade

Bom dia Lucas, você poderia verificar se o tempo de duração da música em relação ao tempo passado do jogo foi ultrapassado. Mas como fazer isso? Veja:
Código:
effectTime += gameTime.ElapsedGameTime;
if (keyState.IsKeyDown(Keys.Space) && effectTime.TotalSeconds >= effect.Duration.TotalSeconds)
{
effect.Play();
effectTime = new TimeSpan();
}
effectTime é uma variavel do tipo TimeSpan que armazena tempo e data, esta é a mesma variável do GameTime, ou seja a cada iteração você vai somando com o tempo passado. Na condição você checa se pressionou Espaço e se o tempo passado supera o tempo de duração do efeito sonoro. Se superar ele entra, toca o efeito e zera o contador, fazendo o tempo ficar menos que a duração do efeito sonoro, sendo assim ele continua contando, liberando o efeito somente quando passar do tempo de duração dele.
Espero ter ajudado. Abraços.












Tenho aprendido bastante sobre xna com seu site, porém gostaria de saber sobre sons no XNA 4.0, pois a maioria dos materiais que encontro é para o 3.0 e não consigo executa-los no 4.0.
agradecido desde já.