94 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use bevy::prelude::*;
 | |
| use bevy_input::gamepad::{Gamepad, GamepadButton, GamepadEvent, GamepadEventType};
 | |
| use std::collections::HashSet;
 | |
| 
 | |
| fn main() {
 | |
|     App::build()
 | |
|         .add_default_plugins()
 | |
|         .add_startup_system(connection_system.system())
 | |
|         .add_system(connection_system.system())
 | |
|         .add_system(button_system.system())
 | |
|         .add_system(axis_system.system())
 | |
|         .add_resource(Lobby::default())
 | |
|         .run();
 | |
| }
 | |
| 
 | |
| #[derive(Default)]
 | |
| struct Lobby {
 | |
|     gamepad: HashSet<Gamepad>,
 | |
|     gamepad_event_reader: EventReader<GamepadEvent>,
 | |
| }
 | |
| 
 | |
| fn connection_system(mut lobby: ResMut<Lobby>, gamepad_event: Res<Events<GamepadEvent>>) {
 | |
|     for event in lobby.gamepad_event_reader.iter(&gamepad_event) {
 | |
|         match &event {
 | |
|             GamepadEvent(gamepad, GamepadEventType::Connected) => {
 | |
|                 lobby.gamepad.insert(*gamepad);
 | |
|                 println!("Connected {:?}", gamepad);
 | |
|             }
 | |
|             GamepadEvent(gamepad, GamepadEventType::Disconnected) => {
 | |
|                 lobby.gamepad.remove(gamepad);
 | |
|                 println!("Disconnected {:?}", gamepad);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| fn button_system(manager: Res<Lobby>, inputs: Res<Input<GamepadButton>>) {
 | |
|     let button_types = [
 | |
|         GamepadButtonType::South,
 | |
|         GamepadButtonType::East,
 | |
|         GamepadButtonType::North,
 | |
|         GamepadButtonType::West,
 | |
|         GamepadButtonType::C,
 | |
|         GamepadButtonType::Z,
 | |
|         GamepadButtonType::LeftTrigger,
 | |
|         GamepadButtonType::LeftTrigger2,
 | |
|         GamepadButtonType::RightTrigger,
 | |
|         GamepadButtonType::RightTrigger2,
 | |
|         GamepadButtonType::Select,
 | |
|         GamepadButtonType::Start,
 | |
|         GamepadButtonType::Mode,
 | |
|         GamepadButtonType::LeftThumb,
 | |
|         GamepadButtonType::RightThumb,
 | |
|         GamepadButtonType::DPadUp,
 | |
|         GamepadButtonType::DPadDown,
 | |
|         GamepadButtonType::DPadLeft,
 | |
|         GamepadButtonType::DPadRight,
 | |
|     ];
 | |
|     for gamepad in manager.gamepad.iter() {
 | |
|         for button_type in button_types.iter() {
 | |
|             if inputs.just_pressed(GamepadButton(*gamepad, *button_type)) {
 | |
|                 println!("Pressed {:?}", GamepadButton(*gamepad, *button_type));
 | |
|             } else if inputs.just_released(GamepadButton(*gamepad, *button_type)) {
 | |
|                 println!("Released {:?}", GamepadButton(*gamepad, *button_type));
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| fn axis_system(manager: Res<Lobby>, axes: Res<Axis<GamepadAxis>>) {
 | |
|     let axis_types = [
 | |
|         GamepadAxisType::LeftStickX,
 | |
|         GamepadAxisType::LeftStickY,
 | |
|         GamepadAxisType::LeftZ,
 | |
|         GamepadAxisType::RightStickX,
 | |
|         GamepadAxisType::RightStickY,
 | |
|         GamepadAxisType::RightZ,
 | |
|         GamepadAxisType::DPadX,
 | |
|         GamepadAxisType::DPadY,
 | |
|     ];
 | |
|     for gamepad in manager.gamepad.iter() {
 | |
|         for axis_type in axis_types.iter() {
 | |
|             if let Some(value) = axes.get(&GamepadAxis(*gamepad, *axis_type)) {
 | |
|                 if value.abs() > 0.01f32
 | |
|                     && (value - 1.0f32).abs() > 0.01f32
 | |
|                     && (value + 1.0f32).abs() > 0.01f32
 | |
|                 {
 | |
|                     println!("Axis {:?} is {}", GamepadAxis(*gamepad, *axis_type), value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | 
