Three.jsGLSLGameIncrementalBrowser GameSpaceIndie

STELLAR EPOCH: APHELION — 免费浏览器太空放置游戏

Sloth255
Sloth255
·3 min read·592 words

类型: 太空 / 放置游戏
平台: 浏览器(手机和电脑)
价格: 免费——无需账户
URL: https://stellar-epoch.sloth255.com/


游戏概述

STELLAR EPOCH: APHELION 是一款完全在浏览器中运行的太空主题放置游戏。无需安装应用,无需订阅,无付费墙。无论是在智能手机还是桌面电脑上,只需一个浏览器即可立即开始游戏。

标题 Aphelion(远日点)指的是行星轨道上距离太阳最远的点——这个天文学术语捕捉了游戏宇宙的广阔浪漫尺度。


特色功能

🌠 随事件和条件演变的宇宙

宇宙的状态根据游戏内的条件和事件动态变化。根据游戏进程的不同,你会遭遇不同的宇宙景观和情境。

🏁 真正的结局

这不仅仅是数字增长的游戏。STELLAR EPOCH: APHELION 有一个真正的结局等待着你。每一次升级和积累的资源都让你更接近一个有意义的目标,当你达成时会感受到真实的满足感。

📱 支持手机和电脑

游戏对智能手机和桌面浏览器均进行了优化。随时随地游玩——你的进度始终只需一个标签页。

🌍 多语言支持

游戏支持多种语言,来自世界各地的玩家可以用母语享受游戏。这是一款为全球受众打造的游戏。

🪐 使用 Three.js 渲染的 3D 太空

宇宙通过 Three.js(一个 JavaScript 3D 库)呈现生机。宇宙在你的浏览器中实时渲染,让玩家沉浸在深度身临其境的世界中。


什么是放置游戏?

放置游戏(也称为挂机游戏或点击游戏)是一种游戏类型,你逐渐积累资源、解锁升级,并一步步扩大规模。其魅力在于小而稳定的进步积累成巨大成就所带来的成就感——以及可以按自己的节奏游玩。


适合哪些人?

  • 想玩无需安装就能上手的游戏的人
  • 太空和科幻题材爱好者
  • 放置/挂机游戏粉丝
  • 喜欢有故事和真正结局的游戏的玩家
  • 想在手机或电脑上休闲游玩的人
  • 偏好使用日语以外语言游玩的玩家

如何游玩

只需打开浏览器并访问 https://stellar-epoch.sloth255.com/ ——就这样!


技术亮点

整体架构

技术 用途
React + TypeScript 整体 UI
Zustand 游戏状态管理
Vite 构建工具
Firebase 分析
AWS S3 + CloudFront 托管

游戏循环: Zustand store 中的 tick() 函数通过 useGameLoop hook 定期调用,在单次遍历中处理能源生产、设施和遭遇生成。状态持久化到 localStorage。


使用 Three.js / React Three Fiber 进行 3D 渲染

所有 3D 渲染集中在 SpaceScene.tsx 中。主要技术要点如下。

1. 自定义 GLSL 着色器(太阳、大气层、吸积盘)

  • 太阳着色器:片段着色器利用表面法线与相机方向的点积生成日冕光晕效果。time uniform 每帧更新以创建脉冲动画。当耀斑触发时,flareIntensity 通过 lerp() 平滑过渡。
  • 大气层着色器:使用相同的法线点积技术,通过 BackSide 渲染实现只给边缘着色的行星大气层(类菲涅尔效果)。
  • 黑洞吸积盘:由多个重叠正弦波构建的湍流图案创建一个渐变,中心呈白热色,边缘渐变为深红色。RingGeometry 的 UV 坐标经过手动修正,以按预期进行径向映射。

2. 使用 useFrame 实现逐帧动画

  • 行星和卫星轨道:每帧递增 angleRef,并用三角函数计算 position.x/z——这是一种无需物理模拟的轻量级方法。
  • 对象引用通过 useRef 存储,位置、旋转和 uniform 可以直接写入而不触发 React 重渲染,保持高性能。

3. 使用 InstancedMesh 高效渲染大量对象

THREE.Object3D 虚拟对象的矩阵复制到 InstancedMesh 中,将所有实例减少到单次 draw call。

4. 粒子系统(BufferGeometry)

  • 星系螺旋:预先生成 5000 个点的 Float32Array。使用均匀间隔的极坐标加随机扩散放置四条螺旋臂,通过 exp(-dist/18) 的亮度衰减创建中心最亮的自然星系外观。
  • 超新星效果:速度向量嵌入 userData 中,在 useFrame 内将位置计算为 elapsed * velocity,使粒子向外球形飞散。
  • 宇宙网:200 个节点的邻近图渲染为 LineSegments,连接距离 12 以内的任意两个节点。

5. 阶段感知的相机控制

随着游戏从第 1 到第 7 阶段推进,相机的回拉距离发生变化,产生从太阳系 → 星系 → 大尺度宇宙结构的视觉规模扩展。通过 requestAnimationFrame 应用自定义缓动曲线(1 - (1-t)^3)实现平滑过渡。

6. 使用 Suspense 渐进式纹理加载

@react-three/dreiuseTexture 异步加载纹理并包裹在 React Suspense 中。纹理尚未加载时,显示仅使用着色器的备用方案。通过向 GLSL 传递 hasTexture uniform 在有纹理和无纹理渲染之间动态切换。

7. 相机抖动

当传奇遭遇触发时,通过 useThree() 直接操控相机,每帧向相机位置添加和减去随机偏移,实现简单的抖动效果。