键盘

可参考的官方例子: keyboard_input, keyboard_input_events.


本页展示如何处理键盘按键的按下和释放。

如果你对文本输入感兴趣,请看 字符输入 页面。

注意:Mac 上的 Command 键对应于 PC 上的 Windows 微标键。

检查按键的状态

检查特定按键的状态目前只能通过按键代码完成,使用 Input<KeyCode>Input, KeyCoderesource 来获取状态:

fn keyboard_input(
    keys: Res<Input<KeyCode>>,
) {
    if keys.just_pressed(KeyCode::Space) {
        // Space was pressed
    }
    if keys.just_released(KeyCode::LControl) {
        // Left Ctrl was released
    }
    if keys.pressed(KeyCode::W) {
        // W is being held down
    }
}

键盘事件

为了获得所有的键盘操作,你可以使用 KeyboardInput 事件 来获取。

fn keyboard_events(
    mut key_evr: EventReader<KeyboardInput>,
) {
    use bevy::input::ElementState;

    for ev in key_evr.iter() {
        match ev.state {
            ElementState::Pressed => {
                println!("Key press: {:?} ({})", ev.key_code, ev.scan_code);
            }
            ElementState::Released => {
                println!("Key release: {:?} ({})", ev.key_code, ev.scan_code);
            }
        }
    }
}

这些事件给了你按键码和扫描码。扫描码被表示为一个任意的 u32 整数ID。

按键码和扫描码

键盘按键可以通过按键码或扫描码来识别。

按键码表示每个键上的符号或字母,并取决于用户操作系统中当前使用的键盘布局。Bevy 用 KeyCode 枚举来表示它们。

扫描码代表键盘上的物理键,与操作系统键盘布局无关。不幸的是,它们只是任意的整数 ID,并且与平台有关。没有简单的方法可以从扫描码中获知应该在游戏的用户界面上为用户显示什么。

此外,对在 Bevy 中使用扫描码的支持是有限的。这对于使用多个或非 QWERTY 键盘布局的人来说可能会很烦。

请参阅 Bevy Issue #2052 以找到一些改进的方法。

与键盘布局无关的按键绑定

不管目前的输入处理有哪些限制,你也可以为了给玩家提供更好的体验尝试更多的方法:

  • 在你的系统内部记录键盘按键绑定并存储为扫描码
  • 使用事件处理输入,并使用扫描码来识别按键
  • 仅仅为在用户界面中显示一个键的名称而存储按键码

这样做意味着在操作系统中使用多种键盘布局的用户,如果在游戏过程中不小心切换了他们的布局,或者用错误的布局开始游戏,他们设置的键盘绑定关系不会被破坏。

不幸的是,这也意味着你的游戏用户界面将显示注册键盘绑定时使用的键盘布局上的按键符号。如果用户改变了当前的键盘布局,这可能是错误的或令人困惑的。