📜  bevy 输入 - Rust (1)

📅  最后修改于: 2023-12-03 14:59:31.013000             🧑  作者: Mango

Bevy 输入 - Rust

Bevy Input 是一个由 Bevy 社区维护的用 Rust 编写的输入系统,旨在提供简单易用的构建游戏输入逻辑的 API。

特性
  • 支持键盘、鼠标、手柄等多种输入设备。
  • 可以轻松创建按键、鼠标按钮、手柄按钮等输入绑定。
  • 提供事件订阅机制,方便处理各种输入事件。
  • 支持输入状态的持久化,方便实现复杂的输入逻辑。
  • 可以轻松地自定义输入处理逻辑。
安装

Bevy Input 可以和 Bevy 一样通过 Cargo 进行安装,只需要在 Cargo.toml 文件中添加如下依赖:

[dependencies]
bevy = "0.5"
bevy_input = "0.5"
使用
创建输入绑定

首先需要创建输入绑定,以将输入设备上的事件映射到游戏中的逻辑按键。这可以通过 InputMap 来完成。

use bevy_input::prelude::*;

fn setup_input(mut input_map: ResMut<InputMap<MyInput>>) {
    input_map.map_axis(MyInput::Horizontal, KeyCode::A, KeyCode::D);
    input_map.map_axis(MyInput::Vertical, KeyCode::W, KeyCode::S);
    input_map.map_button(MyInput::Jump, KeyCode::Space);
}

在上述代码中,我们定义了一个 MyInput 枚举来表示逻辑按键,然后使用 InputMap 将 A、D 键映射到左右方向控制,W、S 键映射到前后方向控制,Space 键映射到跳跃。

监听输入事件

在游戏逻辑中,我们可以为已经定义好的逻辑按键添加事件处理逻辑,通过订阅对应的事件来实现,例如:

use bevy::prelude::*;
use bevy_input::prelude::*;

fn my_input_system(
    keyboard_input: Res<Input<KeyCode>>,
    mouse_input: Res<Input<MouseButton>>,
    my_input: Res<Input<MyInput>>,
    mut query: Query<&mut Transform>,
) {
    if keyboard_input.pressed(KeyCode::Escape) {
        std::process::exit(0);
    }
    if mouse_input.just_pressed(MouseButton::Left) {
        // 处理鼠标左键按下事件
    }
    if my_input.pressed(MyInput::Jump) {
        for mut transform in query.iter_mut() {
            transform.translation.y += 1.0;
        }
    }
}

在上述代码中,我们订阅了键盘、鼠标和自定义的 MyInput 三种输入事件,可以根据事件类型、按键是否按下、按键状态等等来进行处理。

自定义输入处理逻辑

对于更加复杂的输入逻辑,我们可以自定义输入处理逻辑。以自定义鼠标滚动为例:

use bevy_input::prelude::*;

struct MouseWheelInput {
    delta: f32,
}

impl From<MouseWheel> for MouseWheelInput {
    fn from(mouse_wheel: MouseWheel) -> Self {
        Self {
            delta: mouse_wheel.y,
        }
    }
}

fn mouse_wheel_input_system(
    mouse_wheel_inputs: Res<Events<MouseWheel>>,
    mut mouse_wheel_input_events: ResMut<Events<MouseWheelInput>>,
) {
    for event in mouse_wheel_inputs.iter() {
        mouse_wheel_input_events.send(MouseWheelInput::from(*event));
    }
}

在上述代码中,我们定义了一个 MouseWheelInput 结构体来表示鼠标滚动事件。然后通过监听 MouseWheel 事件,并在事件循环中将其转换为 MouseWheelInput 事件来处理。

总结

Bevy Input 是一个功能完善、易于使用、可自定义的输入系统,可以轻松构建游戏输入逻辑。它已经被多个成功的游戏项目所使用,是 Bevy 生态中不可缺少的一环。