📅  最后修改于: 2023-12-03 14:59:31.013000             🧑  作者: Mango
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 生态中不可缺少的一环。