修饰键枚举

基本信息

属性 值
枚举类 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。

相关条目