preparamos as fundacoes e demos os primeiros passos na construcao do game. Agora, com as bases prontas, vamos comecar a nos concentrar no conteudo - imagens, animacoes e interacao entre os objetos do jogo e a interface do usuario.Este post sera maior que os outros dois, construiremos objetos mais complexos e resolveremos alguns problemas mais dificeis portanto, e aconselhavel baixar o codigo-fonte e ir acompanhando as explicacoes utilizando-o como referencia. Caso nao queira fazer o download, voce tambem pode ver o codigo no repositorio do GitHub.Abracos, e mao a obra!LayoutGrade de layout do game.O Space Invaders original utilizava uma distribuicao visual bem estruturada, em forma de grid. Vamos distribuir nosso espaco de maneira similar, quebrando-o em uma grade com celulas de 32x32px cada. Como os limites da janela sao de 800x600px isto nos da uma tabela com 25 colunas e 18 linhas, com uma pequena sobra que vamos ignorar.Observe a imagem ao lado. Ela exibe a grade na qual iremos nos basear para criar o layout do game daqui para frente. E muito importante ter um modelo de referencia visual quando estamos programando graficos porque eles ajudam a julgar a exatidao do posicionamento das coisas com uma simples olhada na tela ao inves de ficar projetando mentalmente as coordenadas dos objetos e comparar o resultado com o que se ve no monitor.Dividimos o espaco da seguinte maneira:Um grupo de celulas que chamaremos de secao superior (onde os inimigos estao)Um grupo de celulas que chamaremos de secao inferior (onde o jogador esta)Celulas externas que nos servirao de margem. Nem o jogador, nem os inimigos poderao mover-se para alem delas.De posse destas definicoes, montamos a tabela de constantes abaixo: Nome Valor Observacao SCREEN_WIDTH 800 Largura da tela SCREEN_HEIGHT 600 Altura da tela SCREEN_HALF_WIDTH SCREEN_WIDTH/2 Centro da tela no eixo X SCREEN_HALF_HEIGHT SCREEN_HEIGHT/2 Centro da tela no eixo Y DEBUG_CELL_SIZE 32 Tamanho das celulas do grid DEBUG_CELL_COUNT_V SCREEN_WIDTH / DEBUG_CELL_SIZE Numero de celulas em 1 linha DEBUG_CELL_COUNT_H SCREEN_HEIGHT / DEBUG_CELL_SIZE Numero de celulas em 1 coluna Algumas dessas constantes ja estao declaradas na unit sdlGame. Crie uma unit nova, chame-a de sdlGameTypes e declare cada linha da tabela abaixo como uma constante publica. Vamos comecar a melhorar a estruturacao do nosso codigo para que ele possa crescer de maneira controlada entao, depois de criar a nova unit, mova tambem as excecoes customizadas que criamos nos textos anteriores. Veja como ficou sdlGameTypes:unit sdlGameTypes;{$mode objfpc}{$H+}interfaceuses sysutils;const SCREEN_WIDTH = 800; SCREEN_HEIGHT = 600; SCREEN_HALF_WIDTH = SCREEN_WIDTH div 2; SCREEN_HALF_HEIGHT = SCREEN_HEIGHT div 2; DEBUG_CELL_SIZE = 32; DEBUG_CELL_COUNT_V = (SCREEN_WIDTH div DEBUG_CELL_SIZE); DEBUG_CELL_COUNT_H = (SCREEN_HEIGHT div DEBUG_CELL_SIZE);type SDLException = class( Exception ); SDLImageException = class( SDLException ); SDLTTFException = class( SDLException ); IndexOutOfBoundsException = class( Exception );implementationend.Nao esqueca de adicionar sdlGameTypes na clausula uses da unit sdlGame, para nao quebrar a compilacao.Grid de DebugPrecisamos de um gatilho para desenhar ou ocultar o grid explicado na secao anterior. Para isto, um flag de debug em TGame e suficiente. Assim, dependendo do estado do flag, chamamos ou nao as rotinas responsavel por seu desenho. Para ativar/desativar o modo debug, vamos utilizar