AnvilKitAnvilKit

Craft

体素游戏 — 3D 世界生成、自定义渲染管线

Craft 是一个 Minecraft 风格的体素游戏,展示了自定义渲染管线、chunk 管理和世界生成。

项目结构

games/craft/
├── src/
│   ├── main.rs         # 入口 + 主循环
│   ├── lib.rs          # 模块导出
│   ├── block.rs        # 方块类型定义
│   ├── chunk.rs        # Chunk 数据结构
│   ├── components.rs   # ECS 组件
│   ├── mesh.rs         # Chunk 网格生成
│   ├── raycast.rs      # 射线拾取
│   ├── resources.rs    # 游戏资源
│   ├── vertex.rs       # 自定义顶点格式
│   ├── world_gen.rs    # 程序化地形生成
│   ├── persistence.rs  # 世界存档
│   ├── render/         # 自定义 wgpu 管线
│   └── systems/        # 游戏系统
├── assets/
│   ├── voxel.wgsl      # 体素着色器
│   └── craft_tonemap.wgsl

核心特性

程序化世界生成

使用 Perlin 噪声生成高度图,分层填充方块类型:

  • 表面:草方块
  • 地下:石头、泥土
  • 深处:基岩
  • 装饰:树木、花草

Chunk 系统

  • Chunk 大小:32 x 256 x 32
  • 按玩家位置动态加载/卸载
  • 贪婪网格合并减少三角形数量
  • 视锥体剔除(bounding sphere 半径 ~130)

自定义渲染管线

绕过 PBR 管线,使用简单的 2 个 bind group:

  • Group 0:场景 uniform(视图投影、相机位置、光照方向、雾)
  • Group 1:贴图图集 + 采样器

方块操作

  • 放置方块 — 右键点击
  • 破坏方块 — 左键点击
  • 射线拾取 — 从相机发射射线,遍历 DDA 算法找到目标方块

v0.3 新特性

Craft 在 v0.3 中进行了更新,以展示引擎的新系统:

生命系统

玩家拥有 Health 组件(20 HP,被动回血)。环境伤害通过 ECS 事件系统施加:

  • 摔落伤害 — 着陆速度转换为 DamageEvent
  • 溺水 — 浸没在水中时持续扣血
  • 生命回复 — 未受伤时缓慢被动治疗
  • 死亡与重生DeathEvent 触发位置重置和满血恢复

血量条(绿/黄/红)渲染在快捷栏上方。

物品栏

9 格 SlotInventory 支持可堆叠物品,替代了旧的固定方块选择器。破坏方块会将其加入物品栏;放置方块消耗一个。快捷栏 HUD 反映实际物品栏内容。

ActionMap 按键映射

所有按键绑定通过 ActionMap(逻辑动作 → 物理按键)注册,为将来通过 ActionMap::apply_overrides() 支持用户自定义按键打下基础。

数据驱动方块

方块类型在 assets/data/blocks.ron 中使用 DataTable 定义。启动时从表中构建 BlockDefCache,将方块属性与代码解耦。

本地化 / i18n

HUD 文本和方块名称通过 Localeassets/data/locale_en.ron)查找。系统支持回退链,方便添加更多语言翻译。

玩家持久化

玩家状态(位置、生命值、物品栏、飞行模式、选中槽位、昼夜时间)通过 Ctrl+S 保存和恢复。世界修改(放置/破坏的方块)也会持久化保存。

运行

cargo run -p craft

相关文档

目录