Three.jsGLSLGameIncrementalBrowser GameSpaceIndie

STELLAR EPOCH: APHELION — Um Jogo Espacial Incremental Gratuito para Navegador

Sloth255
Sloth255
·5 min read·1,065 words

Gênero: Espacial / Jogo Incremental
Plataforma: Navegador (Mobile & PC)
Preço: Gratuito — sem necessidade de conta
URL: https://stellar-epoch.sloth255.com/


Visão Geral do Jogo

STELLAR EPOCH: APHELION é um jogo incremental com temática espacial que roda inteiramente no seu navegador. Sem app para instalar, sem assinatura, sem paywall. Seja no smartphone ou no desktop, tudo que você precisa é um navegador para começar a jogar imediatamente.

O título Aphelion se refere ao ponto na órbita de um planeta onde ele está mais distante do Sol — um termo astronômico que captura a vasta escala romântica do universo do jogo.


Funcionalidades

🌠 Um Universo que Evolui com Eventos e Condições

O estado do universo muda dinamicamente com base nas condições e eventos do jogo. Dependendo de como sua partida se desenrolar, você encontrará diferentes cenários e situações cósmicas.

🏁 Um Final de Verdade

Este não é apenas um jogo de números. STELLAR EPOCH: APHELION tem uma conclusão real esperando por você. Cada melhoria e recurso acumulado te aproxima de um objetivo significativo, proporcionando satisfação genuína quando você o alcança.

📱 Funciona no Mobile e PC

O jogo é otimizado para smartphones e navegadores desktop. Jogue onde for mais confortável — seu progresso está sempre a uma aba de distância.

🌍 Suporte Multilíngue

O jogo suporta múltiplos idiomas, para que jogadores de todo o mundo possam aproveitá-lo em sua língua nativa. É um jogo construído para um público global.

🪐 Espaço 3D Renderizado com Three.js

O universo ganha vida usando Three.js, uma biblioteca JavaScript 3D. O cosmos é renderizado em tempo real diretamente no seu navegador, mergulhando os jogadores em um mundo altamente imersivo.


O Que é um Jogo Incremental?

Jogos incrementais (também chamados de idle games ou clicker games) são um gênero onde você acumula recursos gradualmente, desbloqueia melhorias e expande a escala de sua operação passo a passo. O apelo está na sensação de conquista que vem do progresso pequeno e constante somando-se a algo enorme — e na possibilidade de jogar no seu próprio ritmo.


Para Quem é Este Jogo?

  • Pessoas que procuram um jogo rápido para jogar sem instalação
  • Fãs de cenários espaciais e de ficção científica
  • Fãs de jogos incrementais / idle
  • Jogadores que gostam de jogos com história e final de verdade
  • Quem quiser jogar casualmente no celular ou PC
  • Jogadores que preferem jogar em um idioma diferente do japonês

Como Jogar

Basta abrir seu navegador e acessar https://stellar-epoch.sloth255.com/ — é só isso!


Destaques Técnicos

Arquitetura Geral

Tecnologia Propósito
React + TypeScript Toda a interface
Zustand Gerenciamento de estado do jogo
Vite Ferramenta de build
Firebase Analytics
AWS S3 + CloudFront Hospedagem

Loop do jogo: A função tick() no store Zustand é chamada em intervalos regulares a partir de um hook useGameLoop, tratando produção de energia, instalações e spawning de encontros em uma única passagem. O estado é persistido no localStorage.


Renderização 3D com Three.js / React Three Fiber

Toda a renderização 3D é centralizada em SpaceScene.tsx. Os principais pontos técnicos são descritos abaixo.

1. Shaders GLSL Customizados (Sol, Atmosfera, Disco de Acreção)

  • Shader do Sol: O fragment shader usa o produto escalar da normal da superfície e a direção da câmera para gerar um efeito de brilho de coroa. O uniform time é atualizado a cada frame para criar uma animação de pulso. Quando um flare dispara, flareIntensity é transicionado suavemente usando lerp().
  • Shader de Atmosfera: Usando a mesma técnica de produto escalar da normal, uma atmosfera planetária que colore apenas a borda (efeito Fresnel) é renderizada via renderização BackSide.
  • Disco de acreção do buraco negro: Um padrão de turbulência construído a partir de múltiplas ondas senoidais sobrepostas cria um gradiente que brilha em branco quente no centro e desvanece para vermelho escuro nas bordas. Os UVs do RingGeometry são manualmente corrigidos para mapear radialmente como pretendido.

2. Animação Por Frame com useFrame

  • Órbitas de planetas e luas: angleRef é incrementado a cada frame, e position.x/z é calculado com funções trigonométricas — uma abordagem leve que não requer simulação física.
  • Referências de objetos são armazenadas com useRef para que posições, rotações e uniforms possam ser escritos diretamente sem acionar re-renders do React, mantendo o desempenho elevado.

3. Renderização Eficiente de Grande Número de Objetos com InstancedMesh

Matrizes de um objeto dummy THREE.Object3D são copiadas para o InstancedMesh, reduzindo todas as instâncias a uma única draw call.

4. Sistemas de Partículas (BufferGeometry)

  • Espiral galáctica: Um Float32Array de 5.000 pontos é pré-gerado. Quatro braços espirais são posicionados usando coordenadas polares igualmente espaçadas com dispersão aleatória, e o falloff de brilho via exp(-dist/18) cria uma galáxia de aparência natural que é mais brilhante no centro.
  • Efeito de supernova: Vetores de velocidade são embutidos em userData, e as posições são calculadas como elapsed * velocity dentro de useFrame, fazendo as partículas voarem para fora em uma esfera.
  • Web cósmica: Um grafo de proximidade de 200 nós é renderizado como LineSegments, conectando quaisquer dois nós dentro da distância 12.

5. Controle de Câmera com Conhecimento de Fase

À medida que o jogo avança pelas fases 1–7, a distância de recuo da câmera muda, produzindo uma expansão visual de escala de sistema solar → galáxia → estrutura cósmica em grande escala. Uma curva de easing customizada (1 - (1-t)^3) é aplicada via requestAnimationFrame para transições suaves.

6. Carregamento Progressivo de Texturas com Suspense

useTexture de @react-three/drei carrega texturas de forma assíncrona e é envolvido em React Suspense. Enquanto as texturas ainda não estão carregadas, um fallback apenas com shader é exibido. Um uniform hasTexture é passado ao GLSL para alternar dinamicamente entre renderização com e sem textura.

7. Tremor de Câmera

Quando um encontro Lendário dispara, um efeito simples de tremor é implementado adicionando e subtraindo um offset aleatório à posição da câmera a cada frame via useThree() para manipulação direta da câmera.