mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 12:43:34 +00:00
Add support to get gamepad button/trigger values using Axis<GamepadButton> (#683)
This commit is contained in:
parent
76cc25823d
commit
dd91f8e116
3 changed files with 45 additions and 10 deletions
|
@ -9,6 +9,7 @@ pub fn gilrs_startup_system(_world: &mut World, resources: &mut Resources) {
|
||||||
let mut gamepad_event = resources.get_mut::<Events<GamepadEvent>>().unwrap();
|
let mut gamepad_event = resources.get_mut::<Events<GamepadEvent>>().unwrap();
|
||||||
let mut inputs = resources.get_mut::<Input<GamepadButton>>().unwrap();
|
let mut inputs = resources.get_mut::<Input<GamepadButton>>().unwrap();
|
||||||
let mut axes = resources.get_mut::<Axis<GamepadAxis>>().unwrap();
|
let mut axes = resources.get_mut::<Axis<GamepadAxis>>().unwrap();
|
||||||
|
let mut button_axes = resources.get_mut::<Axis<GamepadButton>>().unwrap();
|
||||||
gamepad_event.update();
|
gamepad_event.update();
|
||||||
inputs.update();
|
inputs.update();
|
||||||
for (gilrs_id, gilrs_gamepad) in gilrs.gamepads() {
|
for (gilrs_id, gilrs_gamepad) in gilrs.gamepads() {
|
||||||
|
@ -18,6 +19,7 @@ pub fn gilrs_startup_system(_world: &mut World, resources: &mut Resources) {
|
||||||
&mut gamepad_event,
|
&mut gamepad_event,
|
||||||
&mut inputs,
|
&mut inputs,
|
||||||
&mut axes,
|
&mut axes,
|
||||||
|
&mut button_axes,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +29,7 @@ pub fn gilrs_update_system(_world: &mut World, resources: &mut Resources) {
|
||||||
let mut gamepad_event = resources.get_mut::<Events<GamepadEvent>>().unwrap();
|
let mut gamepad_event = resources.get_mut::<Events<GamepadEvent>>().unwrap();
|
||||||
let mut inputs = resources.get_mut::<Input<GamepadButton>>().unwrap();
|
let mut inputs = resources.get_mut::<Input<GamepadButton>>().unwrap();
|
||||||
let mut axes = resources.get_mut::<Axis<GamepadAxis>>().unwrap();
|
let mut axes = resources.get_mut::<Axis<GamepadAxis>>().unwrap();
|
||||||
|
let mut button_axes = resources.get_mut::<Axis<GamepadButton>>().unwrap();
|
||||||
|
|
||||||
gamepad_event.update();
|
gamepad_event.update();
|
||||||
inputs.update();
|
inputs.update();
|
||||||
|
@ -39,6 +42,7 @@ pub fn gilrs_update_system(_world: &mut World, resources: &mut Resources) {
|
||||||
&mut gamepad_event,
|
&mut gamepad_event,
|
||||||
&mut inputs,
|
&mut inputs,
|
||||||
&mut axes,
|
&mut axes,
|
||||||
|
&mut button_axes,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
EventType::Disconnected => {
|
EventType::Disconnected => {
|
||||||
|
@ -47,6 +51,7 @@ pub fn gilrs_update_system(_world: &mut World, resources: &mut Resources) {
|
||||||
&mut gamepad_event,
|
&mut gamepad_event,
|
||||||
&mut inputs,
|
&mut inputs,
|
||||||
&mut axes,
|
&mut axes,
|
||||||
|
&mut button_axes,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
EventType::ButtonPressed(gilrs_button, _) => {
|
EventType::ButtonPressed(gilrs_button, _) => {
|
||||||
|
@ -65,6 +70,14 @@ pub fn gilrs_update_system(_world: &mut World, resources: &mut Resources) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EventType::ButtonChanged(gilrs_button, value, _) => {
|
||||||
|
if let Some(button_type) = convert_button(gilrs_button) {
|
||||||
|
button_axes.set(
|
||||||
|
GamepadButton(convert_gamepad_id(gilrs_event.id), button_type),
|
||||||
|
value,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
EventType::AxisChanged(gilrs_axis, value, _) => {
|
EventType::AxisChanged(gilrs_axis, value, _) => {
|
||||||
if let Some(axis_type) = convert_axis(gilrs_axis) {
|
if let Some(axis_type) = convert_axis(gilrs_axis) {
|
||||||
axes.set(
|
axes.set(
|
||||||
|
@ -118,13 +131,17 @@ fn connect_gamepad(
|
||||||
events: &mut Events<GamepadEvent>,
|
events: &mut Events<GamepadEvent>,
|
||||||
inputs: &mut Input<GamepadButton>,
|
inputs: &mut Input<GamepadButton>,
|
||||||
axes: &mut Axis<GamepadAxis>,
|
axes: &mut Axis<GamepadAxis>,
|
||||||
|
button_axes: &mut Axis<GamepadButton>,
|
||||||
) {
|
) {
|
||||||
for gilrs_button in ALL_GILRS_BUTTONS.iter() {
|
for gilrs_button in ALL_GILRS_BUTTONS.iter() {
|
||||||
if let Some(button_type) = convert_button(*gilrs_button) {
|
if let Some(button_type) = convert_button(*gilrs_button) {
|
||||||
let gamepad_button = GamepadButton(gamepad, button_type);
|
if let Some(button_data) = gilrs_gamepad.button_data(*gilrs_button) {
|
||||||
inputs.reset(gamepad_button);
|
let gamepad_button = GamepadButton(gamepad, button_type);
|
||||||
if gilrs_gamepad.is_pressed(*gilrs_button) {
|
inputs.reset(gamepad_button);
|
||||||
inputs.press(gamepad_button);
|
if button_data.is_pressed() {
|
||||||
|
inputs.press(gamepad_button);
|
||||||
|
}
|
||||||
|
button_axes.set(gamepad_button, button_data.value());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,11 +159,13 @@ fn disconnect_gamepad(
|
||||||
events: &mut Events<GamepadEvent>,
|
events: &mut Events<GamepadEvent>,
|
||||||
inputs: &mut Input<GamepadButton>,
|
inputs: &mut Input<GamepadButton>,
|
||||||
axes: &mut Axis<GamepadAxis>,
|
axes: &mut Axis<GamepadAxis>,
|
||||||
|
button_axes: &mut Axis<GamepadButton>,
|
||||||
) {
|
) {
|
||||||
for gilrs_button in ALL_GILRS_BUTTONS.iter() {
|
for gilrs_button in ALL_GILRS_BUTTONS.iter() {
|
||||||
if let Some(button_type) = convert_button(*gilrs_button) {
|
if let Some(button_type) = convert_button(*gilrs_button) {
|
||||||
let gamepad_button = GamepadButton(gamepad, button_type);
|
let gamepad_button = GamepadButton(gamepad, button_type);
|
||||||
inputs.reset(gamepad_button);
|
inputs.reset(gamepad_button);
|
||||||
|
button_axes.remove(&gamepad_button);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for gilrs_axis in ALL_GILRS_AXES.iter() {
|
for gilrs_axis in ALL_GILRS_AXES.iter() {
|
||||||
|
|
|
@ -49,6 +49,7 @@ impl Plugin for InputPlugin {
|
||||||
)
|
)
|
||||||
.add_event::<GamepadEvent>()
|
.add_event::<GamepadEvent>()
|
||||||
.init_resource::<Input<GamepadButton>>()
|
.init_resource::<Input<GamepadButton>>()
|
||||||
.init_resource::<Axis<GamepadAxis>>();
|
.init_resource::<Axis<GamepadAxis>>()
|
||||||
|
.init_resource::<Axis<GamepadButton>>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,11 @@ fn connection_system(mut lobby: ResMut<Lobby>, gamepad_event: Res<Events<Gamepad
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn button_system(manager: Res<Lobby>, inputs: Res<Input<GamepadButton>>) {
|
fn button_system(
|
||||||
|
manager: Res<Lobby>,
|
||||||
|
inputs: Res<Input<GamepadButton>>,
|
||||||
|
button_axes: Res<Axis<GamepadButton>>,
|
||||||
|
) {
|
||||||
let button_types = [
|
let button_types = [
|
||||||
GamepadButtonType::South,
|
GamepadButtonType::South,
|
||||||
GamepadButtonType::East,
|
GamepadButtonType::East,
|
||||||
|
@ -63,6 +67,15 @@ fn button_system(manager: Res<Lobby>, inputs: Res<Input<GamepadButton>>) {
|
||||||
} else if inputs.just_released(GamepadButton(*gamepad, *button_type)) {
|
} else if inputs.just_released(GamepadButton(*gamepad, *button_type)) {
|
||||||
println!("Released {:?}", GamepadButton(*gamepad, *button_type));
|
println!("Released {:?}", GamepadButton(*gamepad, *button_type));
|
||||||
}
|
}
|
||||||
|
if let Some(value) = button_axes.get(&GamepadButton(*gamepad, *button_type)) {
|
||||||
|
if value_check(value) {
|
||||||
|
println!(
|
||||||
|
"Button as Axis {:?} is {}",
|
||||||
|
GamepadButton(*gamepad, *button_type),
|
||||||
|
value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,13 +94,15 @@ fn axis_system(manager: Res<Lobby>, axes: Res<Axis<GamepadAxis>>) {
|
||||||
for gamepad in manager.gamepad.iter() {
|
for gamepad in manager.gamepad.iter() {
|
||||||
for axis_type in axis_types.iter() {
|
for axis_type in axis_types.iter() {
|
||||||
if let Some(value) = axes.get(&GamepadAxis(*gamepad, *axis_type)) {
|
if let Some(value) = axes.get(&GamepadAxis(*gamepad, *axis_type)) {
|
||||||
if value.abs() > 0.01f32
|
if value_check(value) {
|
||||||
&& (value - 1.0f32).abs() > 0.01f32
|
|
||||||
&& (value + 1.0f32).abs() > 0.01f32
|
|
||||||
{
|
|
||||||
println!("Axis {:?} is {}", GamepadAxis(*gamepad, *axis_type), value);
|
println!("Axis {:?} is {}", GamepadAxis(*gamepad, *axis_type), value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn value_check(value: f32) -> bool {
|
||||||
|
let value = value.abs();
|
||||||
|
value > 0.1f32 && value < 0.9f32
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue