privada de TGame ) para armazenar nossos ponteiros:TSpriteKind = ( EnemyA, EnemyB, EnemyC, EnemyD, Player, Bunker, Garbage, Explosion, ShotA ); (...) TGame = class private fRunning : boolean; fWindow : PSDL_Window; fWindowSurface : PSDL_Surface; fRenderer : PSDL_Renderer; fSprites : array of PSDL_Surface;(...)procedure TGame.LoadSprites;begin SetLength(fSprites, Ord( High( TSpriteKind ) ) +1 ); fSprites[ integer(TSpriteKind.EnemyA) ] := LoadPNG( 'enemy_a.png' ); fSprites[ integer(TSpriteKind.EnemyB) ] := LoadPNG( 'enemy_b.png' ); fSprites[ integer(TSpriteKind.EnemyC) ] := LoadPNG( 'enemy_c.png' ); fSprites[ integer(TSpriteKind.EnemyD) ] := LoadPNG( 'enemy_d.png' ); fSprites[ integer(TSpriteKind.Player) ] := LoadPNG( 'player.png' ); fSprites[ integer(TSpriteKind.Bunker) ] := LoadPNG( 'bunker.png' ); fSprites[ integer(TSpriteKind.Garbage)] := LoadPNG( 'garbage.png' ); fSprites[ integer(TSpriteKind.Explosion)] := LoadPNG( 'explosion.png' ); fSprites[ integer(TSpriteKind.ShotA) ] := LoadPNG( 'shot_a.png' );end; procedure TGame.FreeSprites;var i: integer;begin for i:= 0 to Length( fSprites )-1 do begin SDL_FreeSurface( fSprites[ i ] ); fSprites[ i ] := nil; end;end;Excelente! Agora temos todas as imagens carregadas em suas respectivas texturas e podemos acessa-las atraves do TSpriteKind equivalente.Podemos partir para o desenho dos inimigos, se quisermos ( temos tudo a mao para isso ) mas, se pensarmos um pouco, um inimigo e um candidato perfeito para uma nova classe: cada inimigo tem uma posicao independente na tela, uma quantidade de dano que pode sofrer antes de morrer, uma imagem ou um conjunto de imagens que o representa e, para facilitar nossa vida, cada inimigo deve saber desenhar a si mesmo. Crie as classes abaixo para implementarmos estas ideias.TPoint = record X : integer; Y : integer;end;TGameObject = classprotected fTexture : PSDL_Texture; fRenderer : PSDL_Renderer;public Position : TPoint; constructor Create( const aRenderer: PSDL_Renderer ); procedure Draw; virtual; abstract; procedure SetTexture( pTexture: PSDL_Texture );end;TEnemy = class( TGameObject )public HP : integer;end;TEnemyA = class( TEnemy )public procedure Draw; override;end; (...)procedure TEnemyA.Draw;var source, destination : TSDL_Rect;begin if ( HP > 0 ) and ( fTexture <> nil ) then begin source.x := 0; source.y := 0; source.w := 16; source.h := 16; destination.x := self.Position.X; destination.y := self.Position.Y; destination.w := 16; destination.h := 16; SDL_RenderCopy( fRenderer, fTexture, @source, @destination) ; end;end;Definimos nossa classe base TGameObject com as caracteristicas que comentamos acima. Note que ela e uma classe abstrata e que seus descendentes deverao implementar o metodo Draw, alem disso, ela recebe um ponteiro para um renderizador (fRenderer) em seu construtor e o metodo SetTexture permite indicarmos com qual textura nossa instancia ira trabalhar.Seguimos especializando TGameObject em uma classe base para todos os inimigos: TEnemy. Esta classe ainda e muito generica para saber desenhar todos os tipos de inimigos, entao vamos criar mais um nivel de especializacao e chegar classe real de nosso primeiro inimigo: TEnemyA!Finalmente, podemos renderizar nosso inimigo!Observe a listagem do metodo TEnemyA.Draw. Tudo o que ela faz e definir um retangulo do tipo SDL_Rect de origem ( source ) e um de destino ( destination ) e passa-los para SDL_RenderCopyque se encarrega de copiar os pixels de fTexture que estao dentro da area definida pelo retangulo source para a memoria de video na posicao e tamanho definidos por destination. Caso os retangulos possuam tamanhos diferentes, o mapeamento destes pixels ocorrera de forma automatica.Se voce executar o projeto agora, ainda