Commit Graph

44 Commits

Author SHA1 Message Date
SepComet 46c76ec7fc 修复 LightGame 多项 gameplay bug 并完善光敏渲染体系
- 出生点校验:load_level() 加载后 assert 验证 spawn point 是否站在固体地面且不穿墙
- Checkpoint 系统:LevelLoader 为 Checkpoint Trigger 注册 checkpoint 位置,check_triggers() 正确激活 checkpoint,respawn() 使用最后激活的 checkpoint
- Death 触发器:PlayerController 新增 kill(),TriggerAction::Death 正确触发死亡
- Tilemap 光敏 tile:新增 TileLightRule 与 mutable tile buffer,LightEffectSystem::update_tilemap() 按光照条件动态显示/隐藏 tilemap 中的 tile
- GameObject 渲染:LevelLoader 为所有对象分配 tile atlas sprite(金币、门、陷阱、平台、checkpoint 等不再隐形)
- 光敏对象双状态:LightPlatform / ShadowPlatform / Door 均支持 on/off(或 open/closed)两种 sprite 切换,should_render() 始终返回 true,视觉状态由 sprite 承担
- 渲染层级:LevelRenderer 最后绘制玩家,确保玩家始终在最上层
2026-06-11 11:33:36 +08:00
SepComet acf162d1b9 修复 LightGame Windows 输入问题并完善手动亮度控制
- 重构 PlayerController 输入:移除 IButtonInput 依赖,纯使用 IKeyboardState 与 IPointerInput;触摸屏改为上半屏跳跃、左右 1/3 分区分左右移动
- GameStateManager 增加 ESC 键暂停/恢复支持
- 将键盘亮度控制从 SdlPhotoSensor 平台层上提到 LightGameApp 游戏层(W/S 键),并引入 has_manual_override_ 标志防止 photo sensor 默认值覆盖手动调整
- SDLDisplay 初始化时调用 SDL_StopTextInput(),缓解 Windows 中文输入法在按字母键后拦截方向键/空格的问题
- IKeyboardState.h 补充 KEY_S、KEY_ESC、KEY_RETURN 常量
2026-06-11 10:41:53 +08:00
SepComet fda8b120d3 为 LightGame 提供素材转换工具和转换后的头文件 2026-06-11 09:28:20 +08:00
SepComet e00fc1799d 重构键盘输入为 IKeyboardState 接口,消除 App 层对 SDL 的直接依赖
重构键盘输入为 IKeyboardState 接口,消除 App 层对 SDL 的直接依赖

- 新增 IKeyboardState 抽象接口及 SdlKeyboardState/EvdevKeyboardState 实现
- PlayerController 改用 IKeyboardState 替代直接调用 SDL_GetKeyboardState
- 移除 Camera2D.h 中对 Core 私有头文件 Camera.h 的引用
- 将 Timer.h 从 Core/Core 移至 Core/Platform,符合架构边界规范
- 键盘输入优先级调整为高于指针输入
2026-06-10 15:22:30 +08:00
HP fb216de107 修复windows平台下音频播放问题。 2026-06-09 18:17:52 +08:00
SepComet aecd5a46ed 搭建 LightGame 游戏框架 2026-06-09 12:25:01 +08:00
SepComet 189072ba4e 更新文档 2026-06-09 10:39:10 +08:00
SepComet 0fdcb6b8ff stop tracking build-check directory 2026-06-09 10:31:30 +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
HP 8785368913 修改Tom总流程,完善动画机的状态设置以及游戏逻辑;在core/platform新增win和板端的鼠标点击/触控的逻辑代码/驱动;测试游戏内容。 2026-06-08 12:53:38 +08:00
HP 24fe01af46 Merge branch 'master' of https://gitea.sepcomet.xyz/basil/IMX6U-Game 2026-06-08 10:27:33 +08:00
HP 1e34e15e04 重构SpriteAssertTool.cpp,减少中间文件产生;重构TomGame文件夹,删去不必要的文件;修改CMakeLists,PC重构Game自动重新构建资源头文件;修改文档 2026-06-08 10:27:31 +08:00
SepComet c3f12d9013 Triangle::get_boundingBox 消除 std::min({a,b,c}) 替换为 detail::min3f/max3f 2026-06-07 21:37:36 +08:00
SepComet a8630c720e TriangleRasterizer 定点化 2026-06-07 19:54:15 +08:00
SepComet 16d961e9f3 DrawLine 消除 set_pixel 2026-06-07 19:25:00 +08:00
HP 08088c8413 Merge branch 'master' of https://gitea.sepcomet.xyz/basil/IMX6U-Game 2026-06-07 18:32:00 +08:00
HP b26a6a78fa 111 2026-06-07 18:31:58 +08:00
SepComet 046c21d47a Merge branch 'master' of https://gitea.sepcomet.xyz/basil/IMX6U-Game 2026-06-07 18:24:50 +08:00
SepComet b248bd5cff 性能优化:P0/P1 热路径优化及 DepthBuffer 定点化
- 新增 USE_RGB565_BACKBUFFER 选项,FrameBuffer 内部以 RGB565 存储,present 阶段直接 memcpy,消除逐像素格式转换
- 新增 set_pixel_unsafe / get_depth_unsafe / set_depth_unsafe 快路径,热路径去除重复边界检查
- fill_rect 改为行级批量填充,draw_text/draw_sprite_ex 改用 unsafe 写入
- DepthBuffer 从 float 迁移至 uint16_t 定点深度,clear 支持 memset 快速路径
- TriangleRasterizer 深度测试适配 uint16_t(临时桥接,待全面定点化)
- 修复 USE_RGB565_BACKBUFFER 宏未传递到编译器的问题
2026-06-07 18:24:36 +08:00
HP 8d8c9ed9d1 修复CMakeLists路径问题 2026-06-07 17:06:49 +08:00
HP 3f6e2bab2c 修复Demo的Main.cpp的问题,并修复int32-float的转换。 2026-06-07 17:01:27 +08:00
HP e150b153b9 Merge branch 'master' of https://gitea.sepcomet.xyz/basil/IMX6U-Game 2026-06-07 16:42:07 +08:00
HP b82339b185 将CMakeLists分成主CMakeLists和分游戏CMakeLists;README里补了单独构建Tom/Demo和资源转换的命令;把残留的Gfx文案改成Core。 2026-06-07 16:42:05 +08:00
SepComet a2c218f690 更新文档 2026-06-07 15:24:08 +08:00
HP 964a11a215 1 2026-06-07 14:38:42 +08:00
HP 0defa04eef Merge branch 'master' of https://gitea.sepcomet.xyz/basil/IMX6U-Game 2026-06-07 14:37:58 +08:00
SepComet d92b890528 修正板端性能测试误判并加速 framebuffer 提交
板端测试发现轻量 Demo 在未优化 ARM 构建下只有十几帧,但 Release 构建后可达到约 76 FPS。问题主要来自单配置 CMake 构建未默认启用 Release,以及 fb0 提交路径逐像素通用转换成本过高。

本次变更将单配置生成器默认构建类型设为 Release,避免 ARM/fb0 性能测试误用未优化构建;同时为 FBDisplay 增加 RGB565、ARGB8888/XRGB8888、RGBA8888 连续内存等常见格式快速路径。Demo 临时移除旋转正方体,保留 2D sprite、tilemap、FPS 和 Frame/Present 耗时显示,用于定位板端 framebuffer 提交瓶颈。

Constraint: IMX6U framebuffer 性能结论必须基于 Release 构建
Constraint: 核心代码保持 C++11 兼容,不引入新依赖
Rejected: 直接判断板子性能不足 | 未优化构建会严重放大逐像素循环成本
Rejected: 继续优化 3D 正方体路径 | 当前瓶颈已由 Frame/Present 计时证明主要在 fb0 present
Confidence: high
Scope-risk: moderate
Directive: 后续板端性能测试先确认 CMAKE_BUILD_TYPE=Release,再分析算法瓶颈
Directive: 2D-only 场景不要使用会清 depth buffer 的 DrawContext::clear()
Tested: cmake --build build-win --config Release
Tested: wsl bash -lc "cd /mnt/d/source/IMX6U-Game && cmake --build build-arm-fb"
Not-tested: 实机 framebuffer 像素格式以外的非常见 fb0 layout
2026-06-07 14:24:32 +08:00
HP 352a1233e6 Merge branch 'master' of https://gitea.sepcomet.xyz/basil/IMX6U-Game 2026-06-07 12:34:12 +08:00
HP c177114bf3 111 2026-06-07 12:34:07 +08:00
SepComet a9bc9a59fb update FBDisplay.h 2026-06-07 12:31:27 +08:00
HP b093796e61 merge remote and local changes 2026-06-07 10:39:29 +08:00
HP 3beae16917 local changes before merge 2026-06-07 10:38:34 +08:00
SepComet 777ff96602 拆分时间源以稳定 IMX6U 固定步长主循环
将计时职责从显示后端中移出,新增 Platform::ITimeSource 和 Core::Timer,使主循环基于单调整数毫秒生成固定步长 tick。
这样 SDL2/fb0 只负责显示和输入,游戏逻辑不再通过 Display 获取时间,也避免用 float 秒作为核心时间源。

同时增加 30/45/60 FPS 命令行档位,并用整数余数累计生成 33/33/34、22/22/22/22/23、16/17/17 这类毫秒节奏,便于在 IMX6U 上按性能预算选择目标帧率。

Constraint: IMX6U 运行时应避免核心逻辑依赖 float deltaSeconds
Constraint: SDL2 只能作为显示/输入适配层,不能扩散到核心时间逻辑
Rejected: 继续让 IDisplay::get_time_ms 提供时间 | 显示后端职责过宽,SDL/fb0 切换会影响时间语义
Rejected: 直接固定 33ms 实现 30 FPS | 长时间运行会产生节拍漂移
Confidence: high
Scope-risk: narrow
Directive: 后续 Launcher/GameA/GameB 应通过 ITimeSource + Timer 获取 fixed_delta_ms,不要重新引入 Display 计时
Tested: cmake --build build-win --config Release
Not-tested: IMX6U 实机 clock_gettime(CLOCK_MONOTONIC) 帧时间稳定性
2026-06-07 10:09:07 +08:00
SepComet 20d2422650 加入 SpriteRegion 与基础 Tilemap 绘制
DrawContext 现在支持从 atlas 子区域绘制 SpriteRegion,并在 draw_sprite_ex 中加入屏幕裁剪,避免边缘 sprite 逐像素依赖 FrameBuffer 越界保护。新增基础 Tilemap 数据结构和 draw_tilemap,按视口可见范围遍历 tile,并在视口边缘进行像素级裁剪,支持 camera 像素级滚动时显示半个 tile。

Demo 增加小型滚动 tilemap 测试,复用现有测试 sprite 作为单 tile atlas。文档同步记录 SpriteRegion、Tilemap、viewport 裁剪语义和后续优化方向。

Constraint: IMX6U 热路径应避免全地图扫描和运行时资源解码
Constraint: 当前 tilemap 先保持单 atlas、固定 tile 尺寸的简单模型
Rejected: 直接每帧遍历整张 tilemap | 大地图上会浪费 CPU
Rejected: 立即引入复杂地图资源系统 | 当前阶段只需要验证绘制链路
Confidence: high
Scope-risk: moderate
Directive: 扩展 Tilemap 时保持 tile 范围遍历 + 像素级边缘裁剪的语义
Tested: cmake --build build-win --config Release
Not-tested: 尚未在 IMX6U 真机上验证 framebuffer/SDL 后端性能
2026-06-07 09:23:26 +08:00
SepComet 213fa7e961 加入离线 sprite 与位图字体转换流程
Demo 现在通过生成的 C++ 头文件使用测试 sprite 和像素风 bitmap font,避免在运行时解码 PNG/TTF。同步补充资源转换文档,明确源资源、生成脚本和生成头文件需要一起提交,保证后续可追溯和可重新生成。
Constraint: IMX6U 运行时路径应尽量轻量,避免图片/字体解码开销
Constraint: 生成像素沿用当前 framebuffer 的 uint32_t RGBA 格式
Rejected: 运行时加载 PNG/TTF | 会增加解码依赖和运行时成本
Confidence: high
Scope-risk: moderate
Directive: 修改 sprite 或字体时,必须同步提交源资源、转换脚本和生成头文件
Tested: cmake -B build-win .; cmake --build build-win --config Release
Not-tested: 尚未在 IMX6U 真机上验证 ARM framebuffer/SDL 后端
2026-06-06 23:55:27 +08:00
SepComet 3e735e27b0 引入 Gfx::DrawContext 统一绘制入口,封装FrameBuffer/DepthBuffer/Rasterizer/角形光栅化;main.cpp 改用 DrawContext;同步更新文档路径 2026-06-06 17:55:50 +08:00
SepComet a051f6da4c 整理文件结构目录,Gfx 里放底层图形库相关函数,Apps 放上层的应用(启动器、游戏) 2026-06-06 17:31:19 +08:00
SepComet e1a9a9770b 制订规范 2026-06-06 17:10:47 +08:00
SepComet 9a2edd59fe update .gitignore, README.md 2026-06-06 12:45:50 +08:00
SepComet a56bbe6f76 finish build in linux 2026-06-05 19:22:48 +08:00
SepComet 9db7e06aa1 init 2026-06-05 17:55:22 +08:00