# DeepnightLab Tutorial · 深入理解 Deepnight 的游戏开发方法

这是一个**可以随时中断、下次再继续**的实践课程，而不是一份需要从头读到尾的长文档。

## 学习契约

每个 Lesson 都要具备以下内容：

1. **亲手玩**：独立可运行的交互式小实验，不需要修改上游源码。
2. **单变量对比**：关闭/开启一个功能，感受它究竟改变了什么。
3. **定位源码**：指出 Deepnight 的原始 Haxe 文件、函数和典型实现。
4. **抽象架构**：区分可复用基础设施与具体玩法，说明适用边界。
5. **验收**：有明确的操作任务和通过标准，而不是“看懂了就算完成”。
6. **性能审计（固定环节）**：检查时间复杂度、内存与预分配、对象生命周期、每帧热路径、性能上限，以及懒过期/统一调度等替代方案；区分源码事实与假设，必要时加入可重复的基准测试。

教学代码放在课程自身目录，**不是**原作者的代码翻译或移植；每节课会明确指向对应的原始文件。
本地进度通过浏览器的 localStorage 保存，仅用于这台机器、当前浏览器；不发送到网络。

## 入口

运行：

~~~powershell
cd D:\CursorProject\DeepnightLab
.\scripts\serve-tutorial.ps1
~~~

在二号机浏览器打开 http://127.0.0.1:19982/Tutorial/ ，按照页面上的课程顺序学习。
也可以直接打开 Lesson 下的 index.html（常见浏览器可运行，但推荐使用本地服务以保持学习进度）。

## 课程结构与状态

| 主题 | Lesson | 状态 | 重点 |
|---|---|---|---|
| 01 Game Feel | Lesson 01：跳跃宽容与输入缓冲 | **可运行** | 玩家意图与物理判定分离 |
| 01 Game Feel | Lesson 02：镜头冲击与开火反馈 | **可运行** | 事件 -> 参数 -> 渲染的反馈流水线 |
| 01 Game Feel | Lesson 03：挤压拉伸与粒子 | **可运行** | 视觉形变、真实碰撞与粒子池 |
| 02 GameBase 架构 | Lesson 01：Entity 生命周期 | **规划中** | 角色状态、实体更新 |
| 02 GameBase 架构 | Lesson 02：Game / Level / Camera / Fx | **规划中** | 系统职责及依赖方向 |
| 03 开发工具链 | Lesson 01：Haxe 与 Heaps | **规划中** | 编译目标与图形运行时 |
| 03 开发工具链 | Lesson 02：LDtk 数据驱动关卡 | **规划中** | 地图与游戏逻辑的边界 |

后续主题的教学准备见 \`02-GameBase/README.md\` 和 \`03-Toolchain/README.md\`；
它们只有规划、没有可运行模块，所以课程主页不会出现可点击的“开始学习”链接。

## 事实来源

上游仓库保留在 ../third_party/，具体 commit 见 ../SOURCE_MANIFEST.json；
本地无需联网即可做前三节课，课程里没有未经授权的第三方美术资源。

## 复测

~~~powershell
node .\Tutorial\tests\run-tests.cjs
~~~

测试的是课件中的真实规则模块，不等价于整款游戏的人工浏览器体验。