Commit Graph

7 Commits

Author SHA1 Message Date
SepComet 254a8ce5c8 修复 LightGame 玩家地面抖动、动画切换异常并完善 spike/终点视觉
## 物理与动画(核心修复)

- PlayerController::update:地面状态下跳过 apply_gravity。之前每帧重力累入 velocity.y,sub_pixel_y_ 会缓慢累到 ≥1000 像素阈值,导致玩家下沉 1px 后被 collide_tilemap 推回,每隔几帧抖动一次。这是"动画机切不回 idle"的真正根因 —— 单帧 grounded=false 让状态切到 Falling,下一帧又回 Idle,视觉表现为 idle/fall 帧间歇错位。

- Physics2D::collide_tilemap:发生轴向推回时清掉对应 sub_pixel_x_/y_,防止小数残留在下一帧继续推进位置。
- Physics2D::is_grounded:feet 探测窗口(max.y..max.y+2)跨越的所有 tile 行都要扫描,而非只查 feet.min.y/ts 那一行。原写法在边界帧(feet.max.y 临时为 31n+0)会错把上一行空 tile 当判定行返回 false,触发上述的单帧 Falling 抖动。
- PlayerController::update:grounded && velocity.y >= 0 时无条件清零 velocity.y(不再要求 !was_grounded_),避免重力残留导致连续下沉。

## Spike 行为

- Physics2D::is_tile_solid:spike(tile id 4) 改为非实体,玩家可踩入触发死亡。原先 spike 与普通地块都被当 solid,玩家停在 spike 顶部不会死。
- PlayerController::check_death:spike 击杀区域收紧到 tile 底部 14px(视觉高度),不再用整 32px tile 误判。

## 关卡视觉(出生点 / 检查点 / 终点)

- LevelLoader:玩家出生点附近生成 flag 装饰对象;Checkpoint 触发器初始显示 checkpoint 精灵,被激活后由 LightGameApp 在 check_triggers 中替换为 flag 精灵;LevelComplete 触发器使用 checkpoint 精灵作为终点。
- LevelLoader 暴露 flag_sprite() 静态访问器,供 LightGameApp 触发激活时复用同一份 sprite 引用。

## 资源与配套

- 重新打包 tile_atlas(重新生成 generated/tile_atlas.h),更新 assets/tile/checkpoint.png、flag.png 的视觉素材。
- Level1Data、LevelEditor、LevelRenderer、GameObject、tests 跟随接口调整同步更新;game_engine_tests 重新编译通过。
2026-06-13 14:54:29 +08:00
SepComet d49aef8c0f 调整 LightGame 平台碰撞与门尺寸,修复测试编译
- LightPlatform / ShadowPlatform:移除单向板碰撞逻辑,改为完整 tile 碰撞体
- Door:碰撞箱从 32x64 改为 32x32,与单 tile 素材匹配
- 修复 game_engine_tests 编译:补全 LevelData 初始化字段,增加缺失的 include path
2026-06-11 15:27:57 +08:00
SepComet aecd5a46ed 搭建 LightGame 游戏框架 2026-06-09 12:25:01 +08:00
SepComet feb088a854 统一 Image 和 Sprite 语义到目前的 Image/Sprite 结构体而非之前的类定义 2026-06-09 10:28:29 +08:00
SepComet 56eec9e9d2 收口颜色格式,删除原来的 RGBA8888 的存储和调用 2026-06-09 09:00:43 +08:00
SepComet 23a5b50aec 收口字体渲染路径以降低 atlas 体积并直接输出 RGB565
将位图字体从 RGBA8888 atlas 改为 1-bit mask,避免继续为字体存储无效颜色信息。
生成端现在按 row-major、MSB-first 将 8 个像素打包进 1 个 uint8_t;运行时由
draw_text 提供目标颜色,并在 DrawContext 中直接把 bit=1 的像素写入 RGB565 framebuffer。同步补充了回归测试与文档,确保颜色替换、背景填充和裁剪语义保持稳定。

Constraint: 本次只收口字体路径,不改 sprite/tilemap 资源格式
Constraint: 运行时保持纯二值绘制语义,不引入 alpha blending 或抗锯齿
Rejected: 继续兼容 RGBA8888 字体输入 | 会保留双路径复杂度且无实际收益
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: 后续字体资源必须继续使用 row-major + MSB-first 的 1-bit mask;修改位序前先同步生成脚本、运行时读取和测试
Tested: cmake --build build-win --config Release
Tested: build-win/Release/render_pipeline_tests.exe
Tested: ctest -C Release --output-on-failure
Tested: font_atlas_mask 字节数校验(2808 == ceil(208*108/8))
Not-tested: Demo/设备上的人工目视文字显示效果
2026-06-09 08:20:38 +08:00
SepComet 5ac61dca0e 统一 2D 渲染链路以消除格式分叉和热路径中转
将图片主路径收口为 RGBA5551 输入、RGB565 backbuffer 输出,并删除 USE_RGB565_BACKBUFFER 双路径。sprite/tilemap 主绘制改为直接 RGBA5551 -> RGB565,透明语义固定为 1-bit alpha test。同步收口 SDL/FB present 路径、sprite 资源加载/导出规范,以及相关测试与文档。

Constraint: 运行时图片主路径需统一到 RGBA5551,不能继续保留主要 RGBA8888 分支
Constraint: 透明仅支持 1-bit 语义,不引入 alpha blending
Rejected: 保留 USE_RGB565_BACKBUFFER 宏双路径 | 持续增加维护成本并掩盖真实主链路
Rejected: 主绘制继续走 RGBA5551 -> RGBA8888 -> RGB565 | 热路径存在不必要中转
Confidence: high
Scope-risk: moderate
Directive: 后续图片资源默认按 RGBA5551 接入;不要重新引入通用 RGBA8888 主运行时路径
Directive: 字体 atlas 目前仍属兼容输入;若继续收口,优先改成 1-bit mask 而不是新的图片分支
Tested: render_pipeline_tests;SDL Demo Release 构建;搜索确认无 USE_RGB565_BACKBUFFER 残留
Not-tested: Linux framebuffer 目标实机构建与显示验证
2026-06-08 18:32:04 +08:00