a tecle G, de "Grid", ja que a tecla D, mais adequada para "Debug" ja e utilizada para controlar o jogador.Declare fDebugView como campo privado de TGame e vamos alterar TGame.HandleEvents para tratar o pressionamento da tecla G.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_LEFT, SDLK_A : fPlayer.Input[Ord(TPlayerInput.Left)] := true; SDLK_RIGHT, SDLK_D : fPlayer.Input[Ord(TPlayerInput.Right)]:= true; SDLK_SPACE : fPlayer.Input[Ord(TPlayerInput.Shot)] := true; SDLK_p : ScreenShot; SDLK_g : SetDebugView( not fDebugView ); SDLK_ESCAPE : fRunning := false; end; SDL_KEYUP : case event.key.keysym.sym of SDLK_LEFT, SDLK_A : fPlayer.Input[Ord(TPlayerInput.Left)] := false; SDLK_RIGHT, SDLK_D : fPlayer.Input[Ord(TPlayerInput.Right)]:= false; SDLK_SPACE : fPlayer.Input[Ord(TPlayerInput.Shot)] := false; end; SDL_JOYAXISMOTION : case event.jaxis.axis of 0 : begin fPlayer.Input[Ord(TPlayerInput.Left)] := false; fPlayer.Input[Ord(TPlayerInput.Right)] := false; if event.jaxis.value > 0 then fPlayer.Input[Ord(TPlayerInput.Right)] := true else if event.jaxis.value < 0 then fPlayer.Input[Ord(TPlayerInput.Left)] := true end; end; SDL_JOYBUTTONUP : case event.jbutton.button of 0, 1, 2, 3 : fPlayer.Input[Ord(TPlayerInput.Shot)] := false; end; SDL_JOYBUTTONDOWN : case event.jbutton.button of 0, 1, 2, 3 : fPlayer.Input[Ord(TPlayerInput.Shot)] := true; end; end; end;end;(...)procedure TGame.SetDebugView(const aValue: boolean);begin fDebugView := aValue; fShots.SetDrawMode(GetDrawMode); fEnemies.SetDrawMode(GetDrawMode);end;(...)procedure TGame.ScreenShot;const SCREENSHOT_DIR = '.\screenshots\'; SCREENSHOT_PREFIX = 'shot'; function GetNewFileName: string; var i: integer; begin i:= 0; result := Format('%s-%.3d.bmp', [SCREENSHOT_DIR + SCREENSHOT_PREFIX, i]); while FileExists(result) do begin result := Format('%s-%.3d.bmp', [SCREENSHOT_DIR + SCREENSHOT_PREFIX, i]); Inc(i); end; end;var surface : PSDL_Surface;begin surface:= nil; try surface:= SDL_CreateRGBSurface(0, SCREEN_WIDTH, SCREEN_HEIGHT, 32, $00FF0000, $0000FF00, $000000FF, $FF000000); SDL_RenderReadPixels( fRenderer, nil, SDL_PIXELFORMAT_ARGB8888, surface^.pixels, surface^.pitch ); ForceDirectories(SCREENSHOT_DIR); SDL_SaveBMP(surface, GetNewFileName); finally SDL_FreeSurface( surface ); end;end;(...)function TGame.GetDrawMode: TDrawMode;begin if (fDebugView) then result := TDrawMode.Debug else result := TDrawMode.Normal;end;Ha bastante coisa acontecendo aqui. Vamos explica-las na ordem em que aparecem no codigo.A primeira coisa nova, e a captura da tecla P no SDL_KEYUP para chamar a funcao ScreenShot. Esta e uma rotina serve para capturar "fotos" da tela e salva-las em disco. Nao e necessario para o game em si, mas e um recurso bacana e pode ajudar a simplificar o debug. O que ela faz e criar um PSDL_Surface temporario, copiar os pixels da tela atraves de SDL_RenderReadPixels e depois salva-los em disco no formato bitmap usando SDL_SaveBMP.Logo apos, podemos ver que quando capturamos a tecla G, fazemos uma chamada a SetDebugView que vai inverter o valor do flag fDebugView e configurar os objetos do jogo para o modo de desenho equivalente, o que nos leva a proxima modificacao.A funcao GetDrawMode devolve, como retorno, uma variavel do tipo TDrawMode. De onde veio isto?Assim como TGame agora "sabe" se esta em modo de debug ou nao, os nossos objetos tambem deveriam saber e adaptar seu desenho de acordo. Veja: TSpriteAnimationType = ( NoLoop, Circular ); (...) { TGameObject } PGameObject = ^TGameObject; TGameObject = class private function GetSpriteRect: TSDL_Rect; strict protected fRenderer : PSDL_Renderer; fDrawMode : TDrawMode; protected fSprite : TSprite; procedure InitFields; virtual; public Position : TPoint; constructor Create( const aRenderer: PSDL_Renderer ); virtual; destructor Destroy; override; procedure Update(const deltaTime : real ); virtual; abstract; procedure Draw; virtual; abstract; procedure CheckCollisions( Suspects: TGameObjectList); property DrawMode: TDrawMode read fDrawMode write fDrawMode; property Sprite : TSprite