parametrizado, ou generico, TFPObjectList. Isto vai gerar uma lista especializada em lidar com instancias de TGameObject. Em seguida, geramos um descendente desta classe para poder implementar os metodos que queremos, como o SetDrawMode mencionado na secao anterior.Com isto, chegamos a um conteiner mais capaz para nossos objetos. Se quisermos ser ainda mais especificos, e mais claros, podemos declarar listas especificas para TEnemy e para TShot. Declare as classes abaixo, altere todas as referencias de fEnemies e fShots para o novo tipo equivalente e seu codigo voltara a compilar.TEnemyList = class(TGameObjectList);TShotList = class(TGameObjectList);(...)procedure TGame.Update(const deltaTime : real ) ;begin fPlayer.Update( deltaTime ); fEnemies.Update( deltaTime ); fShots.Update( deltaTime );end;procedure TGame.DrawGameObjects;begin fPlayer.Draw; fEnemies.Draw; fShots.Draw;end;procedure TGame.FreeGameObjects;begin fEnemies.Free; fShots.Free;end; constructor TGame.Create;begin fRunning := false; fJoystick := nil; fDebugView := false; fEnemies := TEnemyList.Create;end; procedure TGame.CreateGameObjects;var i : integer; enemy : TEnemy;begin for i:= 0 to 119 do fEnemies.Add( enemy ); fPlayer := TPlayer.Create( fRenderer ); fPlayer.Sprite.Texture.Assign( fTextures[ integer(TSpriteKind.Player)] ); fPlayer.Sprite.InitFrames(1,1); fPlayer.OnShotTriggered:= @doPlayer_OnShot; //centraliza o jogador no eixo X fPlayer.Position.X := trunc( SCREEN_HALF_WIDTH - ( fPlayer.Sprite.Texture.W / 2 )); //posiciona o jogador na 19o linha do grid fPlayer.Position.Y := (DEBUG_CELL_SIZE * 18) - fPlayer.Sprite.CurrentFrame.Rect.h; fShots := TShotList.Create(true);end; Distribuicao dos inimigosDistribuicao final do inimigos na tela. Note como eles estao perfeitamente alinhados a grade.Agora que temos um grid para nos guiar, vamos distribuir os inimigos num padrao retangular como o da figura acima: 6 linhas contendo 20 inimigos cada, sendo 2 linhas para o inimigo do tipo A, 2 para o tipo B e 2 para o Tipo C nesta ordem com o inimigo tipo C ocupando as primeiras linhas e o tipo A ocupando as linhas de baixo.Temos 120 inimigos no total ( 6*20 =120 ). Se voce ja terminou o curso de algebra do ensino medio deve ser capaz de deduzir as formulas para calcular as coordenadas de cada um dos 120 inimigos, se nao, nao se preocupe, vamos ver, a seguir, como obte-las..grayed{color: #ccc;font-weight:light;font-size: smaller;} c0cl1c2c3c4c5c6c7c8c9c10c11c12c13c14c15c16c17c18c19l00001020304050607080910111213141516171819l12021222324252627282930313233343536373839l24041424344454647484950515253545556575859 legenda: l = linha, c = coluna Observe a tabela acima, ela representa a distribuicao do 60 primeiros inimigos.Sabendo que o numero de colunas, que chamaremos de c, e 20 , podemos obter o numero da coluna dividindo o indice do inimigo, que chamaremos de i por 20. Por exemplo, o inimigo armazenado no indice 21 da lista esta na coluna i/c => 20/21 = 1. A sobra desta divisao nos dira a que linha o inimigo pertence, portando: linha = i div c coluna = i mod cCom isto, podemos calcular os valores das coordenas X e Y, ja que sabemos a altura e a largura de cada celula (o valor da constante DEBUG_CELL_SIZE), que chamaremos de k temos x = ( i div c ) * k y = ( i mod c ) * kE, como definimos, em nosso layout, uma margem esquerda de uma celula e uma margem superior de duas, chegamos em x = k + (( i div c ) * k ) y = 2K + (( i mod c ) * k )Trazendo isto para o codigo, vamos alterar a funcao TGame.CreateGameObjects