Theseus 模组文档
API 参考 / 事件系统

BeatEvent


游玩帧内,宿主更新完音乐时间 τ 后检测拍序号(BeatGrid 纯函数)是否与上一帧不同,不同即投递一次。每帧至多一次:一帧内大步跨过多个拍点只报最终位置(倒带快退可能发生,监听器应按「直接对齐最终拍」处理,不要假设逐拍连续)。暂停 / 入场过渡期 τ 冻结,不投递。谱面无 BPM 段时按默认 120 BPM 产拍。

方法速览

方法用途
beatIndex()拍序号(自当前 BPM 段起点,可为负)
phase()投递时刻拍相位 [0,1)
bpm()当前 BPM 段的 BPM
periodMs()拍长(毫秒)
rewinding()是否处于倒带重演窗口

beatIndex()

java
public long beatIndex();

行为:返回自当前 BPM 段起点的整拍数,可为负(count-in)。精确定义见 com.seecmd.mod.api.context.BeatGrid#beatIndex(long, double, long)(τ 的纯函数;无节拍信息时返回 -1)。

phase()

java
public double phase();

行为:返回投递时刻的拍相位,范围 [0,1);跨越后通常接近 0。可用于段内插值(缩放、透明度),不要把相邻两次投递的相位差当作固定步长。

bpm()

java
public double bpm();

行为:返回当前 BPM 段的 BPM。

periodMs()

java
public long periodMs();

行为:返回当前拍长(毫秒),等于 BeatGrid.periodMs(bpm)(round(60000 / bpm);无节拍信息时返回 0)。

rewinding()

java
public boolean rewinding();

行为:true 表示处于倒带重演窗口,此时 τ 可能倒流并反向跨拍。应与 GameplayTickEvent.rewinding() 同一口径使用:据此重建跟拍演出状态,而不是假设时间只进不退。

示例

java
ctx.eventBus().subscribe(BeatEvent.class, event -> {
    double pulse = 1.0 - event.phase();
    if (event.rewinding()) {
        pulse = 0.0;
    }
    beatPulse = pulse;
});

完整签名

java
public class BeatEvent extends Event {
    public BeatEvent(long beatIndex, double phase, double bpm, long periodMs, boolean rewinding);
    public long beatIndex();
    public double phase();
    public double bpm();
    public long periodMs();
    public boolean rewinding();
}

性能:至多每帧一次,监听器保持轻量。

稳定性: 新增,2.x 内只增不破。