Noite Chuvosa:

Análise Completa

Primeiro passo: desenhar a Lua

Como desenhamos a lua? Você deve estar se perguntando... A lua foi criada dentro de uma função chamada desenharLua(), justamente para facilitar seu uso sempre que for necessário chamá-la no programa.

A lógica da lua é bem simples: primeiro desenhamos um círculo claro (em tom bege), representando a lua cheia. Em seguida, desenhamos um segundo círculo um pouco menor e com a cor do fundo (um azul escuro), ligeiramente deslocado para a direita.

Esse segundo círculo fica sobreposto ao primeiro, criando um efeito visual que simula a fase minguante da lua — como se uma parte dela estivesse escondida pela sombra.

Código utilizado:

Código da lua

Segundo passo: criar as estrelas

As estrelas foram criadas para dar um toque mais realista ao cenário noturno. Mas como isso foi feito?

Primeiro, criamos um array chamado estrelas e definimos que o total de estrelas seria 200.

Dentro da função setup(), usamos um laço for para gerar essas 200 estrelas, onde cada uma recebe:

  • estrelaX: posição horizontal aleatória na tela;
  • estrelaY: posição vertical aleatória;
  • brilhoEstrela: valor de brilho aleatório entre 100 e 255;
  • tamanhoEstrela: tamanho aleatório entre 1 e 2 pixels.

Depois disso, criamos uma função chamada desenharEstrela(), que desenha cada estrela na tela com fill no valor do brilho dela e um circle() com o tamanho definido.

Por fim, chamamos essa função dentro do draw(), junto com a lua e a chuva, para que as estrelas apareçam sempre que o cenário for desenhado.

Código utilizado:

1. Declaração de variáveis no início do código
Declaração das variáveis das estrelas
2. Geração das estrelas dentro da função setup()
Geração das estrelas
3. Função para desenhar as estrelas na tela
Função desenharEstrela

Terceiro passo: criar a chuva

A chuva foi adicionada para trazer uma sensação de ambiente dinâmico e reforçar o clima do cenário. Mas como ela foi criada?

Assim como as estrelas, começamos criando um array chamado gotas e definimos o total de gotas como 300.

Na função setup(), usamos um laço for para gerar essas 300 gotas. Cada gota possui as seguintes propriedades:

  • gotasX: posição horizontal aleatória;
  • gotasY: posição vertical aleatória;
  • veloGotas: velocidade aleatória (quanto maior, mais rápido cai);
  • cumprimentoGotas: comprimento da linha que representa a gota.

Depois disso, criamos a função desenharChuva() que desenha as gotas como linhas com line(), usando stroke azul para representar a cor da água.

A cada frame, a posição vertical da gota aumenta de acordo com sua velocidade. Se ela sair da tela, é reiniciada no topo, criando o efeito contínuo de chuva.

Por fim, a função desenharChuva() é chamada dentro do draw(), junto com a lua, as estrelas e o avião.

Código utilizado:

1. Declaração de variáveis no início do código
Declaração da variável gotas
2. Geração das gotas dentro da função setup()
Laço for criando gotas
3. Função para desenhar a chuva
Função desenharChuva

Quarto passo: adicionar o avião

O avião foi incluído como um detalhe especial no cenário, dando um toque de movimento e realismo, como se estivesse sobrevoando a noite chuvosa.

Primeiro, carregamos a imagem do avião usando a função preload(), com a linha:

aviao = loadImage("images/Avião.png")

Depois disso, criamos duas variáveis para controlar a posição do avião na tela:

  • aviaoX: posição horizontal, iniciando fora da tela à direita;
  • aviaoY: posição vertical, começando na parte inferior.

No setup(), o som do avião também é carregado com loadSound() e tem seu volume definido com setVolume().

Na função draw(), usamos image() para desenhar o avião na posição atual, e depois alteramos suas coordenadas para fazê-lo subir e ir para a esquerda, como se estivesse voando na diagonal.

Código utilizado:

1. Declaração de variáveis no início do código
Variáveis do avião (X e Y)
2. Desenho e movimento do avião no draw()
Avião sendo desenhado e movido

Passo mais importante: criar o raio

O raio foi adicionado para representar uma tempestade intensa no cenário. O objetivo era criar um efeito visual marcante, que simula os relâmpagos que ocorrem durante uma noite chuvosa.

Para isso, criamos um array chamado raio, que armazena os pontos (coordenadas x e y) do traçado do relâmpago. Além disso, usamos uma variável mostrarRaio para controlar se o raio deve ser desenhado ou não, e tempoDoFlash para controlar o efeito de clarão na tela.

O raio é gerado por uma função chamada gerarRaio(). Ela cria uma linha que desce da parte de cima da tela até embaixo, com pequenas variações horizontais aleatórias para simular o aspecto irregular de um relâmpago real. Veja como funciona:

  • Começamos com uma posição inicial no topo da tela;
  • A cada passo, avançamos um pouco para baixo (eixo y) e variamos a posição horizontal (eixo x) para os lados;
  • Esses pontos são salvos no array raio.

Para desenhar o raio na tela, usamos a função desenharRaio(), que percorre os pontos armazenados e os conecta usando beginShape(), vertex() e endShape(). A cor usada é um tom de azul claro com strokeWeight mais espesso para destacar o raio.

Além disso, criamos um efeito de clarão branco quando o raio aparece. Isso é feito desenhando um retângulo branco translúcido sobre toda a tela. Esse efeito dura apenas alguns milissegundos e é controlado comparando o tempo atual com tempoDoFlash usando millis().

O raio pode surgir de duas formas:

  • Automática: a cada quadro (frame), há uma pequena chance (por exemplo, 1%) de um novo raio ser gerado aleatoriamente;
  • Manual: se o usuário clicar com o mouse (mousePressed()), o raio aparece instantaneamente.

No draw(), verificamos se é para desenhar o raio e se ainda estamos no tempo do flash. Se sim, chamamos desenharRaio() e desenhamos o clarão branco.

Código utilizado:

1. Declaração das variáveis do raio no início
Variáveis do raio
2. Função para gerar o raio
Função gerarRaio
3. Função para desenhar o raio
Função desenharRaio
4. Controle do flash no draw()
Controle do clarão branco