Struct bevy_input::ButtonInput 
source · pub struct ButtonInput<T: Copy + Eq + Hash + Send + Sync + 'static> { /* private fields */ }Expand description
A “press-able” input of type T.
§Usage
This type can be used as a resource to keep the current state of an input, by reacting to events from the input. For a given input value:
- ButtonInput::pressedwill return- truebetween a press and a release event.
- ButtonInput::just_pressedwill return- truefor one frame after a press event.
- ButtonInput::just_releasedwill return- truefor one frame after a release event.
§Multiple systems
In case multiple systems are checking for ButtonInput::just_pressed or ButtonInput::just_released
but only one should react, for example when modifying a
Resource, you should consider clearing the input state, either by:
- Using ButtonInput::clear_just_pressedorButtonInput::clear_just_releasedinstead.
- Calling ButtonInput::clearorButtonInput::resetimmediately after the state change.
§Performance
For all operations, the following conventions are used:
- n is the number of stored inputs.
- m is the number of input arguments passed to the method.
- *-suffix denotes an amortized cost.
- ~-suffix denotes an expected cost.
See Rust’s std::collections doc on performance for more details on the conventions used here.
| ButtonInput operations          | Computational complexity |
|———————————–|————————————|
| ButtonInput::any_just_pressed       | O(m)~                      |
| ButtonInput::any_just_released      | O(m)~                      |
| ButtonInput::any_pressed            | O(m)~                      |
| ButtonInput::get_just_pressed       | O(n)                       |
| ButtonInput::get_just_released      | O(n)                       |
| ButtonInput::get_pressed            | O(n)                       |
| ButtonInput::just_pressed           | O(1)~                      |
| ButtonInput::just_released          | O(1)~                      |
| ButtonInput::pressed                | O(1)~                      |
| ButtonInput::press                  | O(1)*                     |
| *                     |
| ButtonInput::release                | O(1)ButtonInput::release_all            | O(n)*                     |
|                       |
| ButtonInput::clear_just_pressed     | O(1)ButtonInput::clear_just_released    | *O*(1)~                      |
| ButtonInput::reset_all              | O(n)                       |
| ButtonInput::clear                  | O(n)                       |
§Window focus
ButtonInput<KeyCode> is tied to window focus. For example, if the user holds a button
while the window loses focus, ButtonInput::just_released will be triggered. Similarly if the window
regains focus, ButtonInput::just_pressed will be triggered. Currently this happens even if the
focus switches from one Bevy window to another (for example because a new window was just spawned).
ButtonInput<GamepadButton> is independent of window focus.
§Examples
Reading and checking against the current set of pressed buttons:
fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(
            Update,
            print_gamepad.run_if(resource_changed::<ButtonInput<GamepadButton>>),
        )
        .add_systems(
            Update,
            print_mouse.run_if(resource_changed::<ButtonInput<MouseButton>>),
        )
        .add_systems(
            Update,
            print_keyboard.run_if(resource_changed::<ButtonInput<KeyCode>>),
        )
        .run();
}
fn print_gamepad(gamepad: Res<ButtonInput<GamepadButton>>) {
    println!("Gamepad: {:?}", gamepad.get_pressed().collect::<Vec<_>>());
}
fn print_mouse(mouse: Res<ButtonInput<MouseButton>>) {
    println!("Mouse: {:?}", mouse.get_pressed().collect::<Vec<_>>());
}
fn print_keyboard(keyboard: Res<ButtonInput<KeyCode>>) {
    if keyboard.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight])
        && keyboard.any_pressed([KeyCode::AltLeft, KeyCode::AltRight])
        && keyboard.any_pressed([KeyCode::ShiftLeft, KeyCode::ShiftRight])
        && keyboard.any_pressed([KeyCode::SuperLeft, KeyCode::SuperRight])
        && keyboard.pressed(KeyCode::KeyL)
    {
        println!("On Windows this opens LinkedIn.");
    } else {
        println!("keyboard: {:?}", keyboard.get_pressed().collect::<Vec<_>>());
    }
}Accepting input from multiple devices:
fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(
            Update,
            something_used.run_if(
                input_just_pressed(KeyCode::KeyE)
                    .or_else(input_just_pressed(GamepadButton::new(
                        Gamepad::new(0),
                        GamepadButtonType::West,
                    ))),
            ),
        )
        .run();
}
fn something_used() {
    println!("Generic use-ish button pressed.");
}§Note
When adding this resource for a new input type, you should:
- Call the ButtonInput::pressmethod for each press event.
- Call the ButtonInput::releasemethod for each release event.
- Call the ButtonInput::clearmethod at each frame start, before processing events.
Note: Calling clear from a ResMut will trigger change detection.
It may be preferable to use DetectChangesMut::bypass_change_detection
to avoid causing the resource to always be marked as changed.
Implementations§
source§impl<T> ButtonInput<T>
 
impl<T> ButtonInput<T>
sourcepub fn any_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
 
pub fn any_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
Returns true if any item in inputs has been pressed.
sourcepub fn all_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
 
pub fn all_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
Returns true if all items in inputs have been pressed.
sourcepub fn release_all(&mut self)
 
pub fn release_all(&mut self)
Registers a release for all currently pressed inputs.
sourcepub fn just_pressed(&self, input: T) -> bool
 
pub fn just_pressed(&self, input: T) -> bool
Returns true if the input has been pressed during the current frame.
Note: This function does not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_released.
sourcepub fn any_just_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
 
pub fn any_just_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
Returns true if any item in inputs has been pressed during the current frame.
sourcepub fn clear_just_pressed(&mut self, input: T) -> bool
 
pub fn clear_just_pressed(&mut self, input: T) -> bool
Clears the just_pressed state of the input and returns true if the input has just been pressed.
Future calls to ButtonInput::just_pressed for the given input will return false until a new press event occurs.
sourcepub fn just_released(&self, input: T) -> bool
 
pub fn just_released(&self, input: T) -> bool
Returns true if the input has been released during the current frame.
Note: This function does not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_pressed.
sourcepub fn any_just_released(&self, inputs: impl IntoIterator<Item = T>) -> bool
 
pub fn any_just_released(&self, inputs: impl IntoIterator<Item = T>) -> bool
Returns true if any item in inputs has just been released.
sourcepub fn clear_just_released(&mut self, input: T) -> bool
 
pub fn clear_just_released(&mut self, input: T) -> bool
Clears the just_released state of the input and returns true if the input has just been released.
Future calls to ButtonInput::just_released for the given input will return false until a new release event occurs.
sourcepub fn reset(&mut self, input: T)
 
pub fn reset(&mut self, input: T)
Clears the pressed, just_pressed and just_released data of the input.
sourcepub fn reset_all(&mut self)
 
pub fn reset_all(&mut self)
Clears the pressed, just_pressed, and just_released data for every input.
See also ButtonInput::clear for simulating elapsed time steps.
sourcepub fn clear(&mut self)
 
pub fn clear(&mut self)
Clears the just pressed and just released data for every input.
See also ButtonInput::reset_all for a full reset.
sourcepub fn get_pressed(&self) -> impl ExactSizeIterator<Item = &T>
 
pub fn get_pressed(&self) -> impl ExactSizeIterator<Item = &T>
An iterator visiting every pressed input in arbitrary order.
sourcepub fn get_just_pressed(&self) -> impl ExactSizeIterator<Item = &T>
 
pub fn get_just_pressed(&self) -> impl ExactSizeIterator<Item = &T>
An iterator visiting every just pressed input in arbitrary order.
Note: Returned elements do not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_released.
sourcepub fn get_just_released(&self) -> impl ExactSizeIterator<Item = &T>
 
pub fn get_just_released(&self) -> impl ExactSizeIterator<Item = &T>
An iterator visiting every just released input in arbitrary order.
Note: Returned elements do not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_pressed.
Trait Implementations§
source§impl<T: Clone + Copy + Eq + Hash + Send + Sync + 'static> Clone for ButtonInput<T>
 
impl<T: Clone + Copy + Eq + Hash + Send + Sync + 'static> Clone for ButtonInput<T>
source§fn clone(&self) -> ButtonInput<T>
 
fn clone(&self) -> ButtonInput<T>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
 
fn clone_from(&mut self, source: &Self)
source. Read moresource§impl<T> FromReflect for ButtonInput<T>
 
impl<T> FromReflect for ButtonInput<T>
source§fn from_reflect(reflect: &dyn Reflect) -> Option<Self>
 
fn from_reflect(reflect: &dyn Reflect) -> Option<Self>
Self from a reflected value.source§fn take_from_reflect(
    reflect: Box<dyn Reflect>
) -> Result<Self, Box<dyn Reflect>>
 
fn take_from_reflect( reflect: Box<dyn Reflect> ) -> Result<Self, Box<dyn Reflect>>
Self using,
constructing the value using from_reflect if that fails. Read moresource§impl<T> GetTypeRegistration for ButtonInput<T>
 
impl<T> GetTypeRegistration for ButtonInput<T>
source§fn get_type_registration() -> TypeRegistration
 
fn get_type_registration() -> TypeRegistration
TypeRegistration for this type.source§fn register_type_dependencies(registry: &mut TypeRegistry)
 
fn register_type_dependencies(registry: &mut TypeRegistry)
source§impl<T> Reflect for ButtonInput<T>
 
impl<T> Reflect for ButtonInput<T>
source§fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
 
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
source§fn as_any_mut(&mut self) -> &mut dyn Any
 
fn as_any_mut(&mut self) -> &mut dyn Any
&mut dyn Any.source§fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
 
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
source§fn as_reflect(&self) -> &dyn Reflect
 
fn as_reflect(&self) -> &dyn Reflect
source§fn as_reflect_mut(&mut self) -> &mut dyn Reflect
 
fn as_reflect_mut(&mut self) -> &mut dyn Reflect
source§fn clone_value(&self) -> Box<dyn Reflect>
 
fn clone_value(&self) -> Box<dyn Reflect>
Reflect trait object. Read moresource§fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>
 
fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>>
source§fn reflect_kind(&self) -> ReflectKind
 
fn reflect_kind(&self) -> ReflectKind
source§fn reflect_ref(&self) -> ReflectRef<'_>
 
fn reflect_ref(&self) -> ReflectRef<'_>
source§fn reflect_mut(&mut self) -> ReflectMut<'_>
 
fn reflect_mut(&mut self) -> ReflectMut<'_>
source§fn reflect_owned(self: Box<Self>) -> ReflectOwned
 
fn reflect_owned(self: Box<Self>) -> ReflectOwned
source§fn reflect_partial_eq(&self, value: &dyn Reflect) -> Option<bool>
 
fn reflect_partial_eq(&self, value: &dyn Reflect) -> Option<bool>
source§fn apply(&mut self, value: &(dyn Reflect + 'static))
 
fn apply(&mut self, value: &(dyn Reflect + 'static))
source§fn reflect_hash(&self) -> Option<u64>
 
fn reflect_hash(&self) -> Option<u64>
source§fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
 
fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
source§fn serializable(&self) -> Option<Serializable<'_>>
 
fn serializable(&self) -> Option<Serializable<'_>>
source§fn is_dynamic(&self) -> bool
 
fn is_dynamic(&self) -> bool
source§impl<T> Struct for ButtonInput<T>
 
impl<T> Struct for ButtonInput<T>
source§fn field(&self, name: &str) -> Option<&dyn Reflect>
 
fn field(&self, name: &str) -> Option<&dyn Reflect>
name as a &dyn Reflect.source§fn field_mut(&mut self, name: &str) -> Option<&mut dyn Reflect>
 
fn field_mut(&mut self, name: &str) -> Option<&mut dyn Reflect>
name as a
&mut dyn Reflect.source§fn field_at(&self, index: usize) -> Option<&dyn Reflect>
 
fn field_at(&self, index: usize) -> Option<&dyn Reflect>
index as a
&dyn Reflect.source§fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn Reflect>
 
fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn Reflect>
index
as a &mut dyn Reflect.source§fn name_at(&self, index: usize) -> Option<&str>
 
fn name_at(&self, index: usize) -> Option<&str>
index.source§fn iter_fields(&self) -> FieldIter<'_>
 
fn iter_fields(&self) -> FieldIter<'_>
source§fn clone_dynamic(&self) -> DynamicStruct
 
fn clone_dynamic(&self) -> DynamicStruct
DynamicStruct.source§impl<T> TypePath for ButtonInput<T>
 
impl<T> TypePath for ButtonInput<T>
source§fn type_path() -> &'static str
 
fn type_path() -> &'static str
source§fn short_type_path() -> &'static str
 
fn short_type_path() -> &'static str
source§fn type_ident() -> Option<&'static str>
 
fn type_ident() -> Option<&'static str>
source§fn crate_name() -> Option<&'static str>
 
fn crate_name() -> Option<&'static str>
source§impl<T> Typed for ButtonInput<T>
 
impl<T> Typed for ButtonInput<T>
impl<T: Copy + Eq + Hash + Send + Sync + 'static> Resource for ButtonInput<T>
Auto Trait Implementations§
impl<T> Freeze for ButtonInput<T>
impl<T> RefUnwindSafe for ButtonInput<T>where
    T: RefUnwindSafe,
impl<T> Send for ButtonInput<T>
impl<T> Sync for ButtonInput<T>
impl<T> Unpin for ButtonInput<T>where
    T: Unpin,
impl<T> UnwindSafe for ButtonInput<T>where
    T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
 
impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
 
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Downcast for Twhere
    T: Any,
 
impl<T> Downcast for Twhere
    T: Any,
source§fn into_any(self: Box<T>) -> Box<dyn Any>
 
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
 
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.source§fn as_any(&self) -> &(dyn Any + 'static)
 
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
 
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.source§impl<T> DowncastSync for T
 
impl<T> DowncastSync for T
source§impl<T> DynamicTypePath for Twhere
    T: TypePath,
 
impl<T> DynamicTypePath for Twhere
    T: TypePath,
source§fn reflect_type_path(&self) -> &str
 
fn reflect_type_path(&self) -> &str
TypePath::type_path.source§fn reflect_short_type_path(&self) -> &str
 
fn reflect_short_type_path(&self) -> &str
source§fn reflect_type_ident(&self) -> Option<&str>
 
fn reflect_type_ident(&self) -> Option<&str>
TypePath::type_ident.source§fn reflect_crate_name(&self) -> Option<&str>
 
fn reflect_crate_name(&self) -> Option<&str>
TypePath::crate_name.source§fn reflect_module_path(&self) -> Option<&str>
 
fn reflect_module_path(&self) -> Option<&str>
source§impl<T> FromWorld for Twhere
    T: Default,
 
impl<T> FromWorld for Twhere
    T: Default,
source§fn from_world(_world: &mut World) -> T
 
fn from_world(_world: &mut World) -> T
Self using data from the given World.source§impl<S> GetField for Swhere
    S: Struct,
 
impl<S> GetField for Swhere
    S: Struct,
source§impl<T> GetPath for T
 
impl<T> GetPath for T
source§fn reflect_path<'p>(
    &self,
    path: impl ReflectPath<'p>
) -> Result<&(dyn Reflect + 'static), ReflectPathError<'p>>
 
fn reflect_path<'p>( &self, path: impl ReflectPath<'p> ) -> Result<&(dyn Reflect + 'static), ReflectPathError<'p>>
path. Read moresource§fn reflect_path_mut<'p>(
    &mut self,
    path: impl ReflectPath<'p>
) -> Result<&mut (dyn Reflect + 'static), ReflectPathError<'p>>
 
fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p> ) -> Result<&mut (dyn Reflect + 'static), ReflectPathError<'p>>
path. Read moresource§fn path<'p, T>(
    &self,
    path: impl ReflectPath<'p>
) -> Result<&T, ReflectPathError<'p>>where
    T: Reflect,
 
fn path<'p, T>(
    &self,
    path: impl ReflectPath<'p>
) -> Result<&T, ReflectPathError<'p>>where
    T: Reflect,
path. Read moresource§fn path_mut<'p, T>(
    &mut self,
    path: impl ReflectPath<'p>
) -> Result<&mut T, ReflectPathError<'p>>where
    T: Reflect,
 
fn path_mut<'p, T>(
    &mut self,
    path: impl ReflectPath<'p>
) -> Result<&mut T, ReflectPathError<'p>>where
    T: Reflect,
path. Read more