SDL_ALPHA_OPAQUE ); SDL_RenderClear( fRenderer ); SDL_RenderPresent( fRenderer );end; As tres funcoes acima atuam sobre nosso renderizador fRenderer para:informar que iremos trabalhar com um preto solido (SDL_SetRenderDrawColor),limpar o conteudo da memoria de video e preenche-la uniformemente com a cor que acabamos de informar (SDL_RenderClear)Exibir o que foi feito nos passos anteriores na janela associada a fRenderer (SDL_RenderPresent)Finalize a implementacao inicial de TGame com os metodos abaixo para inicializar fRunning no construtor e liberar os objetos da SDL do destrutor da classe.procedure TGame.Quit;begin SDL_DestroyRenderer(fRenderer); SDL_DestroyWindow(fWindow); SDL_Quit;end; constructor TGame.Create;begin fRunning:= false;end;destructor TGame.Destroy;begin Quit; inherited;end; Se estiver com duvidas ou problemas em compilar, veja como ficou o codigo da unit sdlGame ate aqui.unit sdlGame;{$mode objfpc}{$H+}interfaceuses sysutils, SDL2;type SDLException = class(Exception); TGame = class private fRunning : boolean; fWindow : PSDL_Window; fRenderer : PSDL_Renderer; procedure Quit; procedure HandleEvents; procedure Render; public constructor Create; destructor Destroy; override; procedure Initialize; procedure Run; property Running: boolean read fRunning; end;implementationprocedure TGame.Initialize;begin if ( SDL_Init( 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 or SDL_RENDERER_PRESENTVSYNC); if fRenderer = nil then raise SDLException.Create(SDL_GetError);end;procedure TGame.Quit;begin SDL_DestroyRenderer(fRenderer); SDL_DestroyWindow(fWindow); SDL_Quit;end;procedure TGame.HandleEvents;var event : TSDL_Event;begin while SDL_PollEvent( @event ) = 1 do begin case event.type_ of SDL_QUITEV : fRunning := false; SDL_KEYDOWN : case event.key.keysym.sym of SDLK_ESCAPE: fRunning := false; end; end; end;end;procedure TGame.Render;begin SDL_SetRenderDrawColor( fRenderer, 0, 0, 0, SDL_ALPHA_OPAQUE ); SDL_RenderClear( fRenderer ); SDL_RenderPresent( fRenderer );end;constructor TGame.Create;begin fRunning:= false;end;destructor TGame.Destroy;begin Quit; inherited;end;procedure TGame.Run;begin fRunning:= true; while fRunning do begin HandleEvents; Render; end;end;end.Com a unit compilando sem problemas, altere o codigo do arquivo do projeto ( space_invaders.lpr ) para utilizar a nova classe.program space_invaders;{$mode objfpc}{$H+}uses sdlGame;var Game : TGame;begin Game := TGame.Create; try Game.Initialize; Game.Run; finally Game.Free; end;end.Execute o projeto e... voila! Uma fantastica tela surgira diante de seus olhos!Bom, talvez nao tao fantastica assim, eu admito. Mas podemos melhorar.Carregando e Exibindo ImagensVamos utilizar para nosso game, uma versao ligeiramente modificada das imagens desenhadas por Joel Shapiro e, gentilmente disponibilizadas na internet.A primeira coisa a atentar sobre imagens no SDL, e que, por padrao, a biblioteca so suporta arquivos no o formato BMP. Para carregar e abrir as imagens armazenadas como PNG, devemos utilizar uma das suas varias extensoes: o SDL Image 2.0.Baixe as extensoes certas pro seu ambiente ( windows de 32bits, no meu caso ) , descompacte o conteudo no diretorio bin do projeto e vamos alterar o codigo para integrar o SDL Image ao game.Nos bindings que estamos usando, ha uma unit chamada sdl2_image.pas. Adicione-a a sessao uses da unit sdlGame.pas. Agora vamos alterar os metodos TGame.Inicialize e o TGame.Quit conforme a listagem que seque.procedure TGame.Initialize;var flags, result: integer;begin if ( SDL_Init( 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); fWindowSurface := SDL_GetWindowSurface( fWindow ); if fWindowSurface = nil then raise SDLException.Create(SDL_GetError); fRenderer := SDL_CreateRenderer(fWindow, -1, SDL_RENDERER_ACCELERATED or SDL_RENDERER_PRESENTVSYNC); if fRenderer = nil then raise SDLException.Create(SDL_GetError); flags