修饰键枚举
基本信息
| 属性 | 值 |
|---|---|
| 枚举类 | com.blamejared.controlling.keybinding.KeyModifier |
| 取值数量 | 4 |
| 左键键码字段 | leftKeyCode |
| 右键键码字段 | rightKeyCode |
| 缓存 | public static final KeyModifier[] VALUES = values() |
| 使用者 | 内部实现 + 公开 API 的 ComboModifier |
功能
KeyModifier 是组合键系统中"按下修饰键"这一状态的完整枚举。它把左右两个物理键
(左右 Ctrl、左右 Shift、左右 Alt)合并成同一个逻辑修饰键,所以
Ctrl + G 无论按左 Ctrl 还是右 Ctrl 都成立。
全部取值
| 枚举值 | 显示名 | 左侧键码 | 右侧键码 | isActive() 行为 |
|---|---|---|---|---|
NONE |
None |
-1 |
-1 |
恒为 false(this != NONE 前置条件不成立) |
CONTROL |
Ctrl |
Keyboard.KEY_LCONTROL |
Keyboard.KEY_RCONTROL |
左右任一 Ctrl 被按下即 true |
SHIFT |
Shift |
Keyboard.KEY_LSHIFT |
Keyboard.KEY_RSHIFT |
左右任一 Shift 被按下即 true |
ALT |
Alt |
Keyboard.KEY_LMENU |
Keyboard.KEY_RMENU |
左右任一 Alt 被按下即 true |
键码在源码中以 LWJGL
Keyboard.KEY_*常量符号引用,未硬编码数值。
NONE 的两个键码是 -1(不是 0),因此 NONE.matches(任何键码) 都返回 false——
即使传入 -1 也因前置的 this != NONE 判断而被排除。
状态判定
| 方法 | 语义 |
|---|---|
isActive() |
该修饰键此刻是否被按住;NONE 永远为 false |
matches(int keyCode) |
某个具体键码是否属于该修饰键(左键或右键);NONE 永远为 false |
fromKeyCode(int keyCode) |
反查:把一个键码映射到修饰键,无法识别返回 NONE |
fromSerializedName(String name) |
反查 options.txt 里序列化的名字;无法识别返回 NONE |
isKeyCodeModifier(int keyCode) |
fromKeyCode(keyCode) != NONE,即"这个键码本身是不是修饰键" |
isAnyModifierActive() |
Ctrl / Shift / Alt 三者中是否有任意一个被按住 |
matches(int) 与 isKeyCodeModifier(int) 是互补的一对:matches 从修饰键侧判断,
isKeyCodeModifier 从键码侧判断。可视化键盘 用 matches 决定
哪些键在当前修饰键下应显示为禁用(不能把 Ctrl 绑成 Ctrl + Ctrl)。
同时按住多个修饰键时的优先级
getActiveModifier() 按固定优先级返回单个结果,与按键的按下顺序无关:
| 优先级 | 修饰键 |
|---|---|
| 1(最高) | CONTROL |
| 2 | SHIFT |
| 3 | ALT |
| 4(兜底) | NONE |
源码用连续 if 实现:CONTROL.isActive() 为真立刻返回 CONTROL,否则检查 SHIFT,
再检查 ALT,都不成立才返回 NONE。
这个"取第一个而非组合所有"的语义直接影响
控制设置界面 的行为:当玩家没有在 GUI 里
显式选中修饰键时,界面会退回到 getActiveModifier() 来推断用户想按的那个修饰键。
因此同时按住 Ctrl+Shift 时,界面推断为 Ctrl。