跳到主要内容

HOLD 音符 - 长押音符

概述

HOLD 音符需要玩家按住一段时间的音符。多个 HOLD 音符可以通过 holdGroup 连接形成完整的长押。

技术规格

属性
类型值2
ZNear1
ZFar25
Java 枚举NoteType.HOLD

JSON 格式

{
"noteType": 2,
"beat": 4.0,
"pos": [0, 0, 0],
"scale": [1, 1, 1],
"rotation": [0, 0, 0],
"holdGroup": 0
}

字段说明

字段类型必需说明
noteTypeint固定为 2
beatdouble音符出现的拍数位置
posdouble[3][X, Y, Z] 坐标(数组格式)
scalefloat[3][X, Y, Z] 缩放(数组格式)
rotationfloat[3][X, Y, Z] 旋转角度(数组格式)
holdGroupint长押组 ID(>= 0 表示参与长押)

判定系统

判定窗口

判定类型时间窗口说明
PERFECT±110ms完美命中
FAST_GREAT110ms ~ 220ms偏快的大好
LATE_GREAT-220ms ~ -110ms偏慢的大好
MISS>220ms 或 <-220ms未命中

容差值

  • 空间容差: 0.15(TOLERATE_HOLD
  • 判定逻辑: 检测玩家是否在音符位置附近并按住

长押组机制

holdGroup 字段

  • -1: 该音符不参与任何长押组(单独的 HOLD)
  • >= 0: 长押组 ID,相同 ID 的 HOLD 音符形成长押

长押位置标记

系统会根据 holdGroup 自动识别长押的位置:

位置说明示例
START长押起始音符第一个音符
MIDDLE长押中间音符中间连接音符
END长押结束音符最后一个音符
SOLO单独的长押音符整首歌只有一个 HOLD

长押识别规则

  1. 同一轨道: 相同 holdGroup 的音符必须在同一轨道上
  2. 顺序排列: 音符必须按拍数顺序连续排列
  3. 类型限制: 只有 noteType=2 的音符才能形成长押

判定逻辑

HOLD 音符的判定分为两个阶段:

  1. 起始判定: 检测玩家是否在起始时间点击/按住
  2. 持续判定: 检测玩家是否在整个长押期间保持在位置附近

HOLD 链式判定

HOLD 音符支持链式判定:

  • 如果当前帧已经有 HOLD 判定成功,后续的 HOLD 音符可以被"拯救"
  • 这允许玩家在连续的长押中保持判定

HOLD 位置计算

HOLD 音符的位置计算考虑了:

  • 音符自身的坐标
  • 轨道的变换(平移、旋转、缩放)
  • 玩家的视线方向

使用示例

基本长押(2拍)

[
{
"noteType": 2,
"beat": 4.0,
"pos": [0, 0, 0],
"scale": [1, 1, 1],
"rotation": [0, 0, 0],
"holdGroup": 0
},
{
"noteType": 2,
"beat": 6.0,
"pos": [0, 0, 0],
"scale": [1, 1, 1],
"rotation": [0, 0, 0],
"holdGroup": 0
}
]

这两个 HOLD 音符在拍数 4.0 到 6.0 之间会被系统识别为同一个长押:

  • 第一个音符会被标记为 START
  • 第二个音符会被标记为 END

复杂长押(多段)

[
{
"noteType": 2,
"beat": 0.0,
"pos": [0, 0, 0],
"scale": [1, 1, 1],
"rotation": [0, 0, 0],
"holdGroup": 0
},
{
"noteType": 2,
"beat": 2.0,
"pos": [0, 0, 0],
"scale": [1, 1, 1],
"rotation": [0, 0, 0],
"holdGroup": 0
},
{
"noteType": 2,
"beat": 4.0,
"pos": [0, 0, 0],
"scale": [1, 1, 1],
"rotation": [0, 0, 0],
"holdGroup": 0
}
]

这个长押包含三个音符,形成 START-MIDDLE-END 结构。

单独的 HOLD(SOLO)

{
"noteType": 2,
"beat": 8.0,
"pos": [0, 0, 0],
"scale": [1, 1, 1],
"rotation": [0, 0, 0],
"holdGroup": -1
}

这是一个单独的 HOLD 音符,不与其他音符连接。

与 TAP/LOOK 的区别

特性TAP/LOOKHOLD
持续时间瞬时持续一段时间
判定次数一次多次(起始 + 持续)
组机制不支持支持长押组
容差值0.150.15
ZNear01

注意事项

  1. holdGroup 仅对 HOLD 音符有效,其他类型会被忽略
  2. 长押组内的音符必须按拍数顺序排列
  3. 同一长押组的音符必须在同一轨道上
  4. 单独的 HOLD(holdGroup=-1)也是一个完整的长押
  5. 长押的持续时间由起始和结束音符的拍数决定

相关文档