 115211161b
			
		
	
	
		115211161b
		
	
	
	
	
		
			
			# Objective - I wanted to have controls independent from keyboard layout and found that bevy doesn't have a proper implementation for that ## Solution - I created a `ScanCode` enum with two hundreds scan codes and updated `keyboard_input_system` to include and update `ResMut<Input<ScanCode>>` - closes both https://github.com/bevyengine/bevy/issues/2052 and https://github.com/bevyengine/bevy/issues/862 Co-authored-by: Bleb1k <91003089+Bleb1k@users.noreply.github.com>
		
			
				
	
	
		
			103 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| mod axis;
 | |
| pub mod gamepad;
 | |
| mod input;
 | |
| pub mod keyboard;
 | |
| pub mod mouse;
 | |
| pub mod touch;
 | |
| 
 | |
| pub use axis::*;
 | |
| use bevy_ecs::schedule::{ParallelSystemDescriptorCoercion, SystemLabel};
 | |
| pub use input::*;
 | |
| 
 | |
| pub mod prelude {
 | |
|     #[doc(hidden)]
 | |
|     pub use crate::{
 | |
|         gamepad::{
 | |
|             Gamepad, GamepadAxis, GamepadAxisType, GamepadButton, GamepadButtonType, GamepadEvent,
 | |
|             GamepadEventType, Gamepads,
 | |
|         },
 | |
|         keyboard::{KeyCode, ScanCode},
 | |
|         mouse::MouseButton,
 | |
|         touch::{TouchInput, Touches},
 | |
|         Axis, Input,
 | |
|     };
 | |
| }
 | |
| 
 | |
| use bevy_app::prelude::*;
 | |
| use keyboard::{keyboard_input_system, KeyCode, KeyboardInput, ScanCode};
 | |
| use mouse::{mouse_button_input_system, MouseButton, MouseButtonInput, MouseMotion, MouseWheel};
 | |
| use prelude::Gamepads;
 | |
| use touch::{touch_screen_input_system, TouchInput, Touches};
 | |
| 
 | |
| use gamepad::{
 | |
|     gamepad_connection_system, gamepad_event_system, GamepadAxis, GamepadButton, GamepadEvent,
 | |
|     GamepadEventRaw, GamepadSettings,
 | |
| };
 | |
| 
 | |
| /// Adds keyboard and mouse input to an App
 | |
| #[derive(Default)]
 | |
| pub struct InputPlugin;
 | |
| 
 | |
| #[derive(Debug, PartialEq, Eq, Clone, Hash, SystemLabel)]
 | |
| pub struct InputSystem;
 | |
| 
 | |
| impl Plugin for InputPlugin {
 | |
|     fn build(&self, app: &mut App) {
 | |
|         app
 | |
|             // keyboard
 | |
|             .add_event::<KeyboardInput>()
 | |
|             .init_resource::<Input<KeyCode>>()
 | |
|             .init_resource::<Input<ScanCode>>()
 | |
|             .add_system_to_stage(
 | |
|                 CoreStage::PreUpdate,
 | |
|                 keyboard_input_system.label(InputSystem),
 | |
|             )
 | |
|             // mouse
 | |
|             .add_event::<MouseButtonInput>()
 | |
|             .add_event::<MouseMotion>()
 | |
|             .add_event::<MouseWheel>()
 | |
|             .init_resource::<Input<MouseButton>>()
 | |
|             .add_system_to_stage(
 | |
|                 CoreStage::PreUpdate,
 | |
|                 mouse_button_input_system.label(InputSystem),
 | |
|             )
 | |
|             // gamepad
 | |
|             .add_event::<GamepadEvent>()
 | |
|             .add_event::<GamepadEventRaw>()
 | |
|             .init_resource::<GamepadSettings>()
 | |
|             .init_resource::<Gamepads>()
 | |
|             .init_resource::<Input<GamepadButton>>()
 | |
|             .init_resource::<Axis<GamepadAxis>>()
 | |
|             .init_resource::<Axis<GamepadButton>>()
 | |
|             .add_system_to_stage(
 | |
|                 CoreStage::PreUpdate,
 | |
|                 gamepad_event_system.label(InputSystem),
 | |
|             )
 | |
|             .add_system_to_stage(
 | |
|                 CoreStage::PreUpdate,
 | |
|                 gamepad_connection_system.after(InputSystem),
 | |
|             )
 | |
|             // touch
 | |
|             .add_event::<TouchInput>()
 | |
|             .init_resource::<Touches>()
 | |
|             .add_system_to_stage(
 | |
|                 CoreStage::PreUpdate,
 | |
|                 touch_screen_input_system.label(InputSystem),
 | |
|             );
 | |
|     }
 | |
| }
 | |
| 
 | |
| /// The current "press" state of an element
 | |
| #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
 | |
| #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
 | |
| pub enum ButtonState {
 | |
|     Pressed,
 | |
|     Released,
 | |
| }
 | |
| 
 | |
| impl ButtonState {
 | |
|     pub fn is_pressed(&self) -> bool {
 | |
|         matches!(self, ButtonState::Pressed)
 | |
|     }
 | |
| }
 |