No último artigo da coluna GameDev você viu três maneiras de capturar ações do usuário e implementou duas delas: via teclado e mouse. Foi mostrado que as bibliotecas do XNA responsáveis por essas rotinas poupam bastante tempo do desenvolvedor e são bastante fáceis de serem utilizadas. No artigo de hoje você criará sons e em pouquíssimas linhas de código os adicionará ao projeto de jogo. No fim deste artigo perceberá que o XNA possibilita que o trabalho seja feito em conjunto com um designer de sons, já que vocês trabalharão em ferramentas diferentes que se comunicarão no fim das contas. Mais fácil que isso, só roubar doce de criança!
Não esqueça de preparar seu ambiente de desenvolvimento
Se você não acompanhou o último artigo e não tiver a última versão do projeto que está sendo desenvolvido, poderá fazer o download dele acessando o endereço: http://sdrv.ms/11vN70a.
Lembrando que, para desenvolver o que é proposto na coluna, é necessário ter instalado em sua máquina o Microsoft Visual C# 2010 Express e o XNA Game Studio, ambos gratuitos.
Caso esteja utilizando o Windows 8, talvez você tenha algum problema ao instalar o XNA Game Studio. Esse erro ocorre porque o Game Studio traz consigo uma versão do Games for Windows – LIVE nos bastidores. O problema é que há incompatibilidade entre o Games for Windows – LIVE que o XNA está tentando instalar e o Windows 8, mas isso pode ser corrigido baixando e instalando manualmente a versão mais recente no seguinte link: http://bit.ly/W96StP.
Ao finalizar a atualização, basta tentar instalar o XNA Game Studio novamente e deverá funcionar.
Criando conteúdo de áudio com o XACT
Até aqui muitos aspectos de desenvolvimento de jogos com o XNA já foram trabalhados. Você viu as principais bibliotecas dele, teve noções básicas de como criar e adicionar gráficos a um projeto, bem como manipular e controlá-los com o teclado e o mouse.
Dentre todos esses aspectos, talvez o mais importante seja a forma como o XNA lida com os mais diversos tipos de conteúdo que são incorporados aos seus projetos. Tudo isso já foi visto quando você adicionou duas esferas que agora estão passeando pela tela do jogo. Mas ele ainda está insosso e você pode melhorá-lo adicionando pelo menos alguns efeitos sonoros a ele.
O XNA lida com sons da mesma forma como lida com os gráficos que foram criados até aqui: através do Content Pipeline. Para o XNA, sons são apenas outro tipo de conteúdo de jogo. Apesar disso, existe uma diferença. Os gráficos podem ser adicionados diretamente ao projeto do jogo, o conteúdo de áudio, no entanto, deve estar em um formato específico, gerado pelo Microsoft Cross-Platform Audio Creation Tool, também conhecido como XACT.
O XACT é utilizado para criar bancos de sons e de waves que são compilados para arquivos XAP. São esses arquivos XAP que são adicionados ao projeto e fazem o jogo rodar todo e qualquer som.
Apesar da ferramenta ser bem completa e possibilitar manipular sons, criar variáveis sonoras e tudo o mais, agora será abordado somente o básico do seu funcionamento e em artigos futuros a sua utilização será discutida em mais detalhes.
Em clima de passo a passo, vamos criar o arquivo XAP para ser utilizado no projeto:
- No seu menu Iniciar, aponte para Programas, Microsoft XNA Game Studio 3.0, Tools e finalmente Cross-Platform Audio Creation Tool 3 (XACT3)
- Na tela principal do XACT, selecione File, New Project para criar um novo projeto de áudio e dê a ele o nome “MeusSons”.
Aqui cabe uma observação: nessa nova versão do XNA eu aconselho a criar o projeto de sons dentro da pasta Content do projeto de jogo para não dar problema de referência de arquivo. Nas versões antigas não ocorria esse problema, mas por algum motivo essa nova versão está com esse problema. Portanto, crie e salve o projeto dentro da pasta Content do projeto.
- Na lateral esquerda da tela principal, “MeusSons” aparece o nó raiz do projeto com um punhado de nós filhos que indicam vários tipos de objetos que você poderá incluir no projeto de som: variáveis, efeitos sonoros, configurações de compressão, entre outros.
- Clique com o botão direito em Wave Banks e adicione uma nova Wave Bank:
- Uma nova janela em branco aparecerá. Clique com o botão direito nessa janela e selecione Insert Wave File(s) para adicionar arquivos .wav ao projeto.
Observação: você pode adicionar qualquer tipo de arquivo de som a um projeto de áudio no XACT, mas vamos simplificar por enquanto e utilizar somente arquivos .wav padrão do Windows.
- Procure pelos arquivos chord.wav e notify.wav na pasta C:/Windows do seu computador e selecione-os para inserir na wave bank.
Observação: uma dica interessante é procurar por esses arquivos, copiá-los e colar na pasta raiz da sua solução de jogo. Isso porque o XNA utiliza caminhos relativos para referenciar tais arquivos e se você mudar a localização do projeto, muito provavelmente perderá a referência a eles. Caso tenham dúvidas, baixem o projeto ao final desse encontro e vejam onde estão os arquivos .wav.
- Agora é preciso criar um sound bank. Clique com o botão direito em Sound Banks no menu lateral esquerdo e selecione new sound bank. Uma nova janela aparecerá à esquerda.
- Para organizar melhor o espaço, clique em Windows, Tile Horizontal e as janelas estarão organizadas conforme a figura:
- Na janela de wave bank, selecione os dois arquivos que estão lá, clique e arraste-os para a janela de Cue Name do sound bank. Perceba agora que os arquivos no wave bank deixaram de ser vermelhos e ficaram verdes. Isso indica que eles foram adicionados ao banco de sons.
- Você utilizará um som em loop para aprender a dar play, pausar e parar um som dentro do jogo. Para isso, na lista de sons (sound list), selecione o som notify e, na janela inferior esquerda, selecione o checkbox infinite, conforme a imagem abaixo.
- Finalmente, vá em File, Build (ou simplesmente aperte F7) para compilar o seu projeto e depois salve-o.
Finalmente, quando você apertou F7 para dar o build no projeto de som, o XACT criou duas pastas que contém os arquivos compilados desse projeto. São esses arquivos que você acessará no jogo, logo a seguir.
Utilizando o projeto de áudio no projeto do jogo
Trabalhar com sons no XNA é tão simples quanto trabalhar com gráficos e lidar com as ações do jogador. Para começar a utilizar o projeto de áudio que acabou de ser criado, o primeiro passo é adicioná-lo à pasta Content do projeto do jogo. Em seguida, você definirá e instanciará objetos relacionados a sons e, finalmente, os utilizará. Não se assuste, é simples. Vamos começar.
Para adicionar o projeto de áudio ao seu projeto de jogo, clique com o botão direito na pasta Content no Solution Explorer e escolha a opção Add Existing Item. Procure, então, pelo arquivo MeusSons.xap que você criou dentro da própria pasta Content do projeto e confirme a adição dele. Sua Solution Explorer deve ficar como a da figura:
Após adicionar o arquivo XAP ao projeto, agora você criará três tipos de objetos para gerenciar o conteúdo de áudio:
- AudioEngine: é o objeto que referenciará o serviço de áudio do computador. É utilizado para ajustar algumas configurações e como parâmetro para criar os bancos de wave e de sons. Ao criar um objeto AudioEngine no projeto, é necessário definir o caminho do arquivo de configuração global gerado pelo XACT na hora da compilação do arquivo XAP e que, por padrão, tem o mesmo nome do arquivo XAP, mas com a extensão XGS;
- WaveBank: essa é a coleção de arquivos wave. Para criar esse banco no seu código, você precisará passar por parâmetro o objeto AudioEngine instanciado anteriormente e o caminho do arquivo XWB compilado pelo XACT. Apesar desse objeto não ser utilizado diretamente na sua aplicação, ele é necessário para que os sinais sonoros do banco de sons tenham referência de onde encontrar os arquivos wave;
- SoundBank: esse objeto armazena uma coleção de sinais sonoros. Define-se sinais sonoros como referências a arquivos wave armazenados no banco de wave, juntamente com suas propriedades e detalhes de como executar esses arquivos e métodos que gerenciam o playback desses sons.
Atenção! Caso você não esteja conseguindo criar a variável do tipo AudioEngine isso significa que seu projeto não está com as referências às DLLs do XACT adicionadas. Para fazer isso, basta clicar com o botão direito no projeto na Solution Explorer e selecionar Add Reference. Na janela que abrir, selecione a aba Browser e vá até a pasta Arquivos de Programas (x86)/Microsoft XNA/XNA Game Sudio/v4.0/References/Windows/x86/ e selecionar a DLL Microsoft.Xna.Framework.Xact.dllNo método Initialize do mesmo arquivo, instancie os objetos passando por parâmetro exatamente o que foi discutido anteriormente:
Observe o caminho dos arquivos passados por parâmetro e veja que não há necessidade de indicar se eles estão na pasta “Win” ou “Xbox”, pois isso é determinado em tempo de execução, onde o jogo estiver sendo executado.
É possível executar um som de duas maneiras: em um simples playback, ou em loop de execução. Uma vez instanciados os objetos, iniciar a execução dos sons não é nada mais do que chamar um método: o PlayCue. Você executará um som cada vez que um dos objetos colida com o outro.
No método Update, procure pela condicional que determina se os objetos colidiram ou não e deixe-o da seguinte forma:
Se até aqui você seguiu todos os passos e entendeu tudo o que foi dito e feito, ao executar o projeto será capaz de ouvir um sonzinho quando as esferas colidirem. Vá lá, pode testar.
Voltando ao projeto, você adicionará um som em loop para servir de, digamos assim, música de background do jogo. No entanto, para exemplificar como funciona o controle de áudio no XNA, você criará um objeto do tipo Cue que lhe permitirá ter maior controle sobre os sons do sound bank, possibilitando dar play, pausar e parar o som a qualquer momento.
Logo abaixo da definição dos objetos de áudio, adicione mais uma definição, conforme o bloco:
Da mesma forma como foi feito anteriormente, é necessário instanciar o novo objeto e colocá-lo para tocar. No método Initialize, adicione o seguinte bloco:
Nesse código, o método Play foi utilizado para iniciar a execução do som notify do projeto de som. Já que você definiu a propriedade Looping para infinito no XACT para esse arquivo, o som será executado e reiniciado ao seu final infinitamente – ou até que você o pare.
Objetos do tipo Cue possuem vários métodos e propriedades que nos permitem ter maior controle sobre a execução de arquivos de som. O bloco de código abaixo mostra como pausar e como resumir a execução do arquivo quando a barra de espaço for pressionada durante o jogo:
Para o XNA, o método Stop é diferente do Pause, pois o Stop encerra a execução do arquivo assim que ele chegar ao seu fim e não pode ser executado novamente, a não ser que o método GetCue seja chamado novamente.
Agora sim, você tem um som em loop como “música” de fundo do jogo e que pode ser parado sempre que o usuário pressionar a barra de espaço. Bacana, não? Sinta-se livre para adicionar sons diferentes, explore o XACT e tente descobrir como adicionar arquivos MP3 ou então comprimir os arquivos wave.
No futuro voltaremos a discutir o XACT com mais profundidade. O que foi visto aqui é o básico, noções de como adicionar sons a um projeto XNA e como executá-los. Apesar da simplicidade, é possível fazer muito mais coisas com o XNA e o XACT.
Muito bem, o que acharam da forma como XNA trabalha com sons? Fácil, não? Com o fim deste artigo de hoje, chegamos também ao fim de mais um ciclo de aprendizado. Nele, vimos e discutimos as nuanças do XNA e desenvolvemos um pequeno projeto XNA que trabalha todos esses aspectos e conceitos. Ele não é uma obra prima dos videogames, mas tenha certeza que todos aqueles que trabalham com games começaram com um protótipo como esse. Simples como ele é, o projeto está cheio de conceitos que serão levados para os próximos artigos, nos quais procuraremos desenvolver um jogo completo! Fique antenado e continue nos acompanhando. Até lá!
O arquivo que contém todas as alterações desse encontro e o projeto completo desse ciclo de aprendizado pode ser baixado no seguinte endereço: http://sdrv.ms/10ofzP1. Caso você tenha dúvidas, enviem-me um e-mail para sergioliveira@nintendoblast.com.br
Revisão: Leandro Freire
Comentários