2 minute read

Quem assistiu The Matrix e não ficou hipnotizado pela famosa “chuva digital” verde? Sempre me perguntei como aquele efeito icônico funcionava. Não é um vídeo pré-renderizado; é um programa, gerando um caos visualmente ordenado em tempo real.

Como meu primeiro projeto para inaugurar o conteúdo técnico do blog, decidi aceitar o desafio: seria possível recriar esse efeito do zero, usando apenas C++ e a boa e velha janela de console do Windows?

Neste post, vou compartilhar a jornada completa, desde a lógica inicial, passando pelos desafios de manipulação do console, até o resultado final funcional.

Animation

Desconstruindo a Mágica

A primeira etapa de qualquer projeto de programação é quebrar um problema complexo em partes menores. Para a Chuva de Matrix, a lógica pode ser resumida em:

  1. Ter múltiplos “fios” de chuva caindo de forma independente.
  2. Cada fio precisa ter uma cauda com um certo comprimento.
  3. As letras na cauda precisam mudar constantemente (o efeito “glitch”).
  4. A cauda precisa ter um gradiente de cores (líder branca, depois verde claro, depois verde escuro).
  5. A animação precisa ser suave, sem piscar.

A Fundação: A Estrutura de Dados

Para representar um “fio” de chuva, a struct do C++ é a ferramenta perfeita. Ela nos permite agrupar todas as propriedades de um fio em um único “pacote” lógico. Após algumas iterações, cheguei a esta estrutura:

struct Stream {
    int x;          // A coluna do fio (permanece a mesma)
    int y;          // A linha da letra LÍDER (a da frente)
    int speed;      // Velocidade de queda
    int length;     // O comprimento total da cauda
    std::vector<char> characters; // Guarda os caracteres da cauda
};

Com este “molde”, eu pude criar um std::vector<Stream> para gerenciar todos os fios de chuva da minha cena.

O Grande Desafio: Controlando o Console

O std::cout padrão do C++ apenas imprime texto em sequência. Para criar uma animação, eu precisava de controle total sobre o cursor e as cores. A solução foi mergulhar na API do Windows (windows.h). Criei duas pequenas funções “goToXY” e “setColor” que se tornaram a base de toda a parte visual:

// Move o cursor do terminal para coordenadas específicas
void goToXY(int x, int y) {
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

// Define a cor do texto que será impresso a seguir
void setColor(int color) {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}

Com essas ferramentas, eu podia finalmente tratar o console como uma “tela de pintura”.

O Resultado Final

Depois de juntar a estrutura de dados com as funções de manipulação do console dentro de um loop de animação while(true), a mágica começou a acontecer. O loop principal, a cada “quadro”, faz o seguinte para cada fio de chuva:

  1. Apaga a ponta da cauda do quadro anterior.
  2. Desenha a cauda inteira na nova posição, aplicando as cores e trocando os caracteres.
  3. Atualiza a posição y do fio para o próximo quadro.

O resultado é uma animação suave, contínua e muito próxima do efeito original do filme.

Conclusão

Recriar este efeito foi um exercício fantástico para solidificar os fundamentos de C++ e aprender sobre a API do Windows. Ele prova que mesmo com ferramentas consideradas “simples”, como o console, é possível criar resultados visuais complexos e interessantes.

O código completo deste projeto está disponível no meu GitHub para quem quiser explorar, modificar ou dar sugestões.

Link para o Repositório do Projeto no GitHub

Desafio para vocês: Como vocês fariam para que, aleatoriamente, um único caractere na chuva piscasse em vermelho, como um “glitch” na Matrix? Deixem suas ideias nos comentários!

Deixe seu Comentário