Organize game planning docs

This commit is contained in:
2026-06-09 01:02:36 +08:00
parent e8b05e93b9
commit c87b245cea
4 changed files with 14 additions and 149 deletions
@@ -0,0 +1,420 @@
# 游戏整体架构计划:思维导图与白板
目标:把项目从“能跑的白盒 Demo”推进为可持续扩展的横板 2D ACT 清版游戏工程。本文先作为整体架构白板,后续每个模块再拆成独立任务文档。
## 思维导图
```mermaid
mindmap
root((横板 2D ACT 游戏))
核心体验
横向推进
清版战斗
平台移动
近战连段
关卡节奏
游戏循环
进入关卡
探索与移动
触发战斗区域
击败敌人
解锁推进
结算与升级
角色系统
玩家
输入
移动
跳跃
攻击
受击
动画状态机
敌人
巡逻
追击
攻击
受击硬直
死亡
NPC与可交互物
对话
机关
可破坏物
战斗系统
Hitbox
Hurtbox
伤害结算
击退
霸体
连击窗口
命中特效
调试显示
关卡系统
场景数据
碰撞数据
视觉层
战斗区域
敌人出生点
镜头限制
出入口
渲染与资源
Sprite
Tileset
背景视差
前景遮挡
特效
音频
资源清单
数据驱动
动画表
角色参数
敌人配置
关卡配置
攻击配置
掉落配置
工具与调试
白盒编辑
碰撞可视化
战斗区域可视化
Hitbox可视化
帧率与日志
构建文档
NS平台构建
```
## 白板总览
```text
+----------------------+ +----------------------+ +----------------------+
| Game Loop | ---> | Scene | ---> | Stage |
| 关卡进入/推进/结算 | | 场景编排与生命周期 | | 关卡数据与视觉层 |
+----------------------+ +----------------------+ +----------------------+
| | |
v v v
+----------------------+ +----------------------+ +----------------------+
| Actor | ---> | Movement | ---> | Collision |
| 玩家/敌人/道具/物体 | | 重力/速度/平台移动 | | 地面/平台/边界 |
+----------------------+ +----------------------+ +----------------------+
| |
v v
+----------------------+ +----------------------+ +----------------------+
| Combat | ---> | Animation | ---> | Render |
| Hitbox/伤害/击退 | | 状态机/帧表/过渡 | | Sprite/Tile/特效 |
+----------------------+ +----------------------+ +----------------------+
|
v
+----------------------+ +----------------------+ +----------------------+
| Data | ---> | Debug | ---> | Build |
| 配置表/关卡/参数 | | 可视化/日志/测试 | | PC/Switch/资源复制 |
+----------------------+ +----------------------+ +----------------------+
```
## 模块白板
### 1. Core
职责:
- 管理游戏级常量、资源路径、输入快照、运行配置。
- 隔离 SDL 等底层输入细节,让角色逻辑只消费 `InputState`
- 为后续手柄、Switch Joy-Con、键位配置留接口。
已有:
- `core/game_config.h`
- `core/asset_paths.h`
- `core/input_state.*`
- `core/debug_flags.h`
下一步:
- 增加 `GameContext`,统一传递全局服务。
- 输入层支持键盘和手柄统一映射。
### 2. Scene
职责:
- 管理场景生命周期。
- 装载关卡数据。
- 创建玩家、敌人、道具和场景对象。
- 控制镜头、战斗区域、关卡推进。
已有:
- `scene/whitebox_scene.*`
下一步:
- 抽象 `GameplayScene` 作为通用玩法场景基类。
- `WhiteboxScene` 只保留第一关测试内容。
- 引入 battle zone 触发逻辑。
### 3. Stage
职责:
- 表达关卡世界:碰撞、视觉层、背景、道具、出生点、镜头范围。
- 将白盒数据逐步替换为 tileset 和 props。
已有:
- `data/level_definition.h`
- `data/whitebox_level.cpp`
- `movement/platform_world.*`
- `stage/stage_renderer.*`
下一步:
- 增加 `StageLayer` 数据结构。
- 关卡宽度扩展到 2400 到 3200 像素。
- 引入远景/中景/地面三层绘制。
### 4. Actor
职责:
- 表达游戏对象:玩家、敌人、道具、投射物、可破坏物。
- 每个 Actor 只处理自身状态,不直接管理全局流程。
已有:
- `actor/player_actor.*`
下一步:
- 增加 `EnemyActor`
- 增加 `BreakablePropActor`
- 抽出 `CharacterActor` 作为玩家和敌人的共同基类。
- 将玩家动画切换改为数据驱动。
### 5. Movement
职责:
- 处理速度、重力、平台落地、边界限制。
- 后续支持斜坡、墙体、击退、空中状态。
已有:
- `MovementBody`
- `PlatformWorld`
- `PlatformMover`
下一步:
- 支持水平墙体阻挡。
- 支持击退速度覆盖。
- 支持落地事件。
- 支持移动调试可视化。
### 6. Combat
职责:
- 管理攻击盒、受击盒、伤害结算、击退、硬直、命中特效。
- 保证战斗逻辑不散落在 Actor 内部。
已有:
- `combat/hitbox.h`
下一步:
- 增加 `CombatSystem`
- 每帧收集 active hitbox / hurtbox。
- 支持 team 过滤、重复命中过滤、伤害事件。
- 增加 debug hitbox 绘制。
### 7. Animation
职责:
- 管理 spritesheet 帧、动画状态、播放速度、循环和过渡。
- 避免每个 Actor 手写帧切换。
当前状态:
- `PlayerActor` 内部硬编码 idle/run/punch 动画。
下一步:
- 增加 `AnimationClip`
- 增加 `SpriteAnimator`
- 增加动画配置表。
- 攻击动画和 hitbox active frame 绑定。
### 8. Data
职责:
- 将玩法参数从 C++ 硬编码逐步迁移到数据。
- 支持关卡、敌人、动画、攻击、掉落配置。
当前状态:
- 关卡仍由 `CreateWhiteboxLevel()` 硬编码。
下一步:
- 先用 C++ struct 稳定字段。
- 再迁移到 JSON 或编辑器导出格式。
- 资源路径统一记录,避免散落字符串。
### 9. Render 与资源
职责:
- 绘制角色、关卡、背景、道具、特效和调试图形。
- 管理资源目录和运行时拷贝。
已有:
- `game/assets/character/male/`
- `game/assets/shaders/`
- `xmake.lua` 自动复制 `game/assets`
下一步:
- 增加 `game/assets/stage/stage_01/`
- 引入 tileset、背景、props。
- 增加视差背景绘制。
- 建立素材来源和授权记录。
### 10. Debug 与工具
职责:
- 提供开发时必要的可视化和状态观察。
- 降低调试碰撞、战斗和关卡触发的成本。
下一步:
- `debug/debug_overlay.*` 已经提供碰撞和玩家包围盒绘制。
- `F1` 切换 debug overlay。
- 绘制平台碰撞。
- 绘制 battle zone。
- 绘制 spawn point。
- 绘制 hitbox / hurtbox。
- 输出当前场景、角色状态、FPS。
### 11. Platform
职责:
- 保持 PC 和 NS 共用游戏逻辑。
- 只在入口、构建、资源部署、平台输入处做差异化。
已有:
- `game/src/main.cpp`:统一游戏入口,通过 `__SWITCH__` 区分 Windows/PC 与 Switch/NS。
- `Frostbite2DGame`Windows 游戏目标。
- `Frostbite2DGameSwitch`Switch 游戏目标,生成 `NSUnknownGame.nro`
- Switch NRO 已内嵌 `game/` 为 RomFS,运行时优先读取 `romfs:/assets`
下一步:
- 将 Switch Joy-Con 输入接入 `InputStateProvider`
- 在 Ryujinx 或真机上验证主循环、shader 和角色纹理。
- 如果 RomFS 不可用,再补 SD 卡外部资源部署脚本。
## 数据流白板
```text
输入
SDL Keyboard / Controller
-> InputStateProvider
-> InputState
-> PlayerActor
移动
PlayerActor / EnemyActor
-> MovementBody
-> PlatformMover
-> PlatformWorld
-> 更新 Actor position / grounded
战斗
Actor 当前攻击状态
-> 生成 Hitbox
-> CombatSystem
-> Hurtbox 匹配
-> DamageEvent
-> Actor 受击/击退/死亡
关卡
LevelDefinition
-> Scene 创建 Actor
-> StageRenderer 绘制视觉层
-> PlatformWorld 提供碰撞
-> BattleZone 控制推进
渲染
Scene::Render
-> StageRenderer
-> Actor::Render
-> Effects
-> DebugOverlay
```
## 开发路线白板
### Milestone 1:白盒玩法闭环
目标:验证 ACT 基础手感。
- 玩家移动、跳跃、出拳稳定。
- 第一关横向推进可从头跑到尾。
- battle zone 可触发、锁镜头、解锁。
- 有 1 种敌人占位。
- 有 hitbox/hurtbox debug。
### Milestone 2:灰盒战斗验证
目标:验证清版节奏。
- 玩家 2 到 3 段基础连击。
- 敌人追击、攻击、受击、死亡。
- 每个 battle zone 有敌人波次。
- 有简单掉落或奖励。
- 关卡能完整结算。
### Milestone 3:第一关美术测试
目标:替换白盒视觉。
- 场景有 2 到 3 层视差背景。
- 地面和平台使用 tileset。
- props 丰富空间轮廓。
- 保留 debug overlay。
- 记录素材来源和授权。
### Milestone 4:数据化
目标:降低后续扩展成本。
- 动画配置数据化。
- 攻击参数数据化。
- 敌人参数数据化。
- 关卡数据逐步外部化。
## 当前优先级
下一步建议按这个顺序做:
1. `BattleZone`:做清版推进的核心框架。
2. `SwitchInput`:把 Joy-Con/手柄输入接入 `InputStateProvider`
3. `EnemyActor`:做第一个敌人占位。
4. `CombatSystem`:把 hitbox/hurtbox 真正跑起来。
5. `SpriteAnimator`:把玩家动画从硬编码改成组件。
6. `StageLayer`:把白盒视觉层扩展为背景、tiles 和 props。
## 素材协作提示
你找素材时优先找:
- 横版 tileset:地面、平台、墙面。
- 远景/中景背景:可以横向拼接。
- props:箱子、桶、路障、门、灯、标牌。
- 敌人临时素材:有 idle/run/attack/hurt/death 最好。
- 特效:命中火花、尘土、落地、破坏碎片。
素材回来后先不急着追求最终题材,先按 `stage_01` 做一个可玩的美术测试关。
+210
View File
@@ -0,0 +1,210 @@
# 场景搭建计划
目标:先把第一关从白盒推进到可替换素材的灰盒/美术测试场景。当前游戏方向暂定为横板 2D ACT 清版,因此场景需要服务于移动、跳跃、攻击判定、敌人刷出、镜头推进和战斗节奏。
## 1. 当前起点
已有内容:
- `WhiteboxScene`:当前白盒场景入口。
- `CreateWhiteboxLevel()`:第一版关卡数据,包含平台碰撞和白盒装饰块。
- `PlatformWorld` / `PlatformMover`:基础平台碰撞和重力移动。
- `PlayerActor`:玩家移动、跳跃、出拳和基础动画。
- `Frostbite2DGame`:Windows 游戏目标,可直接构建运行。
当前白盒只解决“能跑、能跳、能看到关卡结构”。下一步要把场景拆成数据层、视觉层和玩法层。
## 2. 第一关场景目标
第一关不急着做最终题材,先做通用 ACT 测试关:
- 横向推进,总宽度先控制在 2400 到 3200 像素。
- 主要视口仍用 1280x720。
- 地面以平路为主,加入 2 到 3 段平台高低差。
- 至少预留 3 个战斗区域,每个区域宽度 480 到 720 像素。
- 每个战斗区域有明确的入口、站位空间、敌人刷出点和退出方向。
- 保留一个跳跃测试段,用来验证移动手感。
- 保留一个窄平台/边缘段,用来验证镜头和碰撞。
## 3. 场景分层
后续场景按以下层拆:
```text
background_far 远景天空、城市、山体、洞窟深处等,不参与碰撞
background_mid 中景建筑、树、墙面、远处平台,不参与碰撞
level_collision 地面、平台、墙体,只负责碰撞
level_visual 和碰撞对齐的地面/墙面贴图
props_back 柱子、牌子、箱子、草丛等后景装饰
actors 玩家、敌人、道具、投射物
props_front 前景遮挡物、栏杆、近景草等
effects 攻击特效、命中特效、尘土、碎片
ui HUD、提示、调试信息
```
白盒阶段先实现:
- `level_collision`
- `level_visual`
- `props_back`
- `actors`
前景遮挡和特效后面再加。
## 4. 素材寻找清单
你先找这些素材,优先像素风,尺寸最好能和 128x128 角色兼容。
### 必需素材
- 地面 tileset:至少包含平地、左边缘、右边缘、平台中段。
- 墙面或背景 tileset:用于挡板、台阶、平台侧面。
- 远景背景:一张或多张可横向拼接背景。
- 中景背景:建筑、树、管线、洞窟墙等可以做视差的图层。
- 基础装饰物:箱子、桶、路灯、告示牌、碎石、草丛等。
- 关卡边界标识:门、路障、出口牌、传送门等任选。
### ACT 玩法相关素材
- 敌人站位/出生点可用的临时标记图。
- 可破坏物:木箱、罐子、障碍物。
- 攻击命中特效:小型 hit spark。
- 落地/跑步尘土:小型 dust effect。
### 可选素材
- 前景遮挡:栏杆、柱子、近景树叶。
- 光照叠加图:窗口光、路灯光、火光等。
- 环境动画:旗子、火焰、流水、机器灯。
- 背景音乐和环境音。
## 5. 素材规格建议
角色当前是 128x128 帧,场景素材建议:
- tileset 单格优先 `32x32``48x48``64x64`
- 平台碰撞块可以和视觉块分离,不要求每张图都精准碰撞。
- 背景图宽度最好大于 1280,或能无缝横向重复。
- PNG 优先,透明背景用于 props 和 effects。
- 同一套素材尽量保持统一像素密度。
- 文件名使用英文小写和下划线,例如 `factory_floor_tiles.png`
建议素材目录:
```text
game/assets/stage/stage_01/
├─ background/
├─ tiles/
├─ props/
├─ effects/
└─ audio/
```
## 6. 工程实现步骤
### Step 1:扩展关卡数据结构
`LevelDefinition` 从纯白盒数据扩展为:
- 世界宽高。
- 碰撞平台列表。
- 视觉 tile/prop 列表。
- 玩家出生点。
- 敌人出生点。
- 战斗区域触发范围。
- 镜头限制范围。
### Step 2:实现 StageRenderer
新增 `scene``stage` 模块,负责绘制:
- 背景色。
- 远景背景。
- 中景背景。
- tile 层。
- prop 层。
- debug 碰撞层。
第一版可以继续用 `Renderer::drawQuad``Sprite`,不急着做 tilemap 优化。
### Step 3:替换白盒视觉
保持碰撞数据不变,先把地面和平台换成 tileset。
验收标准:
- 玩家仍然能正常落地和跳跃。
- 视觉地面和碰撞地面误差不超过 4 像素。
- 镜头移动时背景不黑屏、不闪烁。
### Step 4:加入视差背景
远景和中景随相机不同速度移动:
- 远景速度:相机速度的 20% 到 35%。
- 中景速度:相机速度的 45% 到 65%。
- 地面和角色速度:100%。
### Step 5:加入战斗区域数据
在关卡中标出 3 个 battle zone
- `zone_01_intro`
- `zone_02_platform`
- `zone_03_exit`
每个区域包含:
- 触发矩形。
- 敌人刷出点。
- 镜头锁定范围。
- 清场后解锁出口。
第一版可以只画 debug 框,不立刻做敌人。
### Step 6:加入 debug 显示开关
需要能显示/隐藏:
- 碰撞矩形。
- 玩家 hurtbox。
- 攻击 hitbox。
- 敌人出生点。
- battle zone。
建议先用键盘 `F1` 切换。
## 7. 第一版验收标准
第一阶段完成时应该达到:
- 能启动 `Frostbite2DGame`
- 第一关宽度至少 2400 像素。
- 玩家可以从起点跑到终点。
- 至少 5 个平台/地面碰撞块。
- 至少 2 层背景。
- 至少 8 个装饰物。
- 至少 3 个 battle zone debug 标记。
- 场景资源路径集中在 `game/assets/stage/stage_01/`
- 文档记录已使用素材来源和授权信息。
## 8. 素材回来后的落地顺序
素材准备好后按这个顺序处理:
1. 整理素材到 `game/assets/stage/stage_01/`
2. 记录素材来源和授权。
3. 先接背景图,验证相机移动。
4. 再接地面/平台 tiles,验证碰撞对齐。
5. 再接 props,丰富场景轮廓。
6. 最后接 effects 和音频。
## 9. 下一轮建议任务
你找到素材后,下一轮优先做:
- 创建 `stage_01` 资源目录。
- 新增 `StageRenderer`
- 扩展 `LevelDefinition`
- 把当前白盒平台替换成第一版 tile 视觉。
- 保留 debug 碰撞显示。