一款基于 Godot 4.7+ 开发的 Block Blast 复刻版益智游戏,专为移动端竖屏(720×1280)设计。8×8 网格 + 37 种方块形状 + 连击系统 + 消除动画——直观的拖放玩法、策略性十足、容易上手但难以精通。
整个项目纯代码构建:唯一的 main.tscn 只有根节点 + 脚本引用。棋盘、槽位、分数、按钮、弹窗全部由 main.gd 在代码中构建;方块组(格子 + 拖拽 Button)由 slot_filled 信号触发、代码生成。读 .gd 即可理解全貌。
.tscn / .tres 资源依赖res:// 路径在代码中 load() / preload(),无 export 变量注入view_config.gd,可渐进收敛到常量表与 Block Fall、Godot 2048 一脉相承的 Logic-View 分层,替代常见的 MVC:
| 层 | 职责 | 关键文件 |
|---|---|---|
| logic/ | 纯游戏逻辑。Game 继承 RefCounted,无场景树依赖、可单元测试;Grid / Piece / Shapes 纯数据类;SaveData 负责排行榜持久化 |
game.gd grid.gd piece.gd shapes.gd save_data.gd |
| view/ | 纯渲染 + 拖拽交互。只读 Logic 状态,意图单向调用 Game 方法,不直接写逻辑状态 |
board_view.gd block_group.gd scores_view.gd clear_animation.gd |
| main.gd | 薄协调者。构建 UI → 创建 Game → 注入各 View → 连接 Logic ↔ View 信号 → 播放音效 | — |
关键:Game 继承 RefCounted 而非 Node,逻辑层可脱离场景树直接单元测试——Game.new() 即可构造,无需启动 Godot 运行时。
项目自带轻量级测试框架(无插件依赖),分两层:
tests/test_*.gd)— 覆盖落子、消行、计分、combo、GameOver 等核心规则tests/smoke_test.gd)— 实例化真实主场景,验证全流程运行方式:
godot --headless --path . --script res://tests/test_runner.gd # 单元测试
godot --headless --path . --script res://tests/smoke_test.gd # 冒烟测试
测试运行时排行榜存档会自动隔离到 user://test_scores.json,不会污染玩家真实存档。
| 操作 | 分数 |
|---|---|
| 放置方块 | +10 |
| 消除一行/列 | +100 × 连击数 |
| 连击倍率 | 连续消除时递增 |
连击音效等级:Good → Nice → Great → Amazing → Excellent → Incredible
block-blast/
├── audio/ # 音效文件 (.ogg)
├── logic/ # 游戏逻辑层 (Logic)
│ ├── game.gd # Game:单局状态 + 全部规则(RefCounted 纯逻辑)
│ ├── grid.gd # 8×8 棋盘数据 + 消行检测
│ ├── piece.gd # 方块形状数据 + 放置合法性校验
│ ├── shapes.gd # 37 种方块形状常量
│ └── save_data.gd # 排行榜持久化(路径可注入,测试隔离)
├── view/ # 渲染层 (View)
│ ├── board_view.gd # 棋盘渲染 + 拖拽状态机 + 消除动画
│ ├── block_group.gd # 可拖拽方块的输入代理
│ ├── scores_view.gd # 高分排行榜界面
│ ├── clear_animation.gd # 消除动画(8 色 × 15 帧)
│ └── view_config.gd # View 层共享配置(格子大小、颜色/纹理映射)
├── textures/ # 精灵图和视觉资源
│ ├── clear_anim/ # 行/列消除动画帧(8 种颜色)
│ └── logo/ # 游戏 Logo 资源
├── tests/ # 测试(无插件依赖)
│ ├── test_runner.gd # 单元测试运行器
│ ├── smoke_test.gd # 冒烟测试
│ ├── test_base.gd # 测试基类
│ └── test_game.gd # Game 单元测试
├── main.gd # 主协调者(LV 薄层:接线 + 音效路由)
├── main.tscn # 主场景(仅根节点 + 脚本引用)
├── project.godot # 引擎配置
└── export_presets.cfg # 导出预设配置
godot --path .)export_presets.cfg 中调整目标平台预设本项目使用付费自定义许可证。购买后可修改代码并发布衍生游戏,但不得二次分发源代码或以商业目的销售源代码。详细条款请参阅项目内的 LICENSE.md。