JudgmentKindDefinition
这一页是签名与行为参考。新增一档判定:显示名、分数、准度权重、连击行为。直接做一遍:教程 · 添加判定等级。
判定等级定义对象,取代写死的判定等级枚举,使模组可以注册新的判定等级(如 GOOD、BAD);评分、统计与特效按注册表遍历。在 onPreInit 用 ctx.registries().judgmentKinds().register(key, def) 注册,身份由注册键承载,本接口不自带 id;内置 seecmd:perfect/great/miss/none 由宿主预注册。相关类型:ComboBehavior。
方法速览
| 方法 | 用途 |
|---|---|
displayName() | 判定显示名(如 "PERFECT") |
scoreValue() | 计分相对权重(PERFECT = 100 基准) |
accuracyWeight() | 准度权重(0..1) |
color() | 判定文字/特效与 HUD 连击颜色 |
comboBehavior() | 对连击的影响(递增/归零/不变) |
isMissKind() | 是否具备完整 MISS 语义 |
render(RenderCanvas, JudgedNoteRenderContext) | 判定特效自绘 |
displayName()
签名:
String displayName();行为:返回判定等级的显示名。宿主把它用于 HUD 连击文本("<combo> <displayName>")与日志,不参与判定匹配。
示例:
@Override
public String displayName() {
return "GOOD";
}scoreValue()
签名:
int scoreValue();行为:该判定等级的分数值(相对权重,PERFECT = 100 基准)。宿主按 Σ 每音符基础分 × (scoreValue / 100) × 次数 计算总分;内置 PERFECT = 100、GREAT = 65。宿主不做范围校验,负值会直接拉低总分,应返回非负数。
示例:
@Override
public int scoreValue() {
return 50;
}accuracyWeight()
签名:
double accuracyWeight();行为:准度权重(0..1,PERFECT = 1.0,GREAT = 0.65,MISS = 0)。宿主的结算统计与血量分档消费它:≥ 1.0 归满准度档,> 0 归部分准度档,≤ 0 归零准度档;不做显式钳制,请自行保持在 0..1。
示例:
@Override
public double accuracyWeight() {
return 0.5;
}color()
签名:
Color color();行为:判定文字/特效的渲染颜色,同时也是宿主 HUD 连击颜色的唯一真相源。返回 null 时 HUD 连击颜色回退中性灰(200, 200, 200)。
示例:
@Override
public Color color() {
return new Color(120, 220, 120);
}comboBehavior()
签名:
ComboBehavior comboBehavior();行为:声明本次判定对 combo 的影响:INCREMENT 递增、RESET 归零、NONE 不变。宿主直接 switch 该返回值,不得返回 null(会抛空指针)。语义详见 ComboBehavior。
示例:
@Override
public ComboBehavior comboBehavior() {
return ComboBehavior.INCREMENT;
}isMissKind()
签名:
default boolean isMissKind();行为:该判定等级是否具备完整 MISS 语义(记 miss 数、连击归零、扣血),默认 false。注意宿主的两套消费口径:
- 计分/统计入口以本方法为准:返回
true时misses++、combo 归零、扣血,并直接返回(不再走comboBehavior()分支)。 - 其他判定路径按「本方法 或
comboBehavior() == RESET」判定 MISS(宿主不按注册键字符串判断)。
因此自定义等级通常只需把连击行为声明为 RESET;需要计入 MISS 统计行时才覆写本方法。
示例:
@Override
public boolean isMissKind() {
return false;
}render(RenderCanvas canvas, JudgedNoteRenderContext ctx)
签名:
default void render(RenderCanvas canvas, JudgedNoteRenderContext ctx);行为:宿主在判定特效层按需调用,默认空实现(不绘制);覆写后在 canvas 上自绘该判定等级的特效。ctx 提供 x() / y()(绘制位置)、judgeTime()(本次判定时间,毫秒)与 note()(被判音符只读视图)。内置四级也提供真实现(原宿主内置文字特效经 搬入),宿主对内置与自定义统一经本方法消费。绘制应自带 save() / restore() 配对。
示例:
@Override
public void render(RenderCanvas canvas, JudgedNoteRenderContext ctx) {
canvas.save();
canvas.drawText(displayName(), ctx.x(), ctx.y(), TextStyle.of(20, color()));
canvas.restore();
}完整签名
public interface JudgmentKindDefinition {
String displayName();
int scoreValue();
double accuracyWeight();
Color color();
ComboBehavior comboBehavior();
default boolean isMissKind();
default void render(RenderCanvas canvas, JudgedNoteRenderContext ctx);
}线程:源码未声明额外线程约束;宿主在计分、判定与渲染主线程同步调用,render 每帧在判定特效层调用。
生命周期阶段:定义对象在 onPreInit 注册,运行期由评分/统计/特效按注册表遍历使用。
稳定性:2.0 起冻结:2.x 内只增不破(禁止删签名/改签名/改语义)。