read fSprite; property SpriteRect : TSDL_Rect read GetSpriteRect; end;(...)procedure TGameObject.InitFields;begin Position.X := 0; Position.Y := 0; fSprite := TSprite.Create; fDrawMode := TDrawMode.Normal;end;Declaramos o modo de desenho como um tipo enumerado, adicionamos uma propriedade equivalente a TGameObject e sempre a inicializamos como TDrawMode.Normal.Por fim, podemos nos concentrar no desenho do grid:procedure TGame.DrawDebugGrid; procedure HighlightSecions; var lPlayerBoundary : TSDL_Rect; //secao inferior lEnemyBoundary : TSDL_Rect; //secao superior begin lPlayerBoundary.x := DEBUG_CELL_SIZE; lPlayerBoundary.y := DEBUG_CELL_SIZE * 17; lPlayerBoundary.w := SCREEN_WIDTH - (2 * DEBUG_CELL_SIZE); lPlayerBoundary.h := DEBUG_CELL_SIZE; //1 celula de altura lEnemyBoundary.x := DEBUG_CELL_SIZE; lEnemyBoundary.y := DEBUG_CELL_SIZE * 2; lEnemyBoundary.w := SCREEN_WIDTH - (2 * DEBUG_CELL_SIZE); lEnemyBoundary.h := DEBUG_CELL_SIZE * 14; SDL_SetRenderDrawBlendMode(fRenderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(fRenderer, 255, 0, 0, 50); SDL_RenderFillRect( fRenderer, @lPlayerBoundary ); SDL_RenderFillRect( fRenderer, @lEnemyBoundary ); end;var i, x, y : integer;begin if fDebugView then begin HighlightSecions; SDL_SetRenderDrawBlendMode(fRenderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(fRenderer, 255, 0, 0, 130); //draw horizontal lines for i:=0 to DEBUG_CELL_COUNT_H do begin y := i*DEBUG_CELL_SIZE; SDL_RenderDrawLine(fRenderer, 0, y, SCREEN_WIDTH, y); end; //draw vertical lines for i:=0 to DEBUG_CELL_COUNT_V-1 do begin x := i* DEBUG_CELL_SIZE; SDL_RenderDrawLine(fRenderer, x, 0, x, SCREEN_HEIGHT); end; //draw center lines in green SDL_SetRenderDrawColor(fRenderer, 0, 200, 0, 130); SDL_RenderDrawLine( fRenderer, SCREEN_HALF_WIDTH, 0, SCREEN_HALF_WIDTH, SCREEN_HEIGHT); SDL_RenderDrawLine( fRenderer, 0, SCREEN_HALF_HEIGHT, SCREEN_WIDTH, SCREEN_HALF_HEIGHT); end;end;Comecamos iluminando as secoes do grid com um vermelho semi-transparente dentro de HighlightSecions e calculamos suas dimensoes utilizando os valores da tabela de constantes que criamos previamente. Seguimos com o desenho das linhas horizontais e verticais e finalizamos com duas linhas verdes que passam pelo ponto central da tela, dividindo-a em 4 quadrantes.Arrays Dinamicos x Listas GenericasA linguagem Pascal oferece o recurso de arrays dinamicos, que fornecem a possibilidade de aumentar ou diminuir o tamanho de um array em tempo de execucao. Um recurso realmente muito util que vinhamos utilizando ate entao. Mas ha um problema. Esta facilidade de uso nos levou a implementar a logica de inicializacao e liberacao dos arrays dentro do codigo de TGame, misturando conceitos e dificultando a expansao do codigo.Veja bem, o que queremos de verdade e um objeto capaz de lidar com listas ou colecoes de outros objetos, nos escondendo os detalhes de sua implementacao. Se por um lado, e facil redimensionar um array dinamico, por outro lado nao ha como adicionar funcionalidades novas a seu comportamento.O free pascal suporta o conceito de classes genericas (tambem chamados de metaprogramacao ou de programacao de templates em outras linguagens) e, por consequencia, tambem suporta a criacao de listas genericas (veja a documentacao para mais detalhes), o que nos fornece um substituto muito apto para nossos arrays. A ideia e encapsular o comportamento de lista em uma classe sem nos preocupar com os algoritmos necessarios para mante-la. TGGameObjectList = specialize TFPGObjectList< TGameobject >; { TGameObjectList } TGameObjectList = class (TGGameObjectList) public procedure Update(const deltaTime : real ); virtual; procedure Draw; virtual; procedure SetDrawMode( aDrawMode : TDrawMode); end; (...)procedure TGameObjectList.Update(const deltaTime: real);var i: integer;begin for i:=0 to Pred(Self.Count) do Self.Items[i].Update( deltaTime );end;procedure TGameObjectList.Draw;var i: integer;begin for i:=0 to Pred(Self.Count) do Self.Items[i].Draw;end;procedure TGameObjectList.SetDrawMode(aDrawMode: TDrawMode);var i: integer;begin for i:=0 to Pred(Self.Count) do Self.Items[i].DrawMode := aDrawMode;end; Primeiro, declaramos TGGameObjectList como uma espcializacao do tipo