para reproducao de audio e deve, portanto, ser valido para a maioria das placas de som disponiveis no mercado - incluindo as placas onboard que acompanham praticamente todos os PCs.O primeiro parametro e a frequencia em que os sons serao reproduzidos. O numero 44100 e bem conhecido para quem trabalha com musica. Esta e a frequencia padrao da industria para reproduzir audio com qualidade de CD. Depois passamos MIX_DEFAULT_FORMAT como valor para o parametro de formato dos samples. Este valor, na implementacao, representa samples de audio 16bits, um outr valor padrao no mundo da musica. Em seguida temos a quantidade de canais (2 para sons estereo) e, por fim, o tamanho do buffer de memoria para cada som. Este e o unico parametro para o qual nao realmente um padrao, mas a regra, como em todos os algoritmos basedos em buffers e, quanto maior o buffer, melhor. Fique a vontade para experimentar valores diferentes.Na listagem acima, aparecem duas funcoes novas. LoadSounds e FreeSounds. Elas carregam e liberam, respectivamente, nossos efeitos sonoros para um array privado em TGame. Como nao queremos ficar lembrando dos indices de cada som ao longo do codigo, tambem criamos um tipo enumerado para representar cada um deles. //enumerado para nos ajudar a lembrar o indice dos sons dentro de nosso //array de chunks TSoundKind = ( sndEnemyBullet, sndEnemyHit, sndPlayerBullet, sndPlayerHit, sndGamePause, sndGameResume, sndGameOver ); TGame = class strict private const WINDOW_TITLE = 'Delphi Games - Space Invaders'; var fRunning : boolean; fWindow : PSDL_Window; fWindowSurface : PSDL_Surface; fRenderer : PSDL_Renderer; fFrameCounter : TFPSCounter; fTextures : array of TTexture; fSounds : array of PMix_Chunk; //PMix_Chunk armazera os bytes de um arquivo de som(....)procedure TGame.LoadSounds;const SOUND_DIR = '.\assets\sounds\';begin SetLength(fSounds, Ord(High( TSoundKind))+1); fSounds[ Ord(TSoundKind.sndEnemyBullet) ] := Mix_LoadWAV(SOUND_DIR + 'EnemyBullet.wav'); fSounds[ Ord(TSoundKind.sndEnemyHit) ] := Mix_LoadWAV(SOUND_DIR + 'EnemyHit.wav'); fSounds[ Ord(TSoundKind.sndPlayerBullet) ] := Mix_LoadWAV(SOUND_DIR + 'PlayerBullet.wav'); fSounds[ Ord(TSoundKind.sndPlayerHit) ] := Mix_LoadWAV(SOUND_DIR + 'PlayerHit.wav'); fSounds[ Ord(TSoundKind.sndGamePause) ] := Mix_LoadWAV(SOUND_DIR + 'GamePause.wav'); fSounds[ Ord(TSoundKind.sndGameResume) ] := Mix_LoadWAV(SOUND_DIR + 'GameResume.wav'); fSounds[ Ord(TSoundKind.sndGameOver) ] := Mix_LoadWAV(SOUND_DIR + 'GameOver.wav');end;procedure TGame.FreeSounds;var i : integer;begin for i:=Low(fSounds) to High(fSounds) do Mix_FreeChunk(fSounds[i]);end;Com os sons devidamente carregados na memoria, podemos toca-los com uma chama da Mix_PlayChannel, que aceita 3 parametros: o canal aonde o som sera executado, o endereco dos samples do som e o numero de vezes que o som sera repetido (caso queiramos um loop). Tudo que precisamos fazer agora e localizar os momentos certos para tocar um ou outro efeito sonoro.Quando um tiro for disparado, por exemplo:procedure TGame.doOnShot(Sender: TGameObject); procedure CreateShot(Position: TPoint; Direction: TShotDirection); var shot : TShot; begin shot := TShot.Create( fRenderer ); shot.Sprite.Texture.Assign( fTextures[ Ord(TSpriteKind.ShotA) ] ); shot.Sprite.InitFrames( 1,1 ); shot.Position := Position; shot.Position.X -= (shot.Sprite.CurrentFrame.Rect.w / 2); shot.OnCollided := @doOnShotCollided; shot.DrawMode := GetDrawMode; shot.Direction:= Direction; fShots.Add( shot ); end;begin if (Sender is TPlayer) then begin CreateShot(TPlayer(Sender).ShotSpawnPoint, TShotDirection.Up); Mix_Volume(1, 30); Mix_PlayChannel(1, fSounds[ Ord(TSoundKind.sndPlayerBullet) ], 0); end else if (Sender is TEnemy) then begin CreateShot(TEnemy(Sender).ShotSpawnPoint, TShotDirection.Down); Mix_PlayChannel(1, fSounds[ Ord(TSoundKind.sndEnemyBullet) ], 0); end;end;Ou quando um tiro colidir com o jogador ou o inimigoprocedure TGame.doOnShotCollided(Sender, Suspect: TGameObject; var StopChecking: boolean);var shot : TShot; enemy : TEnemy; procedure CreateExplosion(Position: TPoint); var explostion