This plugin provide functionality for bindig axises and keysets in bevy.
#[derive(PartialEq, Eq, Hash, Clone, Copy)]
enum InputType {
Editor,
MainMenu,
Game,
}
#[derive(PartialEq, Eq, Hash, Clone, Copy)]
enum Bindings {
Hotkeys(HotkeysInput),
Movement(MovementInput),
Camera(CameraInput),
}
#[derive(PartialEq, Eq, Hash, Clone, Copy)]
enum MovementInput {
Forward,
Right,
Up,
}
#[derive(PartialEq, Eq, Hash, Clone, Copy)]
enum CameraInput {
Yaw,
Pitch,
}
#[derive(PartialEq, Eq, Hash, Clone, Copy)]
enum HotkeysInput {
Test,
}
let mut config: InputConfig<Bindings> = InputConfig::new();
config.rebind_default_value(InputAxisType::KeyboardButton(KeyCode::S), -1.0);
config.rebind_default_value(InputAxisType::KeyboardButton(KeyCode::A), -1.0);
config.rebind_default_value(InputAxisType::KeyboardButton(KeyCode::Q), -1.0);
config.rebind_default_value(
InputAxisType::GamepadButton(GamepadButtonType::LeftTrigger2),
-1.0,
);
let mut set = UserInputSet::new()
set.begin_key(Bindings::Hotkeys(HotkeysInput::Test))
.add(&[
InputAxisType::KeyboardButton(KeyCode::Q),
InputAxisType::KeyboardButton(KeyCode::W),
])
.enable_repeat_all_for_reactivation();
set.begin_axis(Bindings::Movement(MovementInput::Forward))
.add(InputAxisType::KeyboardButton(KeyCode::W))
.add(InputAxisType::KeyboardButton(KeyCode::S))
.add(
InputAxisType::GamepadAxis(GamepadAxisType::LeftStickY),
None,
);
input_bindings.apply_config(&config);
fn spawn_player(
mut commands: Commands,
mut input_bindings: ResMut<UserInputHandle<InputType, Bindings>>,
) {
commands.spawn().insert_bundle(PlayerBundle {
player: Player {},
input_id: input_bindings.create_input_id(InputType::Editor),
});
}
fn process_player_input(
input_bindings: Res<UserInputHandle<InputType, Bindings>>,
query: Query<&InputID>,
) {
query.for_each_mut(|input_component| {
if let Some(input_handle) = input_bindings.to_handle(input_component) {
if let Some(value) = input_handle.get_axis_value(Bindings::Movement(MovementInput::Forward))
{}
if let Some(value) = input_handle.get_key_state(Bindings::Hotkeys(HotkeysInput::Test))
{}
}
});
}
Create new input id for handle it from input_bindings
input_bindings.create_input_id(InputType::Editor)
Switch to new input bindings set for InputID
input_bindings.switch_input(&component, InputType::Editor);
Remove unused input from input_bindings
input_bindings.stop_input_tracking(&component);
Take current input source(Mouse, Keyboard, Gamepad). Could be used for game widgets, when you want to add button icon to it
input_bindings.get_input_source()
Take mouse position and delta
input_bindings.get_mouse_postion();
input_bindings.get_mouse_delta();
Create input handle for InputID, take current input type for InputID
if let Some(input_handle) = input_bindings.to_handle(input_component){
let current_input_type = input_handle.get_input_type();
}
Handle multiple gamepads provided by InputID number. First created InputID has id equal 0, second equal 1. And first connected gamepad also will have id equal 0, second equal 1. InputID limited only by u8 numbers.
See examples/common.rs for more information
Currently, plugin didn't support touch inputs, because posssibly it should have gestures processor and algorythm for simply generate gesture and handle it. Also, gamepad values now filtered by abs(value) > 0.1