use bevy::prelude::*;
use bevy_input_bindings::prelude::*;
fn main() {
App::new()
.add_plugins((
DefaultPlugins,
gamepad::Plugin::<MyActions, MyValues, MyGamepadBinding>::new(),
))
.add_observer(
|action: On<ActionEvent<MyActions>>, controllers: Query<&ControllerInterface>| {
let Ok(controller) = controllers.get(action.controller()) else {
return;
};
println!(
"Action from {}({:?}): {:?}",
action.controller(),
controller.layout(),
action.key()
);
},
)
.add_systems(Startup, |mut commands: Commands| {
commands.spawn(Camera3d::default());
})
.add_systems(Update, |values: Query<&ControllerValues<MyValues>>| {
for value in values {
let Some((val0, val1)) = value.get_as_axis2d(&MyValues::Move) else {
continue;
};
if val0 == 0.0 && val1 == 0.0 {
continue;
}
println!("Move: {val0:0.2}:{val1:0.2}");
}
})
.run();
}
#[derive(Debug)]
enum MyActions {
Jump,
Shoot,
}
#[derive(Debug, Hash, PartialEq, Eq)]
enum MyValues {
Move,
}
#[derive(Component, Reflect)]
struct MyGamepadBinding {
jump: gamepad::triggers::ButtonPressed,
shoot: gamepad::triggers::Hysteresis,
character_move: gamepad::values::Direct2d,
}
impl Default for MyGamepadBinding {
fn default() -> Self {
Self {
jump: gamepad::triggers::ButtonPressed::new(GamepadButton::South),
shoot: gamepad::triggers::Hysteresis::new_above(GamepadAxis::RightStickX, 0.5, 0.9),
character_move: gamepad::values::Direct2d::new(
GamepadAxis::LeftStickX,
GamepadAxis::LeftStickY,
),
}
}
}
impl gamepad::Binding<MyActions, MyValues> for MyGamepadBinding {
fn get_action_bindings<'a>(
&'a mut self,
) -> Vec<(&'a mut dyn gamepad::triggers::TriggerTrait, MyActions)> {
return vec![(&mut self.jump, MyActions::Jump), (&mut self.shoot, MyActions::Shoot)];
}
fn get_value_bindings<'a>(
&'a mut self,
) -> Vec<(&'a mut dyn gamepad::values::FunctionTrait, MyValues)> {
return vec![(&mut self.character_move, MyValues::Move)];
}
}