60-eaf24d39
Revision 3
60's Striker —— 是男人就坚持 60 秒
基于 ESP-Mosaico(ESP32-S31 + 480×480 显示屏 + 交互子板)复刻的经典弹幕生存游戏:一条命、不能射击、只用左右移动,在越来越疯狂的字弹地狱里坚持 60 秒。
玩法
- 一条命、不能射击——你唯一的武器是走位。左右移动,躲开一切。
- 顶部巨大的生存计时器实时跳动:
23.4、41.7……看着它活过 60 秒。 - 撑过 60.00 秒 →
CONGRATULATIONS · YOU ARE A MAN!(你是男人!); 中弹死亡 → 结算本局生存时间,按键秒开下一局。 - 生存时间排行榜 Top 5(0.1 秒精度),保存在设备 NVS 中,重启不丢。
难度设计(经典曲线)
复刻原版 Flash 游戏的成瘾性节奏——前几秒几乎空场,之后逐级解锁:
| 时间 | 解锁内容 |
|---|---|
| 0–3 s | 宽限期:场上几乎无弹,热身走位 |
| 3 s | 第一个敌机进场(且 2 秒后才开第一枪) |
| 5 s | 顶部弹雨开始(间隔从 3 s 逐渐压到 0.4 s) |
| 全程 | 瞄准弹 / 三向散射 / 环形弹,密度与速度随时间线性爬升至 2 倍 |
| 32 s | 带缺口的弹墙(惩罚站桩) |
| 45–60 s | 全类型齐发,最终狂潮 |
操作
| 输入 | 动作 |
|---|---|
| 交互子板 左 / 右实体键 | 左右移动(按住持续移动,松开即停) |
| 屏幕左下 / 右下角触摸(隐形区域) | 同上,无子板时的后备 |
| 任意键 / 触屏(标题或结算画面) | 开始 / 重开一局 |
| Host 模拟器 | A / D 移动,W / S 纵向(调试用),P 暂停 |
屏幕重力旋转:交互子板插在右侧时画面自动旋转 90°——子板永远位于画面下方,握持方向即操作方向。
技术亮点
- 弹幕引擎:480×480 RGB565 画布上 30 fps 软件渲染,零图片资源——全部图形由矢量图元与自绘 5×7 像素字体构成(字体支持 90° 旋转渲染),固件仅 1.3 MB。
- 交互子板按键驱动修复:按键焊盘与触摸电极共用且没有内部上拉(实测主动充 3.3 V 后仍读低),普通 GPIO 读取会在按压后锁死数分钟。补丁实现了充电式读取——每个采样周期先把焊盘充到高电平再采样,配合非对称去抖(按下 2 次确认 / 松开 1 次立即)与航向保持(两键冲突时保持当前方向,抑制相邻焊盘互容耦合的幻影信号),做到"按下即动、松开即停"。
- CST9220 触摸驱动自愈:针对 LCD 触摸控制器每秒自校准产生的无效帧突发与偶发楔死,本地化补丁只在连续 300 帧异常后重建触摸模式序列。
- 可移植架构:游戏模型是纯 C(Host 模拟器与设备共用同一份代码),输入/渲染分层适配;Host 网页模拟器支持录制回放与脚本化测试(本次开发中完成了 8 步输入矩阵的自动化验证)。
- 排行榜持久化:NVS blob 存储,游戏通过保存回调解耦存储实现。
硬件与构建
硬件:ESP-Mosaico 主机(ESP32-S31,CO5300 480×480 QSPI 屏)+ 交互子板(右槽)。
构建(需要 ESP-IDF 7b9cc1ac… 与 workspace 布局,见 docs):
git clone https://github.com/zaxchou/esp-mosaico-striker.git
cd esp-mosaico-striker
git submodule update --init submodule/esp-mosaico-utils submodule/raylib-lite-engine
git apply patches/0001-bsp-interact-charged-key-read.patch # 交互子板按键驱动修复
python mosaico.py game sim --project projects/striker1945 # Host 网页模拟器
python mosaico.py game build --project projects/striker1945 # 设备固件
python mosaico.py iris system-update --project projects/striker1945 # 安装到设备
固件:firmware/striker1945.bin(应用分区镜像,esp32s31)。完整安装(含保留 Recovery 契约)请使用上面的 iris system-update 命令。
目录结构
projects/striker1945/ 游戏源码(main/ 游戏模型+渲染+输入适配, components/ 本地驱动补丁)
patches/ BSP 交互子板按键驱动补丁(git apply 方式提供)
firmware/ 比赛固件 bin
projects/striker1945/screenshots/ 游戏截图
submodule/ 上游 BSP / 引擎 / 工具链(pinned gitlinks)
已知限制
- 触摸外设路径读取按键在实测中不可用(焊盘无上拉导致基准漂移),最终方案为 GPIO 充电读取;LCD 触摸控制器的自校准警告(约每秒一次)为正常现象,不影响触摸操作。
- 屏幕左下/右下的隐形触摸区与实体按键功能相同,保留作为无子板时的后备。
ARE YOU A MAN?