quinta-feira, 17 de junho de 2010

Tocando som no XNA 3.0

Até o XNA 2.0, para manipular o som do jogo, eranecessário preparar o som através da ferramenta XACT(Microsoft Cross-Platform Audio Creation Tool).
O processo de inicio até o uso, de fato, do som almejado no jogo era relativamente trabalhoso.
O XNA 3.0 traz consigo, o suporte à alguns formatos de arquivos de áudio, sem a necessidade de preparar esses taisformatos na ferramenta XACT para um formato suportado no XNA.
A seguir, a lista de arquivos de áudio que podem ser importado diretamente para o seu jogo - na pasta Content:
.MP3
.WMA
.WAV
Além do formato salvo no XACT, o formato .XAP, que era utilizado exclusivamente em versões passadas do XNA.
Um breve resumo abordando o que era feito até o XNA 2.0
Uma vez criado um projeto XACT e salvo isso para o formato de arquivo .xap, o arquivo .xap é adicionado e qualquer arquivos waves(.wav) o projeto XACT usa comoentrada para o seu jogo no XNA, e o Content Pipeline construirá os arquivos necessários para acessar o conteúdoem “run time”. Um projeto XACT constrói um conjunto de arquivos, listados abaixo:
Um arquivo global de ajustes - .xgs
Um ou mais bancos de wave (wave Banks) - .xwb
Um ou mais bancos de Som (sound Banks) – .xsb
Esses arquivos listados acima podem ser providos para os contrutores respectivos a cada tipo correspondente no XNA FrameWork(AudioEngine, WaveBank, and SoundBank).


Tocando Som no XNA 3.0


Basicamente, existem 2 tipos de classes que podem representar o recurso de som lido:

Song
SoundEffect
Utilizando a classe SoundEffect

Um SoundEffect é criado por chamar o método ContentManager.Load e uso do tipo SoundEffect e o nome do conteúdo de um arquivo de áudio. O arquivo de áudio precisa ser parte do projeto Content e usar o content processor SoundEffect – XNA Framework.

Um SoundEffect contém os dados de áudio e metadata(semelhante a dados wave e informação de loop) lido a partir de um arquivo de som. Múltiplos objetos SoundEffectInstance podem ser criados e tocados provenientes de um único SoundEffect. Esses objetos compartilham os recursos desse SoundEffect.


Obtendo um objeto SoundEffect e SoundEffectInstance


Após ter “carregado” um objeto SoundEffect, faça uma chamada ao método Play do objeto soundEffect.
Suponha que no escopo da classe existam os 2 objetos a seguir:
SoundEffect mySoundEffect;
SoundEffectInstance mySoundEffectInstance;
E no método LoadContent, teríamos conforme comentado anteriormente:
this.mySoundEffect = this.Content.Load("");
this.mySoundEffectInstance = this.mySoundEffect.Play();
Tenha em mente que no momento que o método Play de um SoundEffect é chamado, o estado da instância(SoundEffectInstance) retornada, é porpadrão que o som esteja tocando(SoundState.Playing).
Para tocar o efeito de som quando desejado, basta invocar o método Play do objeto(SoundEffectInstance.Play). Um exemplo no método Update:

KeyboardState keyboard = Keyboard.GetState();

if (keyboard.IsKeyDown(Keys.A))
{
this.mySoundEffectInstance.Play();
}
if (keyboard.IsKeyDown(Keys.S))
{
this.mySoundEffectInstance.Stop();
}

O método Play, de um SoundEffect, ainda possui uma sobrecarga de método que provê várias opções de aplicabilidade de efeitos ao som, abaixo a sobrecarga:
public SoundEffectInstance Play (
float volume,
float pitch,
float pan,
bool loop
)
volume – o volume do som, esse valor deve estar entre 0f e 1f. 1f equivale ao volume máximo.
pitch – informa se o efeito de som vai está 1 oitava abaixo ou 1 oitava acima. Se você quer que o som não esteja 1 oitrava abaixo ou acima, basta colocar 0f. O valor -1f, indica que o efeito de som vai está 1 oitava abaixo, e o valor +1f, indica que o efeito de som vai está 1 oitava acima.
pan – indica como o som será ouvido nas caixas de som(ou fone de ouvido). O valor -1f indica que o som será ouvido totalmente da caixa de som esquerda. Já, o valor +1f, indica que o som vai sair totalmente na caixa de som direita. O valor 0f, indica que o som sairá centralizado; será possível ouvir o som por ambas as caixas de som. O ajuste deste valor pode ser interessante para simular um ambiente de Áudio 3D.
loop – Indica se o som será repetido automaticamente ou não.
Tal como um SoundEffect, um SoundEffectInstance também é dotado de outros método além do Play, como Stop e Pause.
Existe uma diferença sútil, que se o som for manipulado diretamente através do objeto SoundEffect, um som ao ser pausado, para ele ser “resumido”, um SoundEffect possui um método Resume, entretanto, utilizando um SoundEffectInstance, para “resumir” o som, basta invocar o método Play.

Utilizando a classe Song
Para executar operações sobre o som representado através da classe Song, você precisa fazer chamadas aos métodos estáticos(static) da classe também estática – MediaPlayer.
Efetuando Operações com suas canções(Song)


Utilize:

O método MediaPlayer.Play para Tocar uma canção;
O método MediaPlayer.Pause para pausar uma canção;
O método MediaPlayer.Resume para resumir uma canção que foi previamente pausada;
O método MediaPlayer.Stop para parar uma canção.

Obtendo uma canção


A maneira é bem semelhante ao que foi apresentado anteriormente quando tratou-se sobre o objeto SoundEffect. Observe a instrução a seguir:

this.mySong = this.Content.Load("");
A canção, pode ser qualquer um dos tipos abaixo:
.MP3
.WMA
.WAV

Nenhum comentário:

Postar um comentário