result.Add( enemy ); end;end;Finalmente podemos testar, em TGame, as colisoes entre os tiros disparados realizados pelo jogador e os inimigos presentes na tela.(* Busca por colisoes entre os tiros do jogador (aqueles que segem para cima) e os inimigos ainda vivos *)procedure TGame.CheckCollision;var i : integer; shotList : TShotList; suspectList : TEnemyList;begin //check all shots going upwards with all alive enemies if (fShots.Count > 0) and ( fEnemies.Count > 0 ) then try shotList := fShots.FilterByDirection( TShotDirection.Up ); suspectList := fEnemies.FilterByLife( true ); for i:=0 to Pred(shotList.Count) do TShot(shotList[i]).CheckCollisions( suspectList ); finally shotList.Free; suspectList.Free; end;end; (...)(* alteramos tambem o game loop para incluir as checagens de colisao logo apos o estado dos objetos ter sido atualizado. *)procedure TGame.Run;var deltaTime : real; thisTime, lastTime : UInt32;begin deltaTime := 0.0; thisTime := 0; lastTime := 0; fRunning := true; while fRunning do begin thisTime := SDL_GetTicks; deltaTime := real((thisTime - lastTime) / MSecsPerSec); lastTime := thisTime; CheckDevices; HandleEvents; Update( deltaTime ); CheckCollision; Render; SDL_Delay(1); end;end;(...)(* Nova implementacao de TEnemy.Draw para introduzir o modo de desenho de debug que, alem do inimigo, exibe na tela seu proprio retangulo de colisao. O inimigo tambem e desenhado com uma cor diferente dependendo da quantidade de HP que lhe resta*)procedure TEnemy.Draw;var source, destination : TSDL_Rect;begin source := Sprite.CurrentFrame.Rect; destination := Sprite.CurrentFrame.GetPositionedRect(self.Position); SDL_SetTextureColorMod( fSprite.Texture.Data, 255, 255, 255); if ( HP > 0 ) and ( fSprite.Texture.Data <> nil ) then begin if self is TEnemyB then case HP of 1 : SDL_SetTextureColorMod( fSprite.Texture.Data, 255, 0, 0); end; if self is TEnemyC then case HP of 2 : SDL_SetTextureColorMod( fSprite.Texture.Data, 255, 0, 0); 1 : SDL_SetTextureColorMod( fSprite.Texture.Data, 200, 0, 0); end; SDL_RenderCopy( fRenderer, fSprite.Texture.Data, @source, @destination) ; if fDrawMode = TDrawMode.Debug then begin SDL_SetRenderDrawColor( fRenderer, 0, 255, 0, 255 ); SDL_RenderDrawRect( fRenderer, @destination ); end; end;end;Por fim, vamos tratar o evento disparado quando uma colisao for encontrada, infringindo o dano no inimigo, destruindo o projetil e adicionando pontos ao score (10 para cada hit e 100 para cada morte).//amarramos o evento OnCollided de cada tiro disparado no momento de sua criacaoprocedure TGame.doPlayer_OnShot(Sender: TGameObject);var player : TPlayer; shot : TShot;begin if (Sender is TPlayer) then begin player := TPlayer(Sender); shot := TShot.Create( fRenderer ); shot.Sprite.Texture.Assign( fTextures[ Ord(TSpriteKind.ShotA) ] ); shot.Sprite.InitFrames( 1,1 ); shot.Position := player.ShotSpawnPoint; shot.Position.X -= (shot.Sprite.CurrentFrame.Rect.w / 2); shot.OnCollided := @doShots_OnCollided; shot.DrawMode := GetDrawMode; fShots.Add( shot ); end;end;(...)//e implementamos o evento em TGameprocedure TGame.doShots_OnCollided(Sender, Suspect: TGameObject; var StopChecking: boolean);var shot : TShot; enemy : TEnemy;begin if ( Sender is TShot ) then begin if (Suspect is TEnemy) and (TEnemy(Suspect).HP > 0) then begin shot := TShot(Sender); enemy := TEnemy(Suspect); enemy.Hit( 1 ); if enemy.Alive then Inc(fScore, 10) else Inc(fScore, 100); //destruimos o tiro fShots.Remove( shot ); //o tiro foi destruido, nao precisamos mais seguir com o loop de checagens StopChecking := true; end; end;end;Fontes TTFPara exibir os pontos que o jogador acumulou ao acertar os inimigos, precisamos ser capazes de exibir texto na tela. Poderiamos criar nossa propria logica para exibicao de fontes em bitmap no game, mas ha uma solucao mais pratica: podemos utilizar uma das inumeras fontes