API 参考 / spi 包:音符与判定 SPI
JudgeInputState
想先跑起来?
这一页是签名与行为参考。本帧按下的键与键到轨道的映射。直接做一遍:教程 · 添加新音符类型。
每帧判定回调(onJudgeTick)收到的输入快照,由宿主在分发前构造。模组无需自行订阅按键事件即可实现连按、按住、松开等组合判定。键码与 java.awt.event.KeyEvent 一致。
方法速览
| 方法 | 用途 |
|---|---|
pressedKeys() | 本帧新按下的物理键 |
heldKeys() | 当前按住的物理键 |
releasedKeys() | 本帧松开的物理键 |
keyToLane(int) | 物理键 → 轨道映射(未绑定 -1) |
pressedKeys()
签名:
java
java.util.Set<Integer> pressedKeys();行为:本帧新按下的物理键码集合,来源是输入管理器本帧消费的按下事件,可能包含未绑定轨道的键(用 keyToLane 过滤)。只读:宿主在构造期做防御性拷贝,模组 add / clear 立即抛 UnsupportedOperationException。
示例:
java
for (Integer key : state.pressedKeys()) {
int lane = state.keyToLane(key);
}heldKeys()
签名:
java.util.Set<Integer> heldKeys();
行为:当前按住、且在键位表中已绑定的物理键集合(宿主只轮询 keyToLane 中的键)。只读集合。
示例:
java
boolean holding = !state.heldKeys().isEmpty();releasedKeys()
签名:
java.util.Set<Integer> releasedKeys();
行为:本帧松开的物理键集合,按「上一帧按住 − 本帧按住」差分得到,因此只包含已绑定键。只读集合。
示例:
java
if (!state.releasedKeys().isEmpty()) { /* 松手反馈 */ }keyToLane(int keyCode)
签名:
java
int keyToLane(int keyCode);行为:查询物理键到逻辑轨道的映射(来自玩家键位设置)。未绑定到任何轨道的键返回 -1。映射为物理映射,不套用镜像类模式的轨道翻转,模组按需自行处理。
示例:
java
int lane = state.keyToLane(keyCode);
if (lane >= 0) {
// 该键已绑定到轨道 lane
}完整签名
java
public interface JudgeInputState {
java.util.Set<Integer> pressedKeys();
java.util.Set<Integer> heldKeys();
java.util.Set<Integer> releasedKeys();
int keyToLane(int keyCode);
}线程:源码未声明额外线程约束;宿主在游玩更新线程每帧构造并同步传入。快照只在该帧回调内有效,不要跨帧持有。
生命周期阶段:运行期每帧判定回调(onJudgeTick)内使用。
稳定性:2.0 起冻结:2.x 内只增不破(禁止删签名/改签名/改语义)。