use bevy::{
input::gamepad::GamepadAxis,
math::Vec2,
prelude::{GamepadButton, Message},
};
use inlet::{
InputBindings,
axis::{AxisBinding, DualValueBinding},
button::{ActionBinding, ButtonBinding, ButtonEventBinding},
};
#[derive(Eq, Hash, PartialEq)]
pub enum GenericActions {
Jump,
Move,
Zoom,
}
#[derive(Clone, Message)]
pub enum GenericActionsMessage {
Jump,
Move(Vec2),
}
impl GenericActionsMessage {
pub fn jump() -> Self {
Self::Jump
}
pub fn move_player(values: Vec2) -> Option<Self> {
if values == Vec2::ZERO {
Some(Self::Move(values))
} else {
None
}
}
}
#[test]
fn test_fn() {
let mut bindings = InputBindings::<GenericActions, GenericActionsMessage>::new();
bindings.register_action_binding(
GenericActions::Jump,
ActionBinding::new(
vec![ButtonBinding::Gamepad(GamepadButton::South)],
ButtonEventBinding::when_pressed(GenericActionsMessage::jump),
),
);
bindings.register_value_binding(
GenericActions::Zoom,
AxisBinding::gamepad_axis(GamepadAxis::RightZ).into(),
);
let dvb: DualValueBinding<GenericActionsMessage> = (
AxisBinding::gamepad_right_stick_x(),
AxisBinding::gamepad_right_stick_y(),
)
.into();
bindings.register_dual_value_binding(
GenericActions::Move,
dvb.with_event(GenericActionsMessage::move_player),
);
assert!(bindings.get_action_state(&GenericActions::Jump).released());
assert_eq!(bindings.get_value(&GenericActions::Zoom), 0.);
assert_eq!(
bindings.get_dual_value(&GenericActions::Move),
Vec2::default()
);
assert_eq!(bindings.get_value(&GenericActions::Jump), 0.);
assert!(bindings.get_action_state(&GenericActions::Move).released(),);
}