SDL_INIT_VIDEO ) <> 0 )then raise SDLException.Create( SDL_GetError ); fWindow := SDL_CreateWindow( PAnsiChar( 'Delphi Games - Space Invaders' ), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN); if fWindow = nil then raise SDLException.Create( SDL_GetError ); fRenderer := SDL_CreateRenderer(fWindow, -1, SDL_RENDERER_ACCELERATED); if fRenderer = nil then raise SDLException.Create(SDL_GetError);end;Comecamos com uma chamada a SDL_Init que recebe, como parametro, os flags dos subsistemas que queremos inicializar (somente o subsistema de video, por enquanto).Em seguida, criamos nossa janela com uma chamada a SDL_CreateWindow, passando o titulo da janela, a posicao (usamos a constante SDL_WINDOWPOS_UNDEFINED em x e y para que ela seja criada no centro da tela), o tamanho ( 800 x 600 ) e, por fim, um flag para que a janela seja exibida logo apos sua criacao (SDL_WINDOW_SHOWN).E finalizamos com a criacao do nosso renderizador atraves da funcao SDL_CreateRenderer, onde passamos o ponteiro para a janela em que ele ira atuar, o indice do dispositivo grafico em que ele vai rodar (-1 indica que queremos o dispositivo padrao do sistema) e o modo de operacao (SDL_RENDERER_ACCELERATED indica que queremos que o renderizador utilize aceleracao de hardeware sempre que possivel). Caso qualquer uma das funcoes falhe, levantamos uma excecao do tipo SDLException, que definimos logo acima da classe.Game LoopDepois de termos iniciados a janela e o renderizador, precisamos implementar o loop principal (game loop) do jogo atraves do metodo Run.procedure TGame.Run;begin fRunning:= true; while fRunning do begin HandleEvents; Render; end;end;Bem simples nao?Iremos executar todo o jogo dentro deste loop controlado por fRunning que atualizaremos em resposta a dois eventos: 1 quando o usuario fechar a janela e 2: quando o usuario pressionar a tecla ESC. Passemos entao ao metodo HandleEvents.procedure TGame.HandleEvents;var event : TSDL_Event;begin while SDL_PollEvent( @event ) = 1 do begin case event.type_ of {quit event e gerado em resposta ao fechamento da janela principal do programa } SDL_QUITEV : fRunning := false;< { keydown acontece sempre que uma tecla e pressionada. } SDL_KEYDOWN : case event.key.keysym.sym of { estamos interessados em responder somente a tecla ESC por enquanto } SDLK_ESCAPE: fRunning := false; end; end; end;endEm resposta aos varios eventos possiveis de acontecer dentro do sistema operacional em que o programa esta rodando, o SDL vai preenchendo uma fila de mensagens com informacoes relevantes em uma area especial da memoria.Se o usuario digitou uma tecla, por exemplo, uma mensagem do tipo SDL_KEYDOWN e enfileirada. Se o usuario clicou em qualquer lugar da janela com o botao esquerdo do mouse, uma mensagem do tipo SDL_BUTTON_LEFT e enfileirada. E assim por diante.O que fazemos para cada chamada de HandleEvents e percorrer toda a fila de eventos pendentes, remove-los de la, um a um, atraves do metodo SDL_PollEvent e tratar as mensagens que nos interessam, atualizando o estado do jogo para mante-lo em sincronia com as acoes do usuario.Por enquanto, so estamos interessados em saber quando devemos sair e fechar o programa portanto, so implementamos os eventos que fRunning deve ser atualizado como false.Por fim, precisamos exibir algo na janela. Como ainda nao temos nenhuma imagem, vamos simplesmente desenhar um fundo preto.procedure TGame.Render;begin SDL_SetRenderDrawColor( fRenderer, 0, 0, 0,