ActiveHitEffect
活动打击特效实例的句柄(世界实例层「特效实例」对象)。宿主在打击特效产生时创建内部实例(以音乐时间 τ 计活),模组经 GameplayContext 的 activeHitEffects() 取得当前存活特效的句柄列表,可读产生上下文、修改属性、提前销毁。
方法速览
| 方法 | 用途 |
|---|---|
lane() | 特效所在轨道(写穿) |
noteType() | 触发特效的音符类型 |
grade() | 触发判定等级定义(可能为 null) |
startMs() | 起始音乐时间 τ |
durationMs() | 当前时长(写穿) |
noteView() | 被判定音符(可能为 null) |
setDurationMs(long) | 改寿命,写入即时生效 |
setLane(int) | 移轨(纯视觉),写入即时生效 |
cancel() | 提前销毁(幂等) |
lane()
int lane();行为:特效当前所在轨道(物理轨道号);setLane 之后返回新值(写穿)。示例:
int lane = fx.lane();noteType()
HitEffectNoteType noteType();行为:触发特效的音符类型(TAP / HOLD_HEAD / BARRIER 等),构造后不变。示例:
if (fx.noteType() == HitEffectNoteType.TAP) { /* 轻量特效 */ }grade()
JudgmentKindDefinition grade();行为:触发特效的判定等级定义;部分内部特效无判定等级,返回 null,调用方需判空。示例:
JudgmentKindDefinition g = fx.grade();
String kind = g != null ? g.id() : "";startMs()
long startMs();行为:特效起始的音乐时间 τ(毫秒);有效期 = [startMs, startMs + durationMs)(按 τ 判定)。示例:
long age = ctx.musicTimeMs() - fx.startMs();durationMs()
long durationMs();行为:特效当前时长(毫秒);setDurationMs 之后返回新值(写穿)。示例:
long life = fx.durationMs();noteView()
NoteView noteView();行为:被判定音符的只读视图;部分特效不由具体音符触发,返回 null。示例:
NoteView n = fx.noteView();
int lane = n != null ? n.lane() : fx.lane();setDurationMs(long)
void setDurationMs(long durationMs);行为:修改特效时长,写入即时生效——存活判定与强度消解按新值重算:延长让特效停留更久;缩短后已流逝超过新时长的特效下一帧自然消亡(柔和版 cancel)。非正值抛 IllegalArgumentException 且特效保持原值(绝不静默忽略)。纯视觉,不影响判定。
示例:
fx.setDurationMs(fx.durationMs() * 2);setLane(int)
void setLane(int lane);行为:把特效移到另一条轨道,写入即时生效——下一帧起渲染位置(轨道 x、y 偏移与随轨旋转)按新轨道解析,可用于演出编排。轨道号越界(< 0 或 ≥ 谱面轨道数)抛 IllegalArgumentException 且保持原轨道。纯视觉,不影响判定与音符。
示例:
fx.setLane(Math.min(ctx.chartView().laneCount() - 1, fx.lane() + 1));cancel()
void cancel();行为:提前销毁本特效(幂等)。销毁后立即从渲染与 activeHitEffects() 消失,倒带重演也不再出现;本局结束 / 退场景后调用是安全空操作。首次受理时宿主投递 HitEffectLifecycleEvent 的 CANCELLED 阶段。
示例:
fx.cancel();完整签名
public interface ActiveHitEffect {
int lane();
HitEffectNoteType noteType();
JudgmentKindDefinition grade();
long startMs();
long durationMs();
NoteView noteView();
void setDurationMs(long durationMs);
void setLane(int lane);
void cancel();
}线程:游玩回调均在游戏线程内同步调用(单线程语义,无并发写冲突)。
所有权与生命周期:句柄指向本局游玩场景的内部实例,只在本次游玩局内有效;同一特效在多次快照中得到不同句柄对象但指向同一内部实例(写入互相可见)。
稳定性: 新增。读方法与 cancel() 自 阶段 2 起;setDurationMs / setLane 自 阶段 3 起。