- Sons -
Mais um tutorial sobre desenvolvimento de jogos em Delphi. Desta vez vou explicar algumas técnicas para utilizar sons em seus jogos, e como até aqui não usamos nenhuma biblioteca externa para o que já foi feito, vamos manter isto e usar apenas os recursos internos do Delphi para reproduzir os sons.
Sons no formato wave (.wav) são o padrão suportado pelo windows e podemos tirar proveito disso e utilizar as APIs do windows para reproduzi-los. Além do formato wave, nós podemos reproduzir qualquer outro formato de som ou vídeo (desde que os codecs para estes estejam instalados no computador) com o objeto TMediaPlayer.
- Efeitos Sonoros -
A unit MMSystem, incluída no Delphi, oferece vários métodos para reproduzir diversos tipos de sons. Vamos usar aqui o método SndPlaySound para reproduzir um arquivo wave no computador.
» Faça o download dos arquivos de som aqui
Vamos tocar um som quando a bolinha bater em uma das barrinhas, outro som quando a bolinha colidir com o cenário, e um som para quando um dos jogadores fizer um ponto. Primeiro vamos escrever uma pequena função para tocar os sons (não se esqueça de adicionar a mmsystem na seção uses).
procedure TocaWave(som: string);
begin
SndPlaySound(PChar(som), SND_ASYNC);
end;
A flag SND_ASYNC serve para tocar o som, mas sem interromper a execução do programa, como um thread. Note que nós temos que converter o nome do arquivo para PChar, já que este é o tipo de dados que a função recebe.
Adicione agora algumas chamadas à nossa função TocaWave no código do programa para tocar os sons. No meu caso eu coloquei chamadas à função nas colisões da bolinha e quando um dos jogadores faz um ponto.
- Músicas de fundo -
Como eu disse anteriormente o Delphi traz um componente muito bom para reproduzir diversos arquivos de mídia (inclusive vídeos!) utilizando os codecs instalados no computador (o problema disto é que para reproduzir os arquivos o computador deve ter instalado os codecs utilizados). Vamos utilizar um som de fundo no formato midi.
Adicione um novo componente TMediaPlayer ao formulário. Mude a propriedade visible dele para false, assim ele não irá aparecer na tela do jogo.
Quando o jogo se inicia, precisamos carregar a música e tocá-la. Vamos fazer isso no evento OnCreate do formulário, antes de setar a propriedade Enabled do Timer para true.
MediaPlayer1.FileName:= 'theme.mid';
MediaPlayer1.Open;
MediaPlayer1.Play;
Note que o programa pára a execução e carrega todo o arquivo (acho que isso só acontece com os arquivos midi, então você pode usar threads ou outro formato de arquivo).
Agora temos uma música de fundo tocando no nosso jogo. Mas por se tratar de uma música de fundo seria bom que ela reproduzisse continuamente. Vamos então fazer um pequeno loop na nossa música, isso é feito verificando se a música está tocando, se não estiver, voltamos a reproduzi-la.
Para esse teste vamos incluir mais um TTimer no formulário. Deixe a propriedade Interval dele em 1 e mude a propriedade Enabled para false. Vamos iniciar esse timer depois de carregar a música. Então o código OnCreate do form ficaria assim:
procedure TForm1.FormCreate(Sender: TObject);
begin
//quando o form for criado carregamos as imagens
LoadGameGraphics;
//cria e inicializa o backbuffer
bbuffer:= TBitmap.Create;
bbuffer.Width:= 640;
bbuffer.Height:= 480;
bbuffer.Canvas.Brush.Color:= clBlack;
//inicializa algumas variáveis da bolinha
Ball.W:= 15;
Ball.H:= 15;
//inicializa algumas variáveis da barrinha do jogador
Bar_p1.W:= 10;
Bar_p1.H:= 80;
//inicializa algumas variáveis da barrinha da AI
Bar_cp.W:= 10;
Bar_cp.H:= 80;
Bar_cp.Speed:= 15;
//inicia o jogo
InitGame;
//inicia o som de fundo
MediaPlayer1.FileName:= 'theme.mid';
MediaPlayer1.Open;
MediaPlayer1.Play;
//habilita o timer do jogo
Timer1.Enabled:= true;
//habilita o timer de controle da música
Timer2.Enabled:= true;
end;
Agora vamos fazer o loop na música. No evento OnTimer vamos testar se a música parou de tocar e voltar a tocá-la.
procedure TForm1.Timer2Timer(Sender: TObject);
begin
//se não estiver tocando uma música...
if MediaPlayer1.Mode = mpStopped then
MediaPlayer1.Play;
end;
A propriedade mode do MediaPlayer indica o estado atual da música (se ainda não carregou, se está tocando, pausado, parado, etc.). É bom dar uma olhadinha nas outras propriedades do MediaPlayer, tem muita coisa interessante lá.
» Baixe aqui o código fonte completo
No próximo tutorial vou explicar um pouco sobre animações e sobre como usar o objeto MediaPlayer para reproduzir vídeos. Até lá.
Olá, o que quero fazer mesmo é um gráfico de som, alguém poderia me ajudar?
Muito obrigado
Você se refere a análise do espectro de som? Você pode usar o ACS para isso, que é um conjunto de componentes freeware para mexer com sons. Eu não sei como fazer isso com o MediaPlayer ^^’
Bem, caso queria dar uma olhada no ACS aqui segue o link:
http://wiki.freepascal.org/ACS/pt