Max(opacity, 0); opacity:= Min(255, opacity); fOpacity := Trunc(opacity); fVisible := elapsed < LIFE_TIME; end; end;end; Agora no manipulador do evento OnShotCollided vamos criar, de fato, a explosao.procedure TGame.doOnShotCollided(Sender, Suspect: TGameObject; var StopChecking: boolean);var shot : TShot; enemy : TEnemy; explostion : TExplosion;begin if ( Sender is TShot ) then begin shot := TShot(Sender); if (Suspect is TEnemy) and (TEnemy(Suspect).HP > 0) then begin enemy := TEnemy(Suspect); enemy.Hit( 1 ); if enemy.Alive then Inc(fScore, 10) else begin Inc(fScore, 100); explostion := TExplosion.Create(fRenderer); explostion.Sprite.Texture.Assign(fTextures[Ord(TSpriteKind.Explosion)]); explostion.Sprite.InitFrames(1,1); explostion.Position := enemy.Position; fExplosions.Add(explostion); end; fShots.Remove( shot ); StopChecking := true; exit; end; if ( Suspect is TPlayer ) then begin fPlayer.Hit( 1 ); explostion := TExplosion.Create(fRenderer); explostion.Sprite.Texture.Assign(fTextures[Ord(TSpriteKind.Explosion)]); explostion.Sprite.InitFrames(1,1); explostion.Position := TPlayer(Suspect).Position; fExplosions.Add(explostion); fShots.Remove( shot ); end; end;end;Inclua uma chamada a fShots.Update em TGame.Update e voce vera que ao matar um inimigo a animacao e exibida, causando uma sensacao visual bem melhor.Efeitos sonorosO game esta bem mais interessante agora. Os inimigos se movimentam e atiram, o jogador sofre danos e ate temos um efeito de explosao que e exibido durante a morte de uma nave inimiga. Mas falta som!Os sons, sao parte fundamental de qualquer experiencia multi midia. E os games nao sao excecao. Para tocar sons em nosso game, vamos recorrer a outro subsistema da SDL. O SDL Mixer. Mais uma vez, a integracao desta extensao do SDL e bastante tranquila. Baixe os binarios adequados a sua plataforma, extraia as dlls no diretorio .\bin do projeto, inclua a unit SDL2_mixer na uses de sdlGame.pas e estamos prontos para iniciar o subsistema de som.Assim como fizemos ao adicionar suporte ao joystick, precisamos chamar a funcao SDL_Init passando um flag indicando que queremos iniciar o sistema de audio. O flag em questao se chama SDL_INIT_AUDIO e pode ser combinado os outros flags que ja usamos. Depois de informado a SDL que pretendemos utilizar o subsistema de audio, e necessario carregar as bibilotecas. Faremos isto com uma chamada a funcao Mix_OpenAudio. Veja como ficou a nova versao de nossa rotina de inicializacao e de finalizacao.procedure TGame.Initialize;var flags, result: integer;begin if ( SDL_Init( SDL_INIT_VIDEO or SDL_INIT_TIMER or SDL_INIT_JOYSTICK or SDL_INIT_AUDIO ) <> 0 )then raise SDLException.Create(SDL_GetError); fWindow := SDL_CreateWindow( PAnsiChar( WINDOW_TITLE ), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if fWindow = nil then raise SDLException.Create(SDL_GetError); fWindowSurface := SDL_GetWindowSurface( fWindow ); if fWindowSurface = nil then raise SDLException.Create(SDL_GetError); fRenderer := SDL_CreateRenderer(fWindow, -1, SDL_RENDERER_ACCELERATED {or SDL_RENDERER_PRESENTVSYNC}); if fRenderer = nil then raise SDLException.Create(SDL_GetError); flags := IMG_INIT_PNG; result := IMG_Init( flags ); if ( ( result and flags ) <> flags ) then raise SDLImageException.Create( IMG_GetError ); result := TTF_Init; if ( result <> 0 ) then raise SDLTTFException.Create( TTF_GetError ); result := Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048); if result < 0 then raise SDLMixerException.Create( Mix_GetError ); Randomize; LoadTextures; LoadSounds; CreateFonts; CreateGameObjects; fGameText := TGameTextManager.Create( fRenderer ); StartNewGame;end;procedure TGame.Quit;begin FreeGameObjects; FreeTextures; FreeFonts; FreeSounds; fGameText.Free; if fJoystick <> nil then begin SDL_JoystickClose(fJoystick); fJoystick:= nil; end; fFrameCounter.Free; SDL_DestroyRenderer(fRenderer); SDL_DestroyWindow(fWindow); IMG_Quit; Mix_Quit; SDL_Quit;end;Passamos SDL_INIT_AUDIO para SDL_Init e, mais abaixo, abrimos efetivamente o sistema de som atraves da funcao Mix_OpenAudio. Note que os valores que passamos aqui sao todos valores padrao