一款采用 Godot 4.7+ 开发的复古风格俄罗斯方块游戏,专为 PC 桌面端横屏(1280×720)设计。金色游戏机外壳造型、像素风闲置恐龙、DAS 流畅操控、计分等级系统、游戏状态持久化——一款可直接运行、可构建发布、可作为架构学习模板的完整项目。
整个项目纯代码构建:唯一的 main.tscn 仅 3 行实质内容。节点树、UI、样式、箭头图标全部由 GDScript 在运行时构建,view_config.gd 常量驱动绝对像素布局,外壳图案由 draw_rect 代码绘制。读 .gd 即可理解全貌。
.tscn 黑盒 — 场景树由 view_builder.gd 代码构建,读 .gd 文件即可理解项目全貌view_config.gd,避开冗长的 Container/anchors与 Block Blast、Godot 2048 一脉相承的 Logic-View 分层,替代常见的 MVC:
| 层 | 职责 | 关键文件 |
|---|---|---|
| logic/ | 纯游戏逻辑。Game 继承 RefCounted,无场景树依赖、可单元测试;Block / Matrix 纯数据类;SaveData 负责存档 |
game.gd block.gd matrix.gd input_handler.gd save_data.gd |
| view/ | 纯渲染。所有视图经 game 引用读取状态,通过 state_changed 信号自动刷新;ViewConfig.draw_shell() 代码绘制金色游戏机外壳 |
matrix_view.gd next_view.gd idle_hint.gd reset_dialog.gd |
| main.gd | 薄协调者。构建 UI → 创建 Game → 每帧 tick(delta) 驱动状态机 → 连接 Logic ↔ View 信号 |
— |
关键:Game 继承 RefCounted 而非 Node,逻辑层可脱离场景树直接单元测试,不依赖 Timer/Signal 等场景树组件,改用 tick(delta) 纯驱动。
项目自带轻量级测试框架(无插件依赖),分两层:
tests/test_*.gd)— 覆盖 Block / Matrix / Game 的重力、消行、game over、存档等核心逻辑tests/smoke_test.gd)— 实例化真实主场景,验证启动与 tick 驱动运行方式:
godot --headless --path . --script res://tests/test_runner.gd # 单元测试
godot --headless --path . --script res://tests/smoke_test.gd # 冒烟测试
ViewConfig.draw_shell() 用 draw_rect 代码绘制金色外壳 + 屏幕边框 + 面板背景NOTIFICATION_APPLICATION_FOCUS_OUT 事件处理user://save.json,按域名隔离user://save.json| 消除行数 | 分数 |
|---|---|
| 1 | 100 |
| 2 | 300 |
| 3 | 700 |
| 4 | 1500 |
10 + (speed_level - 1) × 2| 动作 | 键盘 | 虚拟按钮 |
|---|---|---|
| 左移 | A / ← |
方向键左 |
| 右移 | D / → |
方向键右 |
| 软降 | S / ↓ |
方向键下 |
| 旋转 | W / ↑ |
方向键上 |
| 硬降 | Space |
无 |
| 暂停 / 开始 | P |
暂停 |
| 重置 | R |
重置 |
| 静音 / 取消静音 | M |
音效 |
block-fall-pc/
├── audio/ # 音效文件 (.ogg)
│ ├── start.ogg # 游戏开始
│ ├── move.ogg # 方块移动
│ ├── rotate.ogg # 方块旋转
│ ├── clear.ogg # 消除
│ ├── fall.ogg # 下落
│ └── gameover.ogg # Game Over
├── logic/ # 游戏逻辑层 (Logic)
│ ├── block.gd # 方块数据(形状、旋转、移动)
│ ├── game.gd # 游戏逻辑 + tick 状态机(RefCounted 纯逻辑)
│ ├── input_handler.gd # 键盘/按钮输入 + DAS 重复逻辑
│ ├── matrix.gd # 网格逻辑(碰撞检测、固化、消行)
│ └── save_data.gd # 存档读写(user://save.json)
├── view/ # 渲染层 (View)
│ ├── idle_hint.gd # 恐龙闲置动画
│ ├── matrix_view.gd # 矩阵渲染
│ ├── next_view.gd # 下一个方块预览渲染
│ ├── reset_dialog.gd # 重置确认弹窗(复古风格)
│ ├── view_config.gd # 布局常量 + draw_shell() 外壳绘制
│ └── view_builder.gd # 场景树构建 + 视图工厂方法
├── tools/ # 资源生成工具
│ └── gen_block_fall_assets.py # Logo + 启动图生成脚本
├── tests/ # 测试(无插件依赖)
│ ├── test_runner.gd # 单元测试运行器
│ ├── smoke_test.gd # 冒烟测试
│ ├── test_base.gd # 测试基类
│ ├── test_block.gd # Block 单元测试
│ ├── test_game.gd # Game 单元测试
│ └── test_matrix.gd # Matrix 单元测试
├── docs/ # 项目文档
│ ├── intro.md # 本文档(godotstudy.cn 介绍文案)
│ └── intro_en.md # 英文版介绍
├── main.gd # 主协调者(LV 薄层:接线 + tick 驱动 + 外壳绘制)
├── main.tscn # 主场景(仅根节点 + 脚本引用)
├── project.godot # 引擎配置
├── export_presets.cfg # 导出预设配置
└── LICENSE.md # 付费许可证(含 LICENSE_en.md 英文版)
godot --path .)export_presets.cfg 中调整目标平台预设python3 tools/gen_block_fall_assets.py
本项目使用付费自定义许可证。购买后可修改代码并发布衍生游戏,但不得二次分发源代码或以商业目的销售源代码。详细条款请参阅项目内的 LICENSE.md(含 LICENSE_en.md 英文版)。