diff --git a/game/docs/planning/game_architecture_board.md b/game/docs/planning/game_architecture_board.md index b4c8250..d51de8d 100644 --- a/game/docs/planning/game_architecture_board.md +++ b/game/docs/planning/game_architecture_board.md @@ -354,9 +354,9 @@ mindmap 下一步: -- `debug/debug_overlay.*` 已经提供碰撞和玩家包围盒绘制。 -- `F1` 切换 debug overlay。 -- 绘制平台碰撞、battle zone、camera lock 和 spawn point。 +- `debug/debug_overlay.*` 已经提供碰撞、玩家包围盒、battle zone、camera lock 和 spawn point 绘制。 +- `F1` 切换 debug overlay 总开关。 +- `F3-F6` 分别切换碰撞/网格、玩家框、battle zone/camera、spawn point。 - 绘制 hitbox / hurtbox。 - 输出当前场景、角色状态、FPS。 - 增加日志分级和异常状态重置入口。 diff --git a/game/docs/planning/scene_build_plan.md b/game/docs/planning/scene_build_plan.md index 1adbf25..cbbb819 100644 --- a/game/docs/planning/scene_build_plan.md +++ b/game/docs/planning/scene_build_plan.md @@ -28,6 +28,7 @@ - `StageLayerSource` 已接入:`StageRect` 支持色块占位或 sprite 资源路径,资源不存在时回退色块。 - `StageAssetSlots` 已建立:`game/assets/stage/stage_01/` 已预留 background、tiles、props、effects、audio 目录和素材来源记录。 - `StageProps` 已统一:旧 `WhiteboxProp` 已移除,后景/前景 props 都走 `StageLayer`,其中 `props_front` 在角色之后绘制用于遮挡。 +- `SceneDebug` 已扩展:`F1` 控制 debug 总开关,`F3-F6` 分别切换碰撞/网格、玩家框、battle zone/camera、spawn point。 ## 2. 第一关场景目标 @@ -260,9 +261,18 @@ game/assets/stage/stage_01/ 3. 已完成:`StageLayerSource` 扩展 `StageLayer`,让每个 rect 支持色块占位或 sprite 资源路径。 4. 已完成:`StageAssetSlots` 创建并记录 `stage_01` 资源槽位,不要求已有最终素材。 5. 已完成:`StageProps` 把 props 从旧 `WhiteboxProp` 迁移到统一 layer 数据,支持 back/front 两层。 -6. `SceneDebug`:补齐 F1 debug 总开关,并预留分项开关。 +6. 已完成:`SceneDebug` 补齐 F1 debug 总开关,并预留/接入分项开关。 7. `SceneAcceptanceRun`:PC 和 Switch 都构建通过,PC 能从起点移动到终点并看到相机推进。 +### Debug 快捷键 + +- `F1`:debug overlay 总开关。 +- `F2`:debug 清当前 battle zone,占位模拟清场解锁。 +- `F3`:碰撞矩形和场景网格。 +- `F4`:玩家包围盒。 +- `F5`:battle zone 触发框和 camera bounds。 +- `F6`:敌人出生点。 + ### 素材落位标准 素材准备好后只做这些操作: diff --git a/game/src/core/debug_flags.h b/game/src/core/debug_flags.h index d5d264d..85082cd 100644 --- a/game/src/core/debug_flags.h +++ b/game/src/core/debug_flags.h @@ -3,11 +3,14 @@ namespace ns_game { struct DebugFlags { + bool enabled = true; bool showStageGrid = true; bool showCollision = true; bool showActorBounds = true; bool showBattleZones = true; bool showSpawnPoints = true; + bool showHitboxes = false; + bool showEnemies = true; }; } // namespace ns_game diff --git a/game/src/debug/debug_overlay.cpp b/game/src/debug/debug_overlay.cpp index 198a42e..1be0fb4 100644 --- a/game/src/debug/debug_overlay.cpp +++ b/game/src/debug/debug_overlay.cpp @@ -69,6 +69,10 @@ void DebugOverlay::Render(const LevelDefinition& level, const DebugFlags& flags, const frostbite2D::Rect* playerBounds, const std::vector* battleZoneDebug) const { + if (!flags.enabled) { + return; + } + if (flags.showCollision) { drawCollision(level); } diff --git a/game/src/scene/whitebox_scene.cpp b/game/src/scene/whitebox_scene.cpp index 85ea94a..9fa7517 100644 --- a/game/src/scene/whitebox_scene.cpp +++ b/game/src/scene/whitebox_scene.cpp @@ -34,14 +34,7 @@ void WhiteboxScene::Update(float deltaTime) { bool WhiteboxScene::OnEvent(const frostbite2D::Event& event) { if (event.getType() == frostbite2D::EventType::KeyDown) { const auto& keyEvent = static_cast(event); - if (!keyEvent.isRepeat() && - keyEvent.getKeyCode() == frostbite2D::KeyCode::F1) { - toggleDebugOverlay(); - return true; - } - if (!keyEvent.isRepeat() && - keyEvent.getKeyCode() == frostbite2D::KeyCode::F2) { - clearActiveBattleZone(); + if (!keyEvent.isRepeat() && handleDebugKey(keyEvent.getKeyCode())) { return true; } } @@ -103,16 +96,34 @@ void WhiteboxScene::configureCamera() { } } +bool WhiteboxScene::handleDebugKey(frostbite2D::KeyCode keyCode) { + switch (keyCode) { + case frostbite2D::KeyCode::F1: + toggleDebugOverlay(); + return true; + case frostbite2D::KeyCode::F2: + clearActiveBattleZone(); + return true; + case frostbite2D::KeyCode::F3: + debugFlags_.showCollision = !debugFlags_.showCollision; + debugFlags_.showStageGrid = debugFlags_.showCollision; + return true; + case frostbite2D::KeyCode::F4: + debugFlags_.showActorBounds = !debugFlags_.showActorBounds; + return true; + case frostbite2D::KeyCode::F5: + debugFlags_.showBattleZones = !debugFlags_.showBattleZones; + return true; + case frostbite2D::KeyCode::F6: + debugFlags_.showSpawnPoints = !debugFlags_.showSpawnPoints; + return true; + default: + return false; + } +} + void WhiteboxScene::toggleDebugOverlay() { - const bool enabled = !(debugFlags_.showStageGrid || debugFlags_.showCollision || - debugFlags_.showActorBounds || - debugFlags_.showBattleZones || - debugFlags_.showSpawnPoints); - debugFlags_.showStageGrid = enabled; - debugFlags_.showCollision = enabled; - debugFlags_.showActorBounds = enabled; - debugFlags_.showBattleZones = enabled; - debugFlags_.showSpawnPoints = enabled; + debugFlags_.enabled = !debugFlags_.enabled; } void WhiteboxScene::beginCameraBoundsBlend( diff --git a/game/src/scene/whitebox_scene.h b/game/src/scene/whitebox_scene.h index a830dfa..394d539 100644 --- a/game/src/scene/whitebox_scene.h +++ b/game/src/scene/whitebox_scene.h @@ -30,6 +30,7 @@ private: frostbite2D::Camera* activeCamera() const; std::vector buildBattleZoneDebugInfo() const; void configureCamera(); + bool handleDebugKey(frostbite2D::KeyCode keyCode); void toggleDebugOverlay(); void beginCameraBoundsBlend(const frostbite2D::Rect& targetBounds); void clearActiveBattleZone(); diff --git a/game/src/stage/stage_renderer.cpp b/game/src/stage/stage_renderer.cpp index b260539..fa306d2 100644 --- a/game/src/stage/stage_renderer.cpp +++ b/game/src/stage/stage_renderer.cpp @@ -49,7 +49,7 @@ void StageRenderer::Render(const LevelDefinition& level, } drawLayer(level, layer); } - if (debugFlags.showStageGrid) { + if (debugFlags.enabled && debugFlags.showStageGrid) { drawGrid(level); } }