Exatamente igual a imagem ao lado.Mas nao se engane, esta tela, agora dotada de um buffer duplo e uma logica de page flipping, e capaz de muito mais do que pode indicar sua aparencia simploria.E e isto que vamos comecar a descorbrir na proxima secao deste texto.De volta a MatrixPodemos pensar no efeito como sequencias de caracteres que descem na tela deixando um rastro que vai ficando mais fraco ate sumir. Esses caracteres comecam em uma posicao aleatoria no eixo x e com y = 0. Vamos chamar cada um desses rastros de Strip. No espaco entre a clausula uses e a declaracao das variaveis globais, faca as alteracoes necessarias para que seu codigo fique igual o codigo a seguir:const Black = 0; Green = 2; LightGreen = 10; White = 15; STRIP_COUNT = 150; //quantos strips teremos em nosso array STRIP_MAX_LEN = 25; //tamanho maximo do rastro deixado pelo strip STRIP_MIN_LEN = 6; //tamanho minimo deixado pelo rastro.type TStrip = record Position : COORD; //posicao de nosso strip na tela Length : byte; //tamanho do rastro Delay : integer; //tempo de espera ate o strip comecar a ser exibido end;var hBuffer1, hBuffer2, hBackBuffer : THandle; consoleBounds : TCOORD; strips: array[0..STRIP_COUNT] of TStrip; Tudo bem simples.Declaramos as constantes de cor (lembra que temos uma paleta de 16 cores dispoiveis?) que nos interessam, algumas constantes de parametrizacao dos strips, um record TStrip com a estrutura de dados necessaria e, no final, um array de TStrip para armazenar os dados.Agora vamos iniciar os strips com valores aleatorios.procedure InitStrips;var i: integer;begin for i:=0 to STRIP_COUNT-1 do begin strips[i].Length := random(STRIP_MAX_LEN - STRIP_MIN_LEN) + STRIP_MIN_LEN; strips[i].Position.y := 0; strips[i].Position.x := random(consoleBounds.x); strips[i].Delay := random(20); end;end; E atualiza-los a cada iteracao de nosso loop principal com a seguinte rotina.procedure UpdateStrips;var i : integer;begin for i:=0 to STRIP_COUNT-1 do begin if strips[i].Delay > 0 then strips[i].Delay := strips[i].Delay -1 else begin strips[i].Position.Y := strips[i].Position.Y + 1; if ( strips[i].Position.Y - strips[i].Length > consoleBounds.Y ) then begin strips[i].Length := random(STRIP_MAX_LEN - STRIP_MIN_LEN) + STRIP_MIN_LEN; strips[i].Position.y := 0; strips[i].Position.x := random(consoleBounds.x); strips[i].Delay := random(100); end; end; end;end;So restam mais dois passos. Desenhar os strips e ajustar o loop principal para incluir as rotinas criadas.procedure DrawStrips;var i, j : integer; lColor, lCharsWritten: DWORD; lChar : char; lPosition: COORD;begin lCharsWritten := 0; for i:=0 to STRIP_COUNT-1 do begin if (strips[i].Delay <= 0) then begin if (strips[i].Position.Y <= consoleBounds.Y) then begin //desenhamos o primeiro caractere em branco lColor:= White; lChar := Char(random(255-33)+33); WriteConsoleOutputAttribute(hBackBuffer, @lColor, 1, strips[i].Position, lCharsWritten); WriteConsoleOutputCharacter(hBackBuffer, @lChar, 1, strips[i].Position, lCharsWritten); end; for j:=1 to strips[i].Length-1 do if (strips[i].Position.Y + j <= consoleBounds.Y) then begin //os primeiros 35% do rastro serao desenhados em verde claro if (j / strips[i].Length <= 0.35) then lColor:= LightGreen else lColor:= Green; lChar := Char(random(255-33)+33); lPosition.X:= strips[i].Position.X; lPosition.Y:= strips[i].Position.Y - j; WriteConsoleOutputAttribute(hBackBuffer, @lColor, 1, lPosition, lCharsWritten); WriteConsoleOutputCharacter(hBackBuffer, @lChar, 1, lPosition, lCharsWritten); end; end; end;end;begin randomize; ConfigConsole; InitStrips; while hi(GetKeyState(VK_ESCAPE)) = 0 do begin Clear; //limpamos a tela UpdateStrips; //calculamos a posicao dos strips no quadro atual DrawStrips; //desenhamos todos os strips visiveis SwapBuffers; //exibimos o quado criado