:= IMG_INIT_PNG; result := IMG_Init( flags ); if ( ( result and flags ) <> flags ) then raise SDLImageException.Create( IMG_GetError );end;procedure TGame.Quit;begin SDL_DestroyRenderer(fRenderer); SDL_DestroyWindow(fWindow); IMG_Quit; SDL_Quit;end;No TGame.Quit, simplesmente adicionamos uma chamada a IMG_Quit, para liberar os recursos utilizados pelo SLD Image 2.0.Ja o TGame.Initialize requer um pouco mais de nossa atencao, porque o modo de verificar se o retorno da funcao IMG_Init e diferente do que fizemos ate aqui com os metodos da SDL. Ele recebe um inteiro com as flags dos formatos que desejamos suportar ( IMG_INIT_PNG para habilitar a carga dos aquivos PNG que nos interessam agora ) e devolve, como resultado, um outro inteiro com os flags do que foi habilitado com sucesso. No final, comparamos se o que foi inicializado e exatamente o que pedimos nos valendo de uma operacao de bits ( bitwise operation ) simples, levantando uma excecao do tipo SDLImageException que vamos declarar como descendente de SDLException:type SDLException = class( Exception ); SDLImageException = class( SDLException );Ok. Agora podemos carregar nossas imagens para a memoria RAM e repassa-las para a memoria de video! Mas antes, um pouco de teoria...O SDL pode armazenar buffers de pixel em diversos formatos tanto em memoria RAM quanto na VRAM (a memoria da sua placa de video). Cada qual com seu proprio conjunto de vantagens e desvantagens aos quais nao vamos nos prender neste momento. O que precisamos saber e que quando voce manipula os dados em memoria RAM, voce esta utilizando a CPU e quando os manipula na VRAM, o SDL usa, sempre que possivel o GPU, tornando o processo mais rapido.Embora esta explicacao possa ser um pouco simplista, ela e suficiente para o momento. Os dois conceitos sao implementados na biblioteca como dois structs ( um struct e um tipo de dados semanticamente equivalente aos records do pascal ):SDL_Surface - armazena buffers de cor em memoria ramSDL_Texture - armazena buffers de cor o mais proximo possivel da memoria de videoSabendo disto, veja como ficou a rotina para carregar imagens PNG para uma SDL_Texture:function TGame.LoadPNG( const fileName: string ): PSDL_Texture;const IMAGE_DIR = '.\assets\images\';var temp : PSDL_Surface;begin result := nil; try temp := IMG_Load( PAnsiChar( IMAGE_DIR + fileName ) ); if ( temp = nil ) then raise SDLException.Create( SDL_GetError ) else begin result := SDL_CreateTextureFromSurface( fRenderer, temp ); if ( result = nil ) then raise SDLImageException.Create( IMG_GetError ); end; finally SDL_FreeSurface( temp ); end;end;Primeiro carregamos a imagem para a memoria e, a partir de la criamos uma textura otimizada para a placa de video presente no sistema, sempre levantando excecoes em caso de falha. As rotimas IMG_Load e SDL_CreateTextureFromSurface realmente simplificam este processo.Agora vamos carregar as imagens. Caso voce ainda nao tenha baixados os arquivos para acompanhar este texto, baixe-os agora e descompacte o conteudo do .zip no diretorio bin do projetoComo indicado pela constante IMAGE_DIR, as imagens devem estar em ,\assests\images. Temos uma imagem para cada tipo de objetos que vamos precisar no game. Para facilitar as coisas, crie um tipo enumerado para cada uma delas, e declare um array de texturas ( como uma variavel