Criando jogos em Delphi – Parte III

17 07 2008

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


Ações

Informações

2 respostas

26 09 2008
Márcio Leandro

Olá, o que quero fazer mesmo é um gráfico de som, alguém poderia me ajudar?
Muito obrigado

28 09 2008
KillDream

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

Deixe um comentário