Ponto V!

Home XNA XNA Tocando música e efeitos sonoros sem usar o XACT Tools
Kléber de Oliveira Andrade
Tocando música e efeitos sonoros sem usar o XACT ToolsImprimir
Escrito por Kleber Andrade

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.

download

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.


Comentários (4)
  • Weslley Andrade  - XNA 4.0
    avatar

    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á.

  • Kleber Andrade
    avatar

    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.

  • Lucas Martim
    avatar

    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?

  • Kleber Andrade
    avatar

    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.

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter