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

HitEffectLifecycleEvent


打击特效实例的三个生命周期节点各投递一次:CREATED(实例进入宿主活动列表的当帧)、CANCELLED(句柄 cancel() 首次受理的当帧,幂等重复取消不重发)、EXPIRED(实例自然到期,或超保留窗被清扫时补报)。每实例恰好一个消亡事件(CANCELLED 与 EXPIRED 互斥、只报其一);倒带回退令特效「复活」时不重发消亡事件。

方法速览

方法用途
phase()生命周期阶段 CREATED / CANCELLED / EXPIRED
lane()特效所在轨道(事件时刻值)
noteType()音符类型(打击特效口径)
grade()判定等级定义,可能为 null
startMs()特效起始 τ(毫秒)
durationMs()事件时刻的时长(毫秒)
note()触发音符的只读视图,可能为 null

phase()

java
public Phase phase();

行为:返回生命周期阶段。CREATED 覆盖正常击打、幽灵击打、autoplay 等一切创建路径。

lane()

java
public int lane();

行为:返回特效所在轨道。这是事件时刻值,句柄后续 setLane 不会回填历史事件。

noteType()

java
public HitEffectNoteType noteType();

行为:返回音符类型(打击特效口径)。

grade()

java
public JudgmentKindDefinition grade();

行为:返回判定等级定义,可能为 null(部分内部特效没有判定等级)。

startMs()

java
public long startMs();

行为:返回特效起始的音乐时间 τ(毫秒)。

durationMs()

java
public long durationMs();

行为:返回事件时刻的时长(毫秒)。CANCELLED / EXPIRED 携带消亡前最后生效值(包含 setDurationMs 修改后的口径)。

note()

java
public NoteView note();

行为:返回触发音符的只读视图,可能为 null。

示例

java
ctx.eventBus().subscribe(HitEffectLifecycleEvent.class, event -> {
    switch (event.phase()) {
        case CREATED:
            liveEffects++;
            break;
        case CANCELLED:
        case EXPIRED:
            liveEffects = Math.max(0, liveEffects - 1);
            releasePooledEffect(event.lane());
            break;
        default:
            break;
    }
});

完整签名

java
public class HitEffectLifecycleEvent extends Event {
    public enum Phase {
        CREATED,
        CANCELLED,
        EXPIRED
    }

    public HitEffectLifecycleEvent(Phase phase, int lane, HitEffectNoteType noteType,
                                   JudgmentKindDefinition grade, long startMs,
                                   long durationMs, NoteView note);
    public Phase phase();
    public int lane();
    public HitEffectNoteType noteType();
    public JudgmentKindDefinition grade();
    public long startMs();
    public long durationMs();
    public NoteView note();
}

行为核验:宿主在创建特效的当帧发 CREATED;句柄取消只在首次受理时发 CANCELLED;自然到期(elapsed ≥ 当前时长)或超 8 秒保留窗清扫时发 EXPIRED(每实例至多一次)。本局结束的场景整体清理不投递,静默预览会话(EventPolicy.SILENT)也不投递。事件不可取消;需要干预请用句柄原语(setDurationMs / setLane / cancel()),可在 CREATED 当帧响应。

性能:打击密集时每帧可能多次投递,监听器必须极轻。

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