O sistema de colisão do Navistron é responsável por detectar todos os impactos no jogo: tiros contra meteoros, mísseis contra meteoros, meteoros contra a nave e boosts coletados pelo jogador. Toda a detecção usa verificação circular (circle-circle collision), uma técnica otimizada que evita cálculos complexos de polígonos. Neste guia, mostramos exatamente como cada colisão funciona, com raios e tolerâncias extraídos diretamente do código fonte.

A Função Central: circleDist

Todo o sistema de colisão do Navistron gira em torno de uma única função: circleDist(ax, ay, ar, bx, by, br). Ela recebe a posição (x, y) e o raio (r) de dois objetos e verifica se estão colidindo.

A fórmula usada é: dx² + dy² <= (ar + br)², onde dx e dy são as diferenças de posição. Note que não há raiz quadrada — o Navistron compara os quadrados das distâncias diretamente, o que é uma otimização clássica em jogos 2D que evita uma operação matemática cara chamada centenas de vezes por frame.

Por Que Hitboxes Circulares?

A nave do Navistron tem formato triangular (36×48 pixels) e os meteoros são polígonos irregulares com 8 a 12 vértices. Mesmo assim, todas as hitboxes são círculos. Isso acontece por dois motivos:

  1. Performance: verificar colisão entre dois círculos é uma comparação de distância simples. Colisão polígono-a-polígono exigiria SAT (Separating Axis Theorem) ou GJK, algoritmos muito mais pesados.
  2. Fairness: hitboxes circulares permitem ajustar raios para criar tolerâncias que tornam o jogo mais justo e satisfatório.

Na prática, o jogador mal percebe que as hitboxes são círculos. O que ele percebe é que a colisão parece justa — e isso é por design.

Colisão Tiro → Meteoro (82% do Raio)

Quando um tiro (bullet) atinge um meteoro, a verificação usa: circleDist(b.x, b.y, b.r, m.x, m.y, m.r × 0.82). O raio do tiro é o raio visual do tier atual (de 4px no Tier I a 12px no Tier VII), mas o raio do meteoro é reduzido para 82% do seu raio visual.

Isso significa que o tiro precisa acertar dentro de uma área ligeiramente menor que o meteoro aparenta na tela. Na prática, essa redução de 18% evita que tiros que passam apenas pelas bordas externas do meteoro contem como acerto, tornando a jogabilidade mais precisa.

Quando o tiro acerta, ele é consumido (b.hit = true) e o meteoro perde HP equivalente ao dano do tier (m.hp -= b.dmg). Se o HP chegar a 0, o meteoro é destruído com uma explosão de partículas e o jogador ganha pontos.

Colisão Míssil → Meteoro (82% do Raio)

Os mísseis teleguiados usam a mesma tolerância de 82%: circleDist(m.x, m.y, 6, mt.x, mt.y, mt.r × 0.82). A diferença é que o raio do míssil é fixo em 6 pixels, independente do tier — menor que o raio dos tiros nos tiers mais altos.

Ao colidir, o míssil causa dano igual ao TIER_DEFS[tier].dmg (de 1 a 35 conforme o tier) e é imediatamente consumido. Cada míssil só pode atingir um meteoro — não há penetração ou dano em área.

Colisão Meteoro → Nave (72% do Raio)

A colisão mais crítica do jogo — entre meteoro e nave — usa o menor multiplicador: circleDist(m.x, m.y, m.r × 0.72, ship.x, ship.y, 18). A nave possui uma hitbox circular fixa de 18 pixels de raio, enquanto o meteoro usa apenas 72% do seu raio visual.

Essa redução de 28% no raio do meteoro é a mais generosa do jogo, e é intencional: cria a sensação de que o jogador "quase" foi atingido quando um meteoro passa raspando. Essa tolerância torna o jogo mais satisfatório e menos frustrante, especialmente nos tiers altos onde a tela está cheia de obstáculos.

Quando a colisão ocorre, o resultado é fatal: a nave é destruída com uma explosão especial de fragmentos e o jogo entra na sequência de game over. Não existe sistema de vidas — um toque é morte instantânea.

Invencibilidade Temporária

Há uma exceção à morte instantânea: ao nascer, a nave recebe 2 segundos de invencibilidade (ship.invincible = 2). Durante esse período, a verificação de colisão com meteoros é ignorada (ship.invincible <= 0 é falso). Visualmente, a nave pisca durante a invencibilidade, sinalizando ao jogador que ele está temporariamente protegido.

Isso evita mortes injustas logo no início da partida, quando meteoros podem já estar próximos da posição de spawn da nave.

Colisão Boost → Nave (Raio Generoso)

A coleta de boosts usa a hitbox mais generosa do jogo: circleDist(b.x, b.y, 14, ship.x, ship.y, 24). O boost tem raio de 14 pixels e a nave usa um raio de pickup de 24 pixels — maior que os 18 pixels usados para colisão com meteoros.

Essa diferença de 6 pixels pode parecer pequena, mas tem um impacto significativo na jogabilidade: o jogador não precisa passar exatamente sobre o boost para coletá-lo. Basta chegar perto. Isso é especialmente importante nos tiers altos, onde desviar para coletar um boost pode significar colidir com um meteoro.

Resumo de Todos os Raios de Colisão

  • Tiro vs Meteoro: raio tiro (4-12px por tier) + raio meteoro × 0.82
  • Míssil vs Meteoro: raio fixo 6px + raio meteoro × 0.82
  • Meteoro vs Nave: raio meteoro × 0.72 + raio nave 18px
  • Boost vs Nave: raio boost 14px + raio pickup 24px

Entender essas hitboxes ajuda a jogar melhor — sabendo que pode passar mais perto dos meteoros do que parece, e que os boosts são fáceis de coletar. Teste seus reflexos no Navistron e veja essas mecânicas em ação!

FAQ

A hitbox da nave é um círculo?

Sim. Apesar da nave ter formato triangular de 36×48 pixels, sua hitbox de colisão com meteoros é um círculo de 18 pixels de raio, centralizado na posição da nave.

Por que os meteoros usam raios menores que o visual?

Para tornar o jogo mais justo. O multiplicador de 0.82 para tiros e 0.72 para a nave cria uma zona de tolerância onde o jogador "quase" foi atingido mas sobrevive, tornando a experiência mais satisfatória.

O Navistron usa detecção de colisão pixel-perfect?

Não. Toda colisão é circle-circle (comparação de distâncias ao quadrado). Isso é mais performático e permite ajustar tolerâncias facilmente.

Os tiros atravessam múltiplos meteoros?

Não. Tanto tiros quanto mísseis são consumidos ao colidir com um meteoro. Cada projétil atinge apenas um alvo.

A nave pode sobreviver a um impacto com meteoro?

Apenas durante os 2 segundos iniciais de invencibilidade. Fora isso, qualquer colisão com meteoro é fatal — não existe sistema de vidas ou escudo no Navistron.