用途
Bevy Rhythm 是一个「类型路由器」(thin router),面向 Bevy 0.20 的节奏游戏开发。它本身不实现完整的节奏游戏,而是划定领域边界:谱面音符(chart notes)、歌曲时钟(song clock)与判定窗口(hit windows)由本技能负责,其余部分交给已链接的 Bevy 技能。当需要处理与音频对齐的谱面时间与判定窗口时加载本技能。
主要能力
- 以 ECS 数据形式表达节奏游戏要素:组件(Component)保存每个实体的类型标记,资源(Resource)保存全局计数器(如分数、波次索引、随机种子)。
- 提供谱面时钟(ChartClock)与判定器(judge)两个系统的注册示例。
- 定义判定窗口资源(HitWindow),包含 perfect 与 good 两个阈值。
- 提供谱面生成示例(spawn_chart),按索引与轨道生成 ChartNote。
- 明确系统调度:游戏模式切换走 bevy-state-machines,本文件只注册谱面时钟与判定器。
使用方式
依赖声明为 bevy = "0.20"。核心数据结构包括:
ChartNote组件:字段hit_at: f32、lane: u8、judged: bool、grade: u8。HitWindow资源:字段perfect: f32、good: f32。ChartClock资源:元组结构ChartClock(f32),默认派生。
系统示例:
advance_chart:通过time.delta_secs()推进ChartClock,注册在Update。judge:读取ButtonInput<KeyCode>、ChartClock、HitWindow,查询ChartNote;当按下KeyCode::KeyF时,对未判定且lane == 0的音符计算(clock.0 - note.hit_at).abs(),若在 perfect 窗口内则grade = 2,若在 good 窗口内则grade = 1。spawn_chart:在Startup中按[0u8, 1, 0, 2]生成音符,hit_at为1.0 + index * 0.5。
插件注册:ClockPlugin 初始化 ChartClock 并添加 advance_chart;JudgePlugin 插入 HitWindow { perfect: 0.04, good: 0.09 } 并添加 judge;ChartPlugin 在 Startup 添加 spawn_chart。
适用场景
- 在 Bevy 0.20 中搭建节奏游戏,需要确定谱面时间与判定逻辑的数据归属。
- 需要将音乐播放、输入映射、分数呈现与核心判定逻辑解耦的项目。
- 需要参考 ECS 所有权与调度规则(组件、资源、Query、Commands、Startup、Update、FixedMain、
.chain()、Plugin)的节奏游戏实现。
限制
- 本技能是路由器,不拥有第二套实现;播放、输入设备与分数呈现留在链接的技能中。
- 不在此处发明物理、导航、网络或 XR crate;只使用有文档的 Bevy crate 与模块。
- 不在此处选择物理或网络 crate。
- 不得将宽窗口内的每次按键都视为 perfect:紧窗口写 grade 2,宽窗口写 grade 1。
- 不得从两个无序系统可变查询同一组件;调度默认并行,除非用
.chain()排序。 - 文档 URL 不固定
/0.20.0/,官方页面保持在无版本站点上。 - 消息与观察者属于 bevy-events-messaging 的所有权槽位,本文件不发明新事件类型。
相关技能
前置:bevy-master(ECS 所有权与调度)、bevy-ecs-composition(生成与查询形态)。 互补:bevy-audio-systems(音乐播放)、bevy-input-handling(按键命中)、bevy-game-loop-time-trial(分数时间)。 下游/消费者:无。