#![cfg_attr(docsrs, feature(doc_auto_cfg))] #![forbid(unsafe_code)] #![doc( html_logo_url = "https://bevyengine.org/assets/icon.png", html_favicon_url = "https://bevyengine.org/assets/icon.png" )] //! Input functionality for the [Bevy game engine](https://bevyengine.org/). //! //! # Supported input devices //! //! `bevy` currently supports keyboard, mouse, gamepad, and touch inputs. mod axis; mod button_input; /// Common run conditions pub mod common_conditions; pub mod gamepad; pub mod gestures; pub mod keyboard; pub mod mouse; pub mod touch; pub use axis::*; pub use button_input::*; /// The input prelude. /// /// This includes the most common types in this crate, re-exported for your convenience. pub mod prelude { #[doc(hidden)] pub use crate::{ gamepad::{Gamepad, GamepadAxis, GamepadButton, GamepadSettings}, keyboard::KeyCode, mouse::MouseButton, touch::{TouchInput, Touches}, Axis, ButtonInput, }; } use bevy_app::prelude::*; use bevy_ecs::prelude::*; #[cfg(feature = "bevy_reflect")] use bevy_reflect::Reflect; use gestures::*; use keyboard::{keyboard_input_system, KeyCode, KeyboardFocusLost, KeyboardInput}; use mouse::{ accumulate_mouse_motion_system, accumulate_mouse_scroll_system, mouse_button_input_system, AccumulatedMouseMotion, AccumulatedMouseScroll, MouseButton, MouseButtonInput, MouseMotion, MouseWheel, }; use touch::{touch_screen_input_system, TouchInput, Touches}; #[cfg(feature = "bevy_reflect")] use gamepad::Gamepad; use gamepad::{ gamepad_connection_system, gamepad_event_processing_system, GamepadAxis, GamepadAxisChangedEvent, GamepadButton, GamepadButtonChangedEvent, GamepadButtonStateChangedEvent, GamepadConnection, GamepadConnectionEvent, GamepadEvent, GamepadInfo, GamepadInput, GamepadRumbleRequest, GamepadSettings, RawGamepadAxisChangedEvent, RawGamepadButtonChangedEvent, RawGamepadEvent, }; #[cfg(all(feature = "serialize", feature = "bevy_reflect"))] use bevy_reflect::{ReflectDeserialize, ReflectSerialize}; /// Adds keyboard and mouse input to an App #[derive(Default)] pub struct InputPlugin; /// Label for systems that update the input data. #[derive(Debug, PartialEq, Eq, Clone, Hash, SystemSet)] pub struct InputSystem; impl Plugin for InputPlugin { fn build(&self, app: &mut App) { app // keyboard .add_event::() .add_event::() .init_resource::>() .add_systems(PreUpdate, keyboard_input_system.in_set(InputSystem)) // mouse .add_event::() .add_event::() .add_event::() .init_resource::>() .add_systems( PreUpdate, ( mouse_button_input_system, accumulate_mouse_motion_system, accumulate_mouse_scroll_system, ) .in_set(InputSystem), ) .add_event::() .add_event::() .add_event::() .add_event::() // gamepad .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .add_event::() .init_resource::() .init_resource::() .add_systems( PreUpdate, ( gamepad_connection_system, gamepad_event_processing_system.after(gamepad_connection_system), ) .in_set(InputSystem), ) // touch .add_event::() .init_resource::() .add_systems(PreUpdate, touch_screen_input_system.in_set(InputSystem)); #[cfg(feature = "bevy_reflect")] { // Register common types app.register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::() .register_type::(); } } } /// The current "press" state of an element #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] #[cfg_attr( feature = "bevy_reflect", derive(Reflect), reflect(Debug, Hash, PartialEq) )] #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr( all(feature = "serialize", feature = "bevy_reflect"), reflect(Serialize, Deserialize) )] pub enum ButtonState { /// The button is pressed. Pressed, /// The button is not pressed. Released, } impl ButtonState { /// Is this button pressed? pub fn is_pressed(&self) -> bool { matches!(self, ButtonState::Pressed) } }