os quadros (frames) de uma animacao, estamos simplesmente jogando caracteres na tela da maneira mais displiscente e ineficiente se pode imaginar.Outro problema serio e que nao temos nenhum mecanismo de buffer, estamos escrevendo direto na area visivel da aplicacao e, como vimos na serie Animacoes em Tempo Real com a VCL, nao da pra ir muito longe assim (note que o ambiente e diferente, mas as tecnicas que utilizaremos sao exatamente as mesmas).Vamos comecar a por ordem na casa entao! Mas antes, se voce estiver curioso, baixe o programa compilado e veja o resultado do codigo que vamos construir.Bem mais interessante, heim!Preparando o ambientePrimeiro, vamos definir os handlers que irao apontar para nossos buffers. Precisamos de dois buffers, um que aponte pra uma area invisivel na memoria e um que aponte para o buffer de saida do console. Declare as seguintes variaveis e escreva uma nova procedure para realizarmos as inicializacoes.var hBuffer1, hBuffer2, hBackBuffer : THandle; consoleBounds : TCOORD; (...)procedure ConfigConsole;var lCursorInfo : TConsoleCursorInfo; lSecAttributes : TSecurityAttributes;begin SetConsoleTitle('DelphiGames Blog | Matrix Effect - Part 2'); Write('Getting handlers... '); lSecAttributes.nLength:= sizeOf(TSecurityAttributes); lSecAttributes.lpSecurityDescriptor := nil; lSecAttributes.bInheritHandle := false; hBuffer1 := GetStdHandle(STD_OUTPUT_HANDLE); hBuffer2 := CreateConsoleScreenBuffer( GENERIC_WRITE or GENERIC_READ, FILE_SHARE_READ, lSecAttributes, CONSOLE_TEXTMODE_BUFFER, nil); if (hBuffer1 = INVALID_HANDLE_VALUE) or (hBuffer2 = INVALID_HANDLE_VALUE) then begin WriteLn('ERROR'); Halt(1); end else begin WriteLn('OK!'); hBackBuffer := hBuffer1; lcursorInfo.dwSize := 1; lcursorInfo.bVisible := False; SetConsoleCursorInfo(hBuffer1, lcursorInfo); SetConsoleCursorInfo(hBuffer2, lcursorInfo); consoleBounds.X:= 80; consoleBounds.Y:= 25; SetConsoleScreenBufferSize(hBuffer1, consoleBounds); SetConsoleScreenBufferSize(hBuffer2, consoleBounds); end;end;Opa! Tem coisa nova ai, mas nao precisar se intimidar nao.Comecamos setando o titulo da janela, apontamos o hBuffer1 para o buffer de saida do console e criamos um novo buffer usando a API CreateConsoleScreenBuffer armazenando seu handler em hBuffer2. Seguimos checando se os dois buffers foram inicializados corretamente testando seu valor contra a constante INVALID_HANDLE_VALUE e, se estiver tudo ok, ajustamos o hBackBuffer para apontar para hBuffer1, escondemos o cursor (SetConsoleCursorInfo) e concluimos ajustando o tamanho dos buffes para 80x25 caracteres (SetConsoleScreenBufferSize).Ok. Temos um procedimento pra ajustar o console e alguns ponteiros (o handler acaba sendo um tipo de ponteiro no final das contas) para os buffers. A ideia e realizar todos as saidas em hBackBuffer e, quando tivermos um frame pronto, fazemos um swap dos ponteiros, exibindo o buffer em estavamos trabalhando e escondendo o atual. Esta tecnica tambem e conhecida como page-flipping e vamos implementa-la agora com a ajuda de mais uma chamda a Win32 API (SetConsoleActiveScreenBuffer). Escreva o metodo SwapBuffers logo abaixo da implementacao de ConfigConsole.procedure SwapBuffers;begin if hBackBuffer = hBuffer1 then begin SetConsoleActiveScreenBuffer(hBuffer1); hBackBuffer:= hBuffer2; end else begin SetConsoleActiveScreenBuffer(hBuffer2); hBackBuffer:= hBuffer1; end;end; Para concluir o setup do ambiente, implemente a funcao clear logo depois de SwapBuffers e e altere codigo de entrada do programa conforme exibido a seguirprocedure Clear;var tc :tcoord; nw: DWORD; cbi : TConsoleScreenBufferInfo;begin GetConsoleScreenBufferInfo(hBackBuffer, cbi); tc.x := 0; tc.y := 0; FillConsoleOutputAttribute(hBackBuffer, Black,cbi.dwsize.x*cbi.dwsize.y, tc, nw); FillConsoleOutputCharacter(hBackBuffer, ' ', cbi.dwsize.x*cbi.dwsize.y, tc, nw); SetConsoleCursorPosition(hBackBuffer, tc);end; //ponto de entrada do programabegin randomize; ConfigConsole; while hi(GetKeyState(VK_ESCAPE)) = 0 do begin Clear; SwapBuffers; end;end. Pronto! Com estas alteracoes seu ambiente esta preparado.Compile e execute o programa e voce vai uma incrivel... tela preta!